tBetter support for cops; GTK+ client now fully supports "new" fighting code - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 30a0b83c50180421e73560ab86e52103b2a06a78
 (DIR) parent 001a80142b0fb405b15b8353bc9427cffd05228a
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun, 22 Oct 2000 20:41:39 +0000
       
       Better support for cops; GTK+ client now fully supports "new" fighting code
       
       
       Diffstat:
         M src/dopewars.c                      |      36 ++++++++++++++++++++++++++++++-
         M src/dopewars.h                      |      12 ++++++++++--
         M src/gtk_client.c                    |      56 +++++++++++++++++++++----------
         M src/message.c                       |      45 +++++++++++++++++++++++++++-----
         M src/message.h                       |       5 ++++-
         M src/serverside.c                    |      11 ++++++++---
       
       6 files changed, 135 insertions(+), 30 deletions(-)
       ---
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -56,7 +56,8 @@ int Port=7902,Sanitized=0,ConfigVerbose=0,DrugValue;
        char *HiScoreFile=NULL,*ServerName=NULL,*Pager=NULL;
        char WantHelp,WantVersion,WantAntique,WantColour,WantNetwork;
        char WantedClient;
       -int NumLocation=0,NumGun=0,NumDrug=0,NumSubway=0,NumPlaying=0,NumStoppedTo=0;
       +int NumLocation=0,NumGun=0,NumCop=0,NumDrug=0,NumSubway=0,
       +    NumPlaying=0,NumStoppedTo=0;
        Player Noone;
        int LoanSharkLoc=DEFLOANSHARK,BankLoc=DEFBANK,GunShopLoc=DEFGUNSHOP,
            RoughPubLoc=DEFROUGHPUB;
       t@@ -102,6 +103,7 @@ GScannerConfig ScannerConfig = {
        struct LOCATION StaticLocation,*Location=NULL;
        struct DRUG StaticDrug,*Drug=NULL;
        struct GUN StaticGun,*Gun=NULL;
       +struct COP *Cop=NULL;
        struct COPS Cops = { 70,2,65,2,5,2,30 };
        struct NAMES Names = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
                               NULL,NULL,NULL,NULL };
       t@@ -393,6 +395,11 @@ char *DefaultStoppedTo[NUMSTOPPEDTO] = {
           N_("smoke a cigarette")
        };
        
       +struct COP DefaultCop[NUMCOP] = {
       +   { N_("Officer Hardass"),N_("deputy"),N_("deputies") },
       +   { N_("Officer Bob"),N_("deputy"),N_("deputies") }
       +};
       +
        struct GUN DefaultGun[NUMGUN] = {
           { N_("Baretta"),3000,4,5 },
           { N_(".38 Special"),3500,4,9 },
       t@@ -985,6 +992,25 @@ void ResizeLocations(int NewNum) {
           NumLocation=NewNum;
        }
        
       +void ResizeCops(int NewNum) {
       +   int i;
       +   if (NewNum<NumCop) for (i=NewNum;i<NumCop;i++) {
       +      g_free(Cop[i].Name);
       +      g_free(Cop[i].DeputyName);
       +      g_free(Cop[i].DeputiesName);
       +   }
       +   Cop=g_realloc(Cop,sizeof(struct COP)*NewNum);
       +   if (NewNum>NumCop) {
       +      memset(&Cop[NumCop],0,(NewNum-NumCop)*sizeof(struct COP));
       +      for (i=NumCop;i<NewNum;i++) {
       +         Cop[i].Name=g_strdup("");
       +         Cop[i].DeputyName=g_strdup("");
       +         Cop[i].DeputiesName=g_strdup("");
       +      }
       +   }
       +   NumCop=NewNum;
       +}
       +
        void ResizeGuns(int NewNum) {
           int i;
           if (NewNum<NumGun) for (i=NewNum;i<NumGun;i++) {
       t@@ -1091,6 +1117,12 @@ void CopyLocation(struct LOCATION *dest,struct LOCATION *src) {
           dest->MinDrug=src->MinDrug; dest->MaxDrug=src->MaxDrug;
        }
        
       +void CopyCop(struct COP *dest,struct COP *src) {
       +   AssignName(&dest->Name,_(src->Name));
       +   AssignName(&dest->DeputyName,_(src->DeputyName));
       +   AssignName(&dest->DeputiesName,_(src->DeputiesName));
       +}
       +
        void CopyGun(struct GUN *dest,struct GUN *src) {
           AssignName(&dest->Name,_(src->Name));
           dest->Price=src->Price;
       t@@ -1420,6 +1452,8 @@ void SetupParameters() {
        
           ResizeLocations(NUMLOCATION);
           for (i=0;i<NumLocation;i++) CopyLocation(&Location[i],&DefaultLocation[i]);
       +   ResizeCops(NUMCOP);
       +   for (i=0;i<NumCop;i++) CopyCop(&Cop[i],&DefaultCop[i]);
           ResizeGuns(NUMGUN);
           for (i=0;i<NumGun;i++) CopyGun(&Gun[i],&DefaultGun[i]);
           ResizeDrugs(NUMDRUG);
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -112,7 +112,7 @@ struct BITCH {
        extern int ClientSock,ListenSock;
        extern char Network,Client,Server,NotifyMetaServer,AIPlayer;
        extern int Port,Sanitized,DrugValue;
       -extern int NumLocation,NumGun,NumDrug,NumSubway,NumPlaying,NumStoppedTo;
       +extern int NumLocation,NumGun,NumCop,NumDrug,NumSubway,NumPlaying,NumStoppedTo;
        extern gchar *HiScoreFile,*ServerName,*Pager;
        extern char WantHelp,WantVersion,WantAntique,WantColour,WantNetwork;
        extern char WantedClient;
       t@@ -146,6 +146,7 @@ extern int NumTurns;
        
        #define NUMDRUG      12
        #define NUMGUN       4
       +#define NUMCOP       2
        #define NUMLOCATION  8
        
        #define ESCAPE  0
       t@@ -210,6 +211,11 @@ extern int NumTurns;
        #define E_DOCTOR     123
        #define E_MAXOOS     124
        
       +struct COP {
       +   gchar *Name,*DeputyName,*DeputiesName;
       +};
       +extern struct COP DefaultCop[NUMCOP],*Cop;
       +
        struct GUN {
           gchar *Name;
           price_t Price;
       t@@ -292,7 +298,7 @@ struct PLAYER_T {
           ConnBuf ReadBuf,WriteBuf;
           Abilities Abil;
           GPtrArray *FightArray;
       -   gboolean IsCop;
       +   gint IsCop;
        };
        
        #define CM_SERVER 0
       t@@ -361,6 +367,7 @@ gchar *pricetostr(price_t price);
        gchar *FormatPrice(price_t price);
        char IsInventoryClear(Inventory *Guns,Inventory *Drugs);
        void ResizeLocations(int NewNum);
       +void ResizeCops(int NewNum);
        void ResizeGuns(int NewNum);
        void ResizeDrugs(int NewNum);
        void ResizeSubway(int NewNum);
       t@@ -370,6 +377,7 @@ void AssignName(gchar **dest,gchar *src);
        void CopyNames(struct NAMES *dest,struct NAMES *src);
        void CopyMetaServer(struct METASERVER *dest,struct METASERVER *src);
        void CopyLocation(struct LOCATION *dest,struct LOCATION *src);
       +void CopyCop(struct COP *dest,struct COP *src);
        void CopyGun(struct GUN *dest,struct GUN *src);
        void CopyDrug(struct DRUG *dest,struct DRUG *src);
        void CopyDrugs(struct DRUGS *dest,struct DRUGS *src);
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -467,25 +467,30 @@ void PrintMessage(char *text) {
        static void FightCallback(GtkWidget *widget,gpointer data) {
           gint Answer;
           Player *Play;
       -   gchar *text;
       +   gchar text[4];
       +   GtkWidget *window;
       +   gpointer CanRunHere=NULL;
       +
       +   window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW);
       +   if (window) CanRunHere=gtk_object_get_data(GTK_OBJECT(window),"CanRunHere");
       +
           Answer=GPOINTER_TO_INT(data);
           Play=ClientData.Play;
           switch(Answer) {
              case 'D':
                 gtk_widget_hide(FightDialog); break;
              case 'R':
       -         gtk_widget_hide(FightDialog);
       -         Jet(); break;
       -      case 'F': case 'S':
       -         if (Play->Flags&CANSHOOT &&
       -             ((Answer=='F' && TotalGunsCarried(Play)>0) ||
       -              (Answer=='S' && TotalGunsCarried(Play)==0))) {
       -            Play->Flags &= ~CANSHOOT;
       -            text=g_strdup_printf("%c",Answer);
       -            SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,text);
       -            g_free(text);
       +         if (CanRunHere) {
       +            SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,"R");
       +         } else {
       +            gtk_widget_hide(FightDialog);
       +            Jet();
                 }
                 break;
       +      case 'F': case 'S':
       +         text[0]=Answer; text[1]='\0';
       +         SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,text);
       +         break;
           }
        }
        
       t@@ -569,6 +574,9 @@ void DisplayFightMessage(char *Data) {
           gint EditPos;
           GtkWidget *Fight,*Stand,*Run,*Text;
           char cr[] = "\n";
       +   gchar *AttackName,*DefendName,FightPoint,*Message;
       +   int DefendHealth,DefendBitches,BitchesKilled,ArmPercent;
       +   gboolean CanRunHere,Loot,CanFire;
        
           if (!Data) {
              if (FightDialog) {
       t@@ -590,18 +598,32 @@ void DisplayFightMessage(char *Data) {
        
           Play=ClientData.Play;
        
       -   g_strdelimit(Data,"^",'\n');
       -   if (strlen(Data)>0) {
       +   if (HaveAbility(Play,A_NEWFIGHT)) {
       +      ReceiveFightMessage(Data,&AttackName,&DefendName,&DefendHealth,
       +                          &DefendBitches,&BitchesKilled,&ArmPercent,
       +                          &FightPoint,&CanRunHere,&Loot,&CanFire,&Message);
       +   } else {
       +      Message=Data;
       +      if (Play->Flags&FIGHTING) FightPoint=F_MSG; else FightPoint=F_LASTLEAVE;
       +      CanFire = (Play->Flags&CANSHOOT);
       +      CanRunHere=FALSE;
       +   }
       +   gtk_object_set_data(GTK_OBJECT(FightDialog),"CanRunHere",
       +                       GINT_TO_POINTER(CanRunHere));
       +
       +   g_strdelimit(Message,"^",'\n');
       +   if (strlen(Message)>0) {
              EditPos=gtk_text_get_length(GTK_TEXT(Text));
       -      gtk_editable_insert_text(GTK_EDITABLE(Text),Data,strlen(Data),&EditPos);
       +      gtk_editable_insert_text(GTK_EDITABLE(Text),Message,
       +                               strlen(Message),&EditPos);
              gtk_editable_insert_text(GTK_EDITABLE(Text),cr,strlen(cr),&EditPos);
           }
        
       -   if (Play->Flags&CANSHOOT && TotalGunsCarried(Play)>0)
       +   if (CanFire && TotalGunsCarried(Play)>0)
              gtk_widget_show(Fight); else gtk_widget_hide(Fight);
       -   if (Play->Flags&CANSHOOT && TotalGunsCarried(Play)==0)
       +   if (CanFire && TotalGunsCarried(Play)==0)
              gtk_widget_show(Stand); else gtk_widget_hide(Stand);
       -   if (Play->Flags&FIGHTING)
       +   if (FightPoint!=F_LASTLEAVE)
              gtk_widget_show(Run); else gtk_widget_hide(Run);
        }
        
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -994,7 +994,31 @@ void SendFightLeave(Player *Play,gboolean FightOver) {
        }
        
        void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName,
       -                         int *BitchesKilled,gchar *FightPoint,gboolean *Loot) {
       +                         int *DefendHealth,int *DefendBitches,
       +                         int *BitchesKilled,int *ArmPercent,
       +                         gchar *FightPoint,gboolean *CanRunHere,
       +                         gboolean *Loot,gboolean *CanFire,gchar **Message) {
       +   gchar *pt,*Flags;
       +
       +   pt=Data;
       +   *AttackName=GetNextWord(&pt,"");
       +   *DefendName=GetNextWord(&pt,"");
       +   *DefendHealth=GetNextInt(&pt,0);
       +   *DefendBitches=GetNextInt(&pt,0);
       +   *BitchesKilled=GetNextInt(&pt,0);
       +   *ArmPercent=GetNextInt(&pt,0);
       +
       +   Flags=GetNextWord(&pt,NULL);
       +   if (Flags && strlen(Flags)>=4) {
       +      *FightPoint=Flags[0];
       +      *CanRunHere=(Flags[1]=='1');
       +      *Loot=(Flags[2]=='1');
       +      *CanFire=(Flags[3]=='1');
       +   } else {
       +      *FightPoint=F_MSG;
       +      *CanRunHere=*Loot=*CanFire=FALSE;
       +   }
       +   *Message=pt;
        }
        
        void SendFightMessage(Player *Attacker,Player *Defender,
       t@@ -1030,7 +1054,7 @@ void SendFightMessage(Player *Attacker,Player *Defender,
                                  BitchesKilled,ArmPercent,
                                  FightPoint,CanRunHere(To) ? '1' : '0',
                                  Loot ? '1' : '0',
       -                          FightPoint!=F_ARRIVED &&
       +                          FightPoint!=F_ARRIVED && FightPoint!=F_LASTLEAVE &&
                                         CanPlayerFire(To) ? '1' : '0');
              }
              if (Msg) {
       t@@ -1060,6 +1084,15 @@ void FormatFightMessage(Player *To,GString *text,Player *Attacker,
                                gchar FightPoint,gboolean Loot) {
           gchar *Armament,*DefendName,*AttackName;
           int Health,Bitches;
       +   gchar *BitchName,*BitchesName;
       +
       +   if (Defender && Defender->IsCop) {
       +      BitchName=Cop[Defender->IsCop-1].DeputyName;
       +      BitchesName=Cop[Defender->IsCop-1].DeputiesName;
       +   } else {
       +      BitchName=Names.Bitch;
       +      BitchesName=Names.Bitches;
       +   }
        
           AttackName = (!Attacker || Attacker==To ? "" : GetPlayerName(Attacker));
           DefendName = (!Defender || Defender==To ? "" : GetPlayerName(Defender));
       t@@ -1075,7 +1108,7 @@ void FormatFightMessage(Player *To,GString *text,Player *Attacker,
                                           _("armed to the teeth");
                 if (DefendName[0]) {
                    dpg_string_sprintfa(text,_("%s arrives with %d %tde, %s!"),
       -                                DefendName,Bitches,Names.Bitches,Armament);
       +                                DefendName,Bitches,BitchesName,Armament);
                 }
                 break;
              case F_STAND:
       t@@ -1117,7 +1150,7 @@ void FormatFightMessage(Player *To,GString *text,Player *Attacker,
                                         AttackName,DefendName);
                    } else if (BitchesKilled) {
                       dpg_string_sprintfa(text,_("%s shoots at %s and kills a %tde!"),
       -                                   AttackName,DefendName,Names.Bitch);
       +                                   AttackName,DefendName,BitchName);
                     } else {
                       g_string_sprintfa(text,_("%s shoots at %s."),
                                         AttackName,DefendName);
       t@@ -1129,7 +1162,7 @@ void FormatFightMessage(Player *To,GString *text,Player *Attacker,
                    } else if (BitchesKilled) {
                       dpg_string_sprintfa(text,
                                           _("%s shoots at you... and kills a %tde!"),
       -                                   AttackName,Names.Bitch);
       +                                   AttackName,BitchName);
                    } else {
                       g_string_sprintfa(text,_("%s hits you, man!"),AttackName);
                    }
       t@@ -1138,7 +1171,7 @@ void FormatFightMessage(Player *To,GString *text,Player *Attacker,
                       g_string_sprintfa(text,_("You killed %s!"),DefendName);
                    } else if (BitchesKilled) {
                       dpg_string_sprintfa(text,_("You hit %s, and killed a %tde!"),
       -                                   DefendName,Names.Bitch);
       +                                   DefendName,BitchName);
                    } else {
                       g_string_sprintfa(text,_("You hit %s!"),DefendName);
                    }
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -167,7 +167,10 @@ void SendOldCanFireMessage(Player *To,GString *text);
        void SendOldFightPrint(Player *To,GString *text,gboolean FightOver);
        void SendFightLeave(Player *Play,gboolean FightOver);
        void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName,
       -                         int *BitchesKilled,gchar *FightPoint,gboolean *Loot);
       +                         int *DefendHealth,int *DefendBitches,
       +                         int *BitchesKilled,int *ArmPercent,
       +                         gchar *FightPoint,gboolean *CanRunHere,
       +                         gboolean *Loot,gboolean *CanFire,gchar **Message);
        void SendFightMessage(Player *Attacker,Player *Defender,
                              int BitchesKilled,gchar FightPoint,
                              gboolean Loot,gboolean Broadcast,gchar *Msg);
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -348,7 +348,7 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                 BuyObject(Play,Data);
                 break;
              case C_FIGHTACT:
       -         if (Data[0]=='F') Fire(Play); else RunFromCombat(Play);
       +         if (Data[0]=='R') RunFromCombat(Play); else Fire(Play);
                 break;
              case C_ANSWER:
                 HandleAnswer(Play,To,Data);
       t@@ -1184,10 +1184,13 @@ int SendCopOffer(Player *To,char Force) {
        void CopsAttackPlayer(Player *Play) {
        /* Has the cops attack player "Play"                                */
           Player *Cops;
       +   gint CopIndex;
       +
       +   CopIndex=brandom(1,NumCop+1);
           Cops=g_new(Player,1);
           FirstServer=AddPlayer(0,Cops,FirstServer);
       -   SetPlayerName(Cops,"Officer Hardass");
       -   Cops->IsCop=TRUE;
       +   SetPlayerName(Cops,Cop[CopIndex-1].Name);
       +   Cops->IsCop=CopIndex;
           Cops->Cash=Cops->Debt=0;
        
           Cops->Bitches.Carried=10;
       t@@ -1338,6 +1341,8 @@ void RunFromCombat(Player *Play) {
        /* the player for this cowardly act, if applicable                  */
           int EscapeProb,RandNum;
        
       +   if (!Play || !Play->FightArray) return;
       +
           EscapeProb=50;
           RandNum=brandom(0,100);