tBetter support for cops; GTK+ client now fully supports "new" fighting code - … | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 30a0b83c50180421e73560ab86e52103b2a06a78 | |
parent 001a80142b0fb405b15b8353bc9427cffd05228a | |
Author: Ben Webb <[email protected]> | |
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(-) | |
--- | |
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… | |
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); | |
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); | |
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); | |
} | |
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… | |
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 … | |
_("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 … | |
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 … | |
} 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 … | |
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); | |
} | |
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); | |
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); | |