From be2515e33d0e776c0c84a0d02b7db48cd343cdc3 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sat, 2 Nov 2024 19:20:33 -0700 Subject: [PATCH 01/23] languagetool: Skip comments --- tools/languagetool/main.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/languagetool/main.c b/tools/languagetool/main.c index eb9fa8620..f10c6ab8f 100644 --- a/tools/languagetool/main.c +++ b/tools/languagetool/main.c @@ -30,6 +30,19 @@ void error_exit(const char *message, int line_number) { exit(EXIT_FAILURE); } +static char *lang_nextline(char *line, size_t sizeof_line, FILE *file, int *line_number) { + assert(sizeof_line > 1); + while(true) { + (*line_number)++; + char *read_line = fgets(line, sizeof_line, file); + if(read_line && *read_line == '#') { + // skip comments + continue; + } + return read_line; + } +} + // Function to extract value after colon with validation char *extract_value(char *line, const char *field_name, int line_number, bool allow_empty) { { @@ -68,8 +81,7 @@ char *extract_value(char *line, const char *field_name, int line_number, bool al int read_entry(FILE *file, sd_language *language, int *line_number) { char line[MAX_LINE]; - *line_number += 1; - if(!fgets(line, sizeof(line), file)) { + if(!lang_nextline(line, sizeof(line), file, line_number)) { // EOF is ok here return 0; } @@ -91,8 +103,7 @@ int read_entry(FILE *file, sd_language *language, int *line_number) { error_exit(error, *line_number); } - *line_number += 1; - if(!fgets(line, sizeof(line), file)) { + if(!lang_nextline(line, sizeof(line), file, line_number)) { error_exit("Unexpected EOF while reading Title", *line_number); } @@ -101,8 +112,7 @@ int read_entry(FILE *file, sd_language *language, int *line_number) { str_strip(&desc); // Read Data header - *line_number += 1; - if(!fgets(line, sizeof(line), file)) { + if(!lang_nextline(line, sizeof(line), file, line_number)) { error_exit("Unexpected EOF while reading Data", *line_number); } @@ -123,8 +133,7 @@ int read_entry(FILE *file, sd_language *language, int *line_number) { data_iter += value_len; // Read data body until next entry or EOF - while(fgets(line, sizeof(line), file)) { - *line_number += 1; + while(lang_nextline(line, sizeof(line), file, line_number)) { // Check if this is the start of a new entry if(strncmp(line, "ID:", 3) == 0) { // Rewind to start of this line From 59ee5a5b46f668c6911fb2066987f152044a3ad4 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sat, 2 Nov 2024 19:26:45 -0700 Subject: [PATCH 02/23] languagetool: Use MAX_TITLE instead of hardcoding 31 --- tools/languagetool/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/languagetool/main.c b/tools/languagetool/main.c index f10c6ab8f..66ac4be5f 100644 --- a/tools/languagetool/main.c +++ b/tools/languagetool/main.c @@ -156,7 +156,7 @@ int read_entry(FILE *file, sd_language *language, int *line_number) { data_iter[-1] = '\0'; } - size_t max_desc_len = 31; + size_t max_desc_len = MAX_TITLE - 1; if(str_size(&desc) > max_desc_len) { fprintf(stderr, "Warning: truncating overlong 'Title:' of entry id %d. Length is %zu, max length is %zu\n", language->count, str_size(&desc), max_desc_len); From 83cfb98449d59da2589848ab1980e0758e25979f Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sat, 2 Nov 2024 19:31:33 -0700 Subject: [PATCH 03/23] languagetool: Allow 'auto' IDs in TXT --- tools/languagetool/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/languagetool/main.c b/tools/languagetool/main.c index 66ac4be5f..7203d7173 100644 --- a/tools/languagetool/main.c +++ b/tools/languagetool/main.c @@ -91,7 +91,9 @@ int read_entry(FILE *file, sd_language *language, int *line_number) { str value; str_from_c(&value, extract_value(line, "ID", *line_number, false)); str_strip(&value); - if(!str_to_long(&value, &id)) { + if(strcmp(str_c(&value), "auto") == 0) { + id = (long)language->count; + } else if(!str_to_long(&value, &id)) { error_exit("ID must be a valid integer", *line_number); } str_free(&value); From caff3521d351d9120babf7c40c950b155c5ce629 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sat, 2 Nov 2024 19:52:36 -0700 Subject: [PATCH 04/23] Mark error_exit as noreturn --- tools/languagetool/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/languagetool/main.c b/tools/languagetool/main.c index 7203d7173..2538d52e4 100644 --- a/tools/languagetool/main.c +++ b/tools/languagetool/main.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #if defined(ARGTABLE2_FOUND) #include @@ -25,7 +26,7 @@ #define MAX_DATA 8192 // Data field cannot exceed 32 bytes #define MAX_TITLE 32 -void error_exit(const char *message, int line_number) { +noreturn void error_exit(const char *message, int line_number) { fprintf(stderr, "Error on line %d: %s\n", line_number, message); exit(EXIT_FAILURE); } From 92d6b55e81509dfde3ad1ce115782c9a0def6982 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 19:47:21 -0800 Subject: [PATCH 05/23] Add openomf-translations submodule --- .gitmodules | 4 ++++ resources/translations | 1 + 2 files changed, 5 insertions(+) create mode 100644 .gitmodules create mode 160000 resources/translations diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..d401897f0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "resources/translations"] + path = resources/translations + url = git@github.com:omf2097/openomf-translations.git + branch = master diff --git a/resources/translations b/resources/translations new file mode 160000 index 000000000..8b5bf6798 --- /dev/null +++ b/resources/translations @@ -0,0 +1 @@ +Subproject commit 8b5bf6798e91babc356136a8ddb5f10ebdc03faf From f170465bd1a0445bf48308a018b00d0242ff2bdf Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 20:20:56 -0800 Subject: [PATCH 06/23] BuildLanguages.cmake: Use submodule langs and add LanguageStrings.cmake --- cmake-scripts/BuildLanguages.cmake | 77 ++++++++++++++++---------- cmake-scripts/LanguageStrings.cmake | 77 ++++++++++++++++++++++++++ src/resources/generated_languages.h.in | 16 ++++++ 3 files changed, 140 insertions(+), 30 deletions(-) create mode 100644 cmake-scripts/LanguageStrings.cmake create mode 100644 src/resources/generated_languages.h.in diff --git a/cmake-scripts/BuildLanguages.cmake b/cmake-scripts/BuildLanguages.cmake index 7cde27d48..e69ccee2e 100644 --- a/cmake-scripts/BuildLanguages.cmake +++ b/cmake-scripts/BuildLanguages.cmake @@ -1,13 +1,38 @@ +# +# BuildLanguages.cmake has two jobs: +# - it generates src/resources/generated_languages.h from LanguageStrings.cmake, and +# - if option BUILD_LANGUAGES is on, builds the .LNG files from resources/translations/*.TXT +# + +macro(lang_str enum_name) + if(${ARGC} GREATER 1) + set(count "${ARGV1}") + + if(${count} LESS 1) + message(FATAL_ERROR "Cannot add less than 1 of lang_str '${enum_name}'.") + endif() + + string(APPEND LANG_ENUM "\n ${enum_name} = ${Lang_Count},") + string(APPEND LANG_ENUM "\n ${enum_name}_Last = ${Lang_Count} + (${count} - 1),\n") + math(EXPR Lang_Count "${Lang_Count} + ${count}") + else() + string(APPEND LANG_ENUM "\n ${enum_name} = ${Lang_Count},\n") + math(EXPR Lang_Count "${Lang_Count} + 1") + endif() +endmacro() +set(Lang_Count 0) +set(LANG_ENUM "") +include("cmake-scripts/LanguageStrings.cmake") +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/resources/generated_languages.h.in" "${CMAKE_CURRENT_BINARY_DIR}/src/resources/generated_languages.h") + +message(STATUS "BuildLanguages' Lang_Count: ${Lang_Count}") + + if(NOT BUILD_LANGUAGES) + # early out, having written generated_languages.h return() endif() -# OMF 2097 Epic Challenge Arena -set(LANG_STRCOUNT 1013) -set(OMF_LANGS ENGLISH GERMAN) -# OpenOMF-specific -set(LANG2_STRCOUNT 1) -set(OPENOMF_LANGS DANISH) if(WIN32) set(LANGUAGE_INSTALL_PATH "openomf/resources/") @@ -15,44 +40,36 @@ else() set(LANGUAGE_INSTALL_PATH "share/games/openomf/") endif() +# glob all language sources +set(LANG_SRC "${PROJECT_SOURCE_DIR}/resources/translations") +file(GLOB OPENOMF_LANGS + LIST_DIRECTORIES false + CONFIGURE_DEPENDS + "${LANG_SRC}/*.TXT" +) + # generate custom target info set(BUILD_LANG_COMMANDS) set(BUILD_LANG_SOURCES) -foreach(LANG ${OMF_LANGS}) - set(TXT2 "${PROJECT_SOURCE_DIR}/resources/${LANG}2.TXT") - set(DAT2 "${CMAKE_CURRENT_BINARY_DIR}/resources/${LANG}.DAT2") - list(APPEND BUILD_LANG_SORUCES "${TXT2}") - list(APPEND BUILD_LANG_COMMANDS - DEPENDS "${TXT2}" - BYPRODUCTS "${DAT2}" - COMMAND ${CMAKE_COMMAND} -E echo_append "${LANG}, " - COMMAND "$" -i "${TXT2}" -o "${DAT2}" --check-count ${LANG2_STRCOUNT} - ) - install(FILES "${DAT2}" DESTINATION "${LANGUAGE_INSTALL_PATH}") -endforeach() -foreach(LANG ${OPENOMF_LANGS}) - set(TXT "${PROJECT_SOURCE_DIR}/resources/${LANG}.TXT") - set(TXT2 "${PROJECT_SOURCE_DIR}/resources/${LANG}2.TXT") +foreach(TXT ${OPENOMF_LANGS}) + get_filename_component(LANG "${TXT}" NAME_WE) set(LNG "${CMAKE_CURRENT_BINARY_DIR}/resources/${LANG}.LNG") - set(LNG2 "${CMAKE_CURRENT_BINARY_DIR}/resources/${LANG}.LNG2") - list(APPEND BUILD_LANG_SORUCES "${TXT}" "${TXT2}") + list(APPEND BUILD_LANG_SORUCES "${TXT}") list(APPEND BUILD_LANG_COMMANDS - DEPENDS "${TXT}" "${TXT2}" - BYPRODUCTS "${LNG}" "{LNG2}" + DEPENDS "${TXT}" + BYPRODUCTS "${LNG}" COMMAND ${CMAKE_COMMAND} -E echo_append "${LANG}, " - COMMAND "$" -i "${TXT}" -o "${LNG}" --check-count ${LANG_STRCOUNT} - COMMAND "$" -i "${TXT2}" -o "${LNG2}" --check-count ${LANG2_STRCOUNT} + COMMAND "$" --import "${TXT}" --output "${LNG}" --check-count ${Lang_Count} ) - install(FILES "${LNG}" "${LNG2}" DESTINATION "${LANGUAGE_INSTALL_PATH}") + install(FILES "${LNG}" DESTINATION "${LANGUAGE_INSTALL_PATH}") endforeach() - add_custom_target(build_languages COMMAND ${CMAKE_COMMAND} -E echo_append "Building Languages... " ${BUILD_LANG_COMMANDS} COMMAND ${CMAKE_COMMAND} -E echo_append "done" ) -target_sources(build_languages PRIVATE ${BUILD_LANG_SORUCES}) +target_sources(build_languages PRIVATE ${BUILD_LANG_SOURCES}) add_dependencies(openomf build_languages) add_dependencies(build_languages languagetool) diff --git a/cmake-scripts/LanguageStrings.cmake b/cmake-scripts/LanguageStrings.cmake new file mode 100644 index 000000000..c4ac17b95 --- /dev/null +++ b/cmake-scripts/LanguageStrings.cmake @@ -0,0 +1,77 @@ +# This file is used by BuildLanguages.cmake to make resources/generated_languages.h + +# lang_str( []) +# The is what's used in the C code to refer to this language string. +# Specifying a allows for a range of lang strs to be added under one name + +# strings from OMF 2097 +lang_str(LangPilot 11) +lang_str(LangPilotDescription 11) +lang_str(LangRobot 11) +lang_str(LangRobotDescription 11) +lang_str(LangArena 5) +lang_str(LangArenaDescription 5) +lang_str(LangPronoun 6) +lang_str(LangNewsroomUnrankedChallengerDialog) +lang_str(LangNewsroomUnrankedChallenger 2) +lang_str(LangNewsroomNewChampion) +lang_str(LangNewsroomReport 48) +lang_str(LangCpuDifficulty 7) +lang_str(LangTooPatheticDialog) +lang_str(LangTooPatheticInsult) +lang_str(LangVsInsult1 121) +lang_str(LangVsInsult2 121) +lang_str(LangPlug 16) +lang_str(LangPilotStatPower) +lang_str(LangPilotStatSpeed) +lang_str(LangPilotStatEndurance) +lang_str(LangChooseYourPilot) +lang_str(LangChooseYourRobot) +lang_str(LangSceneEnd) +lang_str(LangSceneEnd1 10) +lang_str(LangSceneEnd2 10) +lang_str(LangSelectTournament) +lang_str(LangSelectPhotoForChr) +lang_str(LangSelectChrToLoad) +lang_str(LangSelectChrToDelete) +lang_str(LangSelectOpponent) +lang_str(LangTrainingTitle 3) +lang_str(LangTrainingConfirmation 3) +lang_str(LangTrainingHelp 3) +lang_str(LangTrainingDone) +lang_str(LangTradeGainCash) +lang_str(LangTradeSpendCash) +lang_str(LangTradeEquitable) +lang_str(LangButtonSelect) +lang_str(LangTournamentFight) +lang_str(LangEnterTrainingHelp) +lang_str(LangBuyUpgradesHelp) +lang_str(LangSellUpgradesHelp) +lang_str(LangChrLoadHelp) +lang_str(LangChrCreateHelp) +lang_str(LangChrDeleteHelp) +lang_str(LangTournamentSimHelp) +lang_str(LangTournamentQuitHelp) +lang_str(LangTournamentRegisterHelp) +lang_str(LangTournamentDifficulty 4) +lang_str(LangNo) +lang_str(LangYes) +lang_str(LangPromptChrName) +lang_str(LangCustomizeColor1) +lang_str(LangCustomizeColor2) +lang_str(LangCustomizeColor3) +lang_str(LangUpgradePowerSell) +lang_str(LangUpgradePowerBuy) +lang_str(LangUpgradeSpeedSell) +lang_str(LangUpgradeSpeedBuy) +lang_str(LangUpgradeArmorSell) +lang_str(LangUpgradeArmorBuy) +lang_str(LangUpgradeStunResistanceSell) +lang_str(LangUpgradeStunResistanceBuy) +lang_str(LangTradeHelp) +lang_str(LangTradeNoneAvailable) +lang_str(LangTradeAvailable) +lang_str(LangUpgradeQuitSell) +lang_str(LangUpgradeQuitBuy) +# strings new in OpenOMF +lang_str(LangLanguage) diff --git a/src/resources/generated_languages.h.in b/src/resources/generated_languages.h.in new file mode 100644 index 000000000..3b88fdfa0 --- /dev/null +++ b/src/resources/generated_languages.h.in @@ -0,0 +1,16 @@ +#ifndef GENERATED_LANGUAGES_H +#define GENERATED_LANGUAGES_H + +/*! \brief OpenOMF String ID + * + * These string IDs are generated by BuildLanguages.cmake from the list in LanguageStrings.cmake, + * and match the generated .LNG files. + */ +enum { +@LANG_ENUM@ + + // Number of strings contained in a .LNG file + Lang_Count = @Lang_Count@ +}; + +#endif // GENERATED_LANGUAGES_H From 4d058a777448fa28937c280ae86369fb957e9861 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 19:49:24 -0800 Subject: [PATCH 07/23] Delete in-tree lang sources --- resources/DANISH.TXT | 4414 ---------------------------------------- resources/DANISH2.TXT | 4 - resources/ENGLISH2.TXT | 3 - resources/GERMAN2.TXT | 3 - 4 files changed, 4424 deletions(-) delete mode 100644 resources/DANISH.TXT delete mode 100644 resources/DANISH2.TXT delete mode 100644 resources/ENGLISH2.TXT delete mode 100644 resources/GERMAN2.TXT diff --git a/resources/DANISH.TXT b/resources/DANISH.TXT deleted file mode 100644 index 3ef3d9dd9..000000000 --- a/resources/DANISH.TXT +++ /dev/null @@ -1,4414 +0,0 @@ -ID: 0 -Title: Hjælp side 1 -Data: {BIDDET 260}{CENTER OFF} -{SIZE 8}{SKYD OVER}{COLOR:YELLOW}One Skal Falde 2097{KOLOR:DELEN} - -{SIZE 6}{SPACING 7} Velkommen til en skal falde 2097. Hvis tanken om 90 fod hoje robotter konstrueret til at rive dig i stykker får dig til at makulere dig i frygt, vil du elske "Exit" -indstillingen. - - Men hvis du er pumpet op og klar til dit livs kamp, lavede vi dette spil for dig! Forbered dig på at sparke robotkoj. - - Læs videre for at finde ud af det indvendige scoop på OMF 2097 - kontrollerne, bevægelserne, turneringerne, spilletips og meget mere. Mens du spiller spillet, kan du til enhver tid trykke på F1-tasten for at bringe disse instruktioner op. - - On-disk manualen er også spækket med endnu flere tips. For at se det, skriv "HELPME" fra DOS-prompten. -{CENTER PÅ} - -ID: 1 -Title: Hjælp side 2 -Data: {CENTER OFF} -{SIZE 8}{SHADOWS ON}{COLOR:YELLOW}Using The Main Menu{COLOR:DEFAULT}{SIZE 6}{SPACINGG 7} - -One Must Fall 2097 giver dig tre markant forskellige typer af spil. - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}One spiller spil -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Dette kaster dig ind i en række kampe, der tester din færdighed i ren hurtig handling kamp. Stål vil boje og gnister vil flyve! - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}Two spiller spil -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Udfordre en menneskelig modstander. To kan spille med tastaturet, tastaturet og joystick, eller to joysticks. - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}Tournament spil -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Begynder med en svag robot, du kæmper for kontanter og bruge dine gevinster til at opgradere din robot. Den ultimative kombination af handling og strategi! -{CENTER PÅ} - -ID: 2 -Title: Hjælp side 3 -Data: {CENTER OFF} -{SIZE 8}{SKADOWS PÅ}{COLOR:YELLOW}Andre Hovedmenuindstillinger{SIZE 6}{COLOR:DEFAULT} - - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}Konfiguration -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Brug dette vigtigste menuvalg til at ændre video, lyd, tastatur og joystick indstillinger. - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}Gameplay -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Tweak spillet hastighed, computer intelligens og andre spil muligheder. Du kan tilpasse OMF 2097 på mange måder. -{CENTER PÅ} - -ID: 3 -Title: Hjælp side 4 -Data: {CENTER OFF} -{SIZE 8}{SHADOWS ON}{COLOR:YELLOW}VVÆLG EN Pilot{COLOR:DELÉR} - -{SIZE 6}{SPACING 7}Når du starter et nyt spil, skal du vælge en pilot til at lede din robot i kamp. Hver pilot har unikke statistikker: - -{SIZE 6}{SPACING 9}{KOLOR:YELLOM}KYGGERE -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} En pilots rene brute styrke. Hvad er, der er, er, at du er hojere, så meget din magt, så meget du har, så meget du har ondt i stikken. - -{SIZE 6}{SPACING 9}{KOLOR:YELLOW}AGILITY -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Hurtige tænkere gor hurtige konkurrenter. Agilitet viser din pilots reaktionshastighed. - -{SIZE 6}{SPACING 9}{ KOLLEGA:YELLOM}ENDURANCE -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Det er ikke kun trækstyrke, der holder en robot på fodderne. Da en pilot foler hvert slag mod sin robot, spiller ENTURANCE en afgorende rolle. -{CENTER PÅ} - -ID: 4 -Title: Hjælp side 5 -Data: {CENTER OFF} -{SIZE 8}{SSKYT OVER}}KOLOR:YELLOM}VÆLG EN robot {KOLOR: FOREDBARK - -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Efter at have valgt en pilot, står du over for din vigtigste beslutning - hvilken robot vil repræsentere dig i kamp. Hver robot har mange angreb eller bevægelser, som han kan skade og til sidst besejre modstandere. Hver robot har også mindst to "særlige bevægelser". - - Specielle bevægelser opnås ved hurtig controller og knapkombinationer. Du skal mestre de særlige træk, hvis du onsker at blive en mester. - - Du kan finde flere oplysninger om kontrol og særlige bevægelser under side 10 og læse manualen (lober HELPME.EXE fra DOS-promenden). -{CENTER PÅ} - -ID: 5 -Title: Hjælp side 6 -Data: {CENTER OFF} -{SIZE 8}{SKADOWS PÅ}{COLOR:YELLOW}Tournament Play{COLOR: DEFAULT} - -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Efter at have valgt turneringsspil, er du i turneringskommandocentret. Kontrolpanelet er nederst på skærmen. Brug den til at kobe eller sælge dele, tage træningskurser og kæmpe i en turnering eller simulering. - - Når du har oprettet en ny pilot, ser du et holografisk billede af din robot. Din robots navn og specielle bevægelser er opfort overst til hojre. - - Din pilot statistik er til venstre: POWER, AGILITY, OG UDENDURANCE. Du kan tage kurser for at forbedre disse. - - Din robots statistik vises nederst til hojre. Disse ændrer sig, når du kober robotopgraderinger. -{CENTER PÅ} - -ID: 6 -Title: Hjælp side 7 -Data: {CENTER OFF} -{SIZE 8}{SSKYGGERE PÅ}{COLOR:YELLOW}Robot Statistik i turneringen Play{COLOR:DEFAULT} - -{STORRELSE 6}{SPACING 9}{COLOR:YELLOW}ARM HASTIGHED OG BEN HASTIGHED -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Disse målere viser hastigheden på din robots lemmer. Som disse stiger, vil du være i stand til at slå og sparke hurtigere. - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}ARM KRÆFT OG BEN KRÆFT -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Disse målere beskriver den skade, du kan gore, når du rammer eller sparker din modstander. - -{SIZE 6}{SPACING 9}{COLOR:YELLOW}STUN MODSTAND -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Opgradere dette for at hjælpe din robot med at håndtere chok af gentagne slag. Uden, vil du ofte blive slået svimmel. - -{SIZE 6}{SPACING 9}{ KOLLER:YELLOW}ARMOR PLATE: -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Armor plade drastisk reducerer skaderne på din robot, når du rammer. -{CENTER PÅ} - -ID: 7 -Title: Hjælp side 8 -Data: {CENTER OFF} -{SIZE 8}{SSKADOVRE PÅ}{COLOR:YELLOW}The Holding Bay{COLOR:DEFAULT} - -{SIZE 6}{SPACING 7} Dette er, hvor robotterne er forberedt og inspiceret til kamp. I et spillerspil vil du se en dialog mellem din pilot og hans modstander. - - I et tospillerspil kan spiller man vælge arenaen til at kæmpe i. Tryk til venstre og hojre for at skifte arenaer. - - Derefter bliver din pilot taget ind i turneringslaboratoriet, hvor hans nervesystem er grænsefladet med hans robot. Han glider derefter ind i en stof-induceret sovn. Da piloten vågner, erstattes hans kod af hærdt stål. Med held og din hjælp kan piloten besejre sin modstander i arenaen. -{CENTER PÅ} - -ID: 8 -Title: Hjælp side 9 -Data: {CENTER OFF} -{SKYER PÅ}{SIZE 8}{COLOR:YELLOW}The Arena{COLOR:DEFAULT} - -{SIZE 6}{SPACING 7}{COLOR:DEFAULT}Nu er det tid til den virkelige test! - - Den rode energimåler overst viser, hvor meget skade din robot kan tage for nedlukning. Enhver vellykket strejke mod dig sænker det samlede belob. Hvis din energimåler dypper under nul, kollapser din robot. - - Den tynde blå bar viser din bedovelsesskade. Denne bar blinker, når den er faretruende lav. Når det falder under nul, bliver din pilot svimmel og mister kontrollen i flere sekunder. - - Nogle arenaer indeholder farlige farer: ildkugler, pigge, kampfly og lignende. Hvis du ikke kan tage varmen, kan du slukke dem i GAMEPLAY-menuen. -{CENTER PÅ} - -ID: 9 -Title: Hjælp side 10 -Data: {CENTER OFF} -{SKYTKRÆNKER PÅ}{SIZE 8}{COLOR:YELLOW}Offense{COLOR:DEFAULT} - -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} Robotter har en bred vifte af angreb. For du kan pommel din modstander med dem, skal du kende kontrollerne. Du kan udfore ethvert træk med enten tastaturet eller et joystick. - -"Forward" betyder for din modstander. -"Back" betyder væk fra din modstander. - - Angrebene bruger disse retninger sammen med spark og PUNCH knapper. Strygning mens du trykker tilbage vil producere et andet træk end at slå, mens du trykker fremad. - - Tryk op for at springe. For at hoppe hojere og videre, skal du forst trykke ned og tryk derefter op. -{CENTER PÅ} - -ID: 10 -Title: Hjælp side 11 -Data: {CENTER OFF} -{SKYGGES PÅ}{SIZE 8}{COLOR:YELLOW}Defense - -{SIZE 6}{SPACING 7}{COLOR:DEFAULT} For at forsvare dig mod et angreb, mens du er på jorden, skal du trykke tilbage uden at angribe (ikke slå eller sparke). Din robot vil blokere enhver form for bevægelse, undtagen ben fejer. - - For at blokere ben fejer, tryk ned-back. At trykke ned-back vil ikke blokere luftangreb. - - Mens du er luftbåren, kan du ikke forsvare noget angreb. Hop med forsigtighed. -{CENTER PÅ} - -ID: 11 -Title: Hjælp side 12 -Data: {CENTER OFF} -{SKYER ON}{SIZE 8}{COLOR:YELLOW}At spille Tips{COLOR: DEFAULT} - -{SIZE 6}{SPACING 7} Hver pilot giver en robot en helt ny folelse. Prov flere piloter og vælg en, der passer bedst til dine evner. I et enspiller spil, computeren vil spille de andre piloter, ved hjælp af deres individuelle personligheder til at guide intelligensen af de robotter, de udover. - - Hver robot har flere specielle bevægelser, som både er udokumenterede og meget kraftfulde. For at udfore et særligt træk skal du kombinere controllerbevægelser og knaptryk i hurtig rækkefolge. Se computeren spille for at se nogle af de særlige bevægelser, så prov at gore dem selv. - -Eksempel: Udfor Jaguars hjernerystelse Cannon ved at trykke ned-back-punch. -{CENTER PÅ} - -ID: 12 -Title: Hjælp side 13 -Data: {CENTER OFF} -{SKYGGES ON}{SIZE 8}{COLOR:YELLOW}Combos -{SIZE 6}{COLOR:STANDER} -{SIZE 6}{SPACING 7}{ KOLLEGA:SLIGNER EFTERFAULT} - En kombination er en serie af to eller flere bevægelser, der, når de udfores i rækkefolge, gor betydelig skade og ikke kan blokeres efter det forste hit. - - Når du rammer med en combo, får du bonuspoint. Hvis du vil være en virkelig fremragende spiller, mestre så mange kombinationer som du kan finde. -{CENTER PÅ} - -ID: 13 -Title: Hjælp side 14 -Data: Dette skal være lille og normal storrelse. - -ID: 14 -Title: Hjælp side 15 -Data: Dette skal være lille og normal storrelse. - -ID: 15 -Title: Hjælp side 16 -Data: Dette skal være lille og normal storrelse. - -ID: 16 -Title: Hjælp side 17 -Data: Dette skal være lille og normal storrelse. - -ID: 17 -Title: Hjælp side 18 -Data: Dette skal være lille og normal storrelse. - -ID: 18 -Title: Hjælp side 19 -Data: Dette skal være lille og normal storrelse. - -ID: 19 -Title: Hjælp side 20 -Data: Dette skal være lille og normal storrelse. - -ID: 20 -Title: Piloter -Data: Krystal - -ID: 21 -Title: Piloter -Data: Steffan - -ID: 22 -Title: Piloter -Data: Milano - -ID: 23 -Title: Piloter -Data: Christian - -ID: 24 -Title: Piloter -Data: Shirro - -ID: 25 -Title: Piloter -Data: Jean-Paul - -ID: 26 -Title: Piloter -Data: Ibrahim - -ID: 27 -Title: Piloter -Data: Angel - -ID: 28 -Title: Piloter -Data: Cossette - -ID: 29 -Title: Piloter -Data: Raven - -ID: 30 -Title: Piloter -Data: Major Kreissack - -ID: 31 -Title: Robotter -Data: Jaguar - -ID: 32 -Title: Robotter -Data: Skygge - -ID: 33 -Title: Robotter -Data: Thorn - -ID: 34 -Title: Robotter -Data: Pyros - -ID: 35 -Title: Robotter -Data: Electra - -ID: 36 -Title: Robotter -Data: Katana - -ID: 37 -Title: Robotter -Data: Shredder - -ID: 38 -Title: Robotter -Data: Flail - -ID: 39 -Title: Robotter -Data: Gargoyle - -ID: 40 -Title: Robotter -Data: Chronos - -ID: 41 -Title: Robotter -Data: Nova - -ID: 42 -Title: Robotter -Data: -ID: 43 -Title: Robotter -Data: -ID: 44 -Title: Robotter -Data: -ID: 45 -Title: Robotter -Data: -ID: 46 -Title: Robotter -Data: -ID: 47 -Title: Robotter -Data: -ID: 48 -Title: Robotter -Data: -ID: 49 -Title: Robotter -Data: -ID: 50 -Title: Robotter -Data: -ID: 51 -Title: Robotter -Data: -ID: 52 -Title: Robotter -Data: -ID: 53 -Title: Robotter -Data: -ID: 54 -Title: Robotter -Data: -ID: 55 -Title: Robotter -Data: -ID: 56 -Title: Robotter -Data: Stadion - -ID: 57 -Title: Robotter -Data: Danger værelse - -ID: 58 -Title: Robotter -Data: Kraftværk - -ID: 59 -Title: Robotter -Data: Fire Pit - -ID: 60 -Title: Robotter -Data: Orkenen - -ID: 61 -Title: Robotter -Data: Fire Pit - -ID: 62 -Title: Robotter -Data: Fire Pit - -ID: 63 -Title: Robotter -Data: Fire Pit - -ID: 64 -Title: Robotter -Data: Fire Pit - -ID: 65 -Title: Robotter -Data: Fire Pit - -ID: 66 -Title: Arenaer -Data: Det er her W.A.R. maskiner får deres forste test. Offentligheden opfordres til at se begivenheden. - -ID: 67 -Title: Arenaer -Data: Dette var W.A.R.'s forste fare arena. Kombattanter skal undgå de farlige pigg. - -ID: 68 -Title: Arenaer -Data: Bygget inde i et lyn mod hedning, der er et pustet over modtageligt kraftanlæg, leverer væggene noget af et chok. - -ID: 69 -Title: Arenaer -Data: Den ultimative test, computere projicerer holografiske sfærer, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 70 -Title: Arenaer -Data: Bliv på tæerne og undvige angrebene på jagerflyene for at overleve i orkenen. - -ID: 71 -Title: Arenaer -Data: Den ultimative test: Computere projicerer holografiske kugler, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 72 -Title: Arenaer -Data: Den ultimative test, computere projicerer holografiske sfærer, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 73 -Title: Arenaer -Data: Den ultimative test, computere projicerer holografiske sfærer, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 74 -Title: Arenaer -Data: Den ultimative test, computere projicerer holografiske sfærer, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 75 -Title: Arenaer -Data: Den ultimative test, computere projicerer holografiske sfærer, der, når de rammer, antænder ildkugler under din fjendes fodder. - -ID: 76 -Title: Forste nyhedsreport -Data: Vil du bekæmpe denne udfordrer? - -ID: 77 -Title: Forste nyhedsreport -Data: Og i andre nyheder, efter ~1's kamp i aften, ~2, en urangeret konkurrent, har udstedt en offentlig udfordring til ~1. - -ID: 78 -Title: Forste nyhedsreport -Data: Nå, hvis ~8 accepterer udfordringen, kan du vædde dit liv, jeg vil være der for at se kampen! - -ID: 79 -Title: Forste nyhedsreport -Data: Jeg håber helt sikkert, at du ikke gik glip af denne kampfolk, for i aften har vi en ny MESMEKæmpe. - -ID: 80 -Title: Forste nyhedsreport -Data: 3 - -ID: 81 -Title: Forste nyhedsreport -Data: hans - -ID: 82 -Title: Forste nyhedsreport -Data: hende - -ID: 83 -Title: Forste nyhedsreport -Data: ham - -ID: 84 -Title: Forste nyhedsreport -Data: hende - -ID: 85 -Title: Forste nyhedsreport -Data: han - -ID: 86 -Title: Forste nyhedsreport -Data: hun - -ID: 87 -Title: Forste nyhedsreport -Data: ~1 viste utrolige evner med ~3 som ~2 blev lidt mere end en boksesæk. - -ID: 88 -Title: Anden nyhedsrapport -Data: Denne ene, samt andre fremragende hits, har sendt ~2 tilbage til butikken i et stykke tid. - -ID: 89 -Title: Forste nyhedsreport -Data: For alle jer folk, der nyder en jævnt matchet kamp, håber jeg, at du ikke betalte for kampen på ~5. - -ID: 90 -Title: Anden nyhedsrapport -Data: ...Men for alle jer, der kan lide den lejlighedsvise ensidige masochistiske puncing, så pas på ~1. - -ID: 91 -Title: Forste nyhedsreport -Data: Whoa, denne udfordrer betod forretning i aften. ~1 kunne vise de gamle professionelle en ting eller to om det ~3. - -ID: 92 -Title: Anden nyhedsrapport -Data: Tjek denne handling ud. Dette er, hvordan ~2 så hele kampen: slået, forslået og forvirret. - -ID: 93 -Title: Forste nyhedsreport -Data: Publikum jublede som ~2 blev besejret i det bemærkelsesværdige opgor med ~1. - -ID: 94 -Title: Anden nyhedsrapport -Data: ~1 glade glade tilskuere med respektable færdigheder. Her er det hit, der sluttede kampen. - -ID: 95 -Title: Forste nyhedsreport -Data: ~1 så godt ud i aften. ~6 ~3 forlod ~5 med kun et par ar fra ~6 overmatched modstander. - -ID: 96 -Title: Anden nyhedsrapport -Data: ~2 viste nogle temmelig patetiske kampfærdigheder, og ~1 udnyttede ham. Bare se på dette hit. - -ID: 97 -Title: Forste nyhedsreport -Data: ~5 blev rystet i aften af den imponerende ~1. ~2 har brug for mere praksis, for ~11 kan slå som ~7. - -ID: 98 -Title: Anden nyhedsrapport -Data: ~4 dele fyldte gulvet efter gentagne slag som dette. Jeg har næsten ondt af ~2's reparationshold. - -ID: 99 -Title: Forste nyhedsreport -Data: ~1 udkæmpede en respektabel kamp med ~2 og sejrede. Ikke halvt dårligt, ~1! - -ID: 100 -Title: Anden nyhedsrapport -Data: De gjorde begge nogle skader, men ~1 sluttede konkurrencen med dette skud. - -ID: 101 -Title: Forste nyhedsreport -Data: ...Og i arenaen i aften, ~2 gav ~1 et lob for ~6 penge, men kom op et par tusinde kreditter kort. - -ID: 102 -Title: Anden nyhedsrapport -Data: ~2 holdt derinde i et stykke tid, men ~1 simpelthen ud-præsteret ~10 med bevægelser som dette. - -ID: 103 -Title: Forste nyhedsreport -Data: Alle jer arena junkies derude fik et ret godt show på ~5. ~2 kæmpede med dygtighed, men ikke nok... - -ID: 104 -Title: Anden nyhedsrapport -Data: ...at lægge ned ~1 s hulking ~3. Hey, måske næste gang, ~2. - -ID: 105 -Title: Forste nyhedsreport -Data: ~1 og ~2 blev jævnt matchet. ~4 af ~2 vil tilbringe lidt tid i butikken i aften! - -ID: 106 -Title: Anden nyhedsrapport -Data: Disse to kæmpede praktisk talt blow for blow indtil ~1 endelig naglet ~2 med dette veltimede skud. - -ID: 107 -Title: Forste nyhedsreport -Data: Jeg håber, ~1 og ~2's reparationsbesætninger ikke planlagde nogen fester i aften. - -ID: 108 -Title: Anden nyhedsrapport -Data: Med den middelmådige præstation af ~1, ~6 ~3 reparation besætning vil sidde fast i butikken næsten lige så længe ~6 modstanderens. - -ID: 109 -Title: Forste nyhedsreport -Data: Nu var dette en lige match-up, hvis jeg nogensinde har set en. Hvis de kæmpede denne kamp i morgen, ~2 kunne lige så nemt vinde. - -ID: 110 -Title: Anden nyhedsrapport -Data: ~1's sidste, snublende slag sluttede kampen i, hvad der kun kunne kaldes en heldig sejr. - -ID: 111 -Title: Forste nyhedsreport -Data: Whew, ~2 virkelig rev ind i ~1. ~1 bor nok tage det ~3 tilbage til træningsbanen. - -ID: 112 -Title: Anden nyhedsrapport -Data: Alt jeg kan sige til ~1 er at få noget praksis. At ~3 ikke vinder uden din hjælp. - -ID: 113 -Title: Forste nyhedsreport -Data: Jeg vil opsummere denne ene op for alle jer sportsfans i to ord: TRACK MEET. ~2 lob cirkler rundt, og nogle gange over, - -ID: 114 -Title: Anden nyhedsrapport -Data: ~1 og ~6 skæbnesvangert ~3. ~1 bor begynde at lave væddemål mod ~7self, hvis ~8 skal tage dyk som denne. - -ID: 115 -Title: Forste nyhedsreport -Data: Min, min... Hvem havde kontrol over det ~3! Åh, det var ~1. Jeg har nogle råd til dig, ~1. - -ID: 116 -Title: Anden nyhedsrapport -Data: And, blok, dodge, tilkald sig syg, gor noget andet end at tage hit efter hit fra det ~4. - -ID: 117 -Title: Forste nyhedsreport -Data: Denne kamp var temmelig ensidig. ~2 dominerede kampen mod den overvældede ~1. - -ID: 118 -Title: Anden nyhedsrapport -Data: Opforelsen af ~2 var simpelthen fremragende. ~1 kunne ikke reagere hurtigt nok til at stoppe stormlobet. - -ID: 119 -Title: Forste nyhedsreport -Data: ~2 ved virkelig, hvad han laver derude, eller måske ~1 har simpelthen ingen anelse. Uanset hvad, var det et blowout. - -ID: 120 -Title: Anden nyhedsrapport -Data: Der var et par heldige skud ved ~1, men det meste af tiden kampen så sådan ud. - -ID: 121 -Title: Forste nyhedsreport -Data: De skal være temmelig korte på piloter i disse dage for at rekruttere lignende ~1. - -ID: 122 -Title: Anden nyhedsrapport -Data: Jeg kunne have blokeret dette sidste hit i min sovn. Måske er det problemet. Nogen vågner op ~1. - -ID: 123 -Title: Forste nyhedsreport -Data: En god præstation af ~1, men naturligvis ikke nok til at konkurrere ~2's ~4 - -ID: 124 -Title: Anden nyhedsrapport -Data: ~1's dygtighed er indlysende, men dette skud viser virkelig, hvad en ~4 kan gore i hænderne på ~2. - -ID: 125 -Title: Forste nyhedsreport -Data: Åh, en dårlig dag i livet af ~1. Jeg er sikker på ~2 vil ikke fælde nogen tårer over ~6 tab. - -ID: 126 -Title: Anden nyhedsrapport -Data: ~1 landede nogle ret gode skud, men blev slidt ned af jordrystende skud som denne. - -ID: 127 -Title: Forste nyhedsreport -Data: Hmm. ~1 viste nogle mod i ~5 mod ~2 i aften, men viste bare ikke nok dygtighed. - -ID: 128 -Title: Anden nyhedsrapport -Data: ~1 stod ~6 jorden modigt, men blev til sidst efterladt liggende på det. Nå ~1, der er altid i morgen. - -ID: 129 -Title: Forste nyhedsreport -Data: Flot forsog ~1. Det var så tæt på, som de kommer, folkens. ~2 må være taknemmelig for... - -ID: 130 -Title: Anden nyhedsrapport -Data: blæser som denne. Det var skud som dette, der holdt ~2 bare et halvt skridt foran ~1. - -ID: 131 -Title: Forste nyhedsreport -Data: Wow, det var en tæt en. ~1 og ~2 handlede slag i ~5 indtil... - -ID: 132 -Title: Anden nyhedsrapport -Data: ~2, træt og snuble, landede dette, det sidste slag. Næste gang disse to modes, vil det være en rematch. - -ID: 133 -Title: Forste nyhedsreport -Data: Folkens, du skal have lidt ondt af ~1 i aften. Hvis det ikke var til ~2 landing... - -ID: 134 -Title: Anden nyhedsrapport -Data: et par heldige slag som denne, jeg tror ~1 ville have trukket denne ene ud. - -ID: 135 -Title: Beskrivelser 1 -Data: Tvunget til at klare sig selv efter hendes forældres mystiske dod, har Crystals beslutsomhed opnået stor respekt. - -ID: 136 -Title: Beskrivelser 2 -Data: Selvom han er den yngste konkurrent i turneringens historie, kæmper Stoffan med dygtighed ud over sine år. - -ID: 137 -Title: Beskrivelser 3 -Data: Rekrutteret af Raven for hans fremragende kickboxing færdigheder, Milanos hastighed og fingerfærdighed er legendariske. - -ID: 138 -Title: Beskrivelse 4 -Data: Christians aggressive stil rammer frygt i konkurrenternes sind og begær i mange unge kvinders hjerter. - -ID: 139 -Title: Beskrivelser 5 -Data: I lobet af sine mange års konkurrence har Shirro udviklet uovertruffen magt, men bevarer en ungdommelig sans for humor. - -ID: 140 -Title: Beskrivelser 6 -Data: Hans beregnende og luskede natur sammen med velafrundede evner skræmmer ofte Jean-Pauls modstandere. - -ID: 141 -Title: Beskrivelser 7 -Data: En pensioneret triatlet, Ibrahims tålmodighed og ærlighed har gjort ham til en værdsat mentor for mange håbefulde konkurrenter. - -ID: 142 -Title: Beskrivelser 8 -Data: Angels fortid er indhyllet i mystik. Bortset fra hendes reclusive disposition og stærke vilje, er lidt kendt om hende. - -ID: 143 -Title: Beskrivelser 9 -Data: En veteran fighter, Cossette er blevet forsigtig, defensiv og bitter efter at være blevet forkroblet i arenaen. - -ID: 144 -Title: Beskrivelser 10 -Data: Som stor Kreissacks livvagt og hojre hånd har Raven slået og ydmyget mange inden for og udenfor, arenaen. - -ID: 145 -Title: Beskrivelser 11 -Data: Boss fyrs beskrivelse. Dette vil virkelig ikke blive set, men vi vil gore plads til det alligevel. - -ID: 146 -Title: Shareware Msgs -Data: Beklager, denne pilot er kun tilgængelig i den fulde version af spillet. Se BESTILLING INFO i hovedmenuen. - -ID: 147 -Title: Shareware Msgs -Data: Beklager, denne robot er kun tilgængelig i den fulde version af spillet. Se BESTILLING INFO i hovedmenuen. - -ID: 148 -Title: Shareware Msgs -Data: Beklager, denne turnering er kun tilgængelig i den fulde version af spillet. Se BESTILLING INFO i hovedmenuen. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 149 -Title: Fejl -Data: *Enten spiller holdt op med at svare! - -ID: 150 -Title: Fejl -Data: UD AF SYNC-FEJL - -ID: 151 -Title: Fejl -Data: Joystick %i synes at være kalibreret forkert. Onsker du at omkalibrere? - -ID: 152 -Title: Fejl -Data: FULD -VERSION -KUN - -ID: 153 -Title: Fejl -Data: Ude af mulighed for at initialisere joystick %i. Skifte af spiller %i input til tastaturet. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 154 -Title: Fejl -Data: Beklager, den anden spiller bruger dette. Vælg venligst en anden. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 155 -Title: Fejl -Data: Kan ikke finde nogen turneringsfiler. På en eller anden måde er alle filer med en TRN-udvidelse blevet fjernet fra mappen. Du skal geninstallere OMF. - -ID: 156 -Title: Fejl -Data: Ikke kan gemme fil %s. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 157 -Title: Fejl -Data: INGEN PILOTER ER TILGÆNGELIGER. OPLEV EN NY PILOT. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 158 -Title: Fejl -Data: DEN EGEN OG EGEN PILOT PÅ FILEN ER DER ENHEDER, DER ER FYRET. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 159 -Title: Fejl -Data: INGEN PILOTER TIL RÅDGIVENDE FOR SLETNING. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 160 -Title: Fejl -Data: Ikke i stand til at finde joystick. Sorg for, at joysticket er tilsluttet din joystick port, for du korer OMF. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 161 -Title: Fejl -Data: Denne maskine har ikke nok konventionel hukommelse til at kore lyd og musik. %lik er påkrævet for at kore lyde, og %lik er påkrævet for både lyd og musik. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 162 -Title: Fejl -Data: Denne maskine har ikke nok konventionel hukommelse (%lik nodvendigt) til at kore musik. Musik er handicappet. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 163 -Title: Fejl -Data: Denne maskine har ikke nok konventionel hukommelse (%lik påkrævet) til at kore lyd. Lyden handicappet. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 164 -Title: Fejl -Data: Denne maskine har ikke nok konventionel hukommelse. %lik er påkrævet. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 165 -Title: Fejl -Data: Beklager, denne maskine har mindre end de mindste XMS krav. -%lik, %li flere bytes er nodvendige for at kore One Must Fall 2097. - - -ID: 166 -Title: Konventionel hukommelse -Data: Lob tor for hukommelsen. -Prov at frigore mere overhukommelse. - -ID: 167 -Title: Konventionel hukommelse -Data: Fejlåbningsfil: %s - -ID: 168 -Title: Konventionel hukommelse -Data: Lob tor for XMS. - -ID: 169 -Title: MASI Musik belastning fejl -Data: Musikbelastningsfejl #%i, indlæsning af musikfil %s. - -ID: 170 -Title: MASI Musik belastning fejl -Data: mSampleLoad fejl #%i. - -ID: 171 -Title: MASI Musik belastning fejl -Data: FORSOGTE AT INDLÆSES STORRE END ARKSPAGT. -NODVENDIGT AT UDVÆKSLE ARKSRUPSSTORRELSE. - -ID: 172 -Title: Optag fil ting -Data: Din modstander ændrer systemindstillinger. - -Vær sod at vente. - -ID: 173 -Title: Optag fil ting -Data: Filtrets %s er blevet ændret eller beskadiget og er ikke længere kompatibel med din modstanders maskine. Du skal reparere denne fil eller geninstallere spillet. - -ID: 174 -Title: Optag fil ting -Data: Filerne på din modstanders maskine er blevet ændret eller beskadiget og er ikke længere kompatibel med din maskine. - -ID: 175 -Title: Optag fil ting -Data: Din modstander har travlt med at gore noget. - -Vær sod at vente. - -ID: 176 -Title: Optag fil ting -Data: RECORD FIL FEJLM - -ID: 177 -Title: Chat tekst -Data: Din modstander har forladt spillet. - -ID: 178 -Title: Chat tekst -Data: SPILLER - -ID: 179 -Title: Chat tekst -Data: DEN ANDEN FYR - -ID: 180 -Title: Player quote when reaching han -Data: Den whimp er ikke her endnu! Jeg hader virkelig at vente. - -ID: 181 -Title: ! -Data: Din modstander er endnu ikke ankommet - -ID: 182 -Title: ! -Data: Din modstander spiller i turneringen. Du skal vælge TURNERING PLAY og udfordre ham med en reddet pilot. - -ID: 183 -Title: ! -Data: Din modstander spiller et tospillerspil. Du skal vælge to SPILLER GAME for at udfordre ham. - -ID: 184 -Title: Used on startup as non-server -Data: Gameplay muligheder er blevet kopieret fra din modstander. - -PRESSE G FOR GAMEPLAY MENUEN - -ID: 185 -Title: Brugt på opstart som server -Data: Gameplay muligheder er blevet sendt til din modstander. - -PRESSE G FOR GAMEPLAY MENUEN - -ID: 186 -Title: Vælg robot i det normale spil -Data: VÆLG DIN ROBOT - -ID: 187 -Title: Vælg pilot i det normale spil -Data: VÆLG DIN PILOT - -ID: 188 -Title: Engelsk exit tekst. -Data: OMF_END.BIN - -ID: 189 -Title: for hemmelig karakter ild. -Data: BRAGE - -ID: 190 -Title: for hemmelig karakter is. -Data: ICE - -ID: 191 -Title: til oprettelse af pilot -Data: $ %sk - -ID: 192 -Title: til oprettelse af pilot -Data: INTER PILOT'S NAVN - -ID: 193 -Title: for spiller ved hjælp af robot -Data: MED - -ID: 194 -Title: Resultattavle -Data: SCOREBOARD - - -ID: 195 -Title: Resultattavle -Data: %d af %d - -ID: 196 -Title: Resultattavle -Data: SPILLER NAVN ROBOT PILOT SCORE - -ID: 197 -Title: Velkommen til opsætning -Data: DEL AF ARENAEN - -ID: 198 -Title: Velkommen til opsætning -Data: Tryk på PGDN eller PGUP for at ændre side -Presse ESC til at afslutte hjælp - -ID: 199 -Title: Velkommen til opsætning -Data: SIDE - -ID: 200 -Title: Velkommen til opsætning -Data: VS. - -ID: 201 -Title: Velkommen til opsætning -Data: HINANDEN FOLGER AF HITS - -ID: 202 -Title: Velkommen til opsætning -Data: HIT COMBO - -ID: 203 -Title: Velkommen til opsætning -Data: PERFEKT RUNDE - -ID: 204 -Title: Velkommen til opsætning -Data: VITALITET - -ID: 205 -Title: Velkommen til opsætning -Data: SCRAP BONUS - -ID: 206 -Title: Velkommen til opsætning -Data: DESTRUKTIONSBONUS - -ID: 207 -Title: Velkommen til opsætning -Data: Type OMF til at starte spillet. - - -ID: 208 -Title: Velkommen til opsætning -Data: Kor Venligst SETUP.EXE for du korer OMF.EXE - - -ID: 209 -Title: Velkommen til opsætning -Data: Hav en dejlig dag. - - -ID: 210 -Title: Velkommen til opsætning -Data: Der opstod fejl på linje %d af modul %s - - -ID: 211 -Title: Velkommen til opsætning -Data: SPIL PAUSED - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 212 -Title: Sejr -Data: Er du sikker på, at du vil afslutte dette spil? - -ID: 213 -Title: Sejr -Data: Onsker du at fortsætte? - -ID: 214 -Title: Joystick Kalibrering -Data: KALIBRATE JOYSTICK - -ID: 215 -Title: Joystick Kalibrering -Data: Kalibrere joystick ved at bevæge sig i en komplet cirkel. At lade joystick 'rest' i midten skal medfore, at midterknappen trykkes på. Tryk på ESC til abort eller joystick-knap for at acceptere. - -ID: 216 -Title: Magt -Data: POWER - -ID: 217 -Title: Hastighed -Data: AGILITET - -ID: 218 -Title: Udholdelighed -Data: UDHOLDENHED - -ID: 219 -Title: Hyper eller Normal -Data: NORMAL - -ID: 220 -Title: Hyper eller Normal -Data: HYPER - -ID: 221 -Title: Vælg -Data: EN ANDEN PILOT VED NAVNEN PÅ %S HAR DET SAMME FILENAME. OVER DU OVERSKRIV DEN PILOT? - -ID: 222 -Title: Vælg -Data: ER DU SIKRE DIG TIL AT SLETTE PILOT %s? - -ID: 223 -Title: Vælg -Data: SELECT - -ID: 224 -Title: Vælg -Data: VÆLG FOTO TIL PILOT %s - -ID: 225 -Title: Vælg -Data: VÆLG PILOT TIL AT BÆRE BORD - -ID: 226 -Title: Vælg -Data: VÆLG PILOT TIL SLETNING - -ID: 227 -Title: Vælg -Data: VÆLG MODSTANDER - -ID: 228 -Title: På eller uden for -Data: NEJ - -ID: 229 -Title: På eller uden for -Data: JA - -ID: 230 -Title: På eller uden for -Data: OFF - -ID: 231 -Title: På eller uden for -Data: PÆLE - -ID: 232 -Title: Hurtigste -Data: HASTEST - -ID: 233 -Title: Langsomste -Data: SLIDSTE - -ID: 234 -Title: En runde -Data: ONE ROUNDa - -ID: 235 -Title: En runde -Data: NORMAL - -ID: 236 -Title: En runde -Data: LAV - -ID: 237 -Title: Hurtigt eller normalt -Data: NORMAL - -ID: 238 -Title: Hurtigt eller normalt -Data: HAST - -ID: 239 -Title: Undskyld -Data: Beklager, HYPER mode er kun tilgængelig i den fulde version af spillet. Se BESTILLING INFO i hovedmenuen. - -Tryk på en nogle til at fortsætte. - -ID: 240 -Title: Lydkort -Data: VÆLG LYDKORT - -ID: 241 -Title: Lydkort -Data: Vælg lydkort. Hvis du ikke har et lydkort, skal du vælge PC SPEAKER. PC hojttaler lyd kan deaktiveres fra spillet, hvis du foretrækker stilhed. - -ID: 242 -Title: Lydkort -Data: PC Hojttaler - -ID: 243 -Title: Lydkort -Data: Kan ikke initialisere lydkort. Tjek dine lydkortindstillinger og sorg for, at IRQ, DMA og base IO-adresse overholder. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 244 -Title: Lydkort -Data: INGEN - -ID: 245 -Title: Lydkort -Data: LAV - -ID: 246 -Title: Lydkort -Data: MEDIUM - -ID: 247 -Title: Lydkort -Data: HOJ - -ID: 248 -Title: Mulighed 1 -Data: ET SPILLER GAMEa - -ID: 249 -Title: Mulighed 2 -Data: TO SPILLER GAMEa - -ID: 250 -Title: Mulighed 2 -Data: TURNERING PLAYA - -ID: 251 -Title: Mulighed 3 -Data: KONFIGURATION - -ID: 252 -Title: Mulighed 4 -Data: GAMEPLAYa - -ID: 253 -Title: Mulighed 5 -Data: BESTILLING AF INFOa - -ID: 254 -Title: Mulighed 6 -Data: HELPa - -ID: 255 -Title: Mulighed 7 -Data: DEMOa - -ID: 256 -Title: Mulighed 8 -Data: SCOREBOARD - -ID: 257 -Title: Mulighed 9 -Data: QUITa - -ID: 258 -Title: Titel -Data: AVANCEREDE MULIGELSER - -ID: 259 -Title: Mulighed 1 -Data: REHIT MODE %sa - -ID: 260 -Title: Mulighed 2 -Data: DEF. KAST SA % - -ID: 261 -Title: Mulighed 3 -Data: KAJ RANGE %i%%a - -ID: 262 -Title: Mulighed 4 -Data: JUMP HOJDE %i%%1 - -ID: 263 -Title: Mulighed 5 -Data: HIT PAUSE %ia - -ID: 264 -Title: Mulighed 6 -Data: VITALITET x %i%%a - -ID: 265 -Title: Mulighed 7 -Data: KNOCK DOWN %sa - -ID: 266 -Title: Mulighed 7 -Data: BLOK SKADE %i%%a - -ID: 267 -Title: Mulighed 5 -Data: FORBEDRE %s - -ID: 268 -Title: Mulighed 8 -Data: DONEa - -ID: 269 -Title: Mulighed 8 -Data: INGEN - -ID: 270 -Title: Mulighed 8 -Data: Nod 1 - -ID: 271 -Title: Mulighed 8 -Data: NIVILLE 2 - -ID: 272 -Title: Mulighed 8 -Data: INGEN - -ID: 273 -Title: Mulighed 8 -Data: SLAG - -ID: 274 -Title: Mulighed 8 -Data: PUNCHES - -ID: 275 -Title: Mulighed 8 -Data: BGEDE - -ID: 276 -Title: Mulighed 1 -Data: Dette vil tillade flere hits til en luftbåren fjende. Men efter et træk har forbundet det kan ikke længere genhit. Hvis du blander dine bevægelser, kan du få nogle vilde "jongler" kombinationer. "Ekstra" hits vil kun påfore 60% skader. - -ID: 277 -Title: Mulighed 1 -Data: Tillad spilleren at kaste fjende fra en defensiv (ryg) position. - -ID: 278 -Title: Mulighed 1 -Data: Ændre den afstand, hvorfra en spiller kan kaste sin fjende (Standarder til 100%). - -ID: 279 -Title: Mulighed 1 -Data: Skift hojden af spillerne hopper (Gælder til 100%). Dette har ingen effekt i turneringstilstand. - -ID: 280 -Title: Mulighed 1 -Data: Dette påvirker den tid, spillet holder pause under et hit eller en blok (Standard til 4). - -ID: 281 -Title: Mulighed 1 -Data: Dette vil påvirke mængden af hits en spiller kan tage. Forogelse af dette vil give mulighed for længere kampe (Defaults til 100%). Dette har ingen effekt i turneringstilstand. - -ID: 282 -Title: Mulighed 1 -Data: Dette vil få det angivne springende træk at vælte modstanderen, når den rammer. - -ID: 283 -Title: Mulighed 1 -Data: Dette vil medfore, at skaden påfores, når ethvert træk er blokeret. - -ID: 284 -Title: Mulighed 1 -Data: Dette vil automatisk forbedre begge robotter i et netværksspil til det angivne niveau. - -ID: 285 -Title: Mulighed 1 -Data: Afslut AVANCEREDE OMSTEDER. - -ID: 286 -Title: Titel -Data: GAMEPLAY - -ID: 287 -Title: Mulighed 1 -Data: SPEED %sa - -ID: 288 -Title: Mulighed 2 -Data: FIGHT MODE %sa - -ID: 289 -Title: Mulighed 3 -Data: POWER 1 %sa - -ID: 290 -Title: Mulighed 4 -Data: POWER 2 %sa - -ID: 291 -Title: Mulighed 5 -Data: FARER %sa - -ID: 292 -Title: Mulighed 6 -Data: %sa - -ID: 293 -Title: Mulighed 7 -Data: BEDSTE %i %ia af % - -ID: 294 -Title: Mulighed 7 -Data: AVANCEREDE OPTIONER - -ID: 295 -Title: Mulighed 7 -Data: KONFIGURATION - -ID: 296 -Title: Mulighed 8 -Data: DONEa - -ID: 297 -Title: Mulighed 1 -Data: Ændre den samlede hastighed af spillet. Tryk til venstre og hojre for at ændre. - -ID: 298 -Title: Mulighed 1 -Data: Kamptilstand kan være enten NORMAL eller HYPER. Hypertilstand vil forbedre dine specielle bevægelser. Tjek robotbeskrivelsesafsnitt af hjælpen for mere information. - -ID: 299 -Title: Mulighed 1 -Data: Ændre kraften i spiller 1's hits og kast. Denne indstilling træder kun i kraft i to spillerspil. Tryk til venstre og hojre for at ændre. - -ID: 300 -Title: Mulighed 1 -Data: Ændre kraften i player 2's hits og kast. Denne indstilling træder kun i kraft i to spillerspil. Tryk til venstre og hojre for at ændre. - -ID: 301 -Title: Mulighed 1 -Data: Nogle arenaer har farlige miljoer: pigge, elektricitet, kampfly og lignende. Denne indstilling tænder og slukker dem. - -ID: 302 -Title: Mulighed 1 -Data: Dette bestemmer, hvor godt computeren kæmper i et enspiller spil. Dette har ingen effekt på to spiller spil. Tryk til venstre og hojre for at ændre. - -ID: 303 -Title: Mulighed 1 -Data: Dette vil oprette kampe, så de er en runde, bedste to ud af tre runder, eller bedste tre ud af fem runder. - -ID: 304 -Title: Mulighed 1 -Data: Skal jeg virkelig fortælle dig, hvad det er? - -ID: 305 -Title: Mulighed 1 -Data: Indstil forskellige spilmuligheder. - -ID: 306 -Title: Mulighed 1 -Data: Gå tilbage til hovedmenuen. - -ID: 307 -Title: Titel -Data: OMF 2097 - -ID: 308 -Title: Titel -Data: VENDE TILBAGE TIL GAMEa - -ID: 309 -Title: Titel -Data: LYD %sa - -ID: 310 -Title: Titel -Data: MUSIC %sa - -ID: 311 -Title: Titel -Data: SPEED %sa - -ID: 312 -Title: Titel -Data: VIDEO OPTIONSa - -ID: 313 -Title: Titel -Data: HELPa - -ID: 314 -Title: Titel -Data: QUITa - -ID: 315 -Title: Titel -Data: FORFEITa - -ID: 316 -Title: Titel -Data: Fortsæt kampen. - -ID: 317 -Title: Titel -Data: Hæv eller sænk mængden af alle lydeffekter. Tryk til venstre eller hojre for at ændre. - -ID: 318 -Title: Titel -Data: Hæv eller lav lydstyrken af musik. Tryk til venstre eller hojre for at ændre. - -ID: 319 -Title: Titel -Data: Ændre hastigheden af spillet, når i arenaen. Tryk til venstre eller hojre for at ændre. - -ID: 320 -Title: Titel -Data: Disse er forskellige muligheder for visuelle effekter og detaljer. - -ID: 321 -Title: Titel -Data: Få detaljeret og grundig forklaring på de forskellige muligheder, som du måske har brug for en detaljeret og grundig forklaring på. - -ID: 322 -Title: Titel -Data: Afslut spillet og vende tilbage til hovedmenuen. - -ID: 323 -Title: Titel -Data: Du vil tabe kampen og stadig betale for reparationer på din robot. - -ID: 324 -Title: Option 1 -Data: ⌂||||||| - -ID: 325 -Title: Option 2 -Data: ⌂⌂|||||| - -ID: 326 -Title: Option 1 -Data: ⌂⌂⌂||||| - -ID: 327 -Title: Option 1 -Data: ⌂⌂⌂⌂|||| - -ID: 328 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂||| - -ID: 329 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂|| - -ID: 330 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂| - -ID: 331 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂⌂ - -ID: 332 -Title: Option 1 -Data: |||||||||| - -ID: 333 -Title: Option 1 -Data: ⌂||||||||| - -ID: 334 -Title: Option 2 -Data: ⌂⌂|||||||| - -ID: 335 -Title: Option 1 -Data: ⌂⌂⌂||||||| - -ID: 336 -Title: Option 1 -Data: ⌂⌂⌂⌂|||||| - -ID: 337 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂||||| - -ID: 338 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂|||| - -ID: 339 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂||| - -ID: 340 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂⌂|| - -ID: 341 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂⌂⌂| - -ID: 342 -Title: Option 1 -Data: ⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂ - -ID: 343 -Title: Diff 1 -Data: CPU: PUNCHING BAG - -ID: 344 -Title: Diff 1 -Data: CPU: ROOKIE - -ID: 345 -Title: Diff 1 -Data: CPU: VETERAN - -ID: 346 -Title: Diff 1 -Data: CPU: WORLD CLASS - -ID: 347 -Title: Diff 1 -Data: CPU: CHAMPION - -ID: 348 -Title: Diff 1 -Data: CPU: DODBRINGENDE - -ID: 349 -Title: Diff 1 -Data: CPU: ULTIMAT - -ID: 350 -Title: Titel -Data: BRUGERDSKÆRM FOR KEYBOARD SETUP - -ID: 351 -Title: vælg 1 -Data: JUMPE UP - -ID: 352 -Title: vælg 1 -Data: JUMP HOJRE - -ID: 353 -Title: vælg 1 -Data: GÅ RIGTIGT - -ID: 354 -Title: vælg 1 -Data: DUCK FREMAD - -ID: 355 -Title: vælg 1 -Data: DUCK - -ID: 356 -Title: vælg 1 -Data: DUCK TILBAGE - -ID: 357 -Title: vælg 1 -Data: GÅ TILBAGE - -ID: 358 -Title: vælg 1 -Data: JUMP LEFT - -ID: 359 -Title: vælg 1 -Data: PUNCH - -ID: 360 -Title: vælg 1 -Data: KICK - -ID: 361 -Title: vælg 1 -Data: DONEa - -ID: 362 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 363 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 364 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 365 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 366 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 367 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 368 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 369 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 370 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 371 -Title: vælg 1 -Data: Tryk på Enter for at ændre tasten, og tryk derefter på noglen, der er onsket for den angivne handling. Tryk på ESC, når det er gjort. - -ID: 372 -Title: vælg 1 -Data: Efterlad den brugerdefinerede tastaturopsætning. - -ID: 373 -Title: Shadows -Data: VIDEOOPTIONER - -ID: 374 -Title: Shadows -Data: SHADOWS %sa - -ID: 375 -Title: Shadows -Data: ANIMATION %sa - -ID: 376 -Title: Shadows -Data: PALETTE ANIM %sa - -ID: 377 -Title: Shadows -Data: SNOW CHECKING %sa - -ID: 378 -Title: Shadows -Data: SKÆRME SHAKES %sa - -ID: 379 -Title: Shadows -Data: MENUS %s - -ID: 380 -Title: Shadows -Data: NULSTILLET TIL DEFAULTA - -ID: 381 -Title: Shadows -Data: DONEa - -ID: 382 -Title: hjælp1 -Data: Drej robotskygger til og fra. Sluk for at forbedre spillets hastighed, mens du er i arenaen. - -ID: 383 -Title: hjælp1 -Data: Drej ekstra animation til og fra. Hvis du slukker dette, vil spillet kore hurtigere, men vil ikke se ud som detaljer. - -ID: 384 -Title: hjælp1 -Data: Dette vil slukke for al paletanimation: lynglimt, flammeflimmer og lignende. Sluk for hurtigere spil, eller hvis skærmen flimrer. - -ID: 385 -Title: hjælp1 -Data: At slukke dette vil fremskynde palette animationer, men kan forårsage sne eller flimmer med nogle videokort. - -ID: 386 -Title: hjælp1 -Data: Sluk for at fjerne skærmen 'rystende', når en karakter rammer væggen, en karakter kastes osv. - -ID: 387 -Title: hjælp1 -Data: Normale menuer ser godt ud, men kan være lidt langsomme på nogle maskiner. Ændringer vil finde sted efter at have forladt menuerne. - -ID: 388 -Title: hjælp1 -Data: Dette vil gendanne alle videoindstillinger til standardindstillingerne. - -ID: 389 -Title: hjælp1 -Data: Udrejse fra denne menu. - -ID: 390 -Title: Kvalitet -Data: LAV - -ID: 391 -Title: Kvalitet -Data: MEDIUM - -ID: 392 -Title: Kvalitet -Data: HOJ - -ID: 393 -Title: Titel -Data: LYDKORTSTOMNING - -ID: 394 -Title: Opt 1 -Data: KVALITET %sa - -ID: 395 -Title: Opt 1 -Data: NONA - -ID: 396 -Title: Opt 1 -Data: IO PORT %xha - -ID: 397 -Title: Opt 1 -Data: 8-BIT DMA %ia - -ID: 398 -Title: Opt 1 -Data: 16-BIT DMA %ia - -ID: 399 -Title: Opt 1 -Data: IRQ %ia - -ID: 400 -Title: Opt 1 -Data: MIDI IO PORT %xha - -ID: 401 -Title: Opt 1 -Data: MIDI IRQ %ia - -ID: 402 -Title: Opt 1 -Data: DONEa - -ID: 403 -Title: Kvalitet -Data: Indstilling af lydkvaliteten lav kan hjælpe den samlede hastighed på langsommere maskiner. Dette påvirker ikke PC Speaker og nogle lydkort, som Gravis Ultra Sound. - -ID: 404 -Title: Kvalitet -Data: Vælg et lydkort for at afspille lydeffekter og musik. - -ID: 405 -Title: Kvalitet -Data: Vælg IO-adressen på kortet. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 406 -Title: Kvalitet -Data: Vælg den 8-bit DMA-kanal af kortet. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 407 -Title: Kvalitet -Data: Vælg kortets 16-bit DMA-kanal. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 408 -Title: Kvalitet -Data: Vælg kortets IRQ-nummer. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 409 -Title: Kvalitet -Data: Vælg kortets MIDI IO-adresse. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 410 -Title: Kvalitet -Data: Vælg kortets MIDI IRQ. Tryk på VENSTRE eller HOJRE for at ændre værdien. - -ID: 411 -Title: Kvalitet -Data: Exit SETUP. - -ID: 412 -Title: Titel -Data: KONFIGURATION - -ID: 413 -Title: Mulighed -Data: SPILLER 1 INPUTA - -ID: 414 -Title: Mulighed -Data: SPILLER 2 INPUTA - -ID: 415 -Title: Mulighed -Data: VIDEO OPTIONSa - -ID: 416 -Title: Mulighed -Data: LYD %sa - -ID: 417 -Title: Mulighed -Data: MUSIC %sa - -ID: 418 -Title: Mulighed -Data: LYD TEST %ia - -ID: 419 -Title: Mulighed -Data: STEREO %sa - -ID: 420 -Title: Mulighed -Data: DONEa - -ID: 421 -Title: Mulighed -Data: NORMAL - -ID: 422 -Title: Mulighed -Data: VENDT - -ID: 423 -Title: Mulighed -Data: Vælg kontrol for spiller 1: tastatur eller joystick. - -ID: 424 -Title: Mulighed -Data: Vælg kontrol for spiller 2: tastatur eller joystick. - -ID: 425 -Title: Mulighed -Data: Forskellige muligheder for visuelle effekter og detaljeringsniveauer. - -ID: 426 -Title: Mulighed -Data: Hæv eller sænk mængden af alle lydeffekter. Tryk til venstre eller hojre for at ændre. - -ID: 427 -Title: Mulighed -Data: Hæv eller lav lydstyrken af musik. Tryk til venstre eller hojre for at ændre. - -ID: 428 -Title: Mulighed -Data: UNDEFFEKT TEST. Tryk på venstre og hojre for at ændre lydeffekt, og ind for at spille den. - -ID: 429 -Title: Mulighed -Data: Skift stereolyd mellem venstre og hojre hojttalere. - -ID: 430 -Title: Mulighed -Data: Forlad KONFIGURATION. - -ID: 431 -Title: Titel -Data: VÆLG INPUT ENGÆNGEJENED FOR SPILLER %i - -ID: 432 -Title: Mulighed -Data: RIGTIGE KEYBOARDa - -ID: 433 -Title: Mulighed -Data: VENSTRE KEYBOARDa - -ID: 434 -Title: Mulighed -Data: BRUGERDEFINEREDE KEYBOARDa - -ID: 435 -Title: Mulighed -Data: JOYSTICK 1a - -ID: 436 -Title: Mulighed -Data: JOYSTICK 2a - -ID: 437 -Title: Mulighed -Data: DONEa - -ID: 438 -Title: Mulighed -Data: Dette vil bruge det numeriske tastatur til bevægelse, indtaste til punch og hojre skift til spark. - -ID: 439 -Title: Mulighed -Data: Dette vil sætte 'Q', 'W', og 'E' til spring retninger, 'A' og 'D' til venstre og hojre og 'Z', 'X', og 'C' til edsvinding. TAB og CTRL kontrol stansning og spark. - -ID: 440 -Title: Mulighed -Data: Invent dine egne tastaturindstillinger. - -ID: 441 -Title: Mulighed -Data: Brug joystick 1. - -ID: 442 -Title: Mulighed -Data: Brug joystick 2. Dette er kun tilgængeligt, hvis du har et specielt kabel til at forbinde to joysticks til din computer. - -ID: 443 -Title: Mulighed -Data: Forlad uden at ændre noget. - -ID: 444 -Title: Navne -Data: ALUMINUM -(LET) - -ID: 445 -Title: Navne -Data: JER -(MEDIUM) - -ID: 446 -Title: Navne -Data: STEEL -(HID) - -ID: 447 -Title: Navne -Data: TUNG -METAL - -ID: 448 -Title: Navne -Data: POWER - -ID: 449 -Title: Navne -Data: SMIDIGHED - -ID: 450 -Title: Navne -Data: ENDUR. - -ID: 451 -Title: Navne -Data: ARENA - -ID: 452 -Title: Navne -Data: SIM-kort - -ID: 453 -Title: Navne -Data: NY TURAMENT - -ID: 454 -Title: Navne -Data: BELASTNING - -ID: 455 -Title: Navne -Data: DELETE - -ID: 456 -Title: Navne -Data: NYE - -ID: 457 -Title: Navne -Data: KOB - -ID: 458 -Title: Navne -Data: SÆLG - -ID: 459 -Title: Navne -Data: TRÆNING -KILDE - -ID: 460 -Title: Navne -Data: HANDEL -I NÆVNT - -ID: 461 -Title: Navne -Data: TILGÆNGEBARE: - -ID: 462 -Title: Navne -Data: RUMM - -ID: 463 -Title: Navne -Data: RUMMPLADE: - -ID: 464 -Title: Navne -Data: STUN RES. - -ID: 465 -Title: Navne -Data: STUN RES.: - -ID: 466 -Title: Navne -Data: %s -SPEED - -ID: 467 -Title: Navne -Data: %s HASTIGHED: - -ID: 468 -Title: Navne -Data: %s -I NÆVNT - -ID: 469 -Title: Navne -Data: %s POWER: - -ID: 470 -Title: Navne -Data: %s -SPEED - -ID: 471 -Title: Navne -Data: %s HASTIGHED: - -ID: 472 -Title: Navne -Data: %s -I NÆVNT - -ID: 473 -Title: Navne -Data: %s POWER: - -ID: 474 -Title: Navne -Data: D - O - I nærheden af N - E - -ID: 475 -Title: Navne -Data: Q - U - Jeg - T - -ID: 476 -Title: Ingen omsættelige robotter -Data: INGEN - -ID: 477 -Title: Ikke tilgængelig element -Data: UTILGÆNGEBARE - -ID: 478 -Title: Ikke tilgængelig element -Data: IKKE -TILGÆNGEBARE - -ID: 479 -Title: Ikke tilgængelig element -Data: MINIMUMSNIVEA - -ID: 480 -Title: Ikke tilgængelig element -Data: Mens du arbejder for pengene til at komme ind i turneringen, er dine hårdt tjente færdigheder faldet, og dele af din robot er forværret. Du lover aldrig at være så skodeslos med dine penge. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 481 -Title: Ikke tilgængelig element -Data: Mens du arbejder for pengene til at komme ind i turneringen, er dine hårdt tjente færdigheder faldet, og dele af din robot er forværret. Du lover aldrig at være så skodeslos med dine penge. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 482 -Title: Ikke tilgængelig element -Data: Mens du arbejder for pengene til at komme ind i turneringen, er dine hårdt tjente færdigheder faldet, og dele af din robot er forværret. Du lover aldrig at være så skodeslos med dine penge. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 483 -Title: Ikke tilgængelig element -Data: DU SKAL BRUGERE TID PÅ AT ARGUMENTERE SÅ EN MEKéIKER FOR AT TJENE PENAGET I NÆRING TIL DEN TOURNAMENT. ER DU SIKRE PÅ, AT DU VIL DELTAG I %s? - -ID: 484 -Title: Ikke tilgængelig element -Data: ER DU SIKKER PÅ, AT DU VIL FORDELE %s TIL AT TRÆDE %s? - -ID: 485 -Title: Ikke tilgængelig element -Data: DU KONKURRERER ALLEREDE I %s. ODELÆGGERE OG GÅ IGEN VIDERE %s? - -ID: 486 -Title: Ikke tilgængelig element -Data: VÆLG DEN TURNERING, DU ODSLER, SKAL DE INDTASTE - -ID: 487 -Title: Ikke tilgængelig element -Data: VÆLG ET VENEDIGT NÆVN NÆVN - -ID: 488 -Title: Ingen omsættelige robotter -Data: INGEN OVERKOMMENDE -ROBOTTER TIL RÅDIGHED -FOR HANDEL - -ID: 489 -Title: Ikke tilgængelig element -Data: SALG PRIS: - -ID: 490 -Title: Ikke tilgængelig element -Data: OPGRADERINGSOMKOSTNINGER: - -ID: 491 -Title: Ikke tilgængelig element -Data: Niveau %d - -ID: 492 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -I nærheden af Jaguar Leap - -Hjernerystelse Cannon - -Overhead Kast - -ID: 493 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Skyggedving - -I nærheden af Shadow Punch - -Skygge Slide - -I nærheden af Shadow Grab - -ID: 494 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Hastighed-Kick - -Off-Wall angreb - -I nærheden af Spike-Charge - -ID: 495 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -I nærheden af Fire Spin - -Super fremstod angreb - -I nærheden af Jet Swoop - -ID: 496 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -I nærheden af Ball Lightning - -Rullende Torden - -Elektriske Shards - -ID: 497 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Stigende blad - -I nærheden af Head Stomp - -I nærheden af Razor Spin - -ID: 498 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Hoved-Butt - -Flip Kick - -I nærheden af Flying Hands - -ID: 499 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Spinning Kast - -Opladning af Punch - -Svingende kæder - -ID: 500 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -I nærheden af Diving Claw - -I nærheden af Flying Talon - -Fodsle Afgift - -ID: 501 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Teleportation i små skala - -I nærheden af Matter Phasing - -I nærheden af Stasis Activator - -ID: 502 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -Mini granat - -I nærheden af Missil Launcher - -Jordskælv smadrer - -ID: 503 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -I NÆVNT -HOP VIA WALL THINGIE -STASIS KRISETAL - -ID: 504 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -BLASH KICK RIP-OFF -STIGE AFGORELSE -I NÆRHEDEN AF WALL SPIKE - -ID: 505 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 506 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 507 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 508 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 509 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 510 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 511 -Title: Robotbeskrivelse -Data: SÆRLIGE BEVÆGELSER: - -JET CHARGE -I NÆRHEDEN AF FLAME DIVE - -ID: 512 -Title: Træning -Data: BLUNT STONE'S -STROMAFREVARIALÆG -TEKNIKKER: - -ID: 513 -Title: Træning -Data: DEN LEGENDARISK -FLASH TRÆNING -FOR FÆNGSEL -UDFORDRET: - -ID: 514 -Title: Træning -Data: VLAD IRONSIDE'S -AEROB OG CHOK -MODSTANDSDYGTIGHED -WORKSHOP: - -ID: 515 -Title: Træning -Data: TAG KRAFTVÆRK I %? - -ID: 516 -Title: Træning -Data: TAG AGILITY TRAINING KURS FOR %s? - -ID: 517 -Title: Træning -Data: TAG UDHOLDENDE TRÆNING KURS I %s? - -ID: 518 -Title: Handel robot -Data: HANDLE DINE %s for A %s AND %s? - -ID: 519 -Title: Handel robot -Data: HANDLE DINE %s OG %s FOR A %s? - -ID: 520 -Title: Handel robot -Data: HANDLE DINE %s for A %s? - -ID: 521 -Title: Opgradering kob -Data: SÆLGE NIVÅR %d %s HASTIGHEDSSTUR FOR %s? - -ID: 522 -Title: Opgradering kob -Data: KOBSNIVALETS NIVÆRD %d %s OPGRADERING FOR %s? - -ID: 523 -Title: Opgradering kob -Data: SÆLGENDE NIVÆRD %d %s POWER OPGRADERING FOR %s? - -ID: 524 -Title: Opgradering kob -Data: KOB NEVER %d %s POWER UPGRADE FOR %s? - -ID: 525 -Title: Opgradering kob -Data: SÆLGER NIVIL %d STUN RESISTANCE FOR %s? - -ID: 526 -Title: Opgradering kob -Data: KOB NIVEA %d STUN RESISTANCE FOR %s? - -ID: 527 -Title: Opgradering kob -Data: SÆLGER NIVÅR %d ARMOR PLANTNING FOR %s? - -ID: 528 -Title: Opgradering kob -Data: KOBSNIVEA %D ARMOR PLETTER FOR %s? - -ID: 529 -Title: Hjælp til turneringsbesvær -Data: Den perfekte problemindstilling for nye spillere. - -ID: 530 -Title: Hjælp til turneringsbesvær -Data: Tror du, du er klar til at kæmpe med de store drenge? - -ID: 531 -Title: Hjælp til turneringsbesvær -Data: For at overleve, skal du bruge kuglelejer af stål. - -ID: 532 -Title: Hjælp til turneringsbesvær -Data: Forbered dig på at blive rystet! - -ID: 533 -Title: Hjælp til robot dev. knap -Data: TRÆNER FOR AT STIGE PILOTS MAGTNÆRE - -ID: 534 -Title: Hjælp til robot dev. knap -Data: TRÆN FOR AT FOROGE PILOTS AGILITETSNIVÆRNIT - -ID: 535 -Title: Hjælp til robot dev. knap -Data: TOG FOR AT STIGE PILOTS UDVANDRINGSNIVÆRD - -ID: 536 -Title: Hjælp til robot dev. knap -Data: FORLAD PILOT TRÆNINGSCENTERET - -ID: 537 -Title: Hjælp til robot dev. knap -Data: INDTJEK ARENA OG KAMP %s - -ID: 538 -Title: Hjælp til robot dev. knap -Data: TAG TRÆNINGSKURS FOR AT OGE KRÆFT, AGNILITET ELLER UDHOLDENHED - -ID: 539 -Title: Hjælp til robot dev. knap -Data: KOB OVERGANGSÆT TIL DIN ROBOT - -ID: 540 -Title: Hjælp til robot dev. knap -Data: SÆLG OPGRADER KITS FRA DIN ROBOT - -ID: 541 -Title: Hjælp til robot dev. knap -Data: LÆS PILOT FRA DISK - -ID: 542 -Title: Hjælp til robot dev. knap -Data: SKAPRING EN NY PILOT - -ID: 543 -Title: Hjælp til robot dev. knap -Data: SLETT EN PILOT FRA DISK - -ID: 544 -Title: Hjælp til robot dev. knap -Data: PRAKSIS MOD EN FJENDTLIG PILOT ELLER SPILLER I EN COMPUTERSITI - -ID: 545 -Title: Hjælp til robot dev. knap -Data: FORLAD KOMMANDECENTERET -(DIN PILOT VIL BLEV REDDET AUTOMATICELT) - -ID: 546 -Title: Hjælp til robot dev. knap -Data: REGISTRERING FOR EN NY TOURNAMENT - -ID: 547 -Title: Hjælp til robot dev. knap -Data: ÆNDRE HOMSERFARVE TIL ROBOT - -ID: 548 -Title: Hjælp til robot dev. knap -Data: ÆNDRE HOMSERFARVE TIL ROBOT - -ID: 549 -Title: Hjælp til robot dev. knap -Data: ÆNDRING AF SEKUNDÆRE KUGLE FARVER TIL ROBOT - -ID: 550 -Title: Hjælp til robot dev. knap -Data: ÆNDRING AF SEKUNDÆRE KUGLE FARVER TIL ROBOT - -ID: 551 -Title: Hjælp til robot dev. knap -Data: ÆNDRE TREDJE KAMPAGN FARVE TIL ROBOT - -ID: 552 -Title: Hjælp til robot dev. knap -Data: ÆNDRE TREDJE KAMPAGN FARVE TIL ROBOT - -ID: 553 -Title: Hjælp til robot dev. knap -Data: SÆLG POWER NEVEL FOR %s ANGREB - -ID: 554 -Title: Hjælp til robot dev. knap -Data: OPGRADER DE SKADER, DER ER GJORT AF ALL %S ANGREB - -ID: 555 -Title: Hjælp til robot dev. knap -Data: SÆLG POWER NEVEL FOR %s ANGREB - -ID: 556 -Title: Hjælp til robot dev. knap -Data: OPGRADER DE SKADER, DER ER GJORT AF ALL %S ANGREB - -ID: 557 -Title: Hjælp til robot dev. knap -Data: SÆLG HASTIGHEDSNOVELSE FOR %s ANGREB - -ID: 558 -Title: Hjælp til robot dev. knap -Data: OPGRADERER HASTIGHEDEN AF ALLE %s ANGREB - -ID: 559 -Title: Hjælp til robot dev. knap -Data: SÆLG HASTIGHEDSNOVELSE FOR %s ANGREB - -ID: 560 -Title: Hjælp til robot dev. knap -Data: OPGRADERER HASTIGHEDEN AF ALLE %s ANGREB - -ID: 561 -Title: Hjælp til robot dev. knap -Data: SÆLG ARMT PLATING NIVEAER FRA ROBOT - -ID: 562 -Title: Hjælp til robot dev. knap -Data: OPGRADERER BEVÆBNING AF ROBOTEN - -ID: 563 -Title: Hjælp til robot dev. knap -Data: SÆLG STUN RESISTANCENIVEA FRA ROBOT - -ID: 564 -Title: Hjælp til robot dev. knap -Data: OPGRADERING AF STUN RESISTANCENIVNEN FOR ROBOT - -ID: 565 -Title: Hjælp til robot dev. knap -Data: HANDELS NUVÆRENDE ROBOT FOR EN ANDEN TYPE ROBOT - -ID: 566 -Title: Hjælp til robot dev. knap -Data: HANDELS NUVÆRENDE ROBOT FOR EN ANDEN TYPE ROBOT - -ID: 567 -Title: Hjælp til robot dev. knap -Data: LAV EQUIPMENT EXCHANGE CENTER - -ID: 568 -Title: Hjælp til robot dev. knap -Data: FORLAD ROBOT FORBEDELSESCENTER - -ID: 569 -Title: Hjælp til robot dev. knap -Data: RANK -%i - -ID: 570 -Title: Hjælp til robot dev. knap -Data: NEJ -RANK - -ID: 571 -Title: Hjælp til robot dev. knap -Data: INGEN RANG - -ID: 572 -Title: Hjælp til robot dev. knap -Data: NAVN: - -ID: 573 -Title: Hjælp til robot dev. knap -Data: RANK: - -ID: 574 -Title: Hjælp til robot dev. knap -Data: VINDER: - -ID: 575 -Title: Hjælp til robot dev. knap -Data: TABER: - -ID: 576 -Title: Hjælp til robot dev. knap -Data: PENGE: - -ID: 577 -Title: Hjælp til robot dev. knap -Data: MODEL: - -ID: 578 -Title: Hjælp til robot dev. knap -Data: POWER - -ID: 579 -Title: Hjælp til robot dev. knap -Data: SMIDIGHED - -ID: 580 -Title: Hjælp til robot dev. knap -Data: UDHOLDENHED - -ID: 581 -Title: Hjælp til robot dev. knap -Data: %s HASTIGHED - -ID: 582 -Title: Hjælp til robot dev. knap -Data: %s POWER - -ID: 583 -Title: Hjælp til robot dev. knap -Data: %s HASTIGHED - -ID: 584 -Title: Hjælp til robot dev. knap -Data: %s POWER - -ID: 585 -Title: Hjælp til robot dev. knap -Data: RUMM - -ID: 586 -Title: Hjælp til robot dev. knap -Data: STUN RES - -ID: 587 -Title: Repair messages til fortabing -Data: Oprydningsbesætningerne fandt en form for ekstraudstyr hardware i vraget, du forlod derude. Teknologierne installerer det i din robot. - -ID: 588 -Title: Repair messages til fortabing -Data: Patetisk, knægt, virkelig patetisk. Kunne ikke holde varmen ud, så du spogte. Du er nodt til at lære at se dine kampe i ojnene, eller du vil altid være den klynkende kujon, du var i dag. - -ID: 589 -Title: Repair messages for at tabe -Data: Whew, du blev slået temmelig slemt. Du skal sætte ekstra tid i sims for din næste. - -ID: 590 -Title: Repair messages for at tabe -Data: Forsoger at holde mine drenge beskæftiget, ikke? - -ID: 591 -Title: Repair messages for at tabe -Data: Hej, du må hellere komme tilbage derude. Der er et par steder på den 'bot, der ikke blev revet i stykker. - -ID: 592 -Title: Repair messages for at tabe -Data: Åh, mand. Har du nogensinde hort om blokering? - -ID: 593 -Title: Repair messages for at tabe -Data: Du er heldig, at jeg kan lide mit arbejde mere end min kone. - -ID: 594 -Title: Repair messages til at vinde -Data: Nå, i det mindste vandt du. Ærgerligt jeg vil være her hele natten. - -ID: 595 -Title: Repair messages til at vinde -Data: Ser ud til at du knap nok klarede den ene, knægt. - -ID: 596 -Title: Repair messages til at vinde -Data: Du er nodt til at lære noget forsvar, eller du vil altid få slået op på denne måde. - -ID: 597 -Title: Repair messages til at vinde -Data: Ikke så slemt, ser ud til at du holdt mindst et skridt foran dem. - -ID: 598 -Title: Repair messages til at vinde -Data: Dejligt job. Næste gang kunne du holde dig væk fra ham lidt mere. Gor mit arbejde lettere, knægt? - -ID: 599 -Title: Repair messages til at vinde -Data: Kom nu knægt, hold vagten deroppe. Du gjorde det ikke dårligt, men du kunne have gjort det meget bedre. - -ID: 600 -Title: Repair messages til at vinde -Data: Whoa, du har studeret nogle af mine gamle kampe i holo-biblioteket, har ikke cha. Du har måske lidt talent, knægt. - -ID: 601 -Title: Repair messages til at vinde -Data: Humph. Du synes, du er ret god, gor du ikke. Hvis jeg var yngre, ville jeg vise dig en ting eller to. - -ID: 602 -Title: Repair messages til at vinde -Data: Tja, det ser ud til, at jeg kommer tidligt hjem i aften. - -ID: 603 -Title: Shop rapport -Data: Lyt, og lyt tæt på. Jeg fortalte teknologien, at du ville betale dem tilbage på den næste kamp, så hvis du ikke vinder, er det tilbage til bleachers for dig. - -ID: 604 -Title: Shop rapport -Data: Jeg advarede dig. Turneringsembedsmændene sparker dig ud for ikke at betale dine regninger. Måske skulle du finde en anden karriere, knægt. - -ID: 605 -Title: Shop rapport -Data: DU SKAL BEGYNDE AT VENDE ET OVERSKUD. JEG VAR NODT TIL AT SÆLGE A %s BARE FOR AT DÆKSE REPAIR-regningen. - -ID: 606 -Title: Shop rapport -Data: Finansiel rapport - -ID: 607 -Title: Shop rapport -Data: FORTJENESTE: - -ID: 608 -Title: Shop rapport -Data: REPAIR COST: - -ID: 609 -Title: Shop rapport -Data: VINDNINGER: - -ID: 610 -Title: Shop rapport -Data: BONUSSER: - -ID: 611 -Title: Shop rapport -Data: KI'ER -STATISTIK - -ID: 612 -Title: Shop rapport -Data: HITS LANDET: - -ID: 613 -Title: Shop rapport -Data: GENNANGEN FOR SENDING: - -ID: 614 -Title: Shop rapport -Data: MISLYKTE ANGREB: - -ID: 615 -Title: Shop rapport -Data: HIT/MISS RATIO: - -ID: 616 -Title: Shop rapport -Data: HITS TAGET: - -ID: 617 -Title: Shop rapport -Data: MÅLSTREGNE - -ID: 618 -Title: Shop rapport -Data: HITS LANDET: - -ID: 619 -Title: Shop rapport -Data: GENNANGEN FOR SENDING: - -ID: 620 -Title: Shop rapport -Data: MISLYKTE ANGREB: - -ID: 621 -Title: Shop rapport -Data: HIT/MISS RATIO: - -ID: 622 -Title: -Data: ARM - -ID: 623 -Title: -Data: LEG - -ID: 624 -Title: -Data: FLAIL - -ID: 625 -Title: -Data: FLAME - -ID: 626 -Title: -Data: BLADE - -ID: 627 -Title: -Data: BLADE - -ID: 628 -Title: -Data: BLADE - -ID: 629 -Title: -Data: BLADE - -ID: 630 -Title: -Data: BLADE - -ID: 631 -Title: -Data: BLADE - -ID: 632 -Title: -Data: BLADE - -ID: 633 -Title: -Data: BLADE - -ID: 634 -Title: -Data: BLADE - -ID: 635 -Title: -Data: BLADE - -ID: 636 -Title: -Data: BLADE - -ID: 637 -Title: 1 -Data: - -ID: 638 -Title: 1 -Data: ESCAPE - -ID: 639 -Title: 1 -Data: 1 - -ID: 640 -Title: 1 -Data: 2 - -ID: 641 -Title: 1 -Data: 3 - -ID: 642 -Title: 1 -Data: 4 - -ID: 643 -Title: 1 -Data: 5 - -ID: 644 -Title: 1 -Data: 6 - -ID: 645 -Title: 1 -Data: 7 - -ID: 646 -Title: 1 -Data: 8 - -ID: 647 -Title: 1 -Data: 9 - -ID: 648 -Title: 1 -Data: 0 - -ID: 649 -Title: 1 -Data: - - -ID: 650 -Title: 1 -Data: = - -ID: 651 -Title: 1 -Data: TILBAGE PLADS - -ID: 652 -Title: 1 -Data: TAB - -ID: 653 -Title: 1 -Data: Q - -ID: 654 -Title: 1 -Data: W - -ID: 655 -Title: 1 -Data: E - -ID: 656 -Title: 1 -Data: R - -ID: 657 -Title: 1 -Data: T - -ID: 658 -Title: 1 -Data: Y - -ID: 659 -Title: 1 -Data: U - -ID: 660 -Title: 1 -Data: I - -ID: 661 -Title: 1 -Data: O - -ID: 662 -Title: 1 -Data: P - -ID: 663 -Title: 1 -Data: [ - -ID: 664 -Title: 1 -Data: ] - -ID: 665 -Title: 1 -Data: RETURN - -ID: 666 -Title: 1 -Data: CTRL - -ID: 667 -Title: 1 -Data: A - -ID: 668 -Title: 1 -Data: S - -ID: 669 -Title: 1 -Data: D - -ID: 670 -Title: 1 -Data: F - -ID: 671 -Title: 1 -Data: G - -ID: 672 -Title: 1 -Data: H - -ID: 673 -Title: 1 -Data: J - -ID: 674 -Title: 1 -Data: K - -ID: 675 -Title: 1 -Data: L - -ID: 676 -Title: 1 -Data: -ID: 677 -Title: 1 -Data: ' - -ID: 678 -Title: 1 -Data: ` - -ID: 679 -Title: 1 -Data: VENSTREORIENTERING - -ID: 680 -Title: 1 -Data: \ - -ID: 681 -Title: 1 -Data: Z - -ID: 682 -Title: 1 -Data: X - -ID: 683 -Title: 1 -Data: C - -ID: 684 -Title: 1 -Data: V - -ID: 685 -Title: 1 -Data: B - -ID: 686 -Title: 1 -Data: N - -ID: 687 -Title: 1 -Data: M - -ID: 688 -Title: 1 -Data: , - -ID: 689 -Title: 1 -Data: . - -ID: 690 -Title: 1 -Data: / - -ID: 691 -Title: 1 -Data: RIGHT SHIFT - -ID: 692 -Title: 1 -Data: * - -ID: 693 -Title: 1 -Data: ALT - -ID: 694 -Title: 1 -Data: SPACE BAR - -ID: 695 -Title: 1 -Data: - -ID: 696 -Title: 1 -Data: F1 - -ID: 697 -Title: 1 -Data: F2 - -ID: 698 -Title: 1 -Data: F3 - -ID: 699 -Title: 1 -Data: F4 - -ID: 700 -Title: 1 -Data: F5 - -ID: 701 -Title: 1 -Data: F6 - -ID: 702 -Title: 1 -Data: F7 - -ID: 703 -Title: 1 -Data: F8 - -ID: 704 -Title: 1 -Data: F9 - -ID: 705 -Title: 1 -Data: F10 - -ID: 706 -Title: 1 -Data: - -ID: 707 -Title: 1 -Data: - -ID: 708 -Title: 1 -Data: OP VENSTRE PIL - -ID: 709 -Title: 1 -Data: UP ARROW - -ID: 710 -Title: 1 -Data: UP RIGHT ARROW - -ID: 711 -Title: 1 -Data: - - -ID: 712 -Title: 1 -Data: VENSTRE PIL - -ID: 713 -Title: 1 -Data: 5 - -ID: 714 -Title: 1 -Data: RIGTIGE PIL - -ID: 715 -Title: 1 -Data: + - -ID: 716 -Title: 1 -Data: NED VENSTRE ARROW - -ID: 717 -Title: 1 -Data: DOWN ARROW - -ID: 718 -Title: 1 -Data: DOWN RIGHT ARROW - -ID: 719 -Title: 1 -Data: INSERT - -ID: 720 -Title: 1 -Data: DELETE - -ID: 721 -Title: 1 -Data: SYS REQ - -ID: 722 -Title: 1 -Data: - -ID: 723 -Title: 1 -Data: - -ID: 724 -Title: 1 -Data: - -ID: 725 -Title: 1 -Data: - -ID: 726 -Title: 1 -Data: - -ID: 727 -Title: 1 -Data: - -ID: 728 -Title: 1 -Data: - -ID: 729 -Title: 1 -Data: - -ID: 730 -Title: 1 -Data: - -ID: 731 -Title: 1 -Data: - -ID: 732 -Title: 1 -Data: - -ID: 733 -Title: 1 -Data: - -ID: 734 -Title: 1 -Data: - -ID: 735 -Title: 1 -Data: - -ID: 736 -Title: 1 -Data: - -ID: 737 -Title: 1 -Data: - -ID: 738 -Title: 1 -Data: - -ID: 739 -Title: 1 -Data: - -ID: 740 -Title: 1 -Data: - -ID: 741 -Title: 1 -Data: - -ID: 742 -Title: 1 -Data: - -ID: 743 -Title: 1 -Data: - -ID: 744 -Title: 1 -Data: - -ID: 745 -Title: 1 -Data: - -ID: 746 -Title: 1 -Data: - -ID: 747 -Title: 1 -Data: Jeg er ikke imponeret over dine patetiske kampfærdigheder. Kom tilbage, når du har lært at kæmpe. - -ID: 748 -Title: 1 -Data: Vælg et hojere CPU-vanskelighedsniveau fra GAMEPLAY-menuen. %s niveau, der kræves for at udfordre %s. - -TÆR PÅ ENHVER NOGLE FOR AT FORTSÆTTE - -ID: 749 -Title: 1 -Data: Du ser bekendt ud - -ID: 750 -Title: 1 -Data: Undervurder mig ikke! - -ID: 751 -Title: 1 -Data: Du kendte min far. Hvad skete der med ham? - -ID: 752 -Title: 1 -Data: Jeg er dygtig nok til at stå over for enhver fare, bror. - -ID: 753 -Title: 1 -Data: Stå ikke i vejen! Jeg må sejre! - -ID: 754 -Title: 1 -Data: Jeg kan få dig til at tale! - -ID: 755 -Title: 1 -Data: Jeg kæmper for hævn! Du kan ikke stoppe mig. - -ID: 756 -Title: Crystal til Angel -Data: Skonhed er kun en af mine mange aktiver. - -ID: 757 -Title: Crystal til Cossette -Data: Er der noget, du kan fortælle mig? - -ID: 758 -Title: Crystal to Raven -Data: Du ved sikkert noget? - -ID: 759 -Title: Crystal til major Kreissack -Data: Jeg ved, at du må have dræbt mine forældre. Jeg vil have hævn! - -ID: 760 -Title: Steffan til Crystal -Data: Jeg vil torre det smil af dit ansigt, blodhed. - -ID: 761 -Title: Steffan til Steffan -Data: Du ser fantastisk ud! - -ID: 762 -Title: Steffan til Milano -Data: Du er ved at se perfektion i aktion, Pony-hale. - -ID: 763 -Title: Stoffan til christian -Data: Spis bly, Blondie! - -ID: 764 -Title: Steffan til Shirro -Data: Hej pops, er det ikke tid til din lur? - -ID: 765 -Title: Steffan til Jean-Paul -Data: Se og lær, stille dreng. Jeg giver dig 30 fliser inden du falder. - -ID: 766 -Title: Steffan til Ibrahim -Data: Du kan forlade nu og undgå forlegenhed. - -ID: 767 -Title: Stoffan til Angel -Data: Når jeg har fjernet dig, tager jeg dig ud! - -ID: 768 -Title: Steffan til Cossette -Data: Du tror bestemt ikke, at du kan vinde? - -ID: 769 -Title: Steffan til Raven -Data: Jeg vil lade dig vaske min 'bot, når vi er færdige. - -ID: 770 -Title: Steffan til major Kreissack -Data: Til sidst en værdig modstander. Gor dig klar til at rocke! - -ID: 771 -Title: Milano til Crystal -Data: Du ser forberedt ud. Det bliver en stor kamp. - -ID: 772 -Title: Milano til Steffan -Data: Arrogance gor kujoner af mænd, min ven. - -ID: 773 -Title: Milano til Milano -Data: Når jeg tænker på dig... - -ID: 774 -Title: Milano til Christian -Data: Jeg kan kun onske dig held og lykke med dine bestræbelser. - -ID: 775 -Title: Milano til Shirro -Data: Virksomheden vil snart trives under min regel. - -ID: 776 -Title: Milano til Jean-Paul -Data: Hej, ven. - -ID: 777 -Title: Milano til Ibrahim -Data: Jeg bekymrer mig lidt for dine motiver. Du vil snart se min vej. - -ID: 778 -Title: Milano til Angel -Data: Jeg er helt sikker på, at vi modes igen. - -ID: 779 -Title: Milano til Cossette -Data: Jeg kan kun sige, at jeg respekterer din vedholdenhed. - -ID: 780 -Title: Milano til Raven -Data: Jeg kender dine planer. Du skal være mere diskret. - -ID: 781 -Title: Milano til major Kreissad -Data: Du har ingen idé om den indvirkning, denne kamp kan have. - -ID: 782 -Title: Christian til Crystal -Data: Når jeg har vundet, vil du stoppe dette vrovl. - -ID: 783 -Title: Christian til Steffan -Data: Du har bedst fortalt mig alt, hvad du kender til mine forældre. - -ID: 784 -Title: Christian til Milano -Data: Du vil ikke stå mellem mig og min virkelige fjende. - -ID: 785 -Title: Christian til Christian -Data: Synes du, jeg ser godt ud i denne farve? - -ID: 786 -Title: Christian til Shirro -Data: Mine forældre kendte dig godt. Hvad ved du? - -ID: 787 -Title: Christian til Jean-Paul -Data: Hvilken slags V.P. kunne du være? - -ID: 788 -Title: Christian til Ibrahim -Data: Fortæl mig om dine eksperimenter. - -ID: 789 -Title: Christian til Angel -Data: Hvis jeg vinder, lover du vil give mig nogle anelse! - -ID: 790 -Title: Christian til Cossette -Data: Jeg kan kun håbe, at den fremtidige hersker vil være retfærdig. - -ID: 791 -Title: Christian til Raven -Data: Som ansat i W.A.R. skal du have oplysninger! - -ID: 792 -Title: Christian til major Kreissck -Data: Du dræbte min far, forbereder dig på at do. - -ID: 793 -Title: Shirro til Crystal -Data: En pige af din skonhed bor ikke være så urolig. - -ID: 794 -Title: Shirro til Steffan -Data: Og nu vil den lille dreng gå i skole... - -ID: 795 -Title: Shirro til Milano -Data: Tror du, at dit valg i 'bots havde ret? - -ID: 796 -Title: Shirro til christian -Data: Din far var en god mand. Tingene vil snart fungere. - -ID: 797 -Title: Shirro til Shirro -Data: Bruger du skildpaddevoks på det hoved? - -ID: 798 -Title: Shirro til Jean-Paul -Data: Håber du ikke har noget imod et par bule i den 'bot. - -ID: 799 -Title: Shirro til Ibrahim -Data: Nå, Ib! Lang tid ikke at se... - -ID: 800 -Title: Shirro til Angel -Data: Hvad er du, pige? - -ID: 801 -Title: Shirro til Cossette -Data: Selvom jeg beundrer dig, må jeg have denne sejr! - -ID: 802 -Title: Shirro til Raven -Data: Jeg kender mange af dine svagheder. Du kan give afkald nu, knægt. - -ID: 803 -Title: Shirro til major Kreissack -Data: Hvad laver du her? Åh ja, så mere den gladere. - -ID: 804 -Title: Jean-Paul til Crystal -Data: Betragt dig selv som advaret. - -ID: 805 -Title: Jean-Paul til Steffan -Data: Jeg har ingen respekt for dig. - -ID: 806 -Title: Jean-Paul til Milano -Data: Jeg er fodt til at styre dette firma. - -ID: 807 -Title: Jean-Paul til kristen -Data: Du har ingen mulighed for at vinde. - -ID: 808 -Title: Jean-Paul til Shirro -Data: Hvordan kan du grine, mens W.A.R. fortsætter sine eksperimenter? - -ID: 809 -Title: Jean-Paul til Jean-Paul -Data: Jeg vil vædde på, hvad du tænker. - -ID: 810 -Title: Jean-Paul til Ibrahim -Data: Kreissuck vil ikke lade dig leve. Hold op nu. - -ID: 811 -Title: Jean-Paul til Angel -Data: Af jer ved jeg intet. - -ID: 812 -Title: Jean-Paul til Cossette -Data: Held og lykke. - -ID: 813 -Title: Jean-Paul til Raven -Data: Dine planer kan ikke lykkes. Dine fjender er for magtfulde. - -ID: 814 -Title: Jean-Paul til major Kreissak -Data: Dine dage med magt vil snart komme til en ende! - -ID: 815 -Title: Ibrahim til Crystal -Data: Eksperimentet, som din far arbejdede på, skulle aldrig have startet. - -ID: 816 -Title: Ibrahim til Steffan -Data: Du er i et ydmygende tab. - -ID: 817 -Title: Ibrahim til Milano -Data: Mellem min evne og valg af robot, kan jeg ikke tabe! - -ID: 818 -Title: Ibrahim til christian -Data: Din mor var et uskyldigt offer. - -ID: 819 -Title: Ibrahim til Shirro -Data: Du kan ikke længere være en neutral part i det, der sker her. - -ID: 820 -Title: Ibrahim til Jean-Paul -Data: Intelligens er en gave, men visdom er tjent. - -ID: 821 -Title: Ibrahim til Ibrahim -Data: To fyre går ind i en bar... - -ID: 822 -Title: Ibrahim til Angel -Data: Hvorfor er der intet af dig i Interpol-optegnelserne? - -ID: 823 -Title: Ibrahim til Cossette -Data: Du står over for nogle vanskelige beslutninger i fremtiden, min ven. - -ID: 824 -Title: Ibrahim til Raven -Data: Kreissack kender til dine planer. Vind eller tab, du skal lobe. - -ID: 825 -Title: Ibrahim til major Kreissack -Data: Hvilken robot er det? Jeg har aldrig set den! - -ID: 826 -Title: Angel til Crystal -Data: Jeg bekymrer mig ikke om dit trivielle tab. - -ID: 827 -Title: Angel til Steffan -Data: Du er ikke engang min tid værd. - -ID: 828 -Title: Angel til Milano -Data: Denne gang er det kun en konkurrence... - -ID: 829 -Title: Angel til christian -Data: Du har ret til at frygte mig. - -ID: 830 -Title: Angel til Shirro -Data: Tingene er ikke altid, hvad de ser ud til. - -ID: 831 -Title: Angel til Jean-Paul -Data: Tilbage fra, menneskelig. Denne kamp er ubetydelig. - -ID: 832 -Title: Angel til Ibrahim -Data: Når dette er overstået, må du ophore med dine eksperimenter. - -ID: 833 -Title: Angel til Angel -Data: I det mindste kan jeg stole på dig. - -ID: 834 -Title: Angel til Cossette -Data: Du skulle have sagt op, mens du havde chancen. - -ID: 835 -Title: Angel til Raven -Data: Synes du dig selv stærk? - -ID: 836 -Title: Angel til Major Kreissack -Data: Vi vil ikke blive nægtet! Det er oproret lige ved hånden! - -ID: 837 -Title: Cossette til Crystal -Data: Hvorfor går du ikke hjem og gemmer dig under omslag? - -ID: 838 -Title: Cossette til Steffan -Data: Selv lammet, jeg er stærkere end dig. - -ID: 839 -Title: Cossette til Milano -Data: Ganymede vil snart være min! - -ID: 840 -Title: Cossette til christian -Data: Med dit sind så uroligt, kan du ikke vinde. - -ID: 841 -Title: Cossette til Shirro -Data: Vi skal se, hvem der griner sidst. - -ID: 842 -Title: Cossette til Jean-Paul -Data: Nu vil du se et rigtigt sind i aktion. - -ID: 843 -Title: Cossette til Ibrahim -Data: Dine ben vil ikke hjælpe dig i denne konkurrence! - -ID: 844 -Title: Cossette til Angel -Data: Hvis du ikke har nogen erfaring på disse maskiner, hvorfor er du her? - -ID: 845 -Title: Cossette til Cossette -Data: Jeg er garanteret at vinde. - -ID: 846 -Title: Cossette til Raven -Data: Måske kan du være min livvagt, når jeg vinder... - -ID: 847 -Title: Cossette til major Kreissack -Data: Du kaldte mig svag en gang. Du vil aldrig gore det igen. - -ID: 848 -Title: Raven til Crystal -Data: Du er intet andet end et barn, der rider på din fars navn. - -ID: 849 -Title: Raven til Steffan -Data: Du er et skadedyr, der er ved at blive trampet. - -ID: 850 -Title: Raven til Milano -Data: Hastighed er intet imod rå magt! - -ID: 851 -Title: Raven til kristen -Data: Din far skulle aldrig have forladt Nova-projektet. - -ID: 852 -Title: Raven til Shirro -Data: Du havde bedst at gå på pension, for vi gik på pension. - -ID: 853 -Title: Raven til Jean-Paul -Data: Du er en freak, der skal blive i laboratoriet. - -ID: 854 -Title: Raven til Ibrahim -Data: Jeg ved ikke, hvad du laver her. Dine evner er værdilose. - -ID: 855 -Title: Raven til Angel -Data: Jeg ved ikke, hvem du er, men du må hellere gå tilbage til, hvor du kom fra. - -ID: 856 -Title: Raven to Cossette -Data: Denne kamp er kun for dem med en "PERFECT" krop og sind. - -ID: 857 -Title: Raven til Raven -Data: Næsten som at se i et spejl... - -ID: 858 -Title: Raven til major Kreissack -Data: Godaften, sir. Skal vi spille? - -ID: 859 -Title: M Kreissuck til Crystal -Data: Intet som at hacke et spil, eh? - -ID: 860 -Title: M Kreissack til Steffan -Data: Jeg får en stor glæde af at rive op nogens arbejde. - -ID: 861 -Title: M Kreissick til Milano -Data: Hvordan er det, at jeg kæmper mod dig, måske? - -ID: 862 -Title: M Kreissack til kristen -Data: Hvem gjorde det til mig!?! - -ID: 863 -Title: M Kreissack til Shirro -Data: Jeg skal være på den anden side af denne skærm. - -ID: 864 -Title: M Kreissæk til Jean-Paul -Data: Sæt mig tilbage, hvor jeg horer hjemme. - -ID: 865 -Title: M Kreissack til Ibrahim -Data: Blodkoden er TILFREDS TILFREDS FREMAD PUNCH KICK og derefter FREMAD 135 gange. - -ID: 866 -Title: M Kreissuck til Angel -Data: For at spille som Kreissack skal du trykke på -tasten. - -ID: 867 -Title: M Kreissak til Cossette -Data: For at nå Arachnid, få syv perfektioner i træk. - -ID: 868 -Title: M Kreissick til Raven -Data: Hvorfor læser du dette, alligevel? - -ID: 869 -Title: M Kreissak til major Kreissak -Data: Nu skal jeg se. - -ID: 870 -Title: Crystal til Crystal -Data: Du er den smukkeste pige, jeg nogensinde har set! - -ID: 871 -Title: Krystal til Steffan -Data: Et par strimlen af metal vil være alt, hvad der er tilbage af dig. - -ID: 872 -Title: Crystal til Milano -Data: Når det er overstået, kan du måske være min sekretær. - -ID: 873 -Title: Crystal til Christian -Data: Jeg ved, hvordan man besejrer dig, bror. Du vil ikke vinde. - -ID: 874 -Title: Crystal til Shirro -Data: Min fred vil komme efter denne kamp er vundet. - -ID: 875 -Title: Crystal til Jean-Paul -Data: Hvis du ikke har nogen oplysninger, er alt, hvad jeg har brug for, dit nederlag. - -ID: 876 -Title: Crystal til Ibrahim -Data: Hvilke eksperimenter? Sig det til mig! - -ID: 877 -Title: Crystal til Angel -Data: Trivial? Du vil betale for din holdning! - -ID: 878 -Title: Crystal til Cossette -Data: Huh? Jeg viser dig! - -ID: 879 -Title: Crystal to Raven -Data: Det vil ikke være hans navn, der vinder denne kamp. - -ID: 880 -Title: Crystal til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 881 -Title: Steffan til Crystal -Data: Jeg undervurderer ingen. Jeg er bare bedre end dig. - -ID: 882 -Title: Steffan til Steffan -Data: Tak, dahling. - -ID: 883 -Title: Steffan til Milano -Data: Jeg er ikke bange for noget, Sport. - -ID: 884 -Title: Stoffan til christian -Data: Du bor sporge Iron Fist. De arbejder nu for Kreissck. - -ID: 885 -Title: Steffan til Shirro -Data: Lille dreng? Jeg er to gange din bedre og vil bevise det, nu. - -ID: 886 -Title: Steffan til Jean-Paul -Data: Og din respekt er den mindste af mine bekymringer, Pud. - -ID: 887 -Title: Steffan til Ibrahim -Data: Eller i det mindste vil jeg forårsage en. - -ID: 888 -Title: Stoffan til Angel -Data: Og jeg vil vædde på, at du ikke ville kende en robot, hvis den trådte på dig. - -ID: 889 -Title: Steffan til Cossette -Data: Babe, du er intet, men gnister. - -ID: 890 -Title: Steffan til Raven -Data: Kom inden for fem meter fra mig, og du er stov. - -ID: 891 -Title: Steffan til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 892 -Title: Milano til Crystal -Data: De dode betyder ikke længere noget. Min sejr er alt, hvad der er vigtigt. - -ID: 893 -Title: Milano til Steffan -Data: Alt jeg ser er en dreng, der forsoger at udfylde en mands job. - -ID: 894 -Title: Milano til Milano -Data: ... Jeg sparker mig selv... - -ID: 895 -Title: Milano til Christian -Data: Måske ikke, men jeg vil besejre dig her. - -ID: 896 -Title: Milano til Shirro -Data: Gæt vi bliver nodt til at se. - -ID: 897 -Title: Milano til Jean-Paul -Data: Ser ud til min ide om skæbne, og din er ved at kollidere. - -ID: 898 -Title: Milano til Ibrahim -Data: At have evnen til at bygge et våben giver dig ikke færdigheder til at bruge det. - -ID: 899 -Title: Milano til Angel -Data: Hej, bare navngiv stedet. - -ID: 900 -Title: Milano til Cossette -Data: Du bliver nodt til at komme forbi mig, forst. - -ID: 901 -Title: Milano til Raven -Data: Så vil dette være testen. - -ID: 902 -Title: Milano til major Kreissad -Data: Hvorfor kæmper du mig alligevel? - -ID: 903 -Title: Christian til Crystal -Data: Hvis du kan besejre mig, tror jeg måske på dig. - -ID: 904 -Title: Christian til Steffan -Data: Din heldige stribe slutter her. - -ID: 905 -Title: Christian til Milano -Data: Alt vil blive afsloret, når jeg korer showet. - -ID: 906 -Title: Christian til Christian -Data: Nå, jeg ved, det ser godt ud på mig! - -ID: 907 -Title: Christian til Shirro -Data: Så snart jeg får fingrene i din chef. - -ID: 908 -Title: Christian til Jean-Paul -Data: Vi skal bare finde ud af det. - -ID: 909 -Title: Christian til Ibrahim -Data: Hun skulle aldrig have været på den shuttle... - -ID: 910 -Title: Christian til Angel -Data: Frygter du? Jeg ved ikke engang, hvem du er! - -ID: 911 -Title: Christian til Cossette -Data: Mit had vil være min styrke. - -ID: 912 -Title: Christian til Raven -Data: Er det derfor, han blev dræbt? For at forlade projektet? - -ID: 913 -Title: Christian til major Kreissck -Data: Hvorfor kæmper du mig alligevel? - -ID: 914 -Title: Shirro til Crystal -Data: Vring til skuffelse. - -ID: 915 -Title: Shirro til Steffan -Data: Faktisk er det på tide, at jeg smækker en grædende baby. - -ID: 916 -Title: Shirro til Milano -Data: Det blomstrer nu, og du vil aldrig vinde alligevel! - -ID: 917 -Title: Shirro til christian -Data: Din far ville være stolt af dig. For nu, sætte dit sind i ro. - -ID: 918 -Title: Shirro til Shirro -Data: Nej. Jeg bruger Mr. Det er Kleen. - -ID: 919 -Title: Shirro til Jean-Paul -Data: Hvordan kan du sige, at Nova er ond uden at vide, hvad det er? - -ID: 920 -Title: Shirro til Ibrahim -Data: Testene vil blive modsat eller ej. - -ID: 921 -Title: Shirro til Angel -Data: Hvor er du fra? - -ID: 922 -Title: Shirro til Cossette -Data: Din skade var til din krop. Du har flyttet det til dit sind. - -ID: 923 -Title: Shirro til Raven -Data: Jeg er ikke bange for virksomheden. Sted vil forbedre sig. - -ID: 924 -Title: Shirro til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 925 -Title: Jean-Paul til Crystal -Data: Bare slås. - -ID: 926 -Title: Jean-Paul til Steffan -Data: Du er ingenting. - -ID: 927 -Title: Jean-Paul til Milano -Data: Farvel, ven. - -ID: 928 -Title: Jean-Paul til kristen -Data: I det mindste er mine grunde ikke så dyr som din. - -ID: 929 -Title: Jean-Paul til Shirro -Data: Hvis du kæmper som du gjorde i din sidste kamp, er jeg sikker på at vinde. - -ID: 930 -Title: Jean-Paul til Jean-Paul -Data: Du har ret, selvfolgelig... - -ID: 931 -Title: Jean-Paul til Ibrahim -Data: Måske, men min intelligens vil give mig sejr. - -ID: 932 -Title: Jean-Paul til Angel -Data: Hvis ja, hvorfor er du så her? - -ID: 933 -Title: Jean-Paul til Cossette -Data: Ja, efter jeg genspiller dit nederlag. - -ID: 934 -Title: Jean-Paul til Raven -Data: Og du er en marionet, der forsoger at bryde sine strenge. - -ID: 935 -Title: Jean-Paul til major Kreissak -Data: Hvorfor kæmper du mig alligevel? - -ID: 936 -Title: Ibrahim til Crystal -Data: Hævn vil overskygge dit sind, lille en. - -ID: 937 -Title: Ibrahim til Steffan -Data: Jeg tror, du allerede er flov! - -ID: 938 -Title: Ibrahim til Milano -Data: Din vej vil ikke betyde noget. - -ID: 939 -Title: Ibrahim til christian -Data: Eksperimenterne startede ikke ondt. Vi forsogte at forlænge livet! - -ID: 940 -Title: Ibrahim til Shirro -Data: Det er alvorligt, min ven. Jeg må besejre dig. - -ID: 941 -Title: Ibrahim til Jean-Paul -Data: Min involvering er ikke din bekymring. - -ID: 942 -Title: Ibrahim til Ibrahim -Data: ... det efterlod et stort bar-mærke på deres hoveder. - -ID: 943 -Title: Ibrahim til Angel -Data: Disse eksperimenter kan redde liv. - -ID: 944 -Title: Ibrahim til Cossette -Data: Venligst, din skade har intet at gore med denne kamp. - -ID: 945 -Title: Ibrahim til Raven -Data: Du kan ændre mening forste gang jeg smider dig. - -ID: 946 -Title: Ibrahim til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 947 -Title: Angel til Crystal -Data: Men det vil være det storste sind, der vinder denne konkurrence. - -ID: 948 -Title: Angel til Steffan -Data: Du er ved at få en mands uddannelse. - -ID: 949 -Title: Angel til Milano -Data: Vær ikke. - -ID: 950 -Title: Angel til christian -Data: Jeg bekymrer mig ikke om dine små konflikter. - -ID: 951 -Title: Angel til Shirro -Data: Det sidste, din elendige virksomhed ville forvente. - -ID: 952 -Title: Angel til Jean-Paul -Data: Du vil snart finde ud af min sag. - -ID: 953 -Title: Angel til Ibrahim -Data: Du finder ingen registrering af mig nogen steder. - -ID: 954 -Title: Angel til Angel -Data: Og i det mindste kender jeg den rigtige dig. - -ID: 955 -Title: Angel til Cossette -Data: For Ganymede må jeg sejre. - -ID: 956 -Title: Angel til Raven -Data: Jeg har til hensigt at gore det. - -ID: 957 -Title: Angel til Major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 958 -Title: Cossette til Crystal -Data: Det var et lejesoldater band kaldet Iron Fist, der odelagde rumfærgen. - -ID: 959 -Title: Cossette til Steffan -Data: Forbered dig på at se, hvad et rigtigt sind kan gore. - -ID: 960 -Title: Cossette til Milano -Data: Jeg har ikke brug for din respekt. Bare titlen. - -ID: 961 -Title: Cossette til christian -Data: Åh, det vil jeg, tro mig. - -ID: 962 -Title: Cossette til Shirro -Data: Men jeg er bange for, at jeg har andre planer... - -ID: 963 -Title: Cossette til Jean-Paul -Data: Held? Hvis jeg var heldig, ville jeg ikke være i denne stol! - -ID: 964 -Title: Cossette til Ibrahim -Data: Hvad vil du bekymre dig? - -ID: 965 -Title: Cossette til Angel -Data: Jeg har aldrig sagt op. - -ID: 966 -Title: Cossette til Cossette -Data: Ja, men hvilken! - -ID: 967 -Title: Cossette til Raven -Data: Se hvad du siger, jeg er dodbringende, når jeg er vred. - -ID: 968 -Title: Cossette til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 969 -Title: Raven til Crystal -Data: Hvis du vil holde det smukke ansigt, skal du stoppe med at stille sporgsmål. - -ID: 970 -Title: Raven til Steffan -Data: Ja, jeg vil slange ned, hvad der er tilbage. - -ID: 971 -Title: Raven til Milano -Data: Det er lige meget. Når jeg vinder, vil Kreissack do. - -ID: 972 -Title: Raven til kristen -Data: De onsker at være i stand til at holde et menneskeligt sind i live inde i en robot. - -ID: 973 -Title: Raven til Shirro -Data: Du ved intet. - -ID: 974 -Title: Raven til Jean-Paul -Data: Du bekymrer dig selv for meget med andres forretning. - -ID: 975 -Title: Raven til Ibrahim -Data: Og du er også målrettet, medoprorere. - -ID: 976 -Title: Raven til Angel -Data: I hvert fald stærkere end dig! - -ID: 977 -Title: Raven to Cossette -Data: Jeg er kun en bodyguard, så længe det passer til mit formål. - -ID: 978 -Title: Raven til Raven -Data: ...rorrim a ni gnikool ekil tsomlA - -ID: 979 -Title: Raven til major Kreissack -Data: Hvorfor kæmper du mig alligevel? - -ID: 980 -Title: Kreissæk til Crystal -Data: Din nysgerrighed vil være din ulempe, pige! - -ID: 981 -Title: M Kreissack til Steffan -Data: Ha! Hvad er det? Du er knap nok ude af bleer! - -ID: 982 -Title: M Kreissick til Milano -Data: Åh, men det gor jeg. Du er den i morket her! - -ID: 983 -Title: M Kreissack til kristen -Data: Kom og se hvad din far arbejdede på! Den perfekte hersker er her! - -ID: 984 -Title: M Kreissack til Shirro -Data: Godt, jeg er overrasket over at se dig her, også. - -ID: 985 -Title: M Kreissæk til Jean-Paul -Data: Mine dage med magt er lige begyndt! - -ID: 986 -Title: M Kreissack til Ibrahim -Data: Her er hvad eksperimenterne producerede! Jeg er genfodt en maskine! - -ID: 987 -Title: M Kreissuck til Angel -Data: Opror? Hvilket opror? - -ID: 988 -Title: M Kreissak til Cossette -Data: Din skade var tragisk. Ærgerligt, at du ikke blev nede. - -ID: 989 -Title: M Kreissick til Raven -Data: Jeg ved, hvad du er op til, hvalp, og jeg ser på en dod mand. - -ID: 990 -Title: Kreissuck til Kreissuck -Data: 'Aven't vi modtes for? - -ID: 991 -Title: Shareware Slutter -Data: Da oprydningsbesætningerne fjerner, hvad der er tilbage af Ravens robot fra arenaen, indser du, at du har bestået testen. -Kampen har efterladt dig udmattet, men du kan stadig kun tænke på at vinde den virkelige kamp, kampen mod Kreissack, overherre af turneringen. -Der er meget at lære, meget at overvinde; Men du vil lære, du vil kæmpe, og du vil vinde... -Hvis du tor tage imod udfordringen! - -ID: 992 -Title: Alles begyndelse på e -Data: Du vågner i din egen krop. I et ojeblik kommer du ned fra adrenalinhojen, du har oplevet. Din krop virker så skrobelig nu. Holdet fejrer allerede, og du glæder dig over deres lykonskninger. -Tid til at feste er kortvarig. Dit sind tager i de sidste par timer begivenheder og den viden, at en hel måne er nu din til at styre. -"Vent et sekund!" kommer en panikagtig stemme fra en vidmonitor. "Alle! Lyt til!" Han skruer op for lydstyrken, og alle i rummet er stille. -"... blev fundet dod i dag. Vi gentager, Hans Kreissacks lig blev fundet kl. 18.00 i aften i en skraldespand uden for Nova-laboratorierne. -Alle holder vejret, mens nyhedsreporteren fortsætter. - Vi har fået denne meddelelse, der skulle læses, da Kreissack vandt kampen i aften. Der står:" -"Medlemme af alle mennesker: En ny dag er begyndt! Nova, et projekt startet af WAR., vil give nyt liv! Denne proces kan tage en menneskelig hjerne og placere den inde i en robotkrop. -- Det, du så i aften, var mig, Hans Kreissack, der var direkte forbundet med en ny form for H.A.R. Den menneskelige race vil nu se dens endelige udvikling! -Annoncoren lægger bevillingsapparatet, der indeholder meddelelsen. "Tragisk nok er alle forskere tæt på projektet blevet dræbt i en brand, der brod ud kort efter den sidste kamp i aften. Alle optegnelser fra Nova-projektet blev odelagt. -"I andre nyheder..." -Et besætningsmedlem slukker for displayet. "Nå, det ser ud til, at vi vil være på udkig efter en ny chef nu..." - -ID: 993 -Title: Crystals afslutning -Data: De skulle give dig topprioriteret adgang med det samme. Din forste handling var at hoppe på et privat link og bruge den kode, du har båret siden dine forældres dod. Når du får adgang til en personlig log fra din far, finder du ud af, hvad Nova handlede om. -Din far, sammen med andre topforskere, arbejdede på en måde at holde en menneskelig hjerne i live. Lidt indså de den virkelige årsag til deres eksperimenter. Da din far opdagede, at Kreissack forsogte at danne en cyborg hær ved hjælp af sine eksperimenter, forlod han projektet. -Han burde have vidst, at Kreissuck ikke ville lade ham gå væk. Optegnelserne viste en $ 1500k udbetaling til Iron Fist for "forskning". Iron Fist, hyret under Kreissacks direkte ordrer, dræbte dine forældre. -Nu er han også dod. Nova-projektet vil ikke fortsætte. Når du træder ind i elevatoren til den næste shuttle til Ganymede, forestiller du dig de ændringer, du kan hjælpe med at bringe til KLAGE. Nu har du magt til at bringe disse dromme til virkelighed. - -ID: 994 -Title: Steffans Slutning -Data: Nå, den onde heks er dod... Det vil gore dit job meget lettere! For det forste, at Nova-projektet lyder som om det kunne være en god ting at hente igen. Måske havde den gamle mand bare ikke den rigtige hjerne... -Ganymede var let. Kreissack var en brise. Den næste udfordring bliver hele Jupiter. Og Så Mars. Og så Jorden. -Men for nu skal du mode dit folk. - -ID: 995 -Title: Milano -Data: Med Kreissack dod, vil der være indlysende ændringer. Bestyrelsen taler allerede om at vælge en ny præsident, og du er bare manden til det job. -Forst skal du bringe Ganymede op i fart. Brug derefter sine enorme naturressourcer til at producere H.A.R.'s i rekordfart. Så, når anerkendelsen er der, byde på formand. -Når du er præsident, kan du afslore dit sande navn og vise, at dette firma er din fodselsret. Endnu en gang vil KRIG være en virksomhed for at hjælpe menneskeheden, ikke slavebande den. Måske kan du endda ændre navnet til Aeronautics og Robotics Technologies! - -ID: 996 -Title: Christians afslutning -Data: I en lille Alco-bar modte du lederen af den berygtede lejesoldatgruppe Iron Fist. Med Kreissack ude af vejen indrommede de frit at blive ansat til at dræbe alle, der er forbundet med Nova-projektet. -De forklarer, at dine forældre blev placeret på et rumfærskib og derefter odelagt af laserbrand. Af vrede trækker du en pistol, klar til at slå ned mindst en af disse fjender som hævn, for resten fordamper dig. -Din sidearm er der ikke. Du stinker som Iron Fist repræsentanter griner. Deres leder siger: "Din hævn er forbi, ven. Anyway, vi har brug for dig på Ganymede i live. Der er stadig meget arbejde, der skal gores." -"Dine forældre var dode, uanset om vi dræbte dem eller ej. Nu har vi brug for, at du er med til at kæmpe mod Kærlighed. Kreissuck var kun begyndelsen. Ganymede er kun begyndelsen. Pas på din ryg, knægt." -Nu forbereder du dig på at gå om bord på skibet, der vil tage dig til dit nye liv... - -ID: 997 -Title: Shirro -Data: En menneskelig hjerne inde i en robot? Du tænker på mulighederne. Hvor vidunderligt kunne det være at være inde i den metalramme PERMANENT? Hvor KRAFTIG? -Men se, hvad denne magt gjorde mod Kreissack. Du spekulerer på, hvad det kan gore ved dig... -Du arkiverer den tanke i de morkere fordybninger af dit sind og vender din opmærksomhed mod fremtiden. En fremtid, hvor H.A.R. Arenakampe er en sport i stedet for et simpelt reklamestunt. Da dette ikke ville indebære skade på levende væsener, kunne det nemt komme forbi Verdensfredsorganisationen. -Ja, det er rigtigt! En ny sport! Plus penge og berommelse vil gå til dig! Til sidst, så vil KRIG... - -ID: 998 -Title: Jean-Paul -Data: Selvfolgelig! Kreisscks hemmelighed! Hvad kan der ske med dit perfekte sind inde i en perfekt krop? - -ID: 999 -Title: Ibrahim -Data: Nova... Fantastisk... -Du husker folelsen, da det monster af en robot dukkede op overfor dig. Stadig forbloffet over, at du var i stand til at overvinde noget så kraftfuldt, du sidder gennem de endelose moder og horinger i en dos. -"Mr. Det er Jihad. Er det okay?" Du indser, at en person, der har talt med dig i de sidste femten minutter forventer et svar... -"I Hvert Fald... James, er det? Ja... hvad... hvad... Jeg er ked af det, men I herrer bliver nodt til at undskylde mig..." -Du går, ignorerer protesterne fra WAR's bestyrelse. Deres kævl over, hvem der bliver den næste konge af bakken gor lidt mere end irriteret dig. -"Hvordan kan jeg bygge den robot?" siger du hojt. Du kommer ind på dit kontor og begynder straks at skrive noter på de metaller, du har bemærket under kampen. Placeringen af armene... De sandsynlige mikromotorer i hænderne... -Den Nova-robot, du designer, vil en dag tage den plads i WAR's stadigt stigende arsenal af robotter. Selvom den model, du designer, aldrig vil holde en egentlig menneskelig hjerne, vil Nova snart blive den mest formidable 'bot i kataloget... -...og Ganymede er hvor produktionen vil starte... - -ID: 1000 -Title: Angel -Data: Forestil dig, at gamle fjols tænker, at blot at placere sin hjerne inde i en robot ville gore ham til en slags god! Disse mennesker vil aldrig forstå, at odelæggelse aldrig gor fremskridt. Dine ojne lukker... -< 695342: Operationer er ved at forlobe som planlagt. Jeg er ikke blevet opdaget. > -< 000126: Erkendt. Vi lytter. Er du blevet deres leder? > -69542: Jeg er deres leder for vores måne. De kalder det Ganymede.> -< 000385: Så har vi vundet. De vil gå nu.> -< 695342: Ikke endnu. Jeg vil snart blive spurgt, om jeg vil blive formand for KRIG. -< 000014: Du vil acceptere. Så vil de gå. Vi vil være alene igen.> -< 695342: Ja. Men de kender de mineraler, vores planet har. De vil vende tilbage.> -< 000001: Så vil de gå til grunde.> -... Dine ojne er åbne. "Hvilket er, hvad jeg har onsket hele tiden..." siger du bittert. - -ID: 1001 -Title: Cossette -Data: Selvfolgelig vandt du. Det gamle fjols forstod aldrig dine evner. Og han betalte for sin fejl, gjorde han ikke. -Umiddelbart tildeler du, hvilke ingeniorer du kan monstre for at finde ud af, hvordan Kreissack var i stand til at placere sin hjerne inde i en maskine. -Hvor ville det være vidunderligt at endelig sige farvel til denne stol og tilbringe evigheden i den perfekte krop af en robot. Du ser ned på skrive- og designspecifikationerne for Cossette-robotten. -"Jeg vil snart gå igen." siger du, "og så vil jeg se, hvilken slags KORT præsident jeg kan gore..." - -ID: 1002 -Title: Raven -Data: Hvem kunne have bedt om mere? Sikke en bonus! At få Ganymede og levere dodsstodet til Kreissack selv! -Selvfolgelig skal du beskæftige sig med tosere i bestyrelsen, men med den store chef ud af den måde, de vil være lidt mere end foder. -En af de forudsigelige små papirpushovere forsogte allerede at ændre hakkeordenen tidligere, husker du... -"Minste, sir." Du ser ned som dækningen over dit måltid er hævet. -"Sjæld bof. Min favorit, Jonesey!" Du indånder den skarpe aroma af din sejrsfest... -For skarpt... Du smiler... -"Jonesey? Dette indeholder Noxosilinon Aerodide. Meget dodbringende, meget dyr gift. Lugter lidt som kylling. "Må du tage den væk?" -Han stammer, "...ja... sir... Vil det være alt, sir?" siger han, mens han bakker ud af rummet. Han lukker doren bag sig, for du har tid til at svare. -"Nej, det vil helt sikkert ikke være alt." Du læner dig tilbage i din stol og smider dine fodder på bordet og dine hænder bag dit hoved, "Det vil kun være begyndelsen..." - -ID: 1003 -Title: Crystals anden slutning -Data: Når du flyver mod månen, falder en fred over dig. -Du foler, at du endelig kan være glad, nu hvor dine forældres dod er blevet hævnet. - -ID: 1004 -Title: Steffans anden slutning -Data: Når du flyver mod månen, lukker du ojnene og begynder at tænke på, hvad du snart vil have. -Ingen kan stoppe dig nu. - -ID: 1005 -Title: Milanos anden slutning -Data: Når du flyver mod månen, falder en fred over dig. -Du foler, at du endelig kan slappe af, nu hvor den hårde del af rejsen er forbi. - -ID: 1006 -Title: Christians anden slutning -Data: Når du flyver mod månen, falder en fred over dig. -Du foler, at du endelig kan være glad, nu hvor dine forældres dod er blevet hævnet. - -ID: 1007 -Title: Crystals anden slutning -Data: Du kan ikke stoppe med at tænke på fremtiden, når du flyver mod månen. -Når du lander på den morke side af månen, ser fremtiden lys ud. - -ID: 1008 -Title: Jean-Paul slutter #2 -Data: Du finder på dit trukne en nogle til et stort rum begravet dybt inde i Ganymede. Åbner doren, du stirrer på den storste videnskabelige facilitet, du nogensinde har set. Det er klart, at Kreissck planlagde en fremtid her. Hans fremtid. -"Hjem" siger du, at hore ordet ekkoet tilbage fra morket. - -ID: 1009 -Title: Ibrahims anden slutning -Data: Planerne dannes, når du flyver mod månen. -Ingen tvivl om det, månen vil fungere perfekt. - -ID: 1010 -Title: Angel's anden slutning -Data: Når du vender tilbage til dit hjem, tænker du på, hvordan du stopper dem. -Disse mennesker med deres urimelige og umættelige ambitioner, de er gået langt nok! - -ID: 1011 -Title: Cossettes anden slutning -Data: Når du flyver mod månen, synes dine handicaps begrænsninger at falme væk. -Med dine dromme inden for rækkevidde foler du dig stærkere og mere levende end nogensinde. - -ID: 1012 -Title: Ravens anden slutning -Data: Nu flyver du mod månen, hvilket gor en mental liste over firmaets mænd, der har den usunde tendens til at tænke for sig selv. -Du kan ikke lade være med at smile, når en tanke opstår... -Nu skal du bruge en livvagt. diff --git a/resources/DANISH2.TXT b/resources/DANISH2.TXT deleted file mode 100644 index 40ef3940e..000000000 --- a/resources/DANISH2.TXT +++ /dev/null @@ -1,4 +0,0 @@ -ID: 0 -Title: Translation Name -Data: Dansk -Maskinoversottelse diff --git a/resources/ENGLISH2.TXT b/resources/ENGLISH2.TXT deleted file mode 100644 index 17749d05c..000000000 --- a/resources/ENGLISH2.TXT +++ /dev/null @@ -1,3 +0,0 @@ -ID: 0 -Title: Translation Name -Data: English diff --git a/resources/GERMAN2.TXT b/resources/GERMAN2.TXT deleted file mode 100644 index 86f5b6460..000000000 --- a/resources/GERMAN2.TXT +++ /dev/null @@ -1,3 +0,0 @@ -ID: 0 -Title: Translation Name -Data: Deutsch From f78fa3f01c5568a6f62ccb96faa6a9a6efb4e48f Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 20:37:16 -0800 Subject: [PATCH 08/23] Port languages.h and .c to use generated_languages.h --- src/resources/languages.c | 62 +-------------------------------------- src/resources/languages.h | 5 ++-- 2 files changed, 3 insertions(+), 64 deletions(-) diff --git a/src/resources/languages.c b/src/resources/languages.c index 6eda8a031..f88af6a3c 100644 --- a/src/resources/languages.c +++ b/src/resources/languages.c @@ -10,11 +10,9 @@ #include static sd_language *language; -static sd_language *language2; bool lang_init(void) { language = NULL; - language2 = NULL; str filename_str; const char *dirname = pm_get_local_path(RESOURCE_PATH); @@ -32,61 +30,13 @@ bool lang_init(void) { goto error_0; } - // OMF GERMAN.DAT and old versions of ENGLISH.DAT have only 990 strings - unsigned int const old_language_count = 990; - - if(language->count == old_language_count) { - // OMF 2.1 added netplay, and with it 23 new localization strings - unsigned new_ids[] = {149, 150, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 267, 269, 270, 271, 284, 295, 305}; - unsigned *new_ids_end = new_ids + N_ELEMENTS(new_ids); - - // insert dummy entries - sd_lang_string *expanded_strings = omf_malloc(LANG_STR_COUNT * sizeof(sd_lang_string)); - unsigned next = 0; - unsigned next_from = 0; - for(unsigned *id = new_ids; id < new_ids_end; id++) { - unsigned copy_count = *id - next; - memcpy(expanded_strings + next, language->strings + next_from, copy_count * sizeof(sd_lang_string)); - next += copy_count; - next_from += copy_count; - - expanded_strings[next].data = NULL; - memcpy(expanded_strings[next].description, "dummy", 6); - next++; - language->count++; - } - memcpy(expanded_strings + next, language->strings + next_from, - (LANG_STR_COUNT - next) * sizeof(sd_lang_string)); - omf_free(language->strings); - language->strings = expanded_strings; - } - if(language->count != LANG_STR_COUNT) { + if(language->count != Lang_Count) { PERROR("Unable to load language file '%s', unsupported or corrupt file!", filename); goto error_0; } INFO("Loaded language file '%s'.", filename); - // Load up language2 file (OpenOMF) - str_append_c(&filename_str, "2"); - filename = str_c(&filename_str); - - language2 = omf_calloc(1, sizeof(sd_language)); - if(sd_language_create(language2) != SD_SUCCESS) { - goto error_0; - } - if(sd_language_load(language2, filename)) { - PERROR("Unable to load OpenOMF language file '%s'!", filename); - goto error_0; - } - if(language2->count != LANG2_STR_COUNT) { - PERROR("Unable to load OpenOMF language file '%s', unsupported or corrupt file!", filename); - goto error_0; - } - - INFO("Loaded OpenOMF language file '%s'.", filename); - str_free(&filename_str); // XXX we're wasting 32KB of memory on language->strings[...].description @@ -102,8 +52,6 @@ bool lang_init(void) { void lang_close(void) { sd_language_free(language); omf_free(language); - sd_language_free(language2); - omf_free(language2); } const char *lang_get(unsigned int id) { @@ -113,11 +61,3 @@ const char *lang_get(unsigned int id) { } return language->strings[id].data; } - -const char *lang_get2(unsigned int id) { - if(id > language2->count || !language2->strings[id].data) { - PERROR("unsupported lang2 id %u!", id); - return "!INVALID2!"; - } - return language2->strings[id].data; -} diff --git a/src/resources/languages.h b/src/resources/languages.h index 5e98df7b2..1db6df12c 100644 --- a/src/resources/languages.h +++ b/src/resources/languages.h @@ -1,6 +1,7 @@ #ifndef LANGUAGES_H #define LANGUAGES_H +#include "resources/generated_languages.h" #include /* @@ -39,9 +40,7 @@ enum LANG2_STR_COUNT }; -// Gets an OMF 2097 localization string +// Gets a localization string const char *lang_get(unsigned int id); -// Gets an openomf localization string -const char *lang_get2(unsigned int id); #endif // LANGUAGES_H From 0f5b38a9d48b650192f07852cc495a82ca771b3c Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 20:56:59 -0800 Subject: [PATCH 09/23] menu_language: Use Lang enum --- src/game/scenes/mainmenu/menu_language.c | 39 ++++++++++++------------ 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/game/scenes/mainmenu/menu_language.c b/src/game/scenes/mainmenu/menu_language.c index d715714be..37c0f205f 100644 --- a/src/game/scenes/mainmenu/menu_language.c +++ b/src/game/scenes/mainmenu/menu_language.c @@ -75,8 +75,6 @@ component *menu_language_create(scene *s) { list dirlist; // Seek all files list_create(&dirlist); - list_append(&dirlist, "ENGLISH.DAT", strlen("ENGLISH.DAT") + 1); - list_append(&dirlist, "GERMAN.DAT", strlen("GERMAN.DAT") + 1); scan_directory_suffix(&dirlist, dirname, ".LNG"); local->language_filenames = omf_malloc(list_size(&dirlist) * sizeof(char *)); local->language_names = omf_malloc(list_size(&dirlist) * sizeof(char *)); @@ -84,31 +82,31 @@ component *menu_language_create(scene *s) { iterator it; list_iter_begin(&dirlist, &it); - char const *filename; - str filename2; - str_create(&filename2); - while((filename = (char *)list_iter_next(&it))) { - // Get localized language name from OpenOMF .DAT2 or .LNG2 file - str_format(&filename2, "%s%s2", dirname, filename); - sd_language lang2; - if(sd_language_create(&lang2) != SD_SUCCESS) { + char const *lang_name; + str filename; + str_create(&filename); + while((lang_name = (char *)list_iter_next(&it))) { + // Get localized language name from OpenOMF .LNG file + str_format(&filename, "%s%s", dirname, lang_name); + sd_language lang; + if(sd_language_create(&lang) != SD_SUCCESS) { continue; } - if(sd_language_load(&lang2, str_c(&filename2))) { - INFO("Warning: Unable to load OpenOMF language file '%s'!", str_c(&filename2)); - sd_language_free(&lang2); + if(sd_language_load(&lang, str_c(&filename))) { + INFO("Warning: Unable to load language file '%s'!", str_c(&filename)); + sd_language_free(&lang); continue; } - if(lang2.count != LANG2_STR_COUNT) { - INFO("Warning: Invalid OpenOMF language file '%s', got %d entries!", str_c(&filename2), lang2.count); - sd_language_free(&lang2); + if(lang.count != Lang_Count) { + INFO("Warning: Invalid language file '%s', got %d entries!", str_c(&filename), lang.count); + sd_language_free(&lang); continue; } - char *language_name = lang2.strings[LANG2_STR_LANGUAGE].data; - lang2.strings[LANG2_STR_LANGUAGE].data = NULL; - sd_language_free(&lang2); + char *language_name = lang.strings[LangLanguage].data; + lang.strings[LangLanguage].data = NULL; + sd_language_free(&lang); - if(strcmp(setting->language.language, filename) == 0) { + if(strcmp(setting->language.language, lang_name) == 0) { local->selected_language = local->language_count; } @@ -120,6 +118,7 @@ component *menu_language_create(scene *s) { local->language_filenames[id] = now->data; now->data = NULL; } + str_free(&filename); list_free(&dirlist); // Text config From 41ce3accdac401e759a1797d02b896d828265443 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Tue, 5 Nov 2024 13:29:25 -0800 Subject: [PATCH 10/23] Autocorrect .DAT language setting with .LNG --- src/resources/languages.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/resources/languages.c b/src/resources/languages.c index f88af6a3c..e5c3942d9 100644 --- a/src/resources/languages.c +++ b/src/resources/languages.c @@ -14,9 +14,16 @@ static sd_language *language; bool lang_init(void) { language = NULL; + char *lang = settings_get()->language.language; + + { + char *old_extension = strstr(lang, ".DAT"); + if(old_extension) + memcpy(old_extension, ".LNG", 4); + } + str filename_str; const char *dirname = pm_get_local_path(RESOURCE_PATH); - const char *lang = settings_get()->language.language; str_from_format(&filename_str, "%s%s", dirname, lang); char const *filename = str_c(&filename_str); From fd03f14e4dd5bda9a769dd408a21965bb4441def Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 20:43:58 -0800 Subject: [PATCH 11/23] Add lang_get_offset --- src/resources/languages.c | 17 ++++++++++++----- src/resources/languages.h | 6 +++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/resources/languages.c b/src/resources/languages.c index e5c3942d9..013d59ed9 100644 --- a/src/resources/languages.c +++ b/src/resources/languages.c @@ -7,6 +7,7 @@ #include "utils/c_array_util.h" #include "utils/log.h" #include "utils/str.h" +#include #include static sd_language *language; @@ -61,10 +62,16 @@ void lang_close(void) { omf_free(language); } -const char *lang_get(unsigned int id) { - if(id > language->count || !language->strings[id].data) { - PERROR("unsupported lang id %u!", id); - return "!INVALID!"; - } +const char *lang_get(int id) { + assert(id >= 0); + assert(id < Lang_Count); return language->strings[id].data; } + +const char *lang_get_offset_impl(int id, int last, int offset) { + assert(id >= 0); + assert(last >= id); + assert(last < Lang_Count); + assert(id + offset <= last); + return lang_get(id + offset); +} diff --git a/src/resources/languages.h b/src/resources/languages.h index 1db6df12c..ec2b83270 100644 --- a/src/resources/languages.h +++ b/src/resources/languages.h @@ -41,6 +41,10 @@ enum }; // Gets a localization string -const char *lang_get(unsigned int id); +const char *lang_get(int id); + +// Gets an openomf localization string (from one of the tables) +#define lang_get_offset(LangStr, offset) lang_get_offset_impl(LangStr, LangStr##_Last, (offset)) +const char *lang_get_offset_impl(int id, int last, int offset); #endif // LANGUAGES_H From 2d4fdf46ae4679eb0158523d24f54cb3ebca5cf6 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 20:29:04 -0800 Subject: [PATCH 12/23] Convert newsroom to use generated_languages.h --- src/game/scenes/newsroom.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/game/scenes/newsroom.c b/src/game/scenes/newsroom.c index f7928afdc..94ab4c0ed 100644 --- a/src/game/scenes/newsroom.c +++ b/src/game/scenes/newsroom.c @@ -31,17 +31,17 @@ typedef struct newsroom_local_t { // their const char *possessive_pronoun(int sex) { - return lang_get(LANG_STR_PRONOUN + sex); + return lang_get_offset(LangPronoun, sex); } // them const char *object_pronoun(int sex) { - return lang_get(LANG_STR_PRONOUN + 2 + sex); + return lang_get_offset(LangPronoun, 2 + sex); } // they const char *subject_pronoun(int sex) { - return lang_get(LANG_STR_PRONOUN + 4 + sex); + return lang_get_offset(LangPronoun, 4 + sex); } char const *pronoun_strip(char const *pronoun, char *buf, size_t buf_size) { @@ -91,17 +91,17 @@ void newsroom_fixup_str(newsroom_local *local) { 11= P2 Subjective pronoun - He */ - unsigned int translation_id; + char const *raw_translation; if(local->champion && local->screen >= 2) { - translation_id = LANG_STR_NEWSROOM_NEWCHAMPION; + raw_translation = lang_get(LangNewsroomNewChampion); } else { - translation_id = LANG_STR_NEWSROOM_TEXT + local->news_id + min2(local->screen, 1); + raw_translation = lang_get_offset(LangNewsroomReport, local->news_id + min2(local->screen, 1)); } char scratch[9]; str tmp; - str_from_c(&tmp, lang_get(translation_id)); + str_from_c(&tmp, raw_translation); str_replace(&tmp, "~11", pronoun_strip(subject_pronoun(local->sex2), scratch, sizeof scratch), -1); str_replace(&tmp, "~10", pronoun_strip(object_pronoun(local->sex2), scratch, sizeof scratch), -1); str_replace(&tmp, "~9", pronoun_strip(possessive_pronoun(local->sex2), scratch, sizeof scratch), -1); @@ -109,8 +109,8 @@ void newsroom_fixup_str(newsroom_local *local) { str_replace(&tmp, "~7", pronoun_strip(object_pronoun(local->sex1), scratch, sizeof scratch), -1); str_replace(&tmp, "~6", pronoun_strip(possessive_pronoun(local->sex1), scratch, sizeof scratch), -1); str_replace(&tmp, "~5", "Stadium", -1); - str_replace(&tmp, "~4", pronoun_strip(lang_get(local->har2 + LANG_STR_HAR), scratch, sizeof scratch), -1); - str_replace(&tmp, "~3", pronoun_strip(lang_get(local->har1 + LANG_STR_HAR), scratch, sizeof scratch), -1); + str_replace(&tmp, "~4", pronoun_strip(lang_get_offset(LangRobot, local->har2), scratch, sizeof scratch), -1); + str_replace(&tmp, "~3", pronoun_strip(lang_get_offset(LangRobot, local->har1), scratch, sizeof scratch), -1); str_replace(&tmp, "~2", str_c(&local->pilot2), -1); str_replace(&tmp, "~1", str_c(&local->pilot1), -1); @@ -383,9 +383,9 @@ int newsroom_create(scene *scene) { newsroom_set_names(local, p1->pilot->name, p2->pilot->name, p1->pilot->har_id, p2->pilot->har_id, pilot_sex(p1->pilot->pilot_id), pilot_sex(p2->pilot->pilot_id)); } else { - newsroom_set_names(local, lang_get(20 + p1->pilot->pilot_id), lang_get(20 + p2->pilot->pilot_id), - p1->pilot->har_id, p2->pilot->har_id, pilot_sex(p1->pilot->pilot_id), - pilot_sex(p2->pilot->pilot_id)); + newsroom_set_names(local, lang_get_offset(LangPilot, p1->pilot->pilot_id), + lang_get_offset(LangPilot, p2->pilot->pilot_id), p1->pilot->har_id, p2->pilot->har_id, + pilot_sex(p1->pilot->pilot_id), pilot_sex(p2->pilot->pilot_id)); } newsroom_fixup_str(local); From 75798f37de764b3ddeee75662957217faa6bf0a3 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sun, 3 Nov 2024 14:56:01 -0800 Subject: [PATCH 13/23] Reduce runtime language-file memory usage Also ensures they are stored sequentially on the heap for better cache-locality. --- src/resources/languages.c | 52 +++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/resources/languages.c b/src/resources/languages.c index 013d59ed9..01956f241 100644 --- a/src/resources/languages.c +++ b/src/resources/languages.c @@ -10,10 +10,45 @@ #include #include -static sd_language *language; +static char **language_compact; + +static char **lang_compact(sd_language *lang) { + // calculate in-memory size of language's data + unsigned int data_byte_count = 0; + for(unsigned int i = 0; i < lang->count; i++) { + char const *data = lang->strings[i].data; + data_byte_count += (data ? strlen(data) : 0) + 1; + } + + char **allocation = omf_malloc(lang->count * sizeof(char *) + data_byte_count); + char *strings = (char *)(allocation + lang->count); + + // fill the allocation + char **ptr_iter = allocation; + char *strings_iter = strings; + for(unsigned int i = 0; i < lang->count; i++) { + *(ptr_iter++) = strings_iter; + + char const *data = lang->strings[i].data; + if(data) { + size_t data_size = strlen(data) + 1; + memcpy(strings_iter, data, data_size); + strings_iter += data_size; + } else { + strings_iter[0] = '\0'; + strings_iter += 1; + } + } + + assert(ptr_iter == allocation + lang->count); + assert(strings_iter == strings + data_byte_count); + + return allocation; +} bool lang_init(void) { - language = NULL; + language_compact = NULL; + sd_language *language = NULL; char *lang = settings_get()->language.language; @@ -29,7 +64,8 @@ bool lang_init(void) { char const *filename = str_c(&filename_str); // Load up language file - language = omf_calloc(1, sizeof(sd_language)); + sd_language language_real; + language = &language_real; if(sd_language_create(language) != SD_SUCCESS) { goto error_0; } @@ -47,25 +83,27 @@ bool lang_init(void) { str_free(&filename_str); - // XXX we're wasting 32KB of memory on language->strings[...].description + language_compact = lang_compact(language); + + sd_language_free(language); return true; error_0: str_free(&filename_str); + sd_language_free(language); lang_close(); return false; } void lang_close(void) { - sd_language_free(language); - omf_free(language); + omf_free(language_compact); } const char *lang_get(int id) { assert(id >= 0); assert(id < Lang_Count); - return language->strings[id].data; + return language_compact[id]; } const char *lang_get_offset_impl(int id, int last, int offset) { From 6756488734f4e869f18c413f1df7865efa90561c Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sun, 3 Nov 2024 15:41:00 -0800 Subject: [PATCH 14/23] Use Lang enum in all scenes --- src/game/protos/fight_stats.h | 1 - src/game/scenes/arena.c | 15 +++-- src/game/scenes/cutscene.c | 10 +-- src/game/scenes/mechlab.c | 19 +++--- src/game/scenes/mechlab/lab_dash_main.c | 6 +- src/game/scenes/mechlab/lab_dash_newplayer.c | 2 +- src/game/scenes/mechlab/lab_menu_confirm.c | 4 +- src/game/scenes/mechlab/lab_menu_customize.c | 65 ++++++++++--------- .../mechlab/lab_menu_difficultyselect.c | 4 +- src/game/scenes/mechlab/lab_menu_main.c | 21 +++--- src/game/scenes/mechlab/lab_menu_select.c | 4 +- src/game/scenes/mechlab/lab_menu_trade.c | 11 ++-- src/game/scenes/mechlab/lab_menu_training.c | 22 +++++-- src/game/scenes/melee.c | 31 +++++---- src/game/scenes/vs.c | 27 ++++---- 15 files changed, 130 insertions(+), 112 deletions(-) diff --git a/src/game/protos/fight_stats.h b/src/game/protos/fight_stats.h index 9d2e2cebb..fe9356b6a 100644 --- a/src/game/protos/fight_stats.h +++ b/src/game/protos/fight_stats.h @@ -19,7 +19,6 @@ typedef struct fight_stats_t { unsigned hit_miss_ratio[2]; } fight_stats; -#define PLUG_TEXT_START 587 #define PLUG_FORFEIT 1 #define PLUG_LOSE 2 #define PLUG_WIN 7 diff --git a/src/game/scenes/arena.c b/src/game/scenes/arena.c index e842b11fd..e364885dc 100644 --- a/src/game/scenes/arena.c +++ b/src/game/scenes/arena.c @@ -1144,20 +1144,21 @@ void arena_render_overlay(scene *scene) { } } else { // TODO put these in the pilot struct - player1_name = lang_get(player[0]->pilot->pilot_id + 20); - player2_name = lang_get(player[1]->pilot->pilot_id + 20); + player1_name = lang_get_offset(LangPilot, player[0]->pilot->pilot_id); + player2_name = lang_get_offset(LangPilot, player[1]->pilot->pilot_id); } text_render(&tconf_players, TEXT_DEFAULT, 5, 19, 250, 6, player1_name); - text_render(&tconf_players, TEXT_DEFAULT, 5, 26, 250, 6, lang_get((player[0]->pilot->har_id) + 31)); + text_render(&tconf_players, TEXT_DEFAULT, 5, 26, 250, 6, lang_get_offset(LangRobot, player[0]->pilot->har_id)); if(player[1]->pilot) { // when quitting, this can go null int p2len = (strlen(player2_name) - 1) * font_small.w; - int h2len = (strlen(lang_get((player[1]->pilot->har_id) + 31)) - 1) * font_small.w; + // XXX TODO: Magnus: Hardcoded - 1 for trailing newlines in localization strings + int h2len = (strlen(lang_get_offset(LangRobot, player[1]->pilot->har_id)) - 1) * font_small.w; text_render(&tconf_players, TEXT_DEFAULT, 315 - p2len, 19, 100, 6, player2_name); text_render(&tconf_players, TEXT_DEFAULT, 315 - h2len, 26, 100, 6, - lang_get((player[1]->pilot->har_id) + 31)); + lang_get_offset(LangRobot, player[1]->pilot->har_id)); } // Render score stuff @@ -1539,7 +1540,9 @@ int arena_create(scene *scene) { local->rec->pilots[i].info.color_1 = player->pilot->color_1; local->rec->pilots[i].info.color_2 = player->pilot->color_2; local->rec->pilots[i].info.color_3 = player->pilot->color_3; - memcpy(local->rec->pilots[i].info.name, lang_get(player->pilot->pilot_id + 20), 18); + // XXX ugly strncpy, implicit truncation, no nul termination guarantee, why are we even copying the pilot's + // name in here? + strncpy(local->rec->pilots[i].info.name, lang_get_offset(LangPilot, player->pilot->pilot_id), 18); } local->rec->arena_id = scene->id - SCENE_ARENA0; } else { diff --git a/src/game/scenes/cutscene.c b/src/game/scenes/cutscene.c index 6a074032d..acc3a2673 100644 --- a/src/game/scenes/cutscene.c +++ b/src/game/scenes/cutscene.c @@ -9,10 +9,6 @@ #include "utils/allocator.h" #include "video/video.h" -#define END_TEXT 992 -#define END1_TEXT 993 -#define END2_TEXT 1003 - typedef struct cutscene_local { char *text; char *current; @@ -138,7 +134,7 @@ int cutscene_create(scene *scene) { switch(scene->id) { case SCENE_END: audio_play_music(PSM_END); - text = lang_get(END_TEXT); + text = lang_get(LangSceneEnd); local->text_x = 10; local->text_y = 5; local->text_width = 300; @@ -146,7 +142,7 @@ int cutscene_create(scene *scene) { break; case SCENE_END1: - text = lang_get(END1_TEXT + p1->pilot->pilot_id); + text = lang_get_offset(LangSceneEnd1, p1->pilot->pilot_id); local->text_x = 10; local->text_y = 157; local->text_width = 300; @@ -170,7 +166,7 @@ int cutscene_create(scene *scene) { break; case SCENE_END2: - text = lang_get(END2_TEXT + p1->pilot->pilot_id); + text = lang_get_offset(LangSceneEnd2, p1->pilot->pilot_id); local->text_x = 10; local->text_y = 160; local->text_width = 300; diff --git a/src/game/scenes/mechlab.c b/src/game/scenes/mechlab.c index 4671d7368..56f00f1c6 100644 --- a/src/game/scenes/mechlab.c +++ b/src/game/scenes/mechlab.c @@ -146,16 +146,18 @@ void mechlab_free(scene *scene) { void mechlab_enter_trnselect_menu(scene *scene) { mechlab_local *local = scene_get_userdata(scene); - component *menu = lab_menu_select_create(scene, lab_dash_trnselect_select, &local->tw, lab_dash_trnselect_left, - &local->tw, lab_dash_trnselect_right, &local->tw, lang_get(486), true); + component *menu = + lab_menu_select_create(scene, lab_dash_trnselect_select, &local->tw, lab_dash_trnselect_left, &local->tw, + lab_dash_trnselect_right, &local->tw, lang_get(LangSelectTournament), true); guiframe_set_root(local->frame, menu); guiframe_layout(local->frame); } component *mechlab_chrload_menu_create(scene *scene) { mechlab_local *local = scene_get_userdata(scene); - component *menu = lab_menu_select_create(scene, lab_dash_main_chr_load, &local->dw, lab_dash_main_chr_left, - &local->dw, lab_dash_main_chr_right, &local->dw, lang_get(225), true); + component *menu = + lab_menu_select_create(scene, lab_dash_main_chr_load, &local->dw, lab_dash_main_chr_left, &local->dw, + lab_dash_main_chr_right, &local->dw, lang_get(LangSelectChrToLoad), true); trnmenu_set_submenu_init_cb(menu, lab_dash_main_chr_init); trnmenu_set_submenu_done_cb(menu, lab_dash_main_chr_done); trnmenu_set_userdata(menu, &local->dw); @@ -164,8 +166,9 @@ component *mechlab_chrload_menu_create(scene *scene) { component *mechlab_chrdelete_menu_create(scene *scene) { mechlab_local *local = scene_get_userdata(scene); - component *menu = lab_menu_select_create(scene, lab_dash_main_chr_delete, &local->dw, lab_dash_main_chr_left, - &local->dw, lab_dash_main_chr_right, &local->dw, lang_get(226), true); + component *menu = + lab_menu_select_create(scene, lab_dash_main_chr_delete, &local->dw, lab_dash_main_chr_left, &local->dw, + lab_dash_main_chr_right, &local->dw, lang_get(LangSelectChrToDelete), true); trnmenu_set_submenu_init_cb(menu, lab_dash_main_chr_init); trnmenu_set_submenu_done_cb(menu, lab_dash_main_chr_done); trnmenu_set_userdata(menu, &local->dw); @@ -175,7 +178,7 @@ component *mechlab_chrdelete_menu_create(scene *scene) { component *mechlab_sim_menu_create(scene *scene) { mechlab_local *local = scene_get_userdata(scene); component *menu = lab_menu_select_create(scene, lab_dash_main_chr_delete, &local->dw, lab_dash_sim_left, &local->dw, - lab_dash_sim_right, &local->dw, lang_get(227), true); + lab_dash_sim_right, &local->dw, lang_get(LangSelectOpponent), true); trnmenu_set_submenu_init_cb(menu, lab_dash_sim_init); trnmenu_set_submenu_done_cb(menu, lab_dash_sim_done); trnmenu_set_userdata(menu, &local->dw); @@ -212,7 +215,7 @@ void mechlab_tick(scene *scene, int paused) { game_player *player1 = game_state_get_player(scene->gs, 0); if(local->dashtype == DASHBOARD_NEW_PLAYER) { char select_photo[64]; - snprintf(select_photo, sizeof(select_photo), lang_get(224), player1->pilot->name); + snprintf(select_photo, sizeof(select_photo), lang_get(LangSelectPhotoForChr), player1->pilot->name); mechlab_select_dashboard(scene, DASHBOARD_SELECT_NEW_PIC); guiframe_free(local->frame); local->frame = guiframe_create(0, 0, 320, 200); diff --git a/src/game/scenes/mechlab/lab_dash_main.c b/src/game/scenes/mechlab/lab_dash_main.c index 1447a887a..e0de16260 100644 --- a/src/game/scenes/mechlab/lab_dash_main.c +++ b/src/game/scenes/mechlab/lab_dash_main.c @@ -405,8 +405,8 @@ void lab_dash_main_update(scene *s, dashboard_widgets *dw) { snprintf(tmp, sizeof(tmp), "MONEY: $ %sK", money); label_set_text(dw->money, tmp); - label_set_text(dw->har_name, lang_get(31 + p1->pilot->har_id)); - label_set_text(dw->har_moves, lang_get(492 + p1->pilot->har_id)); + label_set_text(dw->har_name, lang_get_offset(LangRobot, p1->pilot->har_id)); + label_set_text(dw->har_moves, lang_get_offset(LangRobotDescription, p1->pilot->har_id)); // Tournament and player name label_set_text(dw->name, p1->pilot->name); @@ -422,7 +422,7 @@ void lab_dash_sim_update(scene *s, dashboard_widgets *dw, sd_pilot *pilot) { label_set_text(dw->wins, tmp); snprintf(tmp, sizeof(tmp), "LOSES: %d", pilot->losses); label_set_text(dw->losses, tmp); - snprintf(tmp, sizeof(tmp), "MODEL: %s", lang_get(31 + pilot->har_id)); + snprintf(tmp, sizeof(tmp), "MODEL: %s", lang_get_offset(LangRobot, pilot->har_id)); label_set_text(dw->har_name, tmp); snprintf(tmp, sizeof(tmp), "NAME: %s", pilot->name); label_set_text(dw->name, tmp); diff --git a/src/game/scenes/mechlab/lab_dash_newplayer.c b/src/game/scenes/mechlab/lab_dash_newplayer.c index 1adb65e53..171e8d723 100644 --- a/src/game/scenes/mechlab/lab_dash_newplayer.c +++ b/src/game/scenes/mechlab/lab_dash_newplayer.c @@ -25,7 +25,7 @@ component *lab_dash_newplayer_create(scene *s, newplayer_widgets *nw) { xysizer_attach(xy, spriteimage_create(msprite->data), msprite->pos.x, msprite->pos.y, -1, -1); // Dialog text - xysizer_attach(xy, label_create(&tconf, lang_get(192)), 110, 43, 100, 50); + xysizer_attach(xy, label_create(&tconf, lang_get(LangPromptChrName)), 110, 43, 100, 50); // Input field tconf.cselected = TEXT_BRIGHT_GREEN; diff --git a/src/game/scenes/mechlab/lab_menu_confirm.c b/src/game/scenes/mechlab/lab_menu_confirm.c index 5214587a3..2f6dd40b0 100644 --- a/src/game/scenes/mechlab/lab_menu_confirm.c +++ b/src/game/scenes/mechlab/lab_menu_confirm.c @@ -58,7 +58,7 @@ component *lab_menu_confirm_create(scene *s, lab_menu_select_cb yes, void *yesda sprite *bsprite = animation_get_sprite(main_buttons, 0); component *button = - spritebutton_create(&tconf, lang_get(229), bsprite->data, COM_ENABLED, lab_menu_confirm_yes, yesgo); + spritebutton_create(&tconf, lang_get(LangYes), bsprite->data, COM_ENABLED, lab_menu_confirm_yes, yesgo); component_set_size_hints(button, bsprite->data->w, bsprite->data->h); component_set_pos_hints(button, bsprite->pos.x, bsprite->pos.y); @@ -69,7 +69,7 @@ component *lab_menu_confirm_create(scene *s, lab_menu_select_cb yes, void *yesda nogo->data = nodata; bsprite = animation_get_sprite(main_buttons, 1); - button = spritebutton_create(&tconf, lang_get(228), bsprite->data, COM_ENABLED, lab_menu_confirm_no, nogo); + button = spritebutton_create(&tconf, lang_get(LangNo), bsprite->data, COM_ENABLED, lab_menu_confirm_no, nogo); component_set_size_hints(button, bsprite->data->w, bsprite->data->h); component_set_pos_hints(button, bsprite->pos.x, bsprite->pos.y); diff --git a/src/game/scenes/mechlab/lab_menu_customize.c b/src/game/scenes/mechlab/lab_menu_customize.c index ca6278eab..b03cfc39f 100644 --- a/src/game/scenes/mechlab/lab_menu_customize.c +++ b/src/game/scenes/mechlab/lab_menu_customize.c @@ -417,9 +417,9 @@ void lab_menu_focus_blue(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; if(mechlab_get_selling(s)) { - mechlab_set_hint(s, lang_get(547)); + mechlab_set_hint(s, lang_get(LangCustomizeColor1)); } else { - mechlab_set_hint(s, lang_get(548)); + mechlab_set_hint(s, lang_get(LangCustomizeColor1)); } label_set_text(header_label, ""); label_set_text(details_label, ""); @@ -430,9 +430,9 @@ void lab_menu_focus_yellow(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; if(mechlab_get_selling(s)) { - mechlab_set_hint(s, lang_get(551)); + mechlab_set_hint(s, lang_get(LangCustomizeColor2)); } else { - mechlab_set_hint(s, lang_get(552)); + mechlab_set_hint(s, lang_get(LangCustomizeColor2)); } label_set_text(header_label, ""); label_set_text(details_label, ""); @@ -443,9 +443,9 @@ void lab_menu_focus_red(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; if(mechlab_get_selling(s)) { - mechlab_set_hint(s, lang_get(549)); + mechlab_set_hint(s, lang_get(LangCustomizeColor3)); } else { - mechlab_set_hint(s, lang_get(550)); + mechlab_set_hint(s, lang_get(LangCustomizeColor3)); } label_set_text(header_label, ""); label_set_text(details_label, ""); @@ -469,7 +469,7 @@ static void lab_menu_focus_arm_power(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->arm_power, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(553), "arm"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradePowerSell), "arm"); mechlab_set_hint(s, tmp); } else { label_set_text(header_label, "ARM POWER:\n\nUPGRADE COST:"); @@ -482,7 +482,7 @@ static void lab_menu_focus_arm_power(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->arm_power + 1, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(554), "arm"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradePowerBuy), "arm"); mechlab_set_hint(s, tmp); } } @@ -505,7 +505,7 @@ static void lab_menu_focus_leg_power(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->leg_power, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(555), "leg"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradePowerSell), "leg"); mechlab_set_hint(s, tmp); } else { label_set_text(header_label, "LEG POWER:\n\nUPGRADE COST:"); @@ -518,7 +518,7 @@ static void lab_menu_focus_leg_power(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->leg_power + 1, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(556), "leg"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradePowerBuy), "leg"); mechlab_set_hint(s, tmp); } } @@ -541,7 +541,7 @@ static void lab_menu_focus_arm_speed(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->arm_speed, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(557), "arm"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradeSpeedSell), "arm"); mechlab_set_hint(s, tmp); } else { label_set_text(header_label, "ARM SPEED:\n\nUPGRADE COST:"); @@ -554,7 +554,7 @@ static void lab_menu_focus_arm_speed(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->arm_speed + 1, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(558), "arm"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradeSpeedBuy), "arm"); mechlab_set_hint(s, tmp); } } @@ -577,7 +577,7 @@ static void lab_menu_focus_leg_speed(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->leg_speed, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(559), "leg"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradeSpeedSell), "leg"); mechlab_set_hint(s, tmp); } else { label_set_text(header_label, "LEG SPEED:\n\nUPGRADE COST:"); @@ -590,7 +590,7 @@ static void lab_menu_focus_leg_speed(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->leg_speed + 1, price_str); label_set_text(details_label, tmp); } - snprintf(tmp, sizeof(tmp), lang_get(560), "leg"); + snprintf(tmp, sizeof(tmp), lang_get(LangUpgradeSpeedBuy), "leg"); mechlab_set_hint(s, tmp); } } @@ -613,7 +613,7 @@ static void lab_menu_focus_armor(component *c, bool focused, void *userdata) { snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->armor, price_str); label_set_text(details_label, tmp); } - mechlab_set_hint(s, lang_get(561)); + mechlab_set_hint(s, lang_get(LangUpgradeArmorSell)); } else { label_set_text(header_label, "ARMOR PLATE:\n\nUPGRADE COST:"); int32_t price = armor_prices[pilot->har_id][pilot->armor + 1]; @@ -624,7 +624,7 @@ static void lab_menu_focus_armor(component *c, bool focused, void *userdata) { snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->armor + 1, price_str); label_set_text(details_label, tmp); } - mechlab_set_hint(s, lang_get(562)); + mechlab_set_hint(s, lang_get(LangUpgradeArmorBuy)); } } } @@ -646,7 +646,7 @@ static void lab_menu_focus_stun_resistance(component *c, bool focused, void *use snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->stun_resistance, price_str); label_set_text(details_label, tmp); } - mechlab_set_hint(s, lang_get(563)); + mechlab_set_hint(s, lang_get(LangUpgradeStunResistanceSell)); } else { label_set_text(header_label, "STUN RES.:\n\nUPGRADE COST:"); int32_t price = stun_resistance_prices[pilot->har_id][pilot->stun_resistance + 1]; @@ -657,7 +657,7 @@ static void lab_menu_focus_stun_resistance(component *c, bool focused, void *use snprintf(tmp, sizeof(tmp), "Level %d\n\n$ %sK", pilot->stun_resistance + 1, price_str); label_set_text(details_label, tmp); } - mechlab_set_hint(s, lang_get(564)); + mechlab_set_hint(s, lang_get(LangUpgradeStunResistanceBuy)); } } } @@ -666,7 +666,7 @@ void lab_menu_focus_trade(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; game_player *p1 = game_state_get_player(s->gs, 0); - mechlab_set_hint(s, lang_get(565)); + mechlab_set_hint(s, lang_get(LangTradeHelp)); int trade_value = calculate_trade_value(p1->pilot); uint8_t trades[5]; memset(trades, 0, sizeof(trades)); @@ -684,26 +684,29 @@ void lab_menu_focus_trade(component *c, bool focused, void *userdata) { DEBUG("got %d trades from the bitmask %d", tradecount, p1->pilot->har_trades); // check if there's anything for trade if(tradecount == 0) { - label_set_text(header_label, lang_get(488)); + label_set_text(header_label, lang_get(LangTradeNoneAvailable)); label_set_text(details_label, ""); } else { - label_set_text(header_label, lang_get(461)); + label_set_text(header_label, lang_get(LangTradeAvailable)); char tmp[200] = ""; // pick 5 of however many we got // naturally, I unrolled this loop for performance if(tradecount == 1) { - snprintf(tmp, 200, "%s", lang_get(31 + trades[0])); + snprintf(tmp, 200, "%s", lang_get_offset(LangRobot, trades[0])); } else if(tradecount == 2) { - snprintf(tmp, 200, "%s %s", lang_get(31 + trades[0]), lang_get(31 + trades[1])); + snprintf(tmp, 200, "%s %s", lang_get_offset(LangRobot, trades[0]), + lang_get_offset(LangRobot, trades[1])); } else if(tradecount == 3) { - snprintf(tmp, 200, "%s %s %s", lang_get(31 + trades[0]), lang_get(31 + trades[1]), - lang_get(31 + trades[2])); + snprintf(tmp, 200, "%s %s %s", lang_get_offset(LangRobot, trades[0]), + lang_get_offset(LangRobot, trades[1]), lang_get_offset(LangRobot, trades[2])); } else if(tradecount == 4) { - snprintf(tmp, 200, "%s %s %s %s", lang_get(31 + trades[0]), lang_get(31 + trades[1]), - lang_get(31 + trades[2]), lang_get(31 + trades[3])); + snprintf(tmp, 200, "%s %s %s %s", lang_get_offset(LangRobot, trades[0]), + lang_get_offset(LangRobot, trades[1]), lang_get_offset(LangRobot, trades[2]), + lang_get_offset(LangRobot, trades[3])); } else if(tradecount == 5) { - snprintf(tmp, 200, "%s %s %s %s %s", lang_get(31 + trades[0]), lang_get(31 + trades[1]), - lang_get(31 + trades[2]), lang_get(31 + trades[3]), lang_get(31 + trades[4])); + snprintf(tmp, 200, "%s %s %s %s %s", lang_get_offset(LangRobot, trades[0]), + lang_get_offset(LangRobot, trades[1]), lang_get_offset(LangRobot, trades[2]), + lang_get_offset(LangRobot, trades[3]), lang_get_offset(LangRobot, trades[4])); } label_set_text(details_label, tmp); } @@ -714,9 +717,9 @@ void lab_menu_focus_done(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; if(mechlab_get_selling(s)) { - mechlab_set_hint(s, lang_get(567)); + mechlab_set_hint(s, lang_get(LangUpgradeQuitSell)); } else { - mechlab_set_hint(s, lang_get(568)); + mechlab_set_hint(s, lang_get(LangUpgradeQuitBuy)); } label_set_text(header_label, ""); label_set_text(details_label, ""); diff --git a/src/game/scenes/mechlab/lab_menu_difficultyselect.c b/src/game/scenes/mechlab/lab_menu_difficultyselect.c index db963429d..9a4b08484 100644 --- a/src/game/scenes/mechlab/lab_menu_difficultyselect.c +++ b/src/game/scenes/mechlab/lab_menu_difficultyselect.c @@ -80,8 +80,8 @@ component *lab_menu_difficultyselect_create(scene *s) { tconf.direction = details_list[i].dir; sprite *bsprite = animation_get_sprite(main_buttons, i); - component *button = - spritebutton_create(&tconf, lang_get(444 + i), bsprite->data, COM_ENABLED, details_list[i].cb, s); + component *button = spritebutton_create(&tconf, lang_get_offset(LangTournamentDifficulty, i), bsprite->data, + COM_ENABLED, details_list[i].cb, s); component_set_size_hints(button, bsprite->data->w, bsprite->data->h); component_set_pos_hints(button, bsprite->pos.x, bsprite->pos.y); trnmenu_attach(menu, button); diff --git a/src/game/scenes/mechlab/lab_menu_main.c b/src/game/scenes/mechlab/lab_menu_main.c index b12ae1421..847fbb48b 100644 --- a/src/game/scenes/mechlab/lab_menu_main.c +++ b/src/game/scenes/mechlab/lab_menu_main.c @@ -144,7 +144,8 @@ void lab_menu_focus_arena(component *c, bool focused, void *userdata) { sd_chr_enemy *enemy = mechlab_next_opponent(s); if(enemy) { char tmp[100]; - snprintf(tmp, 100, lang_get(537), enemy->pilot.name); + // XXX lang string provided format string + snprintf(tmp, 100, lang_get(LangTournamentFight), enemy->pilot.name); mechlab_set_hint(s, tmp); } } @@ -153,63 +154,63 @@ void lab_menu_focus_arena(component *c, bool focused, void *userdata) { void lab_menu_focus_training(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(538)); + mechlab_set_hint(s, lang_get(LangEnterTrainingHelp)); } } void lab_menu_focus_buy(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(539)); + mechlab_set_hint(s, lang_get(LangBuyUpgradesHelp)); } } void lab_menu_focus_sell(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(540)); + mechlab_set_hint(s, lang_get(LangSellUpgradesHelp)); } } void lab_menu_focus_load(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(541)); + mechlab_set_hint(s, lang_get(LangChrLoadHelp)); } } void lab_menu_focus_new(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(542)); + mechlab_set_hint(s, lang_get(LangChrCreateHelp)); } } void lab_menu_focus_delete(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(543)); + mechlab_set_hint(s, lang_get(LangChrDeleteHelp)); } } void lab_menu_focus_sim(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(544)); + mechlab_set_hint(s, lang_get(LangTournamentSimHelp)); } } void lab_menu_focus_quit(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(545)); + mechlab_set_hint(s, lang_get(LangTournamentQuitHelp)); } } void lab_menu_focus_tournament(component *c, bool focused, void *userdata) { if(focused) { scene *s = userdata; - mechlab_set_hint(s, lang_get(546)); + mechlab_set_hint(s, lang_get(LangTournamentRegisterHelp)); } } diff --git a/src/game/scenes/mechlab/lab_menu_select.c b/src/game/scenes/mechlab/lab_menu_select.c index dcc89d0e2..0ee7d26cf 100644 --- a/src/game/scenes/mechlab/lab_menu_select.c +++ b/src/game/scenes/mechlab/lab_menu_select.c @@ -72,8 +72,8 @@ component *lab_menu_select_create(scene *s, lab_menu_select_cb select, void *sel tconf.direction = TEXT_HORIZONTAL; sprite *bsprite = animation_get_sprite(main_buttons, 0); - component *button = - spritebutton_create(&tconf, lang_get(223), bsprite->data, COM_ENABLED, lab_menu_select_choose, selector); + component *button = spritebutton_create(&tconf, lang_get(LangButtonSelect), bsprite->data, COM_ENABLED, + lab_menu_select_choose, selector); component_set_size_hints(button, bsprite->data->w, bsprite->data->h); component_set_pos_hints(button, bsprite->pos.x, bsprite->pos.y); diff --git a/src/game/scenes/mechlab/lab_menu_trade.c b/src/game/scenes/mechlab/lab_menu_trade.c index 195c3a585..861c74d19 100644 --- a/src/game/scenes/mechlab/lab_menu_trade.c +++ b/src/game/scenes/mechlab/lab_menu_trade.c @@ -60,17 +60,18 @@ void lab_menu_trade(component *c, void *userdata) { int trade_value = calculate_trade_value(&p1->chr->pilot); int har_value = har_price(p1->pilot->har_id); if(trade_value == har_value) { - snprintf(tmp, 100, lang_get(520), lang_get(31 + p1->chr->pilot.har_id), lang_get(31 + p1->pilot->har_id)); + snprintf(tmp, 100, lang_get(LangTradeEquitable), lang_get_offset(LangRobot, p1->chr->pilot.har_id), + lang_get_offset(LangRobot, p1->pilot->har_id)); } else if(trade_value > har_value) { char price[15]; snprintf(price, 15, "$ %dK", trade_value - har_value); - snprintf(tmp, 100, lang_get(518), lang_get(31 + p1->chr->pilot.har_id), lang_get(31 + p1->pilot->har_id), - price); + snprintf(tmp, 100, lang_get(LangTradeGainCash), lang_get_offset(LangRobot, p1->chr->pilot.har_id), + lang_get_offset(LangRobot, p1->pilot->har_id), price); } else if(trade_value + p1->pilot->money > har_value) { char price[15]; snprintf(price, 15, "$ %dK", har_value - trade_value); - snprintf(tmp, 100, lang_get(519), lang_get(31 + p1->chr->pilot.har_id), price, - lang_get(31 + p1->pilot->har_id)); + snprintf(tmp, 100, lang_get(LangTradeSpendCash), lang_get_offset(LangRobot, p1->chr->pilot.har_id), price, + lang_get_offset(LangRobot, p1->pilot->har_id)); } component *menu = lab_menu_confirm_create(s, confirm_trade, s, cancel_trade, s, tmp); diff --git a/src/game/scenes/mechlab/lab_menu_training.c b/src/game/scenes/mechlab/lab_menu_training.c index 458957a7b..6da0db008 100644 --- a/src/game/scenes/mechlab/lab_menu_training.c +++ b/src/game/scenes/mechlab/lab_menu_training.c @@ -19,10 +19,18 @@ static component *label2; static int32_t prices[] = {50, 80, 120, 180, 240, 300, 450, 600, 800, 1100, 1500, 2500, 4000, 7000, 10000, 14000, 20000, 28000, 40000, 55000, 75000, 100000, 140000, 200000}; +// XXX power/agility/endurance menu functions should be folded into one static void lab_menu_focus_power(component *c, bool focused, void *userdata); static void lab_menu_focus_agility(component *c, bool focused, void *userdata); static void lab_menu_focus_endurance(component *c, bool focused, void *userdata); +enum +{ + FOCUS_POWER, + FOCUS_AGILITY, + FOCUS_ENDURANCE, +}; + void lab_menu_training_power(component *c, void *userdata) { scene *s = userdata; game_player *p1 = game_state_get_player(s->gs, 0); @@ -114,7 +122,7 @@ static void lab_menu_focus_power(component *c, bool focused, void *userdata) { scene *s = userdata; game_player *p1 = game_state_get_player(s->gs, 0); sd_pilot *pilot = game_player_get_pilot(p1); - label_set_text(label1, lang_get(512)); + label_set_text(label1, lang_get_offset(LangTrainingTitle, FOCUS_POWER)); if(pilot->power > 23) { label_set_text(label2, "UNAVAILABLE"); } else { @@ -124,7 +132,7 @@ static void lab_menu_focus_power(component *c, bool focused, void *userdata) { snprintf(tmp, sizeof(tmp), "$ %sK", price_str); label_set_text(label2, tmp); } - mechlab_set_hint(s, lang_get(533)); + mechlab_set_hint(s, lang_get_offset(LangTrainingHelp, FOCUS_POWER)); } } @@ -133,7 +141,7 @@ static void lab_menu_focus_agility(component *c, bool focused, void *userdata) { scene *s = userdata; game_player *p1 = game_state_get_player(s->gs, 0); sd_pilot *pilot = game_player_get_pilot(p1); - label_set_text(label1, lang_get(513)); + label_set_text(label1, lang_get_offset(LangTrainingTitle, FOCUS_AGILITY)); if(pilot->agility > 23) { label_set_text(label2, "UNAVAILABLE"); } else { @@ -143,7 +151,7 @@ static void lab_menu_focus_agility(component *c, bool focused, void *userdata) { snprintf(tmp, sizeof(tmp), "$ %sK", price_str); label_set_text(label2, tmp); } - mechlab_set_hint(s, lang_get(534)); + mechlab_set_hint(s, lang_get_offset(LangTrainingHelp, FOCUS_AGILITY)); } } @@ -152,7 +160,7 @@ static void lab_menu_focus_endurance(component *c, bool focused, void *userdata) scene *s = userdata; game_player *p1 = game_state_get_player(s->gs, 0); sd_pilot *pilot = game_player_get_pilot(p1); - label_set_text(label1, lang_get(514)); + label_set_text(label1, lang_get_offset(LangTrainingTitle, FOCUS_ENDURANCE)); if(pilot->endurance > 23) { label_set_text(label2, "UNAVAILABLE"); } else { @@ -162,7 +170,7 @@ static void lab_menu_focus_endurance(component *c, bool focused, void *userdata) snprintf(tmp, sizeof(tmp), "$ %sK", price_str); label_set_text(label2, tmp); } - mechlab_set_hint(s, lang_get(535)); + mechlab_set_hint(s, lang_get_offset(LangTrainingHelp, FOCUS_ENDURANCE)); } } @@ -171,7 +179,7 @@ void lab_menu_focus_training_done(component *c, bool focused, void *userdata) { scene *s = userdata; label_set_text(label1, ""); label_set_text(label2, ""); - mechlab_set_hint(s, lang_get(536)); + mechlab_set_hint(s, lang_get(LangTrainingDone)); } } diff --git a/src/game/scenes/melee.c b/src/game/scenes/melee.c index c6660128f..586ec3f40 100644 --- a/src/game/scenes/melee.c +++ b/src/game/scenes/melee.c @@ -512,11 +512,11 @@ static void render_pilot_select(melee_local *local, bool player2_is_selectable) tconf_black.cshadow = TEXT_SHADOW_BLACK; // player bio - text_render(&tconf_green, TEXT_DEFAULT, 4, 66, 156, 34, lang_get(135 + current_a)); + text_render(&tconf_green, TEXT_DEFAULT, 4, 66, 156, 34, lang_get_offset(LangPilotDescription, current_a)); // player stats - text_render(&tconf_green, TEXT_DEFAULT, 74, 4, 85, 6, lang_get(216)); - text_render(&tconf_green, TEXT_DEFAULT, 74, 22, 85, 6, lang_get(217)); - text_render(&tconf_green, TEXT_DEFAULT, 74, 40, 85, 6, lang_get(218)); + text_render(&tconf_green, TEXT_DEFAULT, 74, 4, 85, 6, lang_get(LangPilotStatPower)); + text_render(&tconf_green, TEXT_DEFAULT, 74, 22, 85, 6, lang_get(LangPilotStatSpeed)); + text_render(&tconf_green, TEXT_DEFAULT, 74, 40, 85, 6, lang_get(LangPilotStatEndurance)); component_render(local->bar_power[0]); component_render(local->bar_agility[0]); component_render(local->bar_endurance[0]); @@ -525,29 +525,32 @@ static void render_pilot_select(melee_local *local, bool player2_is_selectable) if(player2_is_selectable) { // player 2 name - text_render(&tconf_black, TEXT_DEFAULT, 320 - 66, 52, 66, 6, lang_get(20 + current_b)); + text_render(&tconf_black, TEXT_DEFAULT, 320 - 66, 52, 66, 6, lang_get_offset(LangPilot, current_b)); video_draw(&local->bg_player_stats, 320 - 70 - local->bg_player_stats.w, 0); video_draw(&local->bg_player_bio, 320 - local->bg_player_bio.w, 62); // player bio text_render(&tconf_green, TEXT_DEFAULT, 320 - local->bg_player_bio.w + 4, 66, 156, 34, - lang_get(135 + current_b)); + lang_get_offset(LangPilotDescription, current_b)); // player stats - text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 4, 85, 6, lang_get(216)); - text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 22, 85, 6, lang_get(217)); - text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 40, 85, 6, lang_get(218)); + text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 4, 85, 6, + lang_get(LangPilotStatPower)); + text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 22, 85, 6, + lang_get(LangPilotStatSpeed)); + text_render(&tconf_green, TEXT_DEFAULT, 320 - 66 - local->bg_player_stats.w, 40, 85, 6, + lang_get(LangPilotStatEndurance)); component_render(local->bar_power[1]); component_render(local->bar_agility[1]); component_render(local->bar_endurance[1]); } else { // 'choose your pilot' - text_render(&tconf_green, TEXT_DEFAULT, 160, 97, 160, 6, lang_get(187)); + text_render(&tconf_green, TEXT_DEFAULT, 160, 97, 160, 6, lang_get(LangChooseYourPilot)); } // player 1 name - text_render(&tconf_black, TEXT_DEFAULT, 0, 52, 66, 6, lang_get(20 + current_a)); + text_render(&tconf_black, TEXT_DEFAULT, 0, 52, 66, 6, lang_get_offset(LangPilot, current_a)); object_render(&local->unselected_pilot_portraits); render_highlights(local, player2_is_selectable); @@ -591,11 +594,11 @@ static void render_har_select(melee_local *local, bool player2_is_selectable) { tconf_black.cshadow = TEXT_SHADOW_BLACK; // player 1 name - text_render(&tconf_black, TEXT_DEFAULT, 0, 52, 66, 6, lang_get(20 + local->pilot_id_a)); + text_render(&tconf_black, TEXT_DEFAULT, 0, 52, 66, 6, lang_get_offset(LangPilot, local->pilot_id_a)); if(player2_is_selectable) { // player 2 name - text_render(&tconf_black, TEXT_DEFAULT, 320 - 66, 52, 66, 6, lang_get(20 + local->pilot_id_b)); + text_render(&tconf_black, TEXT_DEFAULT, 320 - 66, 52, 66, 6, lang_get_offset(LangPilot, local->pilot_id_b)); // currently selected player object_render(&local->big_portrait_2); @@ -608,7 +611,7 @@ static void render_har_select(melee_local *local, bool player2_is_selectable) { text_render(&tconf_black, TEXT_DEFAULT, 80, 107, 150, 6, str_c(&local->vs_text)); } else { // 'choose your Robot' - text_render(&tconf_green, TEXT_DEFAULT, 160, 97, 160, 6, lang_get(186)); + text_render(&tconf_green, TEXT_DEFAULT, 160, 97, 160, 6, lang_get(LangChooseYourRobot)); // render HAR name text_render(&tconf_black, TEXT_DEFAULT, 120, 107, 60, 6, har_get_name(CURSOR_INDEX(local, 0))); diff --git a/src/game/scenes/vs.c b/src/game/scenes/vs.c index 4c1f9e30e..895d3d56b 100644 --- a/src/game/scenes/vs.c +++ b/src/game/scenes/vs.c @@ -282,16 +282,16 @@ void vs_render(scene *scene) { video_draw(&local->arena_select_bg, 55, 150); // arena name - text_render(&tconf_green, TEXT_DEFAULT, 56 + 72, 152, (211 - 72), 8, lang_get(56 + local->arena)); + text_render(&tconf_green, TEXT_DEFAULT, 56 + 72, 152, (211 - 72), 8, lang_get_offset(LangArena, local->arena)); tconf_green.valign = TEXT_MIDDLE; // arena description - text_render(&tconf_green, TEXT_DEFAULT, 56 + 72, 153, (211 - 72), 50, lang_get(66 + local->arena)); + text_render(&tconf_green, TEXT_DEFAULT, 56 + 72, 153, (211 - 72), 50, + lang_get_offset(LangArenaDescription, local->arena)); } else if(player2->pilot && player2->pilot->pilot_id == PILOT_KREISSACK && - settings_get()->gameplay.difficulty < 2) { - // kreissack, but not on Veteran or higher + settings_get()->gameplay.difficulty < VETERAN) { tconf_yellow.halign = TEXT_CENTER; - text_render(&tconf_yellow, TEXT_DEFAULT, 80, 165, 170, 60, lang_get(747)); + text_render(&tconf_yellow, TEXT_DEFAULT, 80, 165, 170, 60, lang_get(LangTooPatheticInsult)); } else if(player1->chr && player2->pilot) { // tournament mode insult @@ -312,7 +312,7 @@ void vs_render(scene *scene) { char text[256]; char money[16]; fight_stats *fight_stats = &scene->gs->fight_stats; - snprintf(text, sizeof(text), lang_get(fight_stats->plug_text + PLUG_TEXT_START), fight_stats->sold); + snprintf(text, sizeof(text), lang_get_offset(LangPlug, fight_stats->plug_text), fight_stats->sold); text_render(&tconf_yellow, TEXT_DEFAULT, 90, 156, 198, 6, text); text_render(&light_green, TEXT_DEFAULT, 190, 6, 140, 6, "FINANCIAL REPORT"); @@ -377,9 +377,9 @@ void vs_render(scene *scene) { tconf_yellow.valign = TEXT_MIDDLE; tconf_yellow.halign = TEXT_CENTER; text_render(&tconf_yellow, TEXT_DEFAULT, 77, 150, 150, 30, - lang_get(749 + (11 * player1->pilot->pilot_id) + player2->pilot->pilot_id)); + lang_get_offset(LangVsInsult1, (11 * player1->pilot->pilot_id) + player2->pilot->pilot_id)); text_render(&tconf_yellow, TEXT_DEFAULT, 110, 170, 150, 30, - lang_get(870 + (11 * player2->pilot->pilot_id) + player1->pilot->pilot_id)); + lang_get_offset(LangVsInsult2, (11 * player2->pilot->pilot_id) + player1->pilot->pilot_id)); } } @@ -455,8 +455,9 @@ int vs_create(scene *scene) { } else if(player1->chr) { snprintf(local->vs_str, 128, "%s VS. %s", player1->chr->pilot.name, player2->pilot->name); } else { - const char *pilot1 = lang_get(20 + player1->pilot->pilot_id); - const char *pilot2 = lang_get(20 + player2->pilot->pilot_id); + const char *pilot1 = lang_get_offset(LangPilot, player1->pilot->pilot_id); + const char *pilot2 = lang_get_offset(LangPilot, player2->pilot->pilot_id); + // XXX TODO: Magnus: hardcoded -1's to compensate for OMF 2097 lang trailing newlines snprintf(local->vs_str, 128, "%*.*s VS. %*.*s", (int)strlen(pilot1) - 1, (int)strlen(pilot1) - 1, pilot1, (int)strlen(pilot2) - 1, (int)strlen(pilot2) - 1, pilot2); } @@ -645,9 +646,9 @@ int vs_create(scene *scene) { // Too Pathetic Dialog str insult; - str_from_c(&insult, lang_get(748)); - str_replace(&insult, "%s", lang_get(345), 1); - str_replace(&insult, "%s", lang_get(30), 1); + str_from_c(&insult, lang_get(LangTooPatheticDialog)); + str_replace(&insult, "%s", lang_get_offset(LangCpuDifficulty, VETERAN), 1); + str_replace(&insult, "%s", lang_get_offset(LangPilot, PILOT_KREISSACK), 1); // XXX HACK: Remove newline after kreissack's name until we clean up our string tables str_replace(&insult, "\n.", ".", -1); dialog_create(&local->too_pathetic_dialog, DIALOG_STYLE_OK, str_c(&insult), 40, 40); From 169a680dc6ed56e879bac09137fda602d1bb1a3f Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Mon, 4 Nov 2024 16:17:49 -0800 Subject: [PATCH 15/23] Newsroom: convert pilot names to title case --- src/game/scenes/newsroom.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/game/scenes/newsroom.c b/src/game/scenes/newsroom.c index 94ab4c0ed..3a5fddac2 100644 --- a/src/game/scenes/newsroom.c +++ b/src/game/scenes/newsroom.c @@ -120,11 +120,29 @@ void newsroom_fixup_str(newsroom_local *local) { local->news_str = tmp; } +static void title_case(str *str) { + bool start = true; + + unsigned char c; + // XXX this is not Unicode-aware + for(size_t pos = 0; (c = (unsigned char)str_at(str, pos)); pos++) { + if(c == ' ') { + start = true; + } else { + c = (unsigned char)(start ? toupper(c) : tolower(c)); + str_set_at(str, pos, (char)c); + start = false; + } + } +} + void newsroom_set_names(newsroom_local *local, const char *pilot1, const char *pilot2, int har1, int har2, int sex1, int sex2) { str_from_c(&local->pilot1, pilot1); + title_case(&local->pilot1); str_from_c(&local->pilot2, pilot2); + title_case(&local->pilot2); local->har1 = har1; local->har2 = har2; local->sex1 = sex1; From e40a77f370e62d7ef4e16af30fbafebc4d1d0855 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 21:08:57 -0800 Subject: [PATCH 16/23] Remove old LANG and LANG2 enums --- src/resources/languages.h | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/src/resources/languages.h b/src/resources/languages.h index ec2b83270..d4cb20a49 100644 --- a/src/resources/languages.h +++ b/src/resources/languages.h @@ -13,33 +13,6 @@ bool lang_init(void); void lang_close(void); -/*! \brief OMF 2097 String ID - * - * These string IDs match OMFv2.1 (Epic Challenge Arena) - */ -enum -{ - // there are 10 HARs - LANG_STR_HAR = 31, - LANG_STR_NEWSROOM_NEWCHAMPION = 79, - // there are 3*2 pronouns - LANG_STR_PRONOUN = 81, - // there are 24*2 newsroom texts - LANG_STR_NEWSROOM_TEXT = 87, - - LANG_STR_COUNT = 1013, -}; - -/*! \brief OpenOMF String ID - * - * These string IDs should match BuildLanguages.cmake and the various ${LANG}2.TXT files - */ -enum -{ - LANG2_STR_LANGUAGE, - LANG2_STR_COUNT -}; - // Gets a localization string const char *lang_get(int id); From 004557270d0d7c58de2d73273d4210c480372254 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 21:17:49 -0800 Subject: [PATCH 17/23] Add doc comments to languages.h --- src/resources/languages.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/resources/languages.h b/src/resources/languages.h index d4cb20a49..3747d0fd6 100644 --- a/src/resources/languages.h +++ b/src/resources/languages.h @@ -13,10 +13,21 @@ bool lang_init(void); void lang_close(void); -// Gets a localization string +/** + * @brief Gets a C string from a language string index. + * @details Cheap to call, as it's a simple array lookup. + * Currently, returned strings are encoded in CP437; this may + * not be true in the future, there's been talk of switching to UTF-8. + * @param id Lang id to translate, from the enum. Example: LangChooseYourPilot + */ const char *lang_get(int id); -// Gets an openomf localization string (from one of the tables) +/** + * @brief Translates a language string range and offset to a C String. + * @details Cheap to call, as it's a single array lookup. + * @param LangStr Lang id to translate, from the enum. Example: LangTrainingHelp + * @param offset into the range, 0 returns the first of the range. + */ #define lang_get_offset(LangStr, offset) lang_get_offset_impl(LangStr, LangStr##_Last, (offset)) const char *lang_get_offset_impl(int id, int last, int offset); From 74b39760bbd6ce9395dfbbc02646823251423b10 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Mon, 4 Nov 2024 15:57:44 -0800 Subject: [PATCH 18/23] Remove arena, vs, and newsroom string stripping --- src/game/scenes/arena.c | 8 +++----- src/game/scenes/newsroom.c | 29 ++++++++--------------------- src/game/scenes/vs.c | 7 ++----- 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/game/scenes/arena.c b/src/game/scenes/arena.c index e364885dc..cc296e3d6 100644 --- a/src/game/scenes/arena.c +++ b/src/game/scenes/arena.c @@ -1153,11 +1153,9 @@ void arena_render_overlay(scene *scene) { if(player[1]->pilot) { // when quitting, this can go null - int p2len = (strlen(player2_name) - 1) * font_small.w; - // XXX TODO: Magnus: Hardcoded - 1 for trailing newlines in localization strings - int h2len = (strlen(lang_get_offset(LangRobot, player[1]->pilot->har_id)) - 1) * font_small.w; - text_render(&tconf_players, TEXT_DEFAULT, 315 - p2len, 19, 100, 6, player2_name); - text_render(&tconf_players, TEXT_DEFAULT, 315 - h2len, 26, 100, 6, + tconf_players.halign = TEXT_RIGHT; + text_render(&tconf_players, TEXT_DEFAULT, 215, 19, 100, 6, player2_name); + text_render(&tconf_players, TEXT_DEFAULT, 215, 26, 100, 6, lang_get_offset(LangRobot, player[1]->pilot->har_id)); } diff --git a/src/game/scenes/newsroom.c b/src/game/scenes/newsroom.c index 3a5fddac2..7683f033d 100644 --- a/src/game/scenes/newsroom.c +++ b/src/game/scenes/newsroom.c @@ -44,18 +44,6 @@ const char *subject_pronoun(int sex) { return lang_get_offset(LangPronoun, 4 + sex); } -char const *pronoun_strip(char const *pronoun, char *buf, size_t buf_size) { - size_t pronoun_len = strlen(pronoun); - while(pronoun_len && pronoun[pronoun_len - 1] == '\n') { - pronoun_len--; - } - if(pronoun_len >= buf_size) - pronoun_len = buf_size - 1; - memcpy(buf, pronoun, pronoun_len); - buf[pronoun_len] = '\0'; - return buf; -} - static void newsroom_fixup_capitalization(str *tmp) { // XXX non-const str_c variant? char *it = (char *)str_c(tmp); @@ -99,18 +87,17 @@ void newsroom_fixup_str(newsroom_local *local) { raw_translation = lang_get_offset(LangNewsroomReport, local->news_id + min2(local->screen, 1)); } - char scratch[9]; str tmp; str_from_c(&tmp, raw_translation); - str_replace(&tmp, "~11", pronoun_strip(subject_pronoun(local->sex2), scratch, sizeof scratch), -1); - str_replace(&tmp, "~10", pronoun_strip(object_pronoun(local->sex2), scratch, sizeof scratch), -1); - str_replace(&tmp, "~9", pronoun_strip(possessive_pronoun(local->sex2), scratch, sizeof scratch), -1); - str_replace(&tmp, "~8", pronoun_strip(subject_pronoun(local->sex1), scratch, sizeof scratch), -1); - str_replace(&tmp, "~7", pronoun_strip(object_pronoun(local->sex1), scratch, sizeof scratch), -1); - str_replace(&tmp, "~6", pronoun_strip(possessive_pronoun(local->sex1), scratch, sizeof scratch), -1); + str_replace(&tmp, "~11", subject_pronoun(local->sex2), -1); + str_replace(&tmp, "~10", object_pronoun(local->sex2), -1); + str_replace(&tmp, "~9", possessive_pronoun(local->sex2), -1); + str_replace(&tmp, "~8", subject_pronoun(local->sex1), -1); + str_replace(&tmp, "~7", object_pronoun(local->sex1), -1); + str_replace(&tmp, "~6", possessive_pronoun(local->sex1), -1); str_replace(&tmp, "~5", "Stadium", -1); - str_replace(&tmp, "~4", pronoun_strip(lang_get_offset(LangRobot, local->har2), scratch, sizeof scratch), -1); - str_replace(&tmp, "~3", pronoun_strip(lang_get_offset(LangRobot, local->har1), scratch, sizeof scratch), -1); + str_replace(&tmp, "~4", lang_get_offset(LangRobot, local->har2), -1); + str_replace(&tmp, "~3", lang_get_offset(LangRobot, local->har1), -1); str_replace(&tmp, "~2", str_c(&local->pilot2), -1); str_replace(&tmp, "~1", str_c(&local->pilot1), -1); diff --git a/src/game/scenes/vs.c b/src/game/scenes/vs.c index 895d3d56b..f3ed8659d 100644 --- a/src/game/scenes/vs.c +++ b/src/game/scenes/vs.c @@ -457,9 +457,8 @@ int vs_create(scene *scene) { } else { const char *pilot1 = lang_get_offset(LangPilot, player1->pilot->pilot_id); const char *pilot2 = lang_get_offset(LangPilot, player2->pilot->pilot_id); - // XXX TODO: Magnus: hardcoded -1's to compensate for OMF 2097 lang trailing newlines - snprintf(local->vs_str, 128, "%*.*s VS. %*.*s", (int)strlen(pilot1) - 1, (int)strlen(pilot1) - 1, pilot1, - (int)strlen(pilot2) - 1, (int)strlen(pilot2) - 1, pilot2); + snprintf(local->vs_str, 128, "%*.*s VS. %*.*s", (int)strlen(pilot1), (int)strlen(pilot1), pilot1, + (int)strlen(pilot2), (int)strlen(pilot2), pilot2); } // Set player palettes @@ -649,8 +648,6 @@ int vs_create(scene *scene) { str_from_c(&insult, lang_get(LangTooPatheticDialog)); str_replace(&insult, "%s", lang_get_offset(LangCpuDifficulty, VETERAN), 1); str_replace(&insult, "%s", lang_get_offset(LangPilot, PILOT_KREISSACK), 1); - // XXX HACK: Remove newline after kreissack's name until we clean up our string tables - str_replace(&insult, "\n.", ".", -1); dialog_create(&local->too_pathetic_dialog, DIALOG_STYLE_OK, str_c(&insult), 40, 40); str_free(&insult); local->too_pathetic_dialog.userdata = scene; From 874a5d950d5793b9f2db43a9fdc8135612ec1e8f Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 21:30:37 -0800 Subject: [PATCH 19/23] CI: Don't ship ENGLISH.DAT and GERMAN.DAT --- .github/workflows/compilation.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/compilation.yml b/.github/workflows/compilation.yml index a2215f041..d229c4077 100644 --- a/.github/workflows/compilation.yml +++ b/.github/workflows/compilation.yml @@ -74,7 +74,10 @@ jobs: key: omf2097-assets.zip - name: Extract omf 2097 assets - run: unzip -j omf2097-assets.zip -d build-test/resources + shell: bash + run: | + unzip -j omf2097-assets.zip -d build-test/resources + rm -f build-test/resources/{ENGLISH.DAT,GERMAN.DAT} - name: Install pytest requirements run: | @@ -147,10 +150,11 @@ jobs: key: omf2097-assets.zip - name: Extract omf 2097 assets + shell: bash run: | - Expand-Archive omf2097-assets.zip -PassThru - mkdir install/openomf/resources - Move-Item -Path omf2097-assets/OMF2097/* -Destination install/openomf/resources/ -Force -PassThru + mkdir -p install/openomf/resources + unzip -j omf2097-assets.zip -d install/openomf/resources + rm -f install/openomf/resources/{ENGLISH.DAT,GERMAN.DAT} - name: Install openomf run: cmake --install build-msvc --config Release --prefix install @@ -220,7 +224,9 @@ jobs: key: omf2097-assets.zip - name: Extract omf 2097 assets - run: unzip -j omf2097-assets.zip -d build-release/release/usr/share/games/openomf + run: | + unzip -j omf2097-assets.zip -d build-release/release/usr/share/games/openomf + rm -f build-release/release/usr/share/games/openomf/{ENGLISH.DAT,GERMAN.DAT} - name: Generate TGZ package run: tar cvfz ${GITHUB_WORKSPACE}/openomf_${{ env.OPENOMF_VERSION }}-${{ steps.slug.outputs.sha8 }}_linux_amd64.tar.gz -C build-release/release/ . @@ -295,7 +301,10 @@ jobs: key: omf2097-assets.zip - name: Extract omf 2097 assets - run: unzip -j omf2097-assets.zip -d build-release/release/usr/share/games/openomf + shell: bash + run: | + unzip -j omf2097-assets.zip -d build-release/release/usr/share/games/openomf + rm -f build-release/release/usr/share/games/openomf/{ENGLISH.DAT,GERMAN.DAT} - name: Get short SHA id: slug From 0d2aaebf094855ff1aff0dd7866081cefc29f57f Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 21:54:03 -0800 Subject: [PATCH 20/23] Check out submodules in CI --- .github/workflows/compilation.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/compilation.yml b/.github/workflows/compilation.yml index d229c4077..df358bb3f 100644 --- a/.github/workflows/compilation.yml +++ b/.github/workflows/compilation.yml @@ -25,6 +25,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + submodules: true - name: Install dependencies uses: Eeems-Org/apt-cache-action@v1.3 @@ -111,6 +113,8 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - uses: actions/checkout@v4 + with: + submodules: true - name: Check out VCPKG # must be checked out *after* openomf.git uses: actions/checkout@v4 @@ -186,6 +190,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + submodules: true - name: Install Ubuntu Dependencies uses: Eeems-Org/apt-cache-action@v1.3 @@ -269,6 +275,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + submodules: true - name: Install Mac Dependencies run: | @@ -332,6 +340,9 @@ jobs: steps: - uses: actions/checkout@v4 + with: + # mingw does not build languages + submodules: false - name: Install apt Dependencies uses: Eeems-Org/apt-cache-action@v1.3 From b5529053e6929bf43005168e37ddb9947e194e09 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Fri, 3 Jan 2025 22:29:31 -0800 Subject: [PATCH 21/23] Move LanguageStrings.cmake to a C Macro --- cmake-scripts/BuildLanguages.cmake | 36 ++-------- cmake-scripts/LanguageStrings.cmake | 77 --------------------- src/resources/generated_languages.h.in | 16 ----- src/resources/languages.h | 94 +++++++++++++++++++++++++- 4 files changed, 99 insertions(+), 124 deletions(-) delete mode 100644 cmake-scripts/LanguageStrings.cmake delete mode 100644 src/resources/generated_languages.h.in diff --git a/cmake-scripts/BuildLanguages.cmake b/cmake-scripts/BuildLanguages.cmake index e69ccee2e..503747c6e 100644 --- a/cmake-scripts/BuildLanguages.cmake +++ b/cmake-scripts/BuildLanguages.cmake @@ -1,39 +1,12 @@ # -# BuildLanguages.cmake has two jobs: -# - it generates src/resources/generated_languages.h from LanguageStrings.cmake, and -# - if option BUILD_LANGUAGES is on, builds the .LNG files from resources/translations/*.TXT +# BuildLanguages.cmake has one job: +# if option BUILD_LANGUAGES is on, builds the .LNG files from resources/translations/*.TXT # -macro(lang_str enum_name) - if(${ARGC} GREATER 1) - set(count "${ARGV1}") - - if(${count} LESS 1) - message(FATAL_ERROR "Cannot add less than 1 of lang_str '${enum_name}'.") - endif() - - string(APPEND LANG_ENUM "\n ${enum_name} = ${Lang_Count},") - string(APPEND LANG_ENUM "\n ${enum_name}_Last = ${Lang_Count} + (${count} - 1),\n") - math(EXPR Lang_Count "${Lang_Count} + ${count}") - else() - string(APPEND LANG_ENUM "\n ${enum_name} = ${Lang_Count},\n") - math(EXPR Lang_Count "${Lang_Count} + 1") - endif() -endmacro() -set(Lang_Count 0) -set(LANG_ENUM "") -include("cmake-scripts/LanguageStrings.cmake") -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/resources/generated_languages.h.in" "${CMAKE_CURRENT_BINARY_DIR}/src/resources/generated_languages.h") - -message(STATUS "BuildLanguages' Lang_Count: ${Lang_Count}") - - if(NOT BUILD_LANGUAGES) - # early out, having written generated_languages.h return() endif() - if(WIN32) set(LANGUAGE_INSTALL_PATH "openomf/resources/") else() @@ -48,6 +21,9 @@ file(GLOB OPENOMF_LANGS "${LANG_SRC}/*.TXT" ) +file(READ "${LANG_SRC}/langstr_count" Lang_Count) +string(REGEX REPLACE "\n+$" "" Lang_Count "${Lang_Count}") + # generate custom target info set(BUILD_LANG_COMMANDS) set(BUILD_LANG_SOURCES) @@ -59,7 +35,7 @@ foreach(TXT ${OPENOMF_LANGS}) DEPENDS "${TXT}" BYPRODUCTS "${LNG}" COMMAND ${CMAKE_COMMAND} -E echo_append "${LANG}, " - COMMAND "$" --import "${TXT}" --output "${LNG}" --check-count ${Lang_Count} + COMMAND "$" --import "${TXT}" --output "${LNG}" --check-count "${Lang_Count}" ) install(FILES "${LNG}" DESTINATION "${LANGUAGE_INSTALL_PATH}") endforeach() diff --git a/cmake-scripts/LanguageStrings.cmake b/cmake-scripts/LanguageStrings.cmake deleted file mode 100644 index c4ac17b95..000000000 --- a/cmake-scripts/LanguageStrings.cmake +++ /dev/null @@ -1,77 +0,0 @@ -# This file is used by BuildLanguages.cmake to make resources/generated_languages.h - -# lang_str( []) -# The is what's used in the C code to refer to this language string. -# Specifying a allows for a range of lang strs to be added under one name - -# strings from OMF 2097 -lang_str(LangPilot 11) -lang_str(LangPilotDescription 11) -lang_str(LangRobot 11) -lang_str(LangRobotDescription 11) -lang_str(LangArena 5) -lang_str(LangArenaDescription 5) -lang_str(LangPronoun 6) -lang_str(LangNewsroomUnrankedChallengerDialog) -lang_str(LangNewsroomUnrankedChallenger 2) -lang_str(LangNewsroomNewChampion) -lang_str(LangNewsroomReport 48) -lang_str(LangCpuDifficulty 7) -lang_str(LangTooPatheticDialog) -lang_str(LangTooPatheticInsult) -lang_str(LangVsInsult1 121) -lang_str(LangVsInsult2 121) -lang_str(LangPlug 16) -lang_str(LangPilotStatPower) -lang_str(LangPilotStatSpeed) -lang_str(LangPilotStatEndurance) -lang_str(LangChooseYourPilot) -lang_str(LangChooseYourRobot) -lang_str(LangSceneEnd) -lang_str(LangSceneEnd1 10) -lang_str(LangSceneEnd2 10) -lang_str(LangSelectTournament) -lang_str(LangSelectPhotoForChr) -lang_str(LangSelectChrToLoad) -lang_str(LangSelectChrToDelete) -lang_str(LangSelectOpponent) -lang_str(LangTrainingTitle 3) -lang_str(LangTrainingConfirmation 3) -lang_str(LangTrainingHelp 3) -lang_str(LangTrainingDone) -lang_str(LangTradeGainCash) -lang_str(LangTradeSpendCash) -lang_str(LangTradeEquitable) -lang_str(LangButtonSelect) -lang_str(LangTournamentFight) -lang_str(LangEnterTrainingHelp) -lang_str(LangBuyUpgradesHelp) -lang_str(LangSellUpgradesHelp) -lang_str(LangChrLoadHelp) -lang_str(LangChrCreateHelp) -lang_str(LangChrDeleteHelp) -lang_str(LangTournamentSimHelp) -lang_str(LangTournamentQuitHelp) -lang_str(LangTournamentRegisterHelp) -lang_str(LangTournamentDifficulty 4) -lang_str(LangNo) -lang_str(LangYes) -lang_str(LangPromptChrName) -lang_str(LangCustomizeColor1) -lang_str(LangCustomizeColor2) -lang_str(LangCustomizeColor3) -lang_str(LangUpgradePowerSell) -lang_str(LangUpgradePowerBuy) -lang_str(LangUpgradeSpeedSell) -lang_str(LangUpgradeSpeedBuy) -lang_str(LangUpgradeArmorSell) -lang_str(LangUpgradeArmorBuy) -lang_str(LangUpgradeStunResistanceSell) -lang_str(LangUpgradeStunResistanceBuy) -lang_str(LangTradeHelp) -lang_str(LangTradeNoneAvailable) -lang_str(LangTradeAvailable) -lang_str(LangUpgradeQuitSell) -lang_str(LangUpgradeQuitBuy) -# strings new in OpenOMF -lang_str(LangLanguage) diff --git a/src/resources/generated_languages.h.in b/src/resources/generated_languages.h.in deleted file mode 100644 index 3b88fdfa0..000000000 --- a/src/resources/generated_languages.h.in +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef GENERATED_LANGUAGES_H -#define GENERATED_LANGUAGES_H - -/*! \brief OpenOMF String ID - * - * These string IDs are generated by BuildLanguages.cmake from the list in LanguageStrings.cmake, - * and match the generated .LNG files. - */ -enum { -@LANG_ENUM@ - - // Number of strings contained in a .LNG file - Lang_Count = @Lang_Count@ -}; - -#endif // GENERATED_LANGUAGES_H diff --git a/src/resources/languages.h b/src/resources/languages.h index 3747d0fd6..3e959ec54 100644 --- a/src/resources/languages.h +++ b/src/resources/languages.h @@ -1,7 +1,6 @@ #ifndef LANGUAGES_H #define LANGUAGES_H -#include "resources/generated_languages.h" #include /* @@ -31,4 +30,97 @@ const char *lang_get(int id); #define lang_get_offset(LangStr, offset) lang_get_offset_impl(LangStr, LangStr##_Last, (offset)) const char *lang_get_offset_impl(int id, int last, int offset); +#define lang_str(enum_variant) enum_variant +#define lang_str_range(enum_variant, count) enum_variant, enum_variant##_Last = enum_variant + (count - 1) + +/*! \brief OpenOMF String ID + * + * These string IDs are generated by BuildLanguages.cmake from the list in LanguageStrings.cmake, + * and match the generated .LNG files. + */ +enum +{ + // lang_str(), + // lang_str_range(, ), + // The is what's used in the C code to refer to this language string. + // Specifying a allows for a range of lang strs to be added under one name + + // strings from OMF 2097 + lang_str_range(LangPilot, 11), + lang_str_range(LangPilotDescription, 11), + lang_str_range(LangRobot, 11), + lang_str_range(LangRobotDescription, 11), + lang_str_range(LangArena, 5), + lang_str_range(LangArenaDescription, 5), + lang_str_range(LangPronoun, 6), + lang_str(LangNewsroomUnrankedChallengerDialog), + lang_str_range(LangNewsroomUnrankedChallenger, 2), + lang_str(LangNewsroomNewChampion), + lang_str_range(LangNewsroomReport, 48), + lang_str_range(LangCpuDifficulty, 7), + lang_str(LangTooPatheticDialog), + lang_str(LangTooPatheticInsult), + lang_str_range(LangVsInsult1, 121), + lang_str_range(LangVsInsult2, 121), + lang_str_range(LangPlug, 16), + lang_str(LangPilotStatPower), + lang_str(LangPilotStatSpeed), + lang_str(LangPilotStatEndurance), + lang_str(LangChooseYourPilot), + lang_str(LangChooseYourRobot), + lang_str(LangSceneEnd), + lang_str_range(LangSceneEnd1, 10), + lang_str_range(LangSceneEnd2, 10), + lang_str(LangSelectTournament), + lang_str(LangSelectPhotoForChr), + lang_str(LangSelectChrToLoad), + lang_str(LangSelectChrToDelete), + lang_str(LangSelectOpponent), + lang_str_range(LangTrainingTitle, 3), + lang_str_range(LangTrainingConfirmation, 3), + lang_str_range(LangTrainingHelp, 3), + lang_str(LangTrainingDone), + lang_str(LangTradeGainCash), + lang_str(LangTradeSpendCash), + lang_str(LangTradeEquitable), + lang_str(LangButtonSelect), + lang_str(LangTournamentFight), + lang_str(LangEnterTrainingHelp), + lang_str(LangBuyUpgradesHelp), + lang_str(LangSellUpgradesHelp), + lang_str(LangChrLoadHelp), + lang_str(LangChrCreateHelp), + lang_str(LangChrDeleteHelp), + lang_str(LangTournamentSimHelp), + lang_str(LangTournamentQuitHelp), + lang_str(LangTournamentRegisterHelp), + lang_str_range(LangTournamentDifficulty, 4), + lang_str(LangNo), + lang_str(LangYes), + lang_str(LangPromptChrName), + lang_str(LangCustomizeColor1), + lang_str(LangCustomizeColor2), + lang_str(LangCustomizeColor3), + lang_str(LangUpgradePowerSell), + lang_str(LangUpgradePowerBuy), + lang_str(LangUpgradeSpeedSell), + lang_str(LangUpgradeSpeedBuy), + lang_str(LangUpgradeArmorSell), + lang_str(LangUpgradeArmorBuy), + lang_str(LangUpgradeStunResistanceSell), + lang_str(LangUpgradeStunResistanceBuy), + lang_str(LangTradeHelp), + lang_str(LangTradeNoneAvailable), + lang_str(LangTradeAvailable), + lang_str(LangUpgradeQuitSell), + lang_str(LangUpgradeQuitBuy), + // strings new in OpenOMF + lang_str(LangLanguage), + + Lang_Count, +}; + +#undef lang_str +#undef lang_str_range + #endif // LANGUAGES_H From 50679010c5ea4bd89db14b4f1ddc298a477fb4fc Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sun, 5 Jan 2025 19:48:23 -0800 Subject: [PATCH 22/23] Use strncpy_or_assert to copy pilot name into rec --- src/game/scenes/arena.c | 5 ++--- src/utils/c_string_util.c | 8 ++++++++ src/utils/c_string_util.h | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/game/scenes/arena.c b/src/game/scenes/arena.c index cc296e3d6..d8b3860c0 100644 --- a/src/game/scenes/arena.c +++ b/src/game/scenes/arena.c @@ -32,6 +32,7 @@ #include "resources/languages.h" #include "resources/sgmanager.h" #include "utils/allocator.h" +#include "utils/c_string_util.h" #include "utils/log.h" #include "utils/random.h" #include "video/video.h" @@ -1538,9 +1539,7 @@ int arena_create(scene *scene) { local->rec->pilots[i].info.color_1 = player->pilot->color_1; local->rec->pilots[i].info.color_2 = player->pilot->color_2; local->rec->pilots[i].info.color_3 = player->pilot->color_3; - // XXX ugly strncpy, implicit truncation, no nul termination guarantee, why are we even copying the pilot's - // name in here? - strncpy(local->rec->pilots[i].info.name, lang_get_offset(LangPilot, player->pilot->pilot_id), 18); + strncpy_or_assert(local->rec->pilots[i].info.name, lang_get_offset(LangPilot, player->pilot->pilot_id), 18); } local->rec->arena_id = scene->id - SCENE_ARENA0; } else { diff --git a/src/utils/c_string_util.c b/src/utils/c_string_util.c index 76a54c0c9..17a19f385 100644 --- a/src/utils/c_string_util.c +++ b/src/utils/c_string_util.c @@ -10,6 +10,14 @@ char *strncpy_or_truncate(char *dest, const char *src, size_t n) { return ret; } +char *strncpy_or_assert(char *dest, const char *src, size_t n) { + char *ret = strncpy(dest, src, n); + assert(ret[n - 1] == '\0' || !"truncating in strncpy!"); + if(n > 0) + dest[n - 1] = '\0'; + return ret; +} + char *omf_strdup_real(char const *s, char const *file, int line) { assert(s != NULL); size_t valid_range = strlen(s) + 1; diff --git a/src/utils/c_string_util.h b/src/utils/c_string_util.h index fa24d81ce..63f872cc8 100644 --- a/src/utils/c_string_util.h +++ b/src/utils/c_string_util.h @@ -6,6 +6,9 @@ // strncpy() that guarantees null-termination. char *strncpy_or_truncate(char *dest, const char *src, size_t n); +// strncpy() that guarantees null-termination, and asserts when truncating. +char *strncpy_or_assert(char *dest, const char *src, size_t n); + // strdup() that uses our allocator char *omf_strdup_real(char const *s, char const *file, int line); #define omf_strdup(s) omf_strdup_real((s), __FILE__, __LINE__) From 315c8e49140f7797e0866e995d81e40ea48ad355 Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Sun, 5 Jan 2025 22:38:03 -0800 Subject: [PATCH 23/23] Change default language to ENGLISH.LNG --- src/game/utils/settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/utils/settings.c b/src/game/utils/settings.c index 53e1e5936..5cea54b8b 100644 --- a/src/game/utils/settings.c +++ b/src/game/utils/settings.c @@ -58,7 +58,7 @@ typedef struct { // clang-format off static const field f_language[] = { - F_STRING(settings_language, language, "ENGLISH.DAT"), + F_STRING(settings_language, language, "ENGLISH.LNG"), }; const field f_video[] = {