Mercurial > ~darius > hgwebdir.cgi > paradise_client
view packets.c @ 3:5a977ccbc7a9 default tip
Empty changelog
author | darius |
---|---|
date | Sat, 06 Dec 1997 05:41:29 +0000 |
parents | |
children |
line wrap: on
line source
/* $Id: packets.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */ #include <stddef.h> #include "defs.h" #include "packets.h" #include "gppackets.h" #include "wtext.h" size_t client_packet_sizes[] = { 0, sizeof(struct mesg_cpacket), sizeof(struct speed_cpacket), sizeof(struct dir_cpacket), sizeof(struct phaser_cpacket), sizeof(struct plasma_cpacket), sizeof(struct torp_cpacket), sizeof(struct quit_cpacket), sizeof(struct login_cpacket), sizeof(struct outfit_cpacket), /* 10 v */ sizeof(struct war_cpacket), sizeof(struct practr_cpacket), sizeof(struct shield_cpacket), sizeof(struct repair_cpacket), sizeof(struct orbit_cpacket), sizeof(struct planlock_cpacket), sizeof(struct playlock_cpacket), sizeof(struct bomb_cpacket), sizeof(struct beam_cpacket), sizeof(struct cloak_cpacket), /* 20 v */ sizeof(struct det_torps_cpacket), sizeof(struct det_mytorp_cpacket), sizeof(struct copilot_cpacket), sizeof(struct refit_cpacket), sizeof(struct tractor_cpacket), sizeof(struct repress_cpacket), sizeof(struct coup_cpacket), sizeof(struct socket_cpacket), sizeof(struct options_cpacket), sizeof(struct bye_cpacket), /* 30 v */ sizeof(struct dockperm_cpacket), sizeof(struct updates_cpacket), sizeof(struct resetstats_cpacket), sizeof(struct reserved_cpacket), sizeof(struct scan_cpacket), sizeof(struct udp_req_cpacket), sizeof(struct sequence_cpacket), sizeof(struct rsa_key_cpacket), sizeof(struct obvious_packet), 0, /* 40 v */ 0, 0, sizeof(struct ping_cpacket),/* 42 */ #ifdef SHORT_PACKETS sizeof(struct shortreq_cpacket), sizeof(struct threshold_cpacket), 0, /* CP_S_MESSAGE */ 0, /* CP_S_RESERVED */ 0, /* CP_S_DUMMY */ #else 0, 0, 0, 0, 0, /* 47 */ #endif 0, /* 48 */ 0, /* 50 v */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 59 */ #ifdef FEATURE sizeof(struct feature_cpacket) /* CP_FEATURE */ #else 0 #endif }; #define num_cpacket_sizes sizeof(client_packet_sizes)/sizeof(*client_packet_sizes) int size_of_cpacket(pkt) void *pkt; { CARD8 type; CARD8 subtype; type = ((CARD8 *) pkt)[0]; subtype = ((CARD8 *) pkt)[1]; if (type < num_cpacket_sizes && client_packet_sizes[type] > 0) return client_packet_sizes[type]; switch (type) { #ifdef CP_FIRE_WEAPON case CP_FIRE_WEAPON: { struct fire_weapon_cpacket *fwp = pkt; return (fwp->mech == TM_POSITION) ? 12 : 4; } #endif #ifdef SHORT_PACKETS case CP_S_MESSAGE: return ((unsigned char *) pkt)[3]; case CP_S_RESERVED: case CP_S_DUMMY: /* hmm? good question */ return 0; #endif /* SHORT_PACKETS */ default: return 0; } } int server_packet_sizes[] = { 0, /* record 0 */ sizeof(struct mesg_spacket),/* SP_MESSAGE */ sizeof(struct plyr_info_spacket), /* SP_PLAYER_INFO */ sizeof(struct kills_spacket), /* SP_KILLS */ sizeof(struct player_spacket), /* SP_PLAYER */ sizeof(struct torp_info_spacket), /* SP_TORP_INFO */ sizeof(struct torp_spacket),/* SP_TORP */ sizeof(struct phaser_spacket), /* SP_PHASER */ sizeof(struct plasma_info_spacket), /* SP_PLASMA_INFO */ sizeof(struct plasma_spacket), /* SP_PLASMA */ /* 10 v */ sizeof(struct warning_spacket), /* SP_WARNING */ sizeof(struct motd_spacket),/* SP_MOTD */ sizeof(struct you_spacket), /* SP_YOU */ sizeof(struct queue_spacket), /* SP_QUEUE */ sizeof(struct status_spacket), /* SP_STATUS */ sizeof(struct planet_spacket), /* SP_PLANET */ sizeof(struct pickok_spacket), /* SP_PICKOK */ sizeof(struct login_spacket), /* SP_LOGIN */ sizeof(struct flags_spacket), /* SP_FLAGS */ sizeof(struct mask_spacket),/* SP_MASK */ /* 20 v */ sizeof(struct pstatus_spacket), /* SP_PSTATUS */ sizeof(struct badversion_spacket), /* SP_BADVERSION */ sizeof(struct hostile_spacket), /* SP_HOSTILE */ sizeof(struct stats_spacket), /* SP_STATS */ sizeof(struct plyr_login_spacket), /* SP_PL_LOGIN */ sizeof(struct reserved_spacket), /* SP_RESERVED */ sizeof(struct planet_loc_spacket), /* SP_PLANET_LOC */ sizeof(struct scan_spacket),/* SP_SCAN (ATM) */ sizeof(struct udp_reply_spacket), /* SP_UDP_REPLY */ sizeof(struct sequence_spacket), /* SP_SEQUENCE */ /* 30 v */ sizeof(struct sc_sequence_spacket), /* SP_SC_SEQUENCE */ sizeof(struct rsa_key_spacket), /* SP_RSA_KEY */ sizeof(struct motd_pic_spacket), /* SP_MOTD_PIC */ sizeof(struct stats_spacket2), /* SP_STATS2 */ sizeof(struct status_spacket2), /* SP_STATUS2 */ sizeof(struct planet_spacket2), /* SP_PLANET2 */ sizeof(struct obvious_packet), /* SP_NEW_MOTD */ sizeof(struct thingy_spacket), /* SP_THINGY */ sizeof(struct thingy_info_spacket), /* SP_THINGY_INFO */ sizeof(struct ship_cap_spacket), /* SP_SHIP_CAP */ /* 40 v */ #ifdef SHORT_PACKETS sizeof(struct shortreply_spacket), /* SP_S_REPLY */ -1, /* SP_S_MESSAGE */ -1, /* SP_S_WARNING */ sizeof(struct youshort_spacket), /* SP_S_YOU */ sizeof(struct youss_spacket), /* SP_S_YOU_SS */ -1, /* SP_S_PLAYER */ #else -1, -1, -1, -1, -1, -1, #endif sizeof(struct ping_spacket),/* SP_PING */ -1, /* SP_S_TORP */ -1, /* SP_S_TORP_INFO */ 20, /* SP_S_8_TORP */ /* 50 v */ -1, /* SP_S_PLANET */ -1, /* SP_GPARAM */ -1, /* SP_PARADISE_EXT1 */ sizeof(struct terrain_packet2), /* SP_TERRAIN2 */ sizeof(struct terrain_info_packet2), /* SP_TERRAIN_INFO2 */ -1, -1, -1, -1, -1, /* 60 v */ #ifdef FEATURE sizeof(struct feature_spacket), #else -1, #endif -1 }; #define num_spacket_sizes (sizeof(server_packet_sizes) / sizeof(server_packet_sizes[0]) - 1) #ifdef SHORT_PACKETS unsigned char numofbits[256] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; static int vtsize[9] = {4, 8, 8, 12, 12, 16, 20, 20, 24}; /* How big is the torppacket */ int vtisize[9] = {4, 7, 9, 11, 13, 16, 18, 20, 22}; /* 4 byte Header + torpdata */ static int padto4(sz) int sz; { return (sz % 4) ? (sz / 4 + 1) * 4 : sz; } #endif int size_of_spacket(pkt) unsigned char *pkt; { switch (pkt[0]) { case SP_GPARAM: switch (pkt[1]) { case 0: return sizeof(struct gp_sizes_spacket); case 1: return sizeof(struct gp_team_spacket); case 2: return sizeof(struct gp_teamlogo_spacket); case 3: return sizeof(struct gp_shipshape_spacket); case 4: return sizeof(struct gp_shipbitmap_spacket); case 5: return sizeof(struct gp_rank_spacket); case 6: return sizeof(struct gp_royal_spacket); case 7: return sizeof(struct gp_teamplanet_spacket); default: return 0; } #ifdef SHORT_PACKETS case SP_S_MESSAGE: return padto4(pkt[4]); /* IMPORTANT Changed */ case SP_S_WARNING: if (pkt[1] == STEXTE_STRING || pkt[1] == SHORT_WARNING) { return padto4(pkt[3]); } else return 4; /* Normal Packet */ case SP_S_PLAYER: if (pkt[1] & 128) { /* Small +extended Header */ return padto4(((pkt[1] & 0x3f) * 4) + 4); } else if (pkt[1] & 64) { /* Small Header */ return padto4(((pkt[1] & 0x3f) * 4) + 4); } else { /* Big Header */ return padto4((pkt[1] * 4 + 12)); } case SP_S_TORP: return padto4(vtsize[numofbits[pkt[1]]]); case SP_S_TORP_INFO: return padto4((vtisize[numofbits[pkt[1]]] + numofbits[pkt[3]])); case SP_S_PLANET: return padto4((pkt[1] * VPLANET_SIZE) + 2); #endif case SP_PARADISE_EXT1: switch (pkt[1]) { case SP_PE1_MISSING_BITMAP: return sizeof(struct pe1_missing_bitmap_spacket); case SP_PE1_NUM_MISSILES: return sizeof(struct pe1_num_missiles_spacket); default: return 0; } #ifdef RECORDER case REC_UPDATE: { extern int playback; if (playback) /* if not, something's very wrong... */ return 4; } #endif default: return (*pkt < num_spacket_sizes && server_packet_sizes[*pkt] >= 0) ? server_packet_sizes[*pkt] : 0; } }