diff --git a/src/defs.h b/src/defs.h index 8baf069..596c864 100644 --- a/src/defs.h +++ b/src/defs.h @@ -77,11 +77,14 @@ along with this program. If not, see . #define X_VIEW_BORDER 100 #define Y_VIEW_BORDER 100 #define CAMERA_MAX_SPEED 3. + #define MAX_HOMING 20 #define MAX_DOUBLE_HOMING (game.difficulty != DIFFICULTY_ORIGINAL ? 15 : 10) #define MAX_MICRO_HOMING 10 + #define RAY_INTERVAL 250 #define RAY_DAMAGE_DELAY 5 + #define WARP_SPEED MAX(12, 3 * screen->w / 200) #define ALIEN_WARP_SPEED MIN(-15, -3 * screen->w / 160) #define ALIEN_WARP_ACCEL (game.difficulty == DIFFICULTY_ORIGINAL ? -15: -0.5) @@ -94,6 +97,8 @@ along with this program. If not, see . #define MENU_W 400 #define MENU_SPACING 20 +#define SLAVE_RESCUE_TARGET 250 + // Object Flags #define FL_WEAPCO (1L << 0) #define FL_FRIEND (1L << 1) diff --git a/src/game.c b/src/game.c index 7261677..844efc0 100644 --- a/src/game.c +++ b/src/game.c @@ -1887,16 +1887,16 @@ static void game_doHud() if (game.area != MISN_INTERCEPTION) { - screen_blitText(TS_OBJECTIVES_T, screen->w - 250, 20); - sprintf(text, "%d", (mission.remainingObjectives1 + mission.remainingObjectives2)); + /// "%d" must be retained. It is replaced with the number of mission objectives remaining. + sprintf(text, _("Objectives Remaining: %d"), (mission.remainingObjectives1 + mission.remainingObjectives2)); gfx_createTextObject(TS_OBJECTIVES, text, 0, 0, FONT_WHITE); - screen_blitText(TS_OBJECTIVES, screen->w - 55, 21); + screen_blitText(TS_OBJECTIVES, screen->w - gfx_textSprites[TS_OBJECTIVES].image->w - 25, 20); } - screen_blitText(TS_CASH_T, 25, 20); - sprintf(text, "%.6d", game.cash); + /// "%d" must be retained. It is replaced with the player's current total cash. + sprintf(text, _("Cash: $%d"), game.cash); gfx_createTextObject(TS_CASH, text, 0, 0, FONT_WHITE); - screen_blitText(TS_CASH, 90, 21); + screen_blitText(TS_CASH, 25, 20); if (game.difficulty == DIFFICULTY_ORIGINAL) { @@ -1930,23 +1930,28 @@ static void game_doHud() if (player.ammo[0] <= 25) fontColor = FONT_YELLOW; if (player.ammo[0] <= 10) fontColor = FONT_RED; } - screen_blitText(TS_PLASMA_T, screen->w * 5 / 16, screen->h - 50); - sprintf(text, "%.3d", player.ammo[0]); + /// "%.3d" must be retained. It is replaced with the amount of plasma ammo. + sprintf(text, _("Plasma: %.3d"), player.ammo[0]); gfx_createTextObject(TS_PLASMA, text, 0, 0, fontColor); - screen_blitText(TS_PLASMA, screen->w * 5 / 16 + 70, screen->h - 49); + screen_blitText(TS_PLASMA, screen->w * 5 / 16, screen->h - 50); - screen_blitText(TS_AMMO_T, screen->w / 2, screen->h - 50); - - if ((player.weaponType[1] != W_CHARGER) && (player.weaponType[1] != W_LASER)) + if (player.weaponType[1] == W_CHARGER) { - if (player.ammo[1] == 1) - fontColor = FONT_RED; - else - fontColor = FONT_WHITE; - sprintf(text, "%.2d", player.ammo[1]); // rocket ammo - gfx_createTextObject(TS_AMMO, text, 0, 0, fontColor); - screen_blitText(TS_AMMO, screen->w / 2 + 80, screen->h - 49); + /// Used to indicate the charge meter for the charger cannon in the HUD. + gfx_createTextObject(TS_AMMO, _("Charge"), 0, 0, FONT_WHITE); } + else if (player.weaponType[1] == W_LASER) + { + /// Used to indicate the heat meter for the laser cannon in the HUD. + gfx_createTextObject(TS_AMMO, _("Heat"), 0, 0, FONT_WHITE); + } + else + { + /// "%.2d" must be retained. It is replaced with the amount of rocket ammo. + sprintf(text, _("Rockets: %.2d"), player.ammo[1]); + gfx_createTextObject(TS_AMMO, text, 0, 0, FONT_WHITE); + } + screen_blitText(TS_AMMO, screen->w / 2, screen->h - 50); if (((player.weaponType[1] == W_CHARGER) || (player.weaponType[1] == W_LASER)) && (player.ammo[1] > 0)) { @@ -1954,7 +1959,7 @@ static void game_doHud() if (player.ammo[1] > 100) c = red; - bar.x = screen->w / 2 + 65; + bar.x = screen->w / 2 + gfx_textSprites[TS_AMMO].image->w + 10; bar.y = screen->h - 50; bar.h = 12; diff --git a/src/intermission.c b/src/intermission.c index 3be3469..8ee61de 100644 --- a/src/intermission.c +++ b/src/intermission.c @@ -919,7 +919,9 @@ static void intermission_createMissionDetailSurface(SDL_Surface *comms, int miss case MISN_RESCUESLAVES: /// Mission dialog: Eyananth, interceptions (Sid Wilson) - strcpy(string, _("As you know, WEAPCO has many slaves in this system. If we free a large number of them, it might help to spark a rebellion. I estimate that we will need to rescue around 250 to make a difference.")); + /// "%d" must be retained as-is. It is replaced with the number of slaves that + /// need to be rescued. + sprintf(string, _("As you know, WEAPCO has many slaves in this system. If we free a large number of them, it might help to spark a rebellion. I estimate that we will need to rescue around %d to make a difference."), SLAVE_RESCUE_TARGET); y = intermission_renderDialog(comms, y, FS_SID, string); /// Mission dialog: Eyananth, interceptions (Chris Bainfield) diff --git a/src/mission.c b/src/mission.c index 8956399..3e22aed 100644 --- a/src/mission.c +++ b/src/mission.c @@ -736,7 +736,7 @@ static void mission_evaluate(int type, int id, int *completed, int *targetValue, case MISN_ALLEZ: /// Dialog (friendly transport from Eyananth, Allez mission) /// Used when the friendly transport in the Allez mission is destroyed. - radio_setMessage(FS_CREW, _("Noooo! Hull bre-..."), 1); + radio_setMessage(FS_CREW, _("No no no no no! Hull bre-..."), 1); break; case MISN_URUSOR: /// Dialog (Sid Wilson) @@ -801,13 +801,15 @@ static void mission_evaluate(int type, int id, int *completed, int *targetValue, void mission_updateRequirements(int type, int id, int value) { + char message[STRMAX_SHORT]; + char fmt[STRMAX_SHORT]; + int matched = 0; + int slavesNeeded; + // Can't complete missions if you're dead! if (player.shield <= 0) return; - char message[25]; - char matched = 0; - // We don't need to worry here since if Sid dies, // you will automatically fail the mission(!) if ((type == M_DESTROY_TARGET_TYPE) && (id == CD_SID)) @@ -864,7 +866,7 @@ void mission_updateRequirements(int type, int id, int value) { if (intermission_planets[PLANET_RESCUESLAVES].missionCompleted == 0) { - if (game.slavesRescued >= 250) + if (game.slavesRescued >= SLAVE_RESCUE_TARGET) { info_setLine(_("*** Slaves Rescued - Mission Completed ***"), FONT_GREEN); intermission_planets[PLANET_RESCUESLAVES].missionCompleted = 1; @@ -874,8 +876,26 @@ void mission_updateRequirements(int type, int id, int value) } else { - // XXX: Plurals - sprintf(message, _("Rescue %d more..."), 250 - game.slavesRescued); + slavesNeeded = SLAVE_RESCUE_TARGET - game.slavesRescued; + radio_getRandomMessage(fmt, ngettext( + /// Info line messages for remaining slaves to rescue (singular) + /// This is a "\n"-separated list of possible choices to make. Please feel free + /// to add as many as you like. Each entry must have one instance of "%d", which + /// is replaced with the number remaining. + "Rescue %d more slave...\n" + "Rescue at least %d more slave...\n" + "At least %d more slave to rescue...\n" + "At least %d more rescued slave needed...", + /// Info line messages for remaining slaves to rescue (plural) + /// This is a "\n"-separated list of possible choices to make. Please feel free + /// to add as many as you like. Each entry must have one instance of "%d", which + /// is replaced with the number remaining. + "Rescue %d more slaves...\n" + "Rescue at least %d more slaves...\n" + "At least %d more slaves to rescue...\n" + "At least %d more rescued slaves needed...", + slavesNeeded)); + sprintf(message, fmt, slavesNeeded); info_setLine(message, FONT_CYAN); } } @@ -1149,27 +1169,19 @@ mission begins playing here. */ void mission_showStartScreen() { + // TODO: Replace all "TS_*_T" objs with string formatting, plus adjust + // spacing for things like TS_SHIELD screen_clear(black); renderer_update(); gfx_loadSprites(); + /// Used to indicate the player's shield meter in the HUD. gfx_createTextObject(TS_SHIELD, _("Shield"), 0, 0, FONT_WHITE); - gfx_createTextObject(TS_PLASMA_T, _("Plasma:"), 0, 0, FONT_WHITE); - - if (player.weaponType[1] == W_CHARGER) - gfx_createTextObject(TS_AMMO_T, _("Charge"), 0, 0, FONT_WHITE); - else if (player.weaponType[1] == W_LASER) - gfx_createTextObject(TS_AMMO_T, _("Heat"), 20, 0, FONT_WHITE); - else - gfx_createTextObject(TS_AMMO_T, _("Rockets:"), 0, 0, FONT_WHITE); gfx_createTextObject(TS_TARGET, _("Target"), 0, 0, FONT_WHITE); gfx_createTextObject(TS_TARGET_SID, _("Sid"), 0, 0, FONT_WHITE); gfx_createTextObject(TS_TARGET_PHOEBE, _("Phoebe"), 0, 0, FONT_WHITE); gfx_createTextObject(TS_TARGET_KLINE, _("Kline"), 0, 0, FONT_WHITE); - // XXX: Bad assumption! Replace with string formatting ASAP! - gfx_createTextObject(TS_CASH_T, "Cash: $", 0, 0, FONT_WHITE); - gfx_createTextObject(TS_OBJECTIVES_T, "Objectives Remaining:", 0, 0, FONT_WHITE); gfx_createTextObject(TS_TIME_T, "Time Remaining - ", 0, 0, FONT_WHITE); gfx_createTextObject(TS_POWER, "Power", 0, 0, FONT_WHITE); gfx_createTextObject(TS_OUTPUT, "Output", 0, 0, FONT_WHITE);