mirror of
https://git.zap.org.au/git/trader.git
synced 2024-11-03 17:27:29 -05:00
Allow localisation of company letters and map moves (choices)
This commit is contained in:
parent
a024ad83e7
commit
6ef7c7b6da
28
src/exch.c
28
src/exch.c
@ -196,15 +196,29 @@ void exchange_stock (void)
|
||||
|
||||
// Get the actual selection made by the player
|
||||
while (selection == SEL_NONE) {
|
||||
int key = toupper(gettxchar(curwin));
|
||||
bool found;
|
||||
|
||||
if (IS_COMPANY_KEY(key)) {
|
||||
if (company[KEY_TO_COMPANY(key)].on_map) {
|
||||
selection = KEY_TO_COMPANY(key);
|
||||
} else {
|
||||
beep();
|
||||
int key = gettxchar(curwin);
|
||||
|
||||
if (isupper(*keycode_company)) {
|
||||
key = toupper(key);
|
||||
} else if (islower(*keycode_company)) {
|
||||
key = tolower(key);
|
||||
}
|
||||
|
||||
for (i = 0, found = false; keycode_company[i] != '\0'; i++) {
|
||||
if (keycode_company[i] == key) {
|
||||
found = true;
|
||||
if (company[i].on_map) {
|
||||
selection = i;
|
||||
} else {
|
||||
beep();
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
if (! found) {
|
||||
switch (key) {
|
||||
case '1':
|
||||
curs_set(CURS_OFF);
|
||||
|
54
src/game.c
54
src/game.c
@ -108,6 +108,48 @@ static int cmp_player (const void *a, const void *b);
|
||||
|
||||
void init_game (void)
|
||||
{
|
||||
/* Initialise strings used for keycode input and map representations.
|
||||
|
||||
Each string must have an ASCII vertical line (U+007C) in the
|
||||
correct position, followed by context information (such as
|
||||
"input|Company" and "output|MapVals"). This is done to overcome a
|
||||
limitation of gettext_noop() and N_() that does NOT allow context
|
||||
IDs. This vertical line is replaced by a NUL character to
|
||||
terminate the resulting string. The vertical line MAY appear in
|
||||
other positions; if so, it is handled correctly. */
|
||||
|
||||
keycode_company = xstrdup(gettext(default_keycode_company));
|
||||
if (strlen(keycode_company) < MAX_COMPANIES + 1
|
||||
|| keycode_company[MAX_COMPANIES] != '|') {
|
||||
err_exit(_("keycode string for companies has incorrect format: `%s'"),
|
||||
keycode_company);
|
||||
}
|
||||
keycode_company[MAX_COMPANIES] = '\0';
|
||||
|
||||
keycode_game_move = xstrdup(gettext(default_keycode_game_move));
|
||||
if (strlen(keycode_game_move) < NUMBER_MOVES + 1
|
||||
|| keycode_game_move[NUMBER_MOVES] != '|') {
|
||||
err_exit(_("keycode string for game moves has incorrect format: `%s'"),
|
||||
keycode_game_move);
|
||||
}
|
||||
keycode_game_move[NUMBER_MOVES] = '\0';
|
||||
|
||||
printable_map_val = xstrdup(gettext(default_printable_map_val));
|
||||
if (strlen(printable_map_val) < MAX_COMPANIES + 4
|
||||
|| printable_map_val[MAX_COMPANIES + 3] != '|') {
|
||||
err_exit(_("output string for companies has incorrect format: `%s'"),
|
||||
printable_map_val);
|
||||
}
|
||||
printable_map_val[MAX_COMPANIES + 3] = '\0';
|
||||
|
||||
printable_game_move = xstrdup(gettext(default_printable_game_move));
|
||||
if (strlen(printable_game_move) < NUMBER_MOVES + 1
|
||||
|| printable_game_move[NUMBER_MOVES] != '|') {
|
||||
err_exit(_("output string for game moves has incorrect format: `%s'"),
|
||||
printable_game_move);
|
||||
}
|
||||
printable_game_move[NUMBER_MOVES] = '\0';
|
||||
|
||||
// Try to load an old game, if possible
|
||||
if (game_num != 0) {
|
||||
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
|
||||
@ -238,7 +280,7 @@ void init_game (void)
|
||||
|
||||
static int ask_number_players (void)
|
||||
{
|
||||
char *keys_contgame;
|
||||
char *keycode_contgame;
|
||||
chtype *chbuf;
|
||||
int lines, maxwidth;
|
||||
int widthbuf[2];
|
||||
@ -269,7 +311,7 @@ static int ask_number_players (void)
|
||||
first character (keyboard input code) is used to print the user's
|
||||
response if one of those keys is pressed. Both upper and
|
||||
lower-case versions should be present. */
|
||||
keys_contgame = xstrdup(pgettext("input|ContinueGame", "Cc"));
|
||||
keycode_contgame = xstrdup(pgettext("input|ContinueGame", "Cc"));
|
||||
|
||||
done = false;
|
||||
while (! done) {
|
||||
@ -279,8 +321,8 @@ static int ask_number_players (void)
|
||||
wechochar(curwin, key | A_BOLD);
|
||||
ret = key - '0';
|
||||
done = true;
|
||||
} else if (strchr(keys_contgame, key) != NULL) {
|
||||
wechochar(curwin, ((unsigned char) *keys_contgame) | A_BOLD);
|
||||
} else if (strchr(keycode_contgame, key) != NULL) {
|
||||
wechochar(curwin, ((unsigned char) *keycode_contgame) | A_BOLD);
|
||||
ret = 0;
|
||||
done = true;
|
||||
} else {
|
||||
@ -302,7 +344,7 @@ static int ask_number_players (void)
|
||||
}
|
||||
|
||||
curs_set(CURS_OFF);
|
||||
free(keys_contgame);
|
||||
free(keycode_contgame);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -687,6 +729,8 @@ void show_status (int num)
|
||||
val = total_value(num);
|
||||
if (val == 0.0) {
|
||||
center(curwin, 11, 0, attr_normal, attr_highlight, attr_blink, 1,
|
||||
/* TRANSLATORS: The current player is bankrupt (has no
|
||||
shares or cash, ie, whose total value is zero) */
|
||||
_("^[* * * B A N K R U P T * * *^]"));
|
||||
} else {
|
||||
w = getmaxx(curwin);
|
||||
|
@ -54,6 +54,52 @@ const char *company_name[MAX_COMPANIES] = {
|
||||
};
|
||||
|
||||
|
||||
// Default keycodes (keyboard input characters) for each company
|
||||
const char *default_keycode_company =
|
||||
/* TRANSLATORS: This string specifies the keycodes (keyboard input
|
||||
codes) used to enter the Stock Transaction window for each
|
||||
company. There must be exactly eight characters, one for each
|
||||
company in order, before the ASCII vertical line "|"; these must
|
||||
be EITHER all in upper-case or all in lower-case. If at all
|
||||
possible, these should be successive letters in your alphabet (in
|
||||
English, "A" to "H"). Do NOT use digits or control characters.
|
||||
Do not change or translate anything after the vertical line. */
|
||||
N_("ABCDEFGH|input|Companies");
|
||||
|
||||
|
||||
// Default keycodes (keyboard input characters) for each move
|
||||
const char *default_keycode_game_move =
|
||||
/* TRANSLATORS: This string specifies the keycodes used to select a
|
||||
game move. There must be exactly 20 characters, one for each
|
||||
move, before the ASCII vertical line "|"; these must be EITHER all
|
||||
in upper-case or all in lower-case. If at all possible, these
|
||||
should be successive letters in your alphabet. Do NOT use digits
|
||||
or control characters. Do not change or translate anything after
|
||||
the vertical line. */
|
||||
N_("ABCDEFGHIJKLMNOPQRST|input|GameMoves");
|
||||
|
||||
|
||||
// Default printable output representations for each map element
|
||||
const char *default_printable_map_val =
|
||||
/* TRANSLATORS: This string is used to display the galaxy map to
|
||||
screen. There must be exactly 11 characters before the ASCII
|
||||
vertical line. The first ("." in English) is used for empty
|
||||
space, the second ("+") for outposts, the third ("*") for stars,
|
||||
the remaining for the eight companies. Do not change or translate
|
||||
anything after the vertical line. */
|
||||
N_(".+*ABCDEFGH|output|MapVals");
|
||||
|
||||
|
||||
// Default printable output representations for each move
|
||||
const char *default_printable_game_move =
|
||||
/* TRANSLATORS: This string is used to display the game moves
|
||||
(choices). There must be exactly 20 characters before the ASCII
|
||||
vertical line. The first character corresponds to the first
|
||||
character in the "input|GameMoves" string, and so on. Do not
|
||||
change or translate anything after the vertical line. */
|
||||
N_("abcdefghijklmnopqrst|output|GameMoves");
|
||||
|
||||
|
||||
// Ordinal strings
|
||||
const char *ordinal[MAX_PLAYERS + 1] = {
|
||||
"",
|
||||
@ -82,6 +128,11 @@ player_info_t player[MAX_PLAYERS]; // Array of players
|
||||
map_val_t galaxy_map[MAX_X][MAX_Y]; // Map of the galaxy
|
||||
move_rec_t game_move[NUMBER_MOVES]; // Current moves
|
||||
|
||||
char *keycode_company; // Keycodes for each company
|
||||
char *keycode_game_move; // Keycodes for each game move
|
||||
char *printable_map_val; // Printable output for each map value
|
||||
char *printable_game_move; // Printable output for each game move
|
||||
|
||||
int max_turn; // Max. number of turns in game
|
||||
int turn_number; // Current turn (1 to max_turn)
|
||||
int number_players; // Number of players
|
||||
|
@ -130,11 +130,11 @@ typedef enum map_val {
|
||||
#define MAP_TO_COMPANY(m) ((m) - MAP_A)
|
||||
#define IS_MAP_COMPANY(m) ((m) >= MAP_A && (m) <= MAP_LAST)
|
||||
|
||||
#define PRINTABLE_MAP_VAL(m) ((char) (m))
|
||||
|
||||
#define COMPANY_TO_KEY(i) ((i) + 'A')
|
||||
#define KEY_TO_COMPANY(k) ((k) - 'A')
|
||||
#define IS_COMPANY_KEY(k) ((k) >= 'A' && (k) < COMPANY_TO_KEY(MAX_COMPANIES))
|
||||
#define PRINTABLE_MAP_VAL(m) \
|
||||
(((m) == MAP_EMPTY) ? printable_map_val[0] : \
|
||||
(((m) == MAP_OUTPOST) ? printable_map_val[1] : \
|
||||
(((m) == MAP_STAR) ? printable_map_val[2] : \
|
||||
printable_map_val[(m) - MAP_A + 3])))
|
||||
|
||||
|
||||
// Information about a move
|
||||
@ -143,9 +143,7 @@ typedef struct move_rec {
|
||||
int y;
|
||||
} move_rec_t;
|
||||
|
||||
#define MOVE_TO_KEY(m) ((m) + 'a')
|
||||
#define KEY_TO_MOVE(k) ((k) - 'a')
|
||||
#define IS_MOVE_KEY(k) ((k) >= 'a' && (k) < MOVE_TO_KEY(NUMBER_MOVES))
|
||||
#define PRINTABLE_GAME_MOVE(m) (printable_game_move[m])
|
||||
|
||||
|
||||
// Player moves / selection values
|
||||
@ -170,6 +168,18 @@ typedef enum selection {
|
||||
// Company names
|
||||
extern const char *company_name[MAX_COMPANIES];
|
||||
|
||||
// Default keycodes (keyboard input characters) for each company
|
||||
extern const char *default_keycode_company;
|
||||
|
||||
// Default keycodes (keyboard input characters) for each move
|
||||
extern const char *default_keycode_game_move;
|
||||
|
||||
// Default printable output representations for each map element
|
||||
extern const char *default_printable_map_val;
|
||||
|
||||
// Default printable output representations for each move
|
||||
extern const char *default_printable_game_move;
|
||||
|
||||
// Ordinal strings
|
||||
extern const char *ordinal[MAX_PLAYERS + 1];
|
||||
|
||||
@ -183,6 +193,11 @@ extern player_info_t player[MAX_PLAYERS]; // Array of players
|
||||
extern map_val_t galaxy_map[MAX_X][MAX_Y]; // Map of the galaxy
|
||||
extern move_rec_t game_move[NUMBER_MOVES]; // Current moves
|
||||
|
||||
extern char *keycode_company; // Keycodes for each company
|
||||
extern char *keycode_game_move; // Keycodes for each game move
|
||||
extern char *printable_map_val; // Printable output for each map value
|
||||
extern char *printable_game_move; // Printable output for each game move
|
||||
|
||||
extern int max_turn; // Max. number of turns in game
|
||||
extern int turn_number; // Current turn (1 to max_turn)
|
||||
extern int number_players; // Number of players
|
||||
|
115
src/help.c
115
src/help.c
@ -44,9 +44,10 @@ static const char *help_text[] = {
|
||||
Each string is a single page of text that is displayed in an area 76
|
||||
columns wide by 16 lines high. Ideally, each line within the string
|
||||
should be (manually) space-justified or centred; each line is
|
||||
separated by "\n". If a string starts with "@" as the very first
|
||||
character, that string (and all strings following) are ignored: this
|
||||
allows a variable number of help text pages (from one to twelve).
|
||||
separated by "\n". TAB characters and other control codes must NOT
|
||||
be used. If a string starts with "@" as the very first character,
|
||||
that string (and all strings following) are ignored: this allows a
|
||||
variable number of help text pages (from one to twelve).
|
||||
|
||||
The ASCII circumflex accent character "^" switches to a different
|
||||
character rendition (also called attributes), depending on the
|
||||
@ -73,18 +74,23 @@ static const char *help_text[] = {
|
||||
~m - Print the number of moves available (NUMBER_MOVES) [**]
|
||||
~c - Print the maximum number of companies that can be formed (MAX_COMPANIES) [*]
|
||||
~t - Prints the default number of turns in the game (DEFAULT_MAX_TURN) [**]
|
||||
~1 to ~9 - Print the keycode for the N-th choice of move, appropriately localised [*]
|
||||
~1 to ~9 - Print the keycode for the N-th choice of move [*]
|
||||
~M - Print the keycode for the last choice of move [*]
|
||||
~A to ~H - Print the character used to represent the company on the galaxy map, appropriately localised [*]
|
||||
~A to ~H - Print the character used to represent the company on the galaxy map [*]
|
||||
~. - Print the character used to represent empty space on the map [*]
|
||||
~+ - Print the character used to represent outposts on the map [*]
|
||||
~* - Print the character used to represent stars on the map [*]
|
||||
|
||||
[*] Takes one character space in the output
|
||||
[**] Takes two character spaces in the output
|
||||
|
||||
Note that the tilde value escapes do NOT change the current character
|
||||
rendition: a circumflex accent escape is needed for that. For
|
||||
example, to display the first choice of move as it would be shown on
|
||||
the galaxy map, use something like "^k~1^N" (a six-character sequence
|
||||
that would translate to just one character in the output text).
|
||||
Note that all keycodes and map representation characters use locale-
|
||||
specific characters. Note also that the tilde value escapes do NOT
|
||||
change the current character rendition: a circumflex accent escape is
|
||||
needed for that. For example, to display the first choice of move as
|
||||
it would be shown on the galaxy map, use something like "^k~1^N" (a
|
||||
six-character sequence that would translate to just one character in
|
||||
the output text).
|
||||
*/
|
||||
N_(""
|
||||
"^BStar Traders^N is a simple game of interstellar trading. The object of the\n"
|
||||
@ -98,47 +104,47 @@ static const char *help_text[] = {
|
||||
"The map of the galaxy is represented by a ^B~x^N x ^B~y^N grid. A typical section\n"
|
||||
"of it may be:\n"
|
||||
"\n"
|
||||
" ^e . . ^s*^e . . . ^s*^e ^s*^e . ^N\n"
|
||||
" ^e . . . . . . . . . ^N ^e . ^N represents ^Bempty space^N,\n"
|
||||
" ^e . ^s*^e . . . . . . . ^N ^s * ^N represents a ^Bstar^N.\n"
|
||||
" ^e . . . . . . . ^s*^e . ^N\n"
|
||||
" ^e . . . . ^s*^e . . . . ^N\n"
|
||||
" ^e ~. ~. ^s~*^e ~. ~. ~. ^s~*^e ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ~. ~. ~. ~. ~. ~. ^N ^e ~. ^N represents ^Bempty space^N,\n"
|
||||
" ^e ~. ^s~*^e ~. ~. ~. ~. ~. ~. ~. ^N ^s ~* ^N represents a ^Bstar^N.\n"
|
||||
" ^e ~. ~. ~. ~. ~. ~. ~. ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ~. ^s~*^e ~. ~. ~. ~. ^N\n"
|
||||
""),
|
||||
|
||||
N_(""
|
||||
"The computer selects ^B~m^N moves (labeled ^k~1^N to ^k~M^N) at random, and places these\n"
|
||||
"on the map. To select any of the highlighted positions, press that letter.\n"
|
||||
"As an example, some of the moves on the map may be:\n"
|
||||
"For example, some of the moves on the map may be:\n"
|
||||
"\n"
|
||||
"\n"
|
||||
" ^e ^k~1^e . ^s*^e . . . ^s*^e ^s*^e . ^N\n"
|
||||
" ^e . . . ^k~3^e . . . . . ^N\n"
|
||||
" ^e . ^s*^e . . . . ^k~5^e . . ^N Moves ^k~1^N to ^k~5^N shown.\n"
|
||||
" ^e . ^k~2^e . . ^k~4^e . . ^s*^e . ^N\n"
|
||||
" ^e . . . . ^s*^e . . . . ^N\n"
|
||||
" ^e ^k~1^e ~. ^s~*^e ~. ~. ~. ^s~*^e ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ^k~3^e ~. ~. ~. ~. ~. ^N\n"
|
||||
" ^e ~. ^s~*^e ~. ~. ~. ~. ^k~5^e ~. ~. ^N Moves ^k~1^N to ^k~5^N shown.\n"
|
||||
" ^e ~. ^k~2^e ~. ~. ^k~4^e ~. ~. ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ~. ^s~*^e ~. ~. ~. ~. ^N\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"Selecting a position that is ^Bnot^N next to a star (such as moves ^k~1^N, ^k~3^N or ^k~5^N)\n"
|
||||
"will set up an ^Boutpost^N, not belonging to any company. Thus, if move ^k~3^N was\n"
|
||||
"selected on the above map, a ^o + ^N would be placed at that position.\n"
|
||||
"will set up an ^Boutpost^N, not belonging to any company. Thus, if move ^k~3^N is\n"
|
||||
"selected on the above map, a ^o ~+ ^N would be placed at that position.\n"
|
||||
""),
|
||||
|
||||
N_(""
|
||||
"If, on the other hand, a position next to a star (or another outpost) is\n"
|
||||
"selected, a ^Bcompany^N would be formed and its first letter would appear on the\n"
|
||||
"map. As a reward for creating the company, you are granted the first five\n"
|
||||
"shares. Up to ^B~c^N companies can be created in this way.\n"
|
||||
"selected, a ^Bcompany^N would be formed and its letter would appear on the map.\n"
|
||||
"As a reward for creating the company, you are granted the first five shares.\n"
|
||||
"Up to ^B~c^N companies can be created in this way.\n"
|
||||
"\n"
|
||||
"If a position next to an existing company is selected, the company would\n"
|
||||
"expand its operations by one square. This increases the cost of its shares\n"
|
||||
"and hence your return. Thus, if the map was as shown below, selecting ^k~6^N\n"
|
||||
"or ^k~8^N increases Company ^B~B^N's shipping lane:\n"
|
||||
"\n"
|
||||
" ^e ^k~1^e . ^s*^e . . . ^s*^e ^s*^e . ^N\n"
|
||||
" ^e . . . ^o+^e . . ^k~6^e . . ^N\n"
|
||||
" ^e . ^s*^e . . . . ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~6^N or ^k~8^N increases Company ^B~B^N.\n"
|
||||
" ^e . ^k~2^e . . ^k~4^e . . ^s*^e ^c~B^e ^N\n"
|
||||
" ^e . . . . ^s*^e . . . ^k~8^e ^N\n"
|
||||
" ^e ^k~1^e ~. ^s~*^e ~. ~. ~. ^s~*^e ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ^o~+^e ~. ~. ^k~6^e ~. ~. ^N\n"
|
||||
" ^e ~. ^s~*^e ~. ~. ~. ~. ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~6^N or ^k~8^N increases Company ^B~B^N.\n"
|
||||
" ^e ~. ^k~2^e ~. ~. ^k~4^e ~. ~. ^s~*^e ^c~B^e ^N\n"
|
||||
" ^e ~. ~. ~. ~. ^s~*^e ~. ~. ~. ^k~8^e ^N\n"
|
||||
""),
|
||||
|
||||
N_(""
|
||||
@ -146,13 +152,13 @@ static const char *help_text[] = {
|
||||
"five times as much as an extension not next to a star. Thus move ^k~6^N should\n"
|
||||
"be preferred to move ^k~8^N.\n"
|
||||
"\n"
|
||||
" ^e ^c~C^e . ^s*^e . . . ^s*^e ^s*^e . ^N\n"
|
||||
" ^e ^k~1^e ^o+^e . ^o+^e . . ^k~6^e . . ^N\n"
|
||||
" ^e . ^s*^e . . . . ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~6^N is preferred to ^k~8^N.\n"
|
||||
" ^e . ^k~2^e . . ^k~4^e . . ^s*^e ^c~B^e ^N\n"
|
||||
" ^e . . . . ^s*^e . . . ^k~8^e ^N\n"
|
||||
" ^e ^c~C^e ~. ^s~*^e ~. ~. ~. ^s~*^e ^s~*^e ~. ^N\n"
|
||||
" ^e ^k~1^e ^o~+^e ~. ^o~+^e ~. ~. ^k~6^e ~. ~. ^N\n"
|
||||
" ^e ~. ^s~*^e ~. ~. ~. ~. ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~6^N is preferred to ^k~8^N.\n"
|
||||
" ^e ~. ^k~2^e ~. ~. ^k~4^e ~. ~. ^s~*^e ^c~B^e ^N\n"
|
||||
" ^e ~. ~. ~. ~. ^s~*^e ~. ~. ~. ^k~8^e ^N\n"
|
||||
"\n"
|
||||
"You can also expand any company by selecting positions next to outposts.\n"
|
||||
"You may also expand any company by selecting positions next to outposts.\n"
|
||||
"Such outposts will be swallowed up by that company. Thus, move ^k~1^N will\n"
|
||||
"extend Company ^B~C^N by ^Btwo^N squares. As a bonus, outposts next to stars are\n"
|
||||
"more valuable: the company's share price will increase by a greater amount\n"
|
||||
@ -167,11 +173,11 @@ static const char *help_text[] = {
|
||||
"other one. Here, Company ^B~B^N might take over Company ^B~A^N. Company ^B~A^N ceases to\n"
|
||||
"exist, although it may reappear as an entirely new company at a later stage.\n"
|
||||
"\n"
|
||||
" ^e ^k~1^e . ^s*^e . . . ^s*^e ^s*^e . ^N\n"
|
||||
" ^e . . . ^c~A^e ^c~A^e ^k~5^e ^c~B^e . . ^N\n"
|
||||
" ^e . ^s*^e . . ^c~A^e . ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~5^N merges companies ^B~A^N and ^B~B^N.\n"
|
||||
" ^e . ^k~2^e . . . . . ^s*^e ^c~B^e ^N\n"
|
||||
" ^e . . . . ^s*^e . ^o+^e . . ^N\n"
|
||||
" ^e ^k~1^e ~. ^s~*^e ~. ~. ~. ^s~*^e ^s~*^e ~. ^N\n"
|
||||
" ^e ~. ~. ~. ^c~A^e ^c~A^e ^k~5^e ^c~B^e ~. ~. ^N\n"
|
||||
" ^e ~. ^s~*^e ~. ~. ^c~A^e ~. ^c~B^e ^c~B^e ^c~B^e ^N Move ^k~5^N merges companies ^B~A^N and ^B~B^N.\n"
|
||||
" ^e ~. ^k~2^e ~. ~. ~. ~. ~. ^s~*^e ^c~B^e ^N\n"
|
||||
" ^e ~. ~. ~. ~. ^s~*^e ~. ^o~+^e ~. ~. ^N\n"
|
||||
"\n"
|
||||
"When companies merge, players are granted shares in the dominant company\n"
|
||||
"proportional to the amount owned in the old company. As well, a cash bonus\n"
|
||||
@ -180,13 +186,13 @@ static const char *help_text[] = {
|
||||
|
||||
N_(""
|
||||
"Once you select your move, you enter the ^BInterstellar Stock Exchange^N. Here\n"
|
||||
"you can purchase shares, sell them, borrow from the Trading Bank or repay\n"
|
||||
"you may purchase shares, sell them, borrow from the Trading Bank or repay\n"
|
||||
"some of your debt (if applicable). Note that each company issues a limited\n"
|
||||
"number of shares --- you cannot go on buying for ever! You can, however,\n"
|
||||
"number of shares --- you cannot go on buying for ever! You may, however,\n"
|
||||
"bid for more shares to be issued. You have a better chance of succeeding if\n"
|
||||
"you own a larger proportion of the company.\n"
|
||||
"\n"
|
||||
"The game usually ends after ^B~t^N turns. However, you can end the game sooner\n"
|
||||
"The game usually ends after ^B~t^N turns. However, you may end the game sooner\n"
|
||||
"by pressing ^K<CTRL><C>^N when asked to select a move. As well, individual\n"
|
||||
"players can declare themselves bankrupt at any time. If your debt is large\n"
|
||||
"enough, the Bank may do this for you! If you do not complete your game in\n"
|
||||
@ -359,12 +365,27 @@ void show_help (void)
|
||||
case '8':
|
||||
case '9':
|
||||
// N-th choice of move, as a key press
|
||||
wprintw(curwin, "%c", MOVE_TO_KEY(*s - '1'));
|
||||
wprintw(curwin, "%c", PRINTABLE_GAME_MOVE(*s - '1'));
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
// Last choice of move, as a key press
|
||||
wprintw(curwin, "%c", MOVE_TO_KEY(NUMBER_MOVES - 1));
|
||||
wprintw(curwin, "%c", PRINTABLE_GAME_MOVE(NUMBER_MOVES - 1));
|
||||
break;
|
||||
|
||||
case '.':
|
||||
// Map representation of empty space
|
||||
wprintw(curwin, "%c", PRINTABLE_MAP_VAL(MAP_EMPTY));
|
||||
break;
|
||||
|
||||
case '+':
|
||||
// Map representation of an outpost
|
||||
wprintw(curwin, "%c", PRINTABLE_MAP_VAL(MAP_OUTPOST));
|
||||
break;
|
||||
|
||||
case '*':
|
||||
// Map representation of a star
|
||||
wprintw(curwin, "%c", PRINTABLE_MAP_VAL(MAP_STAR));
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
|
@ -42,8 +42,9 @@
|
||||
Returns: (nothing)
|
||||
|
||||
This function displays instructions on how to play Star Traders in a
|
||||
Curses window. It does not depend on any global game variable. On
|
||||
exit, the previous screen is restored and refreshed.
|
||||
Curses window. It does not depend on any global game variables other
|
||||
than printable_map_val[] and printable_game_move[]. On exit, the
|
||||
previous screen is restored and refreshed.
|
||||
*/
|
||||
extern void show_help (void);
|
||||
|
||||
|
14
src/intf.c
14
src/intf.c
@ -2327,8 +2327,8 @@ int gettxlong (WINDOW *win, long int *restrict result, long int min,
|
||||
|
||||
bool answer_yesno (WINDOW *win)
|
||||
{
|
||||
static char *keys_yes;
|
||||
static char *keys_no;
|
||||
static char *keycode_yes;
|
||||
static char *keycode_no;
|
||||
|
||||
bool ret;
|
||||
|
||||
@ -2336,13 +2336,13 @@ bool answer_yesno (WINDOW *win)
|
||||
chtype oldbkgd = getbkgd(win);
|
||||
|
||||
|
||||
if (keys_yes == NULL) {
|
||||
if (keycode_yes == NULL) {
|
||||
/* TRANSLATORS: The strings with msgctxt "input|Yes" and
|
||||
"input|No" contain the keycodes used to determine whether a
|
||||
user is answering "Yes" or "No" in response to some question.
|
||||
Both upper and lower-case versions should be present. */
|
||||
keys_yes = xstrdup(pgettext("input|Yes", "Yy"));
|
||||
keys_no = xstrdup(pgettext("input|No", "Nn"));
|
||||
keycode_yes = xstrdup(pgettext("input|Yes", "Yy"));
|
||||
keycode_no = xstrdup(pgettext("input|No", "Nn"));
|
||||
}
|
||||
|
||||
|
||||
@ -2355,10 +2355,10 @@ bool answer_yesno (WINDOW *win)
|
||||
while (true) {
|
||||
int key = wgetch(win);
|
||||
|
||||
if (strchr(keys_yes, key) != NULL) {
|
||||
if (strchr(keycode_yes, key) != NULL) {
|
||||
ret = true;
|
||||
break;
|
||||
} else if (strchr(keys_no, key) != NULL) {
|
||||
} else if (strchr(keycode_no, key) != NULL) {
|
||||
ret = false;
|
||||
break;
|
||||
} else
|
||||
|
42
src/move.c
42
src/move.c
@ -220,7 +220,7 @@ selection_t get_move (void)
|
||||
// Display current move choices on the galaxy map
|
||||
for (int i = 0; i < NUMBER_MOVES; i++) {
|
||||
mvwaddch(curwin, game_move[i].y + 3, game_move[i].x * 2 + 2,
|
||||
MOVE_TO_KEY(i) | attr_map_choice);
|
||||
PRINTABLE_GAME_MOVE(i) | attr_map_choice);
|
||||
}
|
||||
wrefresh(curwin);
|
||||
|
||||
@ -243,26 +243,42 @@ selection_t get_move (void)
|
||||
right(curwin, 1, getmaxx(curwin) / 2, attr_normal, attr_keycode,
|
||||
attr_choice, 1,
|
||||
_("Select move [^[%c^]-^[%c^]/^{1^}-^{3^}/^{<CTRL><C>^}]: "),
|
||||
MOVE_TO_KEY(0), MOVE_TO_KEY(NUMBER_MOVES - 1));
|
||||
PRINTABLE_GAME_MOVE(0), PRINTABLE_GAME_MOVE(NUMBER_MOVES - 1));
|
||||
|
||||
curs_set(CURS_ON);
|
||||
wrefresh(curwin);
|
||||
|
||||
// Get the actual selection made by the player
|
||||
while (selection == SEL_NONE) {
|
||||
int key = tolower(gettxchar(curwin));
|
||||
int i;
|
||||
bool found;
|
||||
|
||||
if (IS_MOVE_KEY(key)) {
|
||||
selection = KEY_TO_MOVE(key);
|
||||
int key = gettxchar(curwin);
|
||||
|
||||
curs_set(CURS_OFF);
|
||||
left(curwin, 1, getmaxx(curwin) / 2, attr_normal, attr_choice,
|
||||
0, 1,
|
||||
/* TRANSLATORS: "Move" refers to the choice of moves
|
||||
made by the current player (out of a selection of
|
||||
20 moves). */
|
||||
_("Move ^{%c^}"), key);
|
||||
} else {
|
||||
if (isupper(*keycode_game_move)) {
|
||||
key = toupper(key);
|
||||
} else if (islower(*keycode_game_move)) {
|
||||
key = tolower(key);
|
||||
}
|
||||
|
||||
for (i = 0, found = false; keycode_game_move[i] != '\0'; i++) {
|
||||
if (keycode_game_move[i] == key) {
|
||||
found = true;
|
||||
selection = i;
|
||||
|
||||
curs_set(CURS_OFF);
|
||||
left(curwin, 1, getmaxx(curwin) / 2, attr_normal,
|
||||
attr_choice, 0, 1,
|
||||
/* TRANSLATORS: "Move" refers to the choice of
|
||||
moves made by the current player (out of a
|
||||
selection of 20 moves). */
|
||||
_("Move ^{%c^}"), PRINTABLE_GAME_MOVE(i));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (! found) {
|
||||
switch (key) {
|
||||
case '1':
|
||||
curs_set(CURS_OFF);
|
||||
|
Loading…
Reference in New Issue
Block a user