Mercurial > ~darius > hgwebdir.cgi > paradise_client
diff feature.c @ 3:5a977ccbc7a9 default tip
Empty changelog
author | darius |
---|---|
date | Sat, 06 Dec 1997 05:41:29 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/feature.c Sat Dec 06 05:41:29 1997 +0000 @@ -0,0 +1,222 @@ +/* $Id: feature.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */ + +/* + * Feature.c + * + * March, 1994. Joe Rumsey, Tedd Hadley + * + * most of the functions needed to handle SP_FEATURE/CP_FEATURE + * packets. fill in the features list below for your client, and + * add a call to reportFeatures just before the RSA response is sent. + * handleFeature should just call checkFeature, which will search the + * list and set the appropriate variable. features unknown to the + * server are set to the desired value for client features, and off + * for server/client features. + * + * feature packets look like: +struct feature_cpacket { + char type; + char feature_type; + char arg1, + arg2; + int value; + char name[80]; +}; + + * type is CP_FEATURE, which is 60. feature_spacket is identical. + */ + + +#ifdef FEATURE +#include "copyright.h" + +#include <stdio.h> +#include <sys/types.h> +#include <netinet/in.h> +#include "Wlib.h" +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "proto.h" +#include "packets.h" + + +void sendFeature P((char *name, int feature_type, + int value, int arg1, int arg2)); +void reportFeatures P((void)); + +/* not the actual packets: this holds a list of features to report for */ +/* this client. */ +struct feature { + char *name; + int *var; /* holds allowed/enabled status */ + char feature_type; /* 'S' or 'C' for server/client */ + int value; /* desired status */ + char *arg1, *arg2; /* where to copy args, if non-null */ +} features[] = { + /* + also sent seperately, put here for checking later. should be ok that + it's sent twice. + */ + {"FEATURE_PACKETS", &F_feature_packets, 'S', 1, 0, 0}, + + {"VIEW_BOX", &allowViewBox, 'C', 1, 0, 0}, + {"SHOW_ALL_TRACTORS", &allowShowAllTractorPressor, 'S', 1, 0, 0}, +#ifdef CONTINUOUS_MOUSE + {"CONTINUOUS_MOUSE", &allowContinuousMouse, 'C', 1, 0, 0}, +#endif + {"NEWMACRO", &F_UseNewMacro, 'C', 1, 0, 0}, + /* {"SMARTMACRO",&UseSmartMacro, 'C', 1, 0, 0}, */ + {"MULTIMACROS", &F_multiline_enabled, 'S', 1, 0, 0}, + {"WHY_DEAD", &why_dead, 'S', 1, 0, 0}, + {"CLOAK_MAXWARP", &cloakerMaxWarp, 'S', 1, 0, 0}, +/*{"DEAD_WARP", &F_dead_warp, 'S', 1, 0, 0},*/ +#ifdef RC_DISTRESS + {"RC_DISTRESS", &F_gen_distress, 'S', 1, 0, 0}, +#ifdef BEEPLITE + {"BEEPLITE", &F_allow_beeplite, 'C', 1, (char*)&F_beeplite_flags, 0}, +#endif +#endif +/* terrain features */ + {"TERRAIN", &F_terrain, 'S', 1, (char*)&F_terrain_major, (char*)&F_terrain_minor}, +/* Gzipped MOTD */ + {"GZ_MOTD", &F_gz_motd, 'S', 1, (char*)&F_gz_motd_major, (char*)&F_gz_motd_minor}, + {0, 0, 0, 0, 0, 0} +}; + +void +checkFeature(packet) + struct feature_spacket *packet; +{ + int i; + int value = ntohl(packet->value); + +#ifdef FEAT_DEBUG + if (packet->type != SP_FEATURE) { + printf("Packet type %d sent to checkFeature!\n", packet->type); + return; + } +#endif + printf("%s: %s(%d)\n", &packet->name[0], + ((value == 1) ? "ON" : (value == 0) ? "OFF" : "UNKNOWN"), + value); + + for (i = 0; features[i].name != 0; i++) { + if (strcmpi(packet->name, features[i].name) == 0) { + /* + if server returns unknown, set to off for server mods, desired + value for client mods. Otherwise, set to value from server. + */ + *features[i].var = (value == -1 ? + (features[i].feature_type == 'S' ? 0 : features[i].value) : + value); + if (features[i].arg1) + *features[i].arg1 = packet->arg1; + if (features[i].arg2) + *features[i].arg2 = packet->arg2; + break; + } + } + if (features[i].name == 0) { + printf("Feature %s from server unknown to client!\n", packet->name); + } +/* special cases: */ + if ((strcmpi(packet->name, "FEATURE_PACKETS")==0)) + reportFeatures(); + else if ((strcmpi(packet->name, "RC_DISTRESS") == 0) && F_gen_distress) + distmacro = dist_prefered; + else if ((strcmpi(packet->name, "BEEPLITE") == 0)) { + switch (value) { + case -1: /* Unknown, we can use all of the features! */ + F_beeplite_flags = LITE_PLAYERS_MAP | + LITE_PLAYERS_LOCAL | + LITE_SELF | + LITE_PLANETS | + LITE_SOUNDS | + LITE_COLOR; + break; + case 1: + if (F_beeplite_flags == 0) { /* Server says we can have + beeplite, but no + options??? must be + configured wrong. */ + F_beeplite_flags = LITE_PLAYERS_MAP | + LITE_PLAYERS_LOCAL | + LITE_SELF | + LITE_PLANETS | + LITE_SOUNDS | + LITE_COLOR; + } + if (!(F_beeplite_flags & LITE_PLAYERS_MAP)) + printf(" LITE_PLAYERS_MAP disabled\n"); + if (!(F_beeplite_flags & LITE_PLAYERS_LOCAL)) + printf(" LITE_PLAYERS_LOCAL disabled\n"); + if (!(F_beeplite_flags & LITE_SELF)) + printf(" LITE_SELF disabled\n"); + if (!(F_beeplite_flags & LITE_PLANETS)) + printf(" LITE_PLANETS disabled\n"); + if (!(F_beeplite_flags & LITE_SOUNDS)) + printf(" LITE_SOUNDS disabled\n"); + if (!(F_beeplite_flags & LITE_COLOR)) + printf(" LITE_COLOR disabled\n"); + break; + default: + break; + } + } +} + +/* call this from handleReserved */ +void +reportFeatures() +{ + struct feature *f; + + /* + Don't send features[0], which is the feature for FEATURE_PACKETS itself. + That's sent from main() + */ + for (f = &features[1]; f->name != 0; f++) { + sendFeature(f->name, + f->feature_type, + f->value, + (f->arg1 ? *f->arg1 : 0), + (f->arg2 ? *f->arg2 : 0)); +#ifdef FEAT_DEBUG + printf("(C->S) %s (%c): %d\n", f->name, f->feature_type, f->value); +#endif + } +} + +void +sendFeature(name, feature_type, value, arg1, arg2) + char *name; + int feature_type; + int value; + int arg1, arg2; +{ + struct feature_cpacket packet; + +#ifdef FEAT_DEBUG + printf( "Sending feature %s (value = %d)\n", name, value ); +#endif + strncpy(packet.name, name, sizeof(packet.name)); + packet.type = CP_FEATURE; + packet.name[sizeof(packet.name) - 1] = 0; + packet.feature_type = feature_type; + packet.value = htonl(value); + packet.arg1 = arg1; + packet.arg2 = arg2; + sendServerPacket((struct player_spacket *) & packet); +} + +void +handleFeature(packet) + struct feature_spacket *packet; +{ +#ifdef FEAT_DEBUG + printf( "Handling Feature packet\n" ); +#endif + checkFeature(packet); +} +#endif /* FEATURE */