t%/.../ notation added, to qualify translatable strings; more comments for translators added to the GTK+ client - 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 81d376b3c81127ee132ca8434fff10385e323510
(DIR) parent 223eb15eb6d838f9426947cf77c6b4f742abc0c7
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Sat, 7 Apr 2001 19:18:19 +0000
%/.../ notation added, to qualify translatable strings; more comments for
ttranslators added to the GTK+ client
Diffstat:
M doc/i18n.html | 11 +++++++++--
M src/gtk_client.c | 105 +++++++++++++++++++++++++++++--
M src/serverside.c | 5 +++--
M src/tstring.c | 8 ++++++++
4 files changed, 120 insertions(+), 9 deletions(-)
---
(DIR) diff --git a/doc/i18n.html b/doc/i18n.html
t@@ -123,7 +123,14 @@ in the translation that you haven't given an alternative form for, the
default word ("bitch") will be used. In the original English, "<tt>%tde</tt>"
is used for this purpose, but there is nothing special about the "<tt>de</tt>"
code - you can use it yourself if you like, and you can use as many
-different two-letter codes as you want to.
+different two-letter codes as you want to.<p>
+
+Additionally, prices in dopewars are automatically formatted into strings by
+means of the %P notation, and comments can be introduced into format strings
+by means of the %/.../ notation. Everything between the two / characters is
+not printed. This is used to "qualify" some strings for translation, and the
+%/.../ can be left out of the translated string if desired (the comment does
+not need to be translated).
</ul>
t@@ -172,7 +179,7 @@ Molenda</a>
<ul>
<li><a href="index.html">Main index</a>
</ul>
-Last update: <b>02-12-2000</b>
+Last update: <b>07-04-2001</b>
</body>
</html>
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -155,6 +155,7 @@ static void GetSpyReports(GtkWidget *widget,gpointer data);
static void DisplaySpyReports(Player *Play);
static GtkItemFactoryEntry menu_items[] = {
+/* The names of the the menus and their items in the GTK+ client */
{ N_("/_Game"),NULL,NULL,0,"<Branch>" },
{ N_("/Game/_New"),"<control>N",NewGame,0,NULL },
{ N_("/Game/_Quit"),"<control>Q",QuitGame,0,NULL },
t@@ -182,6 +183,7 @@ static gchar *MenuTranslate(const gchar *path,gpointer func_data) {
static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level,
const gchar *message,gpointer user_data) {
GtkMessageBox(NULL,message,
+/* Titles of the message boxes for warnings and errors */
log_level&G_LOG_LEVEL_WARNING ? _("Warning") : _("Message"),
MB_OK);
}
t@@ -202,7 +204,10 @@ static guint SetAccelerator(GtkWidget *labelparent,gchar *Text,
void QuitGame(GtkWidget *widget,gpointer data) {
if (!InGame ||
- GtkMessageBox(ClientData.window,_("Abandon current game?"),
+ GtkMessageBox(ClientData.window,
+/* Prompt in 'quit game' dialog */
+ _("Abandon current game?"),
+/* Title of 'quit game' dialog */
_("Quit Game"),MB_YESNO)==IDYES) {
gtk_main_quit();
}
t@@ -220,7 +225,9 @@ gint MainDelete(GtkWidget *widget,GdkEvent *event,gpointer data) {
void NewGame(GtkWidget *widget,gpointer data) {
if (InGame) {
- if (GtkMessageBox(ClientData.window,_("Abandon current game?"),
+ if (GtkMessageBox(ClientData.window,
+ _("Abandon current game?"),
+/* Title of 'stop game to start a new game' dialog */
_("Start new game"),MB_YESNO)==IDYES) EndGame();
else return;
}
t@@ -240,6 +247,8 @@ void ListInventory(GtkWidget *widget,gpointer data) {
gtk_window_set_default_size(GTK_WINDOW(window),550,120);
accel_group=gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);
+
+/* Title of inventory window */
gtk_window_set_title(GTK_WINDOW(window),_("Inventory"));
IsShowingInventory=TRUE;
t@@ -266,6 +275,7 @@ void ListInventory(GtkWidget *widget,gpointer data) {
hsep=gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0);
+/* Caption of the button to close a dialog */
button=gtk_button_new_with_label(_("Close"));
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy),
t@@ -389,6 +399,7 @@ void HandleClientMessage(char *pt,Player *Play) {
tmp=(Player *)list->data;
tmp->Flags &= ~FIGHTING;
}
+/* Message displayed when the player "jets" to a new location */
text=dpg_strdup_printf(_("Jetting to %tde"),
Location[(int)Play->IsAt].Name);
PrintMessage(text); g_free(text);
t@@ -396,9 +407,13 @@ void HandleClientMessage(char *pt,Player *Play) {
case C_ENDLIST:
MenuItem=gtk_item_factory_get_widget(ClientData.Menu,
"<main>/Errands/Spy");
+
+/* Text to update the Errands/Spy menu item with the price for spying */
text=dpg_strdup_printf(_("_Spy\t(%P)"),Prices.Spy);
SetAccelerator(MenuItem,text,NULL,NULL,NULL);
g_free(text);
+
+/* Text to update the Errands/Tipoff menu item with the price for a tipoff */
text=dpg_strdup_printf(_("_Tipoff\t(%P)"),Prices.Tipoff);
MenuItem=gtk_item_factory_get_widget(ClientData.Menu,
"<main>/Errands/Tipoff");
t@@ -472,6 +487,7 @@ void AddScoreToDialog(char *Data) {
/* Get the first word - the score */
spl1 = g_strsplit(cp," ",1);
if (!spl1 || !spl1[0] || !spl1[1]) {
+/* Error - the high score from the server is invalid */
g_warning(_("Corrupt high score!"));
g_strfreev(spl1);
return;
t@@ -539,6 +555,8 @@ static void EndHighScore(GtkWidget *widget) {
void CompleteHighScoreDialog(gboolean AtEnd) {
GtkWidget *OKButton,*dialog;
dialog=HiScoreDialog.dialog;
+
+/* Caption of the "OK" button in dialogs */
OKButton=gtk_button_new_with_label(_("OK"));
gtk_signal_connect_object(GTK_OBJECT(OKButton),"clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy),
t@@ -700,17 +718,23 @@ static void CreateFightDialog() {
hbbox=gtk_hbutton_box_new();
+/* Button for closing the "Fight" dialog and going back to dealing drugs
+ (%Tde = "Drugs" by default) */
buf=dpg_strdup_printf(_("_Deal %Tde"),Names.Drugs);
button=AddFightButton(buf,accel_group,GTK_BOX(hbbox),'D');
gtk_object_set_data(GTK_OBJECT(dialog),"deal",button);
g_free(buf);
+/* Button for shooting at other players in the "Fight" dialog, or for
+ popping up the "Fight" dialog from the main window */
button=AddFightButton(_("_Fight"),accel_group,GTK_BOX(hbbox),'F');
gtk_object_set_data(GTK_OBJECT(dialog),"fight",button);
+/* Button to stand and take it in the "Fight" dialog */
button=AddFightButton(_("_Stand"),accel_group,GTK_BOX(hbbox),'S');
gtk_object_set_data(GTK_OBJECT(dialog),"stand",button);
+/* Button to run from combat in the "Fight" dialog */
button=AddFightButton(_("_Run"),accel_group,GTK_BOX(hbbox),'R');
gtk_object_set_data(GTK_OBJECT(dialog),"run",button);
t@@ -758,7 +782,11 @@ static void UpdateCombatant(gchar *DefendName,int DefendBitches,
RowIndex=0;
}
+/* Display of number of bitches or deputies during combat (%tde="bitches"
+ or "deputies" (etc.) by default) */
BitchText=dpg_strdup_printf(_("%d %tde"),DefendBitches,BitchName);
+
+/* Display of health during combat */
HealthText=g_strdup_printf(_("Health: %d"),DefendHealth);
ProgPercent=(gfloat)DefendHealth/100.0;
t@@ -770,7 +798,9 @@ static void UpdateCombatant(gchar *DefendName,int DefendBitches,
gtk_progress_bar_update(GTK_PROGRESS_BAR(compt->healthprog),
ProgPercent);
} else {
+/* Display of the current player's name during combat */
compt->name = gtk_label_new(DefendName[0] ? DefendName : _("You"));
+
gtk_table_attach_defaults(GTK_TABLE(table),compt->name,0,1,
RowIndex,RowIndex+1);
compt->bitches = gtk_label_new(BitchText);
t@@ -906,6 +936,7 @@ void DisplayStats(Player *Play,struct StatusWidgets *Status) {
gtk_label_set_text(GTK_LABEL(Status->DebtValue),prstr);
g_free(prstr);
+/* Display of carried guns in GTK+ client status window */
tstring_fmt(&tfmt,&tstr,_("**Stats: Guns** %Tde"),Names.Guns);
gtk_label_set_text(GTK_LABEL(Status->GunsName),tstr[0]);
tstring_free(tfmt,tstr);
t@@ -913,6 +944,7 @@ void DisplayStats(Player *Play,struct StatusWidgets *Status) {
gtk_label_set_text(GTK_LABEL(Status->GunsValue),text->str);
if (!WantAntique) {
+/* Display of number of bitches in GTK+ client status window */
tstring_fmt(&tfmt,&tstr,_("**Stats: Bitches** %Tde"),Names.Bitches);
gtk_label_set_text(GTK_LABEL(Status->BitchesName),tstr[0]);
tstring_free(tfmt,tstr);
t@@ -1073,7 +1105,9 @@ void Jet() {
accel_group=gtk_accel_group_new();
dialog=gtk_window_new(GTK_WINDOW_DIALOG);
+/* Title of 'Jet' dialog */
gtk_window_set_title(GTK_WINDOW(dialog),_("Jet to location"));
+
gtk_container_set_border_width(GTK_CONTAINER(dialog),7);
gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group);
gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
t@@ -1082,6 +1116,7 @@ void Jet() {
vbox=gtk_vbox_new(FALSE,7);
+/* Prompt in 'Jet' dialog */
label=gtk_label_new(_("Where to, dude ? "));
gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
t@@ -1105,7 +1140,9 @@ void Jet() {
button=gtk_button_new_with_label(Location[i].Name);
} else {
button=gtk_button_new_with_label("");
- name=g_strdup_printf("_%c. %s",AccelChar,Location[i].Name);
+
+/* Display of locations in 'Jet' window (%tde="The Bronx" etc. by default) */
+ name=dpg_strdup_printf(_("_%c. %tde"),AccelChar,Location[i].Name);
SetAccelerator(button,name,button,"clicked",accel_group);
g_free(name);
}
t@@ -1138,20 +1175,28 @@ static void UpdateDealDialog() {
DrugInd=DealDialog.DrugInd;
Play=ClientData.Play;
+/* Display of the current price of the selected drug in 'Deal Drugs' dialog */
dpg_string_sprintf(text,_("at %P"),Play->Drugs[DrugInd].Price);
gtk_label_set_text(GTK_LABEL(DealDialog.cost),text->str);
CanDrop=Play->Drugs[DrugInd].Carried;
+
+/* Display of current inventory of the selected drug in 'Deal Drugs' dialog
+ (%tde="Opium" etc. by default) */
dpg_string_sprintf(text,_("You are currently carrying %d %tde"),
CanDrop,Drug[DrugInd].Name);
gtk_label_set_text(GTK_LABEL(DealDialog.carrying),text->str);
CanCarry=Play->CoatSize;
+
+/* Available space for drugs in 'Deal Drugs' dialog */
g_string_sprintf(text,_("Available space: %d"),CanCarry);
gtk_label_set_text(GTK_LABEL(DealDialog.space),text->str);
if (DealDialog.Type==BT_BUY) {
CanAfford=Play->Cash/Play->Drugs[DrugInd].Price;
+
+/* Number of the selected drug that you can afford in 'Deal Drugs' dialog */
g_string_sprintf(text,_("You can afford %d"),CanAfford);
gtk_label_set_text(GTK_LABEL(DealDialog.afford),text->str);
MaxDrug=MIN(CanCarry,CanAfford);
t@@ -1201,6 +1246,7 @@ void DealDrugs(GtkWidget *widget,gpointer data) {
gint DrugInd,i,SelIndex,FirstInd;
gboolean DrugIndOK;
+/* Action in 'Deal Drugs' dialog - "Buy/Sell/Drop Drugs" */
if (data==BT_BUY) Action=_("Buy");
else if (data==BT_SELL) Action=_("Sell");
else if (data==BT_DROP) Action=_("Drop");
t@@ -1315,6 +1361,8 @@ void DealDrugs(GtkWidget *widget,gpointer data) {
GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0);
+
+/* Caption of "Cancel" button for GTK+ client dialogs */
button=gtk_button_new_with_label(_("Cancel"));
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy),
t@@ -1351,6 +1399,7 @@ void DealGuns(GtkWidget *widget,gpointer data) {
} else return;
+/* Title of 'gun shop' dialog (%tde="guns" by default) */
if (data==BT_BUY) Title=dpg_strdup_printf(_("Buy %tde"),Names.Guns);
else if (data==BT_SELL) Title=dpg_strdup_printf(_("Sell %tde"),Names.Guns);
else Title=dpg_strdup_printf(_("Drop %tde"),Names.Guns);
t@@ -1358,7 +1407,7 @@ void DealGuns(GtkWidget *widget,gpointer data) {
text=g_string_new("");
if (data!=BT_BUY && TotalGunsCarried(ClientData.Play)==0) {
- dpg_string_sprintf(text,_("You don't have any %tde!"),Names.Guns);
+ dpg_string_sprintf(text,_("You don't have any %tde to sell!"),Names.Guns);
GtkMessageBox(dialog,text->str,Title,MB_OK);
} else if (data==BT_BUY && TotalGunsCarried(ClientData.Play) >=
ClientData.Play->Bitches.Carried+2) {
t@@ -1405,6 +1454,9 @@ void QuestionDialog(char *Data,Player *From) {
GtkWidget *dialog,*label,*vbox,*hsep,*hbbox,*button;
GtkAccelGroup *accel_group;
gchar *Responses,**split,*LabelText;
+
+/* Button titles that correspond to the single-keypress options provided
+ by the curses client (e.g. _Yes corresponds to 'Y' etc.) */
gchar *Words[] = { N_("_Yes"), N_("_No"), N_("_Run"),
N_("_Fight"), N_("_Attack"), N_("_Evade") };
gint numWords = sizeof(Words) / sizeof(Words[0]);
t@@ -1424,7 +1476,10 @@ void QuestionDialog(char *Data,Player *From) {
gtk_signal_connect(GTK_OBJECT(dialog),"delete_event",
GTK_SIGNAL_FUNC(DisallowDelete),NULL);
gtk_object_set_data(GTK_OBJECT(dialog),"From",(gpointer)From);
+
+/* Title of the 'ask player a question' dialog */
gtk_window_set_title(GTK_WINDOW(dialog),_("Question"));
+
gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group);
gtk_container_set_border_width(GTK_CONTAINER(dialog),7);
gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
t@@ -1551,22 +1606,30 @@ GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status) {
label=Status->Date = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,2,4,0,1);
+/* Available space label in GTK+ client status display */
label=Status->SpaceName = gtk_label_new(_("Space"));
+
gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,0,1);
label=Status->SpaceValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,0,1);
+/* Player's cash label in GTK+ client status display */
label=Status->CashName = gtk_label_new(_("Cash"));
+
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
label=Status->CashValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,1,2);
+/* Player's debt label in GTK+ client status display */
label=Status->DebtName = gtk_label_new(_("Debt"));
+
gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);
label=Status->DebtValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,3,4,1,2);
+/* Player's bank balance label in GTK+ client status display */
label=Status->BankName = gtk_label_new(_("Bank"));
+
gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,1,2);
label=Status->BankValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,1,2);
t@@ -1581,7 +1644,9 @@ GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status) {
label=Status->BitchesValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,3,4,2,3);
+/* Player's health label in GTK+ client status display */
label=Status->HealthName = gtk_label_new(_("Health"));
+
gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,2,3);
label=Status->HealthValue = gtk_label_new(NULL);
gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,2,3);
t@@ -1601,7 +1666,9 @@ void SetJetButtonTitle(GtkAccelGroup *accel_group) {
ClientData.JetAccel=SetAccelerator(button,
(ClientData.Play && ClientData.Play->Flags & FIGHTING) ?
- _("_Fight") : _("_Jet!"),button,"clicked",accel_group);
+ _("_Fight") :
+/* Caption of 'Jet' button in main window */
+ _("_Jet!"),button,"clicked",accel_group);
}
#ifdef CYGWIN
t@@ -1636,6 +1703,8 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
ClientData.PlayerName=NULL;
ClientData.Play=NULL;
window=ClientData.window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+/* Title of main window in GTK+ client */
gtk_window_set_title(GTK_WINDOW(window),_("dopewars"));
gtk_window_set_default_size(GTK_WINDOW(window),450,390);
gtk_signal_connect(GTK_OBJECT(window),"delete_event",
t@@ -1714,6 +1783,7 @@ void display_intro(GtkWidget *widget,gpointer data) {
const int rows=5,cols=3;
int i,j;
gchar *table_data[5][3] = {
+/* Credits labels in GTK+ 'about' dialog */
{ N_("Drug Dealing and Research"), "Dan Wolf", NULL },
{ N_("Play Testing"), "Phil Davis", "Owen Walsh" },
{ N_("Extensive Play Testing"), "Katherine Holt",
t@@ -1724,7 +1794,10 @@ void display_intro(GtkWidget *widget,gpointer data) {
};
dialog=gtk_window_new(GTK_WINDOW_DIALOG);
+
+/* Title of GTK+ 'about' dialog */
gtk_window_set_title(GTK_WINDOW(dialog),_("About dopewars"));
+
gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
gtk_window_set_transient_for(GTK_WINDOW(dialog),
GTK_WINDOW(ClientData.window));
t@@ -1733,6 +1806,7 @@ void display_intro(GtkWidget *widget,gpointer data) {
vbox=gtk_vbox_new(FALSE,5);
label=gtk_label_new(
+/* Main content of GTK+ 'about' dialog */
_("Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
"imaginary drug market. dopewars is an All-American game which features\n"
"buying, selling, and trying to get past the cops!\n\n"
t@@ -1741,6 +1815,7 @@ _("Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
"have one month of game time to make your fortune.\n"));
gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
+/* Version and copyright notice in GTK+ 'about' dialog */
VersionStr=g_strdup_printf(_("Version %s "
"Copyright (C) 1998-2000 Ben Webb ben@bellatrix.pcl.ox.ac.uk\n"
"dopewars is released under the GNU General Public Licence\n"),VERSION);
t@@ -1759,6 +1834,7 @@ _("Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
gtk_box_pack_start(GTK_BOX(vbox),table,FALSE,FALSE,0);
label=gtk_label_new(
+/* Label at the bottom of GTK+ 'about' dialog */
_("\nFor information on the command line options, type dopewars -h at your\n"
"Unix prompt. This will display a help screen, listing the available "
"options."));
t@@ -1797,6 +1873,7 @@ static void FinishConnect(gpointer data,gint socket,
widgets->ConnectTag=0;
NetworkError=FinishSetupNetwork();
if (NetworkError) {
+/* Error: GTK+ client could not connect to the given dopewars server */
text=g_strdup_printf(_("Status: Could not connect (%s)"),NetworkError);
gtk_label_set_text(GTK_LABEL(widgets->status),text);
g_free(text);
t@@ -1808,6 +1885,7 @@ static void FinishConnect(gpointer data,gint socket,
static void DoConnect(struct StartGameStruct *widgets) {
gchar *text,*NetworkError;
+/* Message displayed during the attempted connect to a dopewars server */
text=g_strdup_printf(_("Status: Attempting to contact %s..."),ServerName);
gtk_label_set_text(GTK_LABEL(widgets->status),text); g_free(text);
t@@ -1869,8 +1947,11 @@ static void FillMetaServerList(struct StartGameStruct *widgets) {
titles[1]=g_strdup_printf("%d",ThisServer->Port);
titles[2]=ThisServer->Version;
if (ThisServer->CurPlayers==-1) {
+/* Displayed if we don't know how many players are logged on to a server */
titles[3]=_("Unknown");
} else {
+/* e.g. "5 of 20" means 5 players are logged on to a server, out of a
+ maximum of 20 */
titles[3]=g_strdup_printf(_("%d of %d"),ThisServer->CurPlayers,
ThisServer->MaxPlayers);
}
t@@ -1938,6 +2019,7 @@ void NewGameDialog() {
guint AccelKey;
gboolean UpdateMeta=FALSE;
+/* Column titles of metaserver information */
server_titles[0]=_("Server");
server_titles[1]=_("Port");
server_titles[2]=_("Version");
t@@ -1956,6 +2038,7 @@ void NewGameDialog() {
gtk_window_set_default_size(GTK_WINDOW(dialog),400,250);
accel_group=gtk_accel_group_new();
+/* Title of 'New Game' dialog */
gtk_window_set_title(GTK_WINDOW(widgets.dialog),_("New Game"));
gtk_container_set_border_width(GTK_CONTAINER(widgets.dialog),7);
gtk_window_add_accel_group(GTK_WINDOW(widgets.dialog),accel_group);
t@@ -1964,7 +2047,9 @@ void NewGameDialog() {
hbox=gtk_hbox_new(FALSE,7);
label=gtk_label_new("");
+
AccelKey=gtk_label_parse_uline(GTK_LABEL(label),
+/* Prompt for player's name in 'New Game' dialog */
_("Hey dude, what's your _name?"));
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
t@@ -2018,6 +2103,7 @@ void NewGameDialog() {
gtk_box_pack_start(GTK_BOX(vbox2),table,FALSE,FALSE,0);
button=gtk_button_new_with_label("");
+/* Button to connect to a named dopewars server */
SetAccelerator(button,_("_Connect"),button,"clicked",accel_group);
gtk_signal_connect(GTK_OBJECT(button),"clicked",
GTK_SIGNAL_FUNC(ConnectToServer),
t@@ -2029,11 +2115,15 @@ void NewGameDialog() {
label=gtk_label_new(_("Server"));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),frame,label);
+
+/* Title of 'New Game' dialog notebook tab for single-player mode */
frame=gtk_frame_new(_("Single player"));
gtk_container_set_border_width(GTK_CONTAINER(frame),4);
vbox2=gtk_vbox_new(FALSE,7);
gtk_container_set_border_width(GTK_CONTAINER(vbox2),4);
widgets.antique=gtk_check_button_new_with_label("");
+
+/* Checkbox to activate 'antique mode' in single-player games */
SetAccelerator(widgets.antique,_("_Antique mode"),widgets.antique,
"clicked",accel_group);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets.antique),WantAntique);
t@@ -2065,6 +2155,8 @@ void NewGameDialog() {
hbbox=gtk_hbutton_box_new();
button=gtk_button_new_with_label("");
+
+/* Button to update metaserver information */
SetAccelerator(button,_("_Update"),button,
"clicked",accel_group);
gtk_signal_connect(GTK_OBJECT(button),"clicked",
t@@ -2254,14 +2346,17 @@ void TransferDialog(gboolean Debt) {
gtk_table_set_row_spacings(GTK_TABLE(table),4);
gtk_table_set_col_spacings(GTK_TABLE(table),4);
+/* Display of player's cash in bank or loan shark dialog */
text=dpg_strdup_printf(_("Cash: %P"),ClientData.Play->Cash);
label=gtk_label_new(text);
g_free(text);
gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,0,1);
if (Debt) {
+/* Display of player's debt in loan shark dialog */
text=dpg_strdup_printf(_("Debt: %P"),ClientData.Play->Debt);
} else {
+/* Display of player's bank balance in bank dialog */
text=dpg_strdup_printf(_("Bank: %P"),ClientData.Play->Bank);
}
label=gtk_label_new(text);
(DIR) diff --git a/src/serverside.c b/src/serverside.c
t@@ -1771,7 +1771,7 @@ void SendDrugsHere(Player *To,char DisplayBusts) {
/* is TRUE, also regenerates drug prices and sends details of */
/* special events such as drug busts */
int i;
- gchar *Deal;
+ gchar *Deal,*prstr;
GString *text;
gboolean First;
t@@ -1793,7 +1793,8 @@ void SendDrugsHere(Player *To,char DisplayBusts) {
if (!First) SendPrintMessage(NULL,C_NONE,To,text->str);
g_string_truncate(text,0);
for (i=0;i<NumDrug;i++) {
- dpg_string_sprintfa(text,"%P^",To->Drugs[i].Price);
+ g_string_sprintfa(text,"%s^",(prstr=pricetostr(To->Drugs[i].Price)));
+ g_free(prstr);
}
SendServerMessage(NULL,C_NONE,C_DRUGHERE,To,text->str);
g_string_free(text,TRUE);
(DIR) diff --git a/src/tstring.c b/src/tstring.c
t@@ -161,6 +161,10 @@ void GetNextFormat(int *Index,gchar *str,int *StartPos,
Code[1]=str[i+2];
Code[2]=0;
i+=3;
+ } else if (type=='/') {
+ i++;
+ while (str[i]!='\0' && str[i]!='/') i++;
+ if (str[i]=='/') i++;
} else i++;
*ArgNum=anum; *Wid=wid; *Prec=prec; *Index=i; *Type=type;
return;
t@@ -205,6 +209,8 @@ gchar *HandleTFmt(gchar *format, va_list va) {
fdat->data.CharVal=(char)va_arg(va,int); break;
case 's': case 't': case 'T':
fdat->data.StrVal=va_arg(va,char *); break;
+ case '%': case '/':
+ break; /* No special action for %% or %/.../ */
default:
g_error("Unknown format type %c!",fdat->Type);
}
t@@ -239,6 +245,8 @@ gchar *HandleTFmt(gchar *format, va_list va) {
g_string_sprintfa(string,tmpfmt->str,fstr); g_free(fstr); break;
case 's':
g_string_sprintfa(string,tmpfmt->str,fdat->data.StrVal); break;
+ case '%':
+ g_string_append_c(string,'%'); break;
}
}
retstr=string->str;