Update of /cvsroot/netrek/client/netrekxp/src In directory sc8-pr-cvs16:/tmp/cvs-serv30344/src Modified Files: data.c helpwin.c input.c parsemeta.c playback.c socket.c Log Message: Add new #define PARADISE for trying to add support for paradise servers. There are some issues that make bronco and paradise not compatable, namely overlapping definitions of packet types (see CP_PLANET or GENERIC_32). Also paradise uses a different set of global constants (GWIDTH and MAXPLAYER come to mind as the biggest changes). So for now, for testing with paradise, I will simply flip the PARADISE define in config.h. Added in the paradise packet types and packet handlers. The actual functionality is commented out, it needs a lot more work. Client is able to connect to paradise server with no broken packet types, so that's a good start. Don't save INL servers in UDP metacache. Rename xtrekrc to netrekrc.txt in the help window. Index: input.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/input.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- input.c 28 Apr 2007 12:09:51 -0000 1.38 +++ input.c 16 May 2007 00:05:15 -0000 1.39 @@ -1892,8 +1892,11 @@ int detmine (void) { - register int i; + register int i = 0; +#ifdef PARADISE + sendDetMineReq(-1); +#else for (i = 0; i < MAXTORP; i++) { if (torps[i + (me->p_no * MAXTORP)].t_status == TMOVE || @@ -1907,6 +1910,7 @@ #endif } } +#endif return (0); } Index: playback.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/playback.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- playback.c 14 May 2007 02:56:41 -0000 1.21 +++ playback.c 16 May 2007 00:05:16 -0000 1.22 @@ -506,7 +506,9 @@ case SP_S_YOU_SS: case SP_S_PLAYER: case SP_SHIP_CAP: +#ifndef PARADISE case SP_GENERIC_32: +#endif case SP_S_TORP: case SP_S_TORP_INFO: case SP_S_8_TORP: Index: data.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/data.c,v retrieving revision 1.91 retrieving revision 1.92 diff -u -d -r1.91 -r1.92 --- data.c 14 May 2007 02:56:40 -0000 1.91 +++ data.c 16 May 2007 00:05:15 -0000 1.92 @@ -24,6 +24,9 @@ struct torp *torps; struct plasmatorp *plasmatorps; struct status *status; +#ifdef PARADISE +struct status2 *status2; +#endif struct ship *myship; struct stats *mystats; struct planet *planets; @@ -107,6 +110,9 @@ int warncount = 0; int warntimer = -1; int infomapped = 0; +void *infothing = NULL; /* infow contents [BDyess] */ +int infoupdate = 0; /* update flag for infow [BDyess] */ +int infotype = 0; /* type of info thing [BDyess] */ int mustexit = 0; int messtime = 5; int keepPeace = 1; @@ -117,6 +123,7 @@ #endif int msgBeep = 1; /* ATM - msg beep */ +int scanmapped = 0; /* ATM - scanners */ int planetBitmap = 0; int planetBitmapGalaxy = 0; Index: parsemeta.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/parsemeta.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- parsemeta.c 14 May 2007 02:56:41 -0000 1.38 +++ parsemeta.c 16 May 2007 00:05:16 -0000 1.39 @@ -845,6 +845,9 @@ instead they default to "Active". */ for (i = 0; i < num_servers; i++) { + /* Don't cache INL servers */ + if (serverlist[i].typeflag == 'I') + continue; #ifdef METAPING /* Don't cache servers that aren't responding to ping, they are likely defunct. */ Index: helpwin.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/helpwin.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- helpwin.c 14 May 2007 02:56:40 -0000 1.10 +++ helpwin.c 16 May 2007 00:05:15 -0000 1.11 @@ -157,7 +157,7 @@ "V Increase sound volume", #endif - "& Reread xtrekrc", + "& Reread netrekrc.txt", "\" Save current options", 0 }; Index: socket.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/socket.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- socket.c 28 Apr 2007 12:09:51 -0000 1.31 +++ socket.c 16 May 2007 00:05:16 -0000 1.32 @@ -31,7 +31,6 @@ #include "local.h" #include "proto.h" -/* #define INCLUDE_SCAN /* include Amdahl scanning beams */ #define INCLUDE_VISTRACT /* include visible tractor beams */ #define NETSTAT @@ -130,8 +129,8 @@ {sizeof (struct reserved_spacket), handleReserved}, /* SP_RESERVED */ {sizeof (struct planet_loc_spacket), handlePlanetLoc}, /* SP_PLANET_LOC */ -#ifdef HANDLE_SCAN - {sizeof (struct scan_spacket), handleScan} /* SP_SCAN (ATM) */ +#ifdef PARADISE + {sizeof (struct scan_spacket), handleScan}, /* SP_SCAN (ATM) */ #else {0, dummy}, /* won't be called */ #endif @@ -146,6 +145,15 @@ {0, dummy}, /* #31, and dummy won't */ #endif +#ifdef PARADISE + {sizeof (struct motd_pic_spacket), handleMotdPic}, /* SP_MOTD_PIC */ + {sizeof (struct stats_spacket2), handleStats2}, /* SP_STATS2 */ + {sizeof (struct status_spacket2), handleStatus2}, /* SP_STATUS2 */ + {sizeof (struct planet_spacket2), handlePlanet2}, /* SP_PLANET2 */ + {sizeof (struct obvious_packet), handleTempPack}, /* SP_TEMP_5 */ + {sizeof (struct thingy_spacket), handleThingy}, /* SP_THINGY */ + {sizeof (struct thingy_info_spacket), handleThingyInfo}, /* SP_THINGY_INFO */ +#else {sizeof (struct generic_32_spacket), handleGeneric32}, /* SP_GENERIC_32 */ {sizeof (struct flags_all_spacket), handleFlagsAll}, /* SP_FLAGS_ALL */ {0, dummy}, /* 34 */ @@ -153,6 +161,7 @@ {0, dummy}, /* 36 */ {0, dummy}, /* 37 */ {0, dummy}, /* 38 */ +#endif {sizeof (struct ship_cap_spacket), handleShipCap}, /* SP_SHIP_CAP */ #ifdef SHORT_PACKETS @@ -186,10 +195,17 @@ {0, dummy}, /* 50 */ #endif +#ifdef PARADISE + {-1, /* variable */ handleGameparams}, + {-1, /* variable */ handleExtension1}, + {sizeof (struct terrain_packet2), handleTerrain2}, /* 53 */ + {sizeof (struct terrain_info_packet2), handleTerrainInfo2}, /* 54 */ +#else {0, dummy}, /* 51 */ {0, dummy}, /* 52 */ {0, dummy}, /* 53 */ {0, dummy}, /* 54 */ +#endif {0, dummy}, /* 55 */ #ifdef SHORT_PACKETS /* S_P2 */ @@ -247,7 +263,7 @@ sizeof (struct resetstats_cpacket), /* CP_RESETSTATS */ sizeof (struct reserved_cpacket), /* CP_RESERVED */ -#ifdef INCLUDE_SCAN +#ifdef PARADISE sizeof (struct scan_cpacket), /* CP_SCAN (ATM) */ #else 0, @@ -926,6 +942,50 @@ switch (*bufptr) { +#ifdef PARADISE + case SP_GPARAM: + switch ((unsigned char) bufptr[1]) { +/* case 0: + size = sizeof(struct gp_sizes_spacket); + break; + case 1: + size = sizeof(struct gp_team_spacket); + break; + case 2: + size = sizeof(struct gp_teamlogo_spacket); + break; + case 3: + size = sizeof(struct gp_shipshape_spacket); + break; + case 4: + size = sizeof(struct gp_shipbitmap_spacket); + break; + case 5: + size = sizeof(struct gp_rank_spacket); + break; + case 6: + size = sizeof(struct gp_royal_spacket); + break; + case 7: + size = sizeof(struct gp_teamplanet_spacket); + break;*/ + default: + size = 0; + break; + } + case SP_PARADISE_EXT1: + switch ((unsigned char) bufptr[1]) { + case SP_PE1_MISSING_BITMAP: + size = sizeof(struct pe1_missing_bitmap_spacket); + break; + case SP_PE1_NUM_MISSILES: + size = sizeof(struct pe1_num_missiles_spacket); + break; + default: + size = 0; + break; + } +#endif case SP_S_MESSAGE: size = ((unsigned char) bufptr[4]); /* IMPORTANT Changed */ break; @@ -1640,7 +1700,7 @@ case CP_COUP: case CP_DOCKPERM: -#ifdef INCLUDE_SCAN +#ifdef PARADISE case CP_SCAN: #endif @@ -1841,8 +1901,10 @@ strcpy (packet.login, login); packet.type = CP_LOGIN; packet.query = query; - //packet.pad2 = 0x69; /* Paradise support */ - //packet.pad3 = 0x43; /* Paradise support */ +#ifdef PARADISE + packet.pad2 = 0x69; /* Paradise support */ + packet.pad3 = 0x43; /* Paradise support */ +#endif sendServerPacket ((struct player_spacket *) &packet); } @@ -2646,10 +2708,367 @@ #endif -#ifdef INCLUDE_SCAN -void -handleScan (packet) - struct scan_spacket *packet; +#ifdef PARADISE +void handleMotdPic (struct motd_pic_spacket *packet) +{ + int x, y, page, width, height; + + x = ntohs(packet->x); + y = ntohs(packet->y); + width = ntohs(packet->width); + height = ntohs(packet->height); + page = ntohs(packet->page); + + //newMotdPic(x, y, width, height, (char *) packet->bits, page); +} + +void handleStats2 (struct stats_spacket2 *packet) +{ + struct stats2 *p; /* to hold packet's player's stats2 struct */ + +#ifdef CORRUPTED_PACKETS + if (packet->pnum >= MAXPLAYER) + { + LineToConsole ("handleStats2: bad index\n"); + return; + } +#endif + + updatePlayer[packet->pnum] |= LARGE_UPDATE; + if (infomapped && infotype == PLAYERTYPE && + ((struct player *) infothing)->p_no == packet->pnum) + infoupdate = 1; + p = &(players[packet->pnum].p_stats2); /* get player's stats2 struct */ + p->st_genocides = ntohl(packet->genocides); + p->st_tmaxkills = (float) ntohl(packet->maxkills) / (float) 100.0; + p->st_di = (float) ntohl(packet->di) / (float) 100.0; + p->st_tkills = (int) ntohl(packet->kills); + p->st_tlosses = (int) ntohl(packet->losses); + p->st_tarmsbomb = (int) ntohl(packet->armsbomb); + p->st_tresbomb = (int) ntohl(packet->resbomb); + p->st_tdooshes = (int) ntohl(packet->dooshes); + p->st_tplanets = (int) ntohl(packet->planets); + p->st_tticks = (int) ntohl(packet->tticks); + p->st_sbkills = (int) ntohl(packet->sbkills); + p->st_sblosses = (int) ntohl(packet->sblosses); + p->st_sbticks = (int) ntohl(packet->sbticks); + p->st_sbmaxkills = (float) ntohl(packet->sbmaxkills) / (float) 100.0; + p->st_wbkills = (int) ntohl(packet->wbkills); + p->st_wblosses = (int) ntohl(packet->wblosses); + p->st_wbticks = (int) ntohl(packet->wbticks); + p->st_wbmaxkills = (float) ntohl(packet->wbmaxkills) / (float) 100.0; + p->st_jsplanets = (int) ntohl(packet->jsplanets); + p->st_jsticks = (int) ntohl(packet->jsticks); + if (p->st_rank != (int) ntohl(packet->rank) || + p->st_royal != (int) ntohl(packet->royal)) { + p->st_rank = (int) ntohl(packet->rank); + p->st_royal = (int) ntohl(packet->royal); + updatePlayer[packet->pnum] |= ALL_UPDATE; + } +} + +void handleStatus2 (struct status_spacket2 *packet) +{ +/* + updatePlayer[me->p_no] |= LARGE_UPDATE; + if (infomapped && infotype == PLAYERTYPE && + ((struct player *) infothing)->p_no == me->p_no) + infoupdate = 1; + status2->tourn = packet->tourn; + status2->dooshes = ntohl(packet->dooshes); + status2->armsbomb = ntohl(packet->armsbomb); + status2->resbomb = ntohl(packet->resbomb); + status2->planets = ntohl(packet->planets); + status2->kills = ntohl(packet->kills); + status2->losses = ntohl(packet->losses); + status2->sbkills = ntohl(packet->sbkills); + status2->sblosses = ntohl(packet->sblosses); + status2->sbtime = ntohl(packet->sbtime); + status2->wbkills = ntohl(packet->wbkills); + status2->wblosses = ntohl(packet->wblosses); + status2->wbtime = ntohl(packet->wbtime); + status2->jsplanets = ntohl(packet->jsplanets); + status2->jstime = ntohl(packet->jstime); + status2->time = ntohl(packet->time); + status2->timeprod = ntohl(packet->timeprod); +*/ +} + +void handlePlanet2 (struct planet_spacket2 *packet) +{ + static int first_planet_packet = 1; + +#ifdef CORRUPTED_PACKETS + if (packet->pnum >= MAXPLANETS) + { + LineToConsole ("handlePlanet2: bad index %d\n", packet->pnum); + return; + } +#endif +/* + if(first_planet_packet) + { + first_planet_packet = 0; + nplanets = packet->pnum+1; + } + else + { + if((packet->pnum+1) > nplanets) + nplanets = packet->pnum+1; + } + + planets[packet->pnum].pl_owner = packet->owner; + planets[packet->pnum].pl_info = packet->info; + planets[packet->pnum].pl_flags = ntohl(packet->flags); + if(PL_TYPE(planets[packet->pnum]) != PLPLANET) { + planets[packet->pnum].pl_owner = ALLTEAM; + } + planets[packet->pnum].pl_timestamp = ntohl(packet->timestamp); + planets[packet->pnum].pl_armies = ntohl(packet->armies); + planets[packet->pnum].pl_flags |= PLREDRAW; + pl_update[packet->pnum].plu_update = 1; + pl_update[packet->pnum].plu_x = planets[packet->pnum].pl_x; + pl_update[packet->pnum].plu_y = planets[packet->pnum].pl_y; + if (infomapped && infotype == PLANETTYPE && + ((struct planet *) infothing)->pl_no == packet->pnum) + infoupdate = 1; +*/ +} + +void handleTerrainInfo2 (struct terrain_info_packet2 *pkt) +{ +/* +#ifdef ZDIAG2 + fprintf( stderr, "Receiving terrain info packet\n" ); + fprintf( stderr, "Terrain dims: %d x %d\n", ntohs(pkt->xdim), ntohs(pkt->ydim) ); +#endif + received_terrain_info = TERRAIN_STARTED; + terrain_x = ntohs(pkt->xdim); + terrain_y = ntohs(pkt->ydim); +*/ +}; + +void handleTerrain2 (struct terrain_packet2 *pkt) +{ +/* + static int curseq = 0, totbytes = 0, done = 0; + int i; +#if defined(ZDIAG) || defined(ZDIAG2) + int status; +#endif // ZDIAG || ZDIAG2 + unsigned long dlen; +#ifdef ZDIAG2 + static unsigned char sum = 0; + static unsigned numnz = 0; +#endif + static unsigned char *gzipTerrain = NULL, *orgTerrain = NULL; + +#ifdef ZDIAG2 + fprintf( stderr, "Receiving Terrain packet. This should be %d.\n", curseq+1 ); +#endif + + if( (done == TERRAIN_DONE) && (received_terrain_info == TERRAIN_STARTED ) ){ + // receiving new terrain info + free( gzipTerrain ); + free( orgTerrain ); + free( terrainInfo ); + gzipTerrain = orgTerrain = NULL; + terrainInfo = NULL; + curseq = done = totbytes = 0; + } + + curseq++; + if( (curseq != pkt->sequence) || !(received_terrain_info) ){ + // Should fill in a list of all packets missed + // or request header packet from server + fprintf( stderr, "Blech! Received terrain packet before terrain_info\n" ); + return; + } +#ifdef ZDIAG2 + fprintf( stderr, "Receiving packet %d out of %d\n", curseq, pkt->total_pkts ); +#endif + if( !gzipTerrain ){ + gzipTerrain = (unsigned char *)malloc( pkt->total_pkts << 7 ); +#if defined(ZDIAG) || defined(ZDIAG2) + fprintf( stderr, "Allocating %d bytes for gzipTerrain.\n", pkt->total_pkts << 7 ); +#endif + // another yukko constant + } + if( !orgTerrain ){ + orgTerrain = (unsigned char *)malloc( terrain_x*terrain_y ); + dlen = terrain_x * terrain_y; +#if defined(ZDIAG) || defined(ZDIAG2) + fprintf( stderr, "Allocating %d bytes for orgTerrain.\n", dlen ); +#endif + } + for( i = 0; i < pkt->length; i++ ){ +#ifdef ZDIAG2 + if( !(i%10) ){ + fprintf( stderr, "Params: %d, %d\n", ((curseq-1)<<7)+i, i ); + } +#endif + gzipTerrain[((curseq-1)<<7)+i] = pkt->terrain_type[i]; + } + totbytes += pkt->length; + if( curseq == pkt->total_pkts ){ +#if defined(ZDIAG) || defined(ZDIAG2) + status = uncompress( orgTerrain, &dlen, gzipTerrain, totbytes ); + if( status != Z_OK ){ + if( status == Z_BUF_ERROR ){ + fprintf( stderr, "Unable to uncompress -- Z_BUF_ERROR.\n" ); + } + if( status == Z_MEM_ERROR ){ + fprintf( stderr, "Unable to uncompress -- Z_MEM_ERROR.\n" ); + } + if( status = Z_DATA_ERROR ){ + fprintf( stderr, "Unable to uncompress -- Z_DATA_ERROR!\n" ); + } + } + else{ + fprintf( stderr, "Total zipped terrain received: %d bytes\n", totbytes ); + } +#else + uncompress( orgTerrain, &dlen, gzipTerrain, totbytes ); +#endif + terrainInfo = (struct t_unit *)malloc( dlen * sizeof( struct t_unit ) ); + for( i = 0; i < dlen; i++ ){ + terrainInfo[i].types = orgTerrain[i]; +#ifdef ZDIAG2 + sum |= orgTerrain[i]; + if( orgTerrain[i] != 0 ){ + numnz++; + } +#endif + } + done = received_terrain_info = TERRAIN_DONE; +#ifdef ZDIAG2 + fprintf( stderr, "Sum = %d, numnz = %d\n", sum, numnz ); +#endif + } +*/ +} + +void handleTempPack (struct obvious_packet *packet) +{ +/* + struct obvious_packet reply; + // printf("New MOTD info available\n"); + erase_motd(); + reply.type = CP_ASK_MOTD; + sendServerPacket((struct player_spacket *) & reply); +*/ +} + +/* handlers for the extension1 packet */ + +int compute_extension1_size (char *pkt) +{ + if (pkt[0] != SP_PARADISE_EXT1) + return -1; + + 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 -1; + } +} + +void handleExtension1 (struct paradiseext1_spacket *packet) +{ +/* + switch (packet->subtype) { + case SP_PE1_MISSING_BITMAP: + { + struct pe1_missing_bitmap_spacket *pkt = + (struct pe1_missing_bitmap_spacket *) packet; + + newMotdPic(ntohs(pkt->x), ntohs(pkt->y), ntohs(pkt->width), ntohs(pkt->height), 0, ntohs(pkt->page)); + } + break; + case SP_PE1_NUM_MISSILES: + me->p_totmissiles = ntohs(((struct pe1_num_missiles_spacket *) packet)->num); + // printf("updated totmissiles to %d\n",me->p_totmissiles); + if (me->p_totmissiles < 0) + me->p_totmissiles = 0; // SB/WB have + break; + default: + printf("unknown paradise extension packet 1 subtype = %d\n", + packet->subtype); + } +*/ +} +void handleThingy (struct thingy_spacket *packet) +{ +/* + struct thingy *thetorp; + + //SANITY_THINGYNUM(ntohs(packet->tnum)); + + thetorp = &thingies[ntohs(packet->tnum)]; + thetorp->t_x = ntohl(packet->x); + thetorp->t_y = ntohl(packet->y); + // printf("drone at %d, %d\n", thetorp->t_x, thetorp->t_y); + thetorp->t_dir = packet->dir; + + + if (rotate) { + rotate_gcenter(&thetorp->t_x, &thetorp->t_y); + rotate_dir(&thetorp->t_dir, rotate_deg); + } + + if (thetorp->t_shape == SHP_WARP_BEACON) + redrawall = 1; // shoot, route has changed +*/ +} + +void handleThingyInfo (struct thingy_info_spacket *packet) +{ +/* + struct thingy *thetorp; + + //SANITY_THINGYNUM(ntohs(packet->tnum)); + + thetorp = &thingies[ntohs(packet->tnum)]; + + thetorp->t_owner = ntohs(packet->owner); + + if (thetorp->t_shape == SHP_WARP_BEACON) + redrawall = 1; // redraw the lines, I guess + + if (ntohs(packet->shape) == SHP_BOOM && thetorp->t_shape == SHP_BLANK) { + // FAT: redundant explosion; don't update p_ntorp + // printf("texplode ignored\n"); + return; + } + + if (thetorp->t_shape == SHP_BLANK && ntohs(packet->shape) != SHP_BLANK) { + players[thetorp->t_owner].p_ndrone++; + } + if (thetorp->t_shape != SHP_BLANK && ntohs(packet->shape) == SHP_BLANK) { + players[thetorp->t_owner].p_ndrone--; + } + thetorp->t_war = packet->war; + + if (ntohs(packet->shape) != thetorp->t_shape) { + // FAT: prevent explosion reset + int shape = ntohs(packet->shape); + + if(shape == SHP_BOOM || shape == SHP_PBOOM) { + if(thetorp->t_shape == SHP_FIGHTER) + shape = SHP_FBOOM; + if(thetorp->t_shape == SHP_MISSILE) + shape = SHP_DBOOM; + thetorp->t_fuse = BIGINT; + } + thetorp->t_shape = shape; + } +*/ +} + +void handleScan (struct scan_spacket *packet) { struct player *pp; @@ -2670,16 +3089,42 @@ pp->p_damage = ntohl (packet->p_damage); pp->p_etemp = ntohl (packet->p_etemp); pp->p_wtemp = ntohl (packet->p_wtemp); - informScan (packet->pnum); } } -informScan (p) - int p; +void handleGameparams (struct gameparam_spacket *packet) { + /*switch (pkt->subtype) { + case 0: + handleGPsizes((struct gp_sizes_spacket *) pkt); + break; + case 1: + handleGPteam((struct gp_team_spacket *) pkt); + break; + case 2: + handleGPteamlogo((struct gp_teamlogo_spacket *) pkt); + break; + case 3: + handleGPshipshape((struct gp_shipshape_spacket *) pkt); + break; + case 4: + handleGPshipbitmap((struct gp_shipbitmap_spacket *) pkt); + break; + case 5: + handleGPrank((struct gp_rank_spacket *) pkt); + break; + case 6: + handleGProyal((struct gp_royal_spacket *) pkt); + break; + case 7: + handleGPteamplanet((struct gp_teamplanet_spacket *) pkt); + break; + default: + fprintf(stderr, "Gameparams packet subtype %d not yet implemented\n", + pkt->subtype); + }*/ } - -#endif /* INCLUDE_SCAN */ +#endif /* PARADISE*/ /* UDP stuff */ void @@ -3698,8 +4143,7 @@ ntohl(((struct planet_loc_spacket *) packet)->y), ((struct planet_loc_spacket *) packet)->name ); break; -#ifdef INCLUDE_SCAN - /* NOTE: not implemented */ +#ifdef PARADISE case SP_SCAN : /* ATM: results of player * * * scan */ LineToConsole("\nS->C SP_SCAN\t"); @@ -4200,8 +4644,7 @@ LineToConsole(","); } break; -#ifdef INCLUDE_SCAN - /* NOTE: not implemented. */ +#ifdef PARADISE case CP_SCAN : /* ATM: request for player * * * * scan */