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);