summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lang/american.txt4
-rw-r--r--src/lang/brazilian_portuguese.txt4
-rw-r--r--src/lang/bulgarian.txt4
-rw-r--r--src/lang/catalan.txt4
-rw-r--r--src/lang/czech.txt4
-rw-r--r--src/lang/danish.txt4
-rw-r--r--src/lang/dutch.txt4
-rw-r--r--src/lang/english.txt9
-rw-r--r--src/lang/esperanto.txt4
-rw-r--r--src/lang/estonian.txt4
-rw-r--r--src/lang/finnish.txt4
-rw-r--r--src/lang/french.txt4
-rw-r--r--src/lang/galician.txt4
-rw-r--r--src/lang/german.txt4
-rw-r--r--src/lang/hungarian.txt4
-rw-r--r--src/lang/icelandic.txt4
-rw-r--r--src/lang/italian.txt4
-rw-r--r--src/lang/japanese.txt4
-rw-r--r--src/lang/korean.txt4
-rw-r--r--src/lang/lithuanian.txt4
-rw-r--r--src/lang/norwegian_bokmal.txt4
-rw-r--r--src/lang/norwegian_nynorsk.txt4
-rw-r--r--src/lang/piglatin.txt4
-rw-r--r--src/lang/polish.txt4
-rw-r--r--src/lang/portuguese.txt4
-rw-r--r--src/lang/romanian.txt4
-rw-r--r--src/lang/russian.txt4
-rw-r--r--src/lang/simplified_chinese.txt4
-rw-r--r--src/lang/slovak.txt4
-rw-r--r--src/lang/slovenian.txt4
-rw-r--r--src/lang/spanish.txt4
-rw-r--r--src/lang/swedish.txt4
-rw-r--r--src/lang/traditional_chinese.txt4
-rw-r--r--src/lang/turkish.txt4
-rw-r--r--src/lang/ukrainian.txt4
-rw-r--r--src/lang/unfinished/afrikaans.txt4
-rw-r--r--src/lang/unfinished/croatian.txt4
-rw-r--r--src/lang/unfinished/frisian.txt4
-rw-r--r--src/lang/unfinished/greek.txt4
-rw-r--r--src/openttd.cpp22
-rw-r--r--src/saveload.cpp127
-rw-r--r--src/saveload.h2
42 files changed, 172 insertions, 140 deletions
diff --git a/src/lang/american.txt b/src/lang/american.txt
index 597631940..d0f098760 100644
--- a/src/lang/american.txt
+++ b/src/lang/american.txt
@@ -1900,9 +1900,9 @@ STR_4003_DELETE :{BLACK}Delete
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} free
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Unable to read drive
-STR_4007_GAME_SAVE_FAILED :{WHITE}Game Save Failed
+STR_4007_GAME_SAVE_FAILED :{WHITE}Game Save Failed{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Unable to delete file
-STR_4009_GAME_LOAD_FAILED :{WHITE}Game Load Failed
+STR_4009_GAME_LOAD_FAILED :{WHITE}Game Load Failed{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}List of drives, directories and saved-game files
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Currently selected name for saved-game
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Delete the currently selected saved-game
diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt
index 37933f957..55ff10995 100644
--- a/src/lang/brazilian_portuguese.txt
+++ b/src/lang/brazilian_portuguese.txt
@@ -1908,9 +1908,9 @@ STR_4003_DELETE :{BLACK}Remover
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes livres
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Incapaz de ler unidade
-STR_4007_GAME_SAVE_FAILED :{WHITE}Falha ao Salvar Jogo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Falha ao Salvar Jogo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Incapaz de remover o arquivo
-STR_4009_GAME_LOAD_FAILED :{WHITE}Falha ao Abrir Jogo
+STR_4009_GAME_LOAD_FAILED :{WHITE}Falha ao Abrir Jogo{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista de unidades, diretórios e arquivos de jogos gravados
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nome selecionado para salvar o jogo
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Remover o jogo selecionado
diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt
index 496fc4090..adc0dc1a0 100644
--- a/src/lang/bulgarian.txt
+++ b/src/lang/bulgarian.txt
@@ -1894,9 +1894,9 @@ STR_4003_DELETE :{BLACK}Изтр
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} мегабайт{P "" а} свободно
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Не може да прочете диска
-STR_4007_GAME_SAVE_FAILED :{WHITE}Запазването на играта е неуспешно
+STR_4007_GAME_SAVE_FAILED :{WHITE}Запазването на играта е неуспешно{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Изтриването на файла е неуспешно
-STR_4009_GAME_LOAD_FAILED :{WHITE}Отварянето на играта е неуспешно
+STR_4009_GAME_LOAD_FAILED :{WHITE}Отварянето на играта е неуспешно{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Списък с хард-дисковете, директориите и запазените игри
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Избрано име за запазена игра
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Изтрий избраната запазената игра
diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt
index 5270558bf..be696e455 100644
--- a/src/lang/catalan.txt
+++ b/src/lang/catalan.txt
@@ -1904,9 +1904,9 @@ STR_4003_DELETE :{BLACK}Esborra
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes lliures
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Impossible llegir la unitat de disc
-STR_4007_GAME_SAVE_FAILED :{WHITE}Desat del Joc erroni
+STR_4007_GAME_SAVE_FAILED :{WHITE}Desat del Joc erroni{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Impossible esborrar l'arxiu
-STR_4009_GAME_LOAD_FAILED :{WHITE}Càrrega del Joc errònia
+STR_4009_GAME_LOAD_FAILED :{WHITE}Càrrega del Joc errònia{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Llista de dispositius de disc, carpetes i arxius de jocs desats
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nom actualment seleccionat per joc desat
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Esborra el joc desat actualment seleccionat
diff --git a/src/lang/czech.txt b/src/lang/czech.txt
index 47ec83d58..578aaf394 100644
--- a/src/lang/czech.txt
+++ b/src/lang/czech.txt
@@ -1958,9 +1958,9 @@ STR_4003_DELETE :{BLACK}Smazat
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} MB voln{P ý é ých}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Nemohu číst z jednotky
-STR_4007_GAME_SAVE_FAILED :{WHITE}Uložení hry selhalo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Uložení hry selhalo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Nemohu smazat soubor
-STR_4009_GAME_LOAD_FAILED :{WHITE}Nemohu otevřít hru
+STR_4009_GAME_LOAD_FAILED :{WHITE}Nemohu otevřít hru{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Seznam jednotek, adresářů a uložených her
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Zvolené jméno uložené hry
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Smazat označenou uloženou hru
diff --git a/src/lang/danish.txt b/src/lang/danish.txt
index 6c37450be..2bdf50690 100644
--- a/src/lang/danish.txt
+++ b/src/lang/danish.txt
@@ -1903,9 +1903,9 @@ STR_4003_DELETE :{BLACK}Slet
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes fri
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikke læse drevet
-STR_4007_GAME_SAVE_FAILED :{WHITE}Fejl under gemning af spil
+STR_4007_GAME_SAVE_FAILED :{WHITE}Fejl under gemning af spil{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikke slette fil
-STR_4009_GAME_LOAD_FAILED :{WHITE}Fejl under hentning af spil
+STR_4009_GAME_LOAD_FAILED :{WHITE}Fejl under hentning af spil{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Liste over drev, biblioteker og gemte spilfiler
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nuværende gemte spils navn
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Slet det valgte gemte spil
diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt
index e656733ab..ab6d05c14 100644
--- a/src/lang/dutch.txt
+++ b/src/lang/dutch.txt
@@ -1904,9 +1904,9 @@ STR_4003_DELETE :{BLACK}Verwijde
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes vrij
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan niet lezen van schijf
-STR_4007_GAME_SAVE_FAILED :{WHITE}Opslaan Spel Mislukt
+STR_4007_GAME_SAVE_FAILED :{WHITE}Opslaan Spel Mislukt{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan bestand niet verwijderen
-STR_4009_GAME_LOAD_FAILED :{WHITE}Laden Spel Mislukt
+STR_4009_GAME_LOAD_FAILED :{WHITE}Laden Spel Mislukt{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lijst van schijven, mappen, en opgeslagen spellen
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Huidige gekozen naam voor opgeslagen spel
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Verwijder het momenteel geselecteerde opgeslagen spel
diff --git a/src/lang/english.txt b/src/lang/english.txt
index 8c366ed9a..410889c90 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -1904,9 +1904,14 @@ STR_4003_DELETE :{BLACK}Delete
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} free
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Unable to read drive
-STR_4007_GAME_SAVE_FAILED :{WHITE}Game Save Failed
+STR_4007_GAME_SAVE_FAILED :{WHITE}Game Save Failed{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Unable to delete file
-STR_4009_GAME_LOAD_FAILED :{WHITE}Game Load Failed
+STR_4009_GAME_LOAD_FAILED :{WHITE}Game Load Failed{}{STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Internal error: {STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Broken savegame - {STRING}
+STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Savegame is made with newer version
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :File not readable
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :File not writeable
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}List of drives, directories and saved-game files
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Currently selected name for saved-game
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Delete the currently selected saved-game
diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt
index b730164d0..21119a3e3 100644
--- a/src/lang/esperanto.txt
+++ b/src/lang/esperanto.txt
@@ -1842,9 +1842,9 @@ STR_4003_DELETE :{BLACK}Forviŝu
STR_4004 :{COMPANY} je {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabitoko{P "" j} libera{P "" j}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Ne eblas legi diskon
-STR_4007_GAME_SAVE_FAILED :{WHITE}Ludkonservado Fiaskis
+STR_4007_GAME_SAVE_FAILED :{WHITE}Ludkonservado Fiaskis{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Ne eblas forviŝi dosieron
-STR_4009_GAME_LOAD_FAILED :{WHITE}Ludŝarĝado Fiaskis
+STR_4009_GAME_LOAD_FAILED :{WHITE}Ludŝarĝado Fiaskis{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Listo da diskoj, dosierujoj kaj luddosieroj
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nune elektita nomo por luddosiero
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Forviŝu la nun elektitan luddosieron
diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt
index 8ebf5ff01..538645179 100644
--- a/src/lang/estonian.txt
+++ b/src/lang/estonian.txt
@@ -2004,9 +2004,9 @@ STR_4003_DELETE :{BLACK}Kustuta
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabaiti{P "" i} vaba
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Ei suuda kettalt lugeda
-STR_4007_GAME_SAVE_FAILED :{WHITE}Mängu salvestamine ebaõnnestus
+STR_4007_GAME_SAVE_FAILED :{WHITE}Mängu salvestamine ebaõnnestus{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Faili ei saa kustutada
-STR_4009_GAME_LOAD_FAILED :{WHITE}Mängu laadimine ebaõnnestus
+STR_4009_GAME_LOAD_FAILED :{WHITE}Mängu laadimine ebaõnnestus{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Nimekiri ketastest, kataloogidest ja salvestatud mängudest
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Mängu salvestuse nimi
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Kustuta valitud salvestus
diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt
index 908d5d786..5a1c03410 100644
--- a/src/lang/finnish.txt
+++ b/src/lang/finnish.txt
@@ -1893,9 +1893,9 @@ STR_4003_DELETE :{BLACK}Poista
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megatavu{P "" a} vapaana
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Asemaa ei voi lukea.
-STR_4007_GAME_SAVE_FAILED :{WHITE}Tallennus epäonnistui.
+STR_4007_GAME_SAVE_FAILED :{WHITE}Tallennus epäonnistui.{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Tiedostoa ei voi poistaa.
-STR_4009_GAME_LOAD_FAILED :{WHITE}Lataus epäonnistui.
+STR_4009_GAME_LOAD_FAILED :{WHITE}Lataus epäonnistui.{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista asemista, hakemistoista ja tallennetuista peleistä.
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Valittu nimi pelitallenteelle.
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Poista valittu pelitallenne.
diff --git a/src/lang/french.txt b/src/lang/french.txt
index f0b9b370a..f885345c8 100644
--- a/src/lang/french.txt
+++ b/src/lang/french.txt
@@ -1905,9 +1905,9 @@ STR_4003_DELETE :{BLACK}Supprime
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} Mo libre{P "" s}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Impossible d'accéder au disque
-STR_4007_GAME_SAVE_FAILED :{WHITE}La sauvegarde à échoué
+STR_4007_GAME_SAVE_FAILED :{WHITE}La sauvegarde à échoué{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Impossible de supprimer le fichier
-STR_4009_GAME_LOAD_FAILED :{WHITE}Le chargement à échoué
+STR_4009_GAME_LOAD_FAILED :{WHITE}Le chargement à échoué{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Liste des disques, répertoires, et fichiers de sauvegarde
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nom sélectionné pour la sauvegarde
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Supprime la sauvegarde sélectionnée
diff --git a/src/lang/galician.txt b/src/lang/galician.txt
index 30d726660..02185139c 100644
--- a/src/lang/galician.txt
+++ b/src/lang/galician.txt
@@ -1751,9 +1751,9 @@ STR_4003_DELETE :{BLACK}Borrar
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes libres
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}No se pode lee-la unidade
-STR_4007_GAME_SAVE_FAILED :{WHITE}Grabación da partida fallida
+STR_4007_GAME_SAVE_FAILED :{WHITE}Grabación da partida fallida{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Non se pode borra-lo arquivo
-STR_4009_GAME_LOAD_FAILED :{WHITE}Carga da partida fallida
+STR_4009_GAME_LOAD_FAILED :{WHITE}Carga da partida fallida{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista de unidades, directorios e arquivos de partida
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nome seleccionado actualmente para o arquivo
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Borra-lo arquivo que está seleccionado
diff --git a/src/lang/german.txt b/src/lang/german.txt
index 86548a61c..1a9521d0c 100644
--- a/src/lang/german.txt
+++ b/src/lang/german.txt
@@ -1902,9 +1902,9 @@ STR_4003_DELETE :{BLACK}Löschen
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} Megabyte{P "" s} frei
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kann vom Laufwerk nicht lesen
-STR_4007_GAME_SAVE_FAILED :{WHITE}Spielspeicherung fehlgeschlagen
+STR_4007_GAME_SAVE_FAILED :{WHITE}Spielspeicherung fehlgeschlagen{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Datei kann nicht gelöscht werden
-STR_4009_GAME_LOAD_FAILED :{WHITE}Laden des Spieles fehlgeschlagen
+STR_4009_GAME_LOAD_FAILED :{WHITE}Laden des Spieles fehlgeschlagen{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Liste der Laufwerke, Verzeichnisse und gespeicherten Spiele
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Ausgewählter Spielname
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Lösche gewählten Spielstand
diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt
index 49ee79918..6564a511f 100644
--- a/src/lang/hungarian.txt
+++ b/src/lang/hungarian.txt
@@ -1970,9 +1970,9 @@ STR_4003_DELETE :{BLACK}Töröl
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabájt szabad
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Nem olvasható a meghajtó
-STR_4007_GAME_SAVE_FAILED :{WHITE}A mentés nem sikerült
+STR_4007_GAME_SAVE_FAILED :{WHITE}A mentés nem sikerült{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Nem sikerült törölni a fájlt
-STR_4009_GAME_LOAD_FAILED :{WHITE}A betöltés nem sikerült
+STR_4009_GAME_LOAD_FAILED :{WHITE}A betöltés nem sikerült{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Meghajtók, könyvtárak és mentések listája
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}A mentés neve
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}A kijelölt mentés törlése
diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt
index 2ed84c2f5..c812914f6 100644
--- a/src/lang/icelandic.txt
+++ b/src/lang/icelandic.txt
@@ -1809,9 +1809,9 @@ STR_4003_DELETE :{BLACK}Eyða
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabæti laus
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Get ekki lesið af drifi
-STR_4007_GAME_SAVE_FAILED :{WHITE}Vistun leiks mistókst
+STR_4007_GAME_SAVE_FAILED :{WHITE}Vistun leiks mistókst{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Get ekki eytt skrá
-STR_4009_GAME_LOAD_FAILED :{WHITE}Mistókst að opna leik
+STR_4009_GAME_LOAD_FAILED :{WHITE}Mistókst að opna leik{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Listi yfir drif, möppur og vistaða leiki
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nafn fyrir vistun leiks
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Eyða nafninu
diff --git a/src/lang/italian.txt b/src/lang/italian.txt
index 166716285..5718aa641 100644
--- a/src/lang/italian.txt
+++ b/src/lang/italian.txt
@@ -1906,9 +1906,9 @@ STR_4003_DELETE :{BLACK}Elimina
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte liber{P o i}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Impossibile leggere dall'unità
-STR_4007_GAME_SAVE_FAILED :{WHITE}Salvataggio fallito
+STR_4007_GAME_SAVE_FAILED :{WHITE}Salvataggio fallito{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Impossibile eliminare il file
-STR_4009_GAME_LOAD_FAILED :{WHITE}Caricamento fallito
+STR_4009_GAME_LOAD_FAILED :{WHITE}Caricamento fallito{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Elenco delle unità, delle cartelle e dei file delle partite salvate
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nome del salvataggio selezionato
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Elimina il salvataggio selezionato
diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt
index 665f4b77a..6352538ed 100644
--- a/src/lang/japanese.txt
+++ b/src/lang/japanese.txt
@@ -1903,9 +1903,9 @@ STR_4003_DELETE :{BLACK}削除
STR_4004 :{COMPANY}、{DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} MB 使用可能
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}ドライブが読み込めません
-STR_4007_GAME_SAVE_FAILED :{WHITE}ゲームの保存が失敗しました
+STR_4007_GAME_SAVE_FAILED :{WHITE}ゲームの保存が失敗しました{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}ファイルを削除できません
-STR_4009_GAME_LOAD_FAILED :{WHITE}ゲームの読み込むが失敗しました
+STR_4009_GAME_LOAD_FAILED :{WHITE}ゲームの読み込むが失敗しました{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}ドライブ、フォルダ、ゲームファイルのリスト
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}ゲームのファイル名
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}選択したゲームを削除します
diff --git a/src/lang/korean.txt b/src/lang/korean.txt
index 1765e101b..105cc2e88 100644
--- a/src/lang/korean.txt
+++ b/src/lang/korean.txt
@@ -1905,9 +1905,9 @@ STR_4003_DELETE :{BLACK}파일
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} Mb 남음
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}드라이브를 읽을 수 없음
-STR_4007_GAME_SAVE_FAILED :{WHITE}게임 저장 실패
+STR_4007_GAME_SAVE_FAILED :{WHITE}게임 저장 실패{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}파일을 삭제할 수 없음
-STR_4009_GAME_LOAD_FAILED :{WHITE}게임 불러오기 실패
+STR_4009_GAME_LOAD_FAILED :{WHITE}게임 불러오기 실패{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}드라이프, 폴더, 저장된 게임 파일의 목록입니다
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}저장될 세이브 파일의 이름입니다.
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}선택된 세이브 파일을 삭제합니다.
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
index 543e90e0c..da1f1df9f 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -1839,9 +1839,9 @@ STR_4003_DELETE :{BLACK}Trinti
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} Mb laisva
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Negali pasiekti disko
-STR_4007_GAME_SAVE_FAILED :{WHITE}Zaidimo issaugoti nepavyko
+STR_4007_GAME_SAVE_FAILED :{WHITE}Zaidimo issaugoti nepavyko{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Failo istrinti nepavyko
-STR_4009_GAME_LOAD_FAILED :{WHITE}Zaidimo atverti nepavyko
+STR_4009_GAME_LOAD_FAILED :{WHITE}Zaidimo atverti nepavyko{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Disku, katalogu ir issaugotu zaidimu sarasas
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Pasirinktas zaidimas
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Istrinti pasirinkta zaidima
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
index 4eea30fbe..7c7af73d4 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
@@ -1864,9 +1864,9 @@ STR_4003_DELETE :{BLACK}Slett
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte ledig
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikke lese fra disk
-STR_4007_GAME_SAVE_FAILED :{WHITE}Lagring av spillet mislyktes
+STR_4007_GAME_SAVE_FAILED :{WHITE}Lagring av spillet mislyktes{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikke slette fil
-STR_4009_GAME_LOAD_FAILED :{WHITE}Feil ved fremhenting av spill
+STR_4009_GAME_LOAD_FAILED :{WHITE}Feil ved fremhenting av spill{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Liste over disker, mapper og lagrede spill
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Gjeldende navn for valgt lagret spill
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Slett valgte lagring
diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt
index 5481c3bb6..1ec2c1340 100644
--- a/src/lang/norwegian_nynorsk.txt
+++ b/src/lang/norwegian_nynorsk.txt
@@ -1900,9 +1900,9 @@ STR_4003_DELETE :{BLACK}Slett
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte ledig
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikkje lese frå disk
-STR_4007_GAME_SAVE_FAILED :{WHITE}Lagring av spelet mislukkast
+STR_4007_GAME_SAVE_FAILED :{WHITE}Lagring av spelet mislukkast{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikkje slette fil
-STR_4009_GAME_LOAD_FAILED :{WHITE}Feil ved henting av spel
+STR_4009_GAME_LOAD_FAILED :{WHITE}Feil ved henting av spel{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Liste over diskar, mapper og lagra spel
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Gjeldande namn for vald lagra spel
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Slett valde lagra spel
diff --git a/src/lang/piglatin.txt b/src/lang/piglatin.txt
index 63d127504..056210579 100644
--- a/src/lang/piglatin.txt
+++ b/src/lang/piglatin.txt
@@ -1903,9 +1903,9 @@ STR_4003_DELETE :{BLACK}Eleteday
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} egabyte{P "" s}may eefray
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Unableway otay eadray ivedray
-STR_4007_GAME_SAVE_FAILED :{WHITE}Amegay Avesay Ailedfay
+STR_4007_GAME_SAVE_FAILED :{WHITE}Amegay Avesay Ailedfay{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Unableway otay eleteday ilefay
-STR_4009_GAME_LOAD_FAILED :{WHITE}Amegay Oadlay Ailedfay
+STR_4009_GAME_LOAD_FAILED :{WHITE}Amegay Oadlay Ailedfay{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Istlay ofway ivesdray, irectoriesday andway avedsay-amegay ilesfay
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Urrentlycay electedsay amenay orfay avedsay-amegay
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Eleteday ethay urrentlycay electedsay avedsay-amegay
diff --git a/src/lang/polish.txt b/src/lang/polish.txt
index 49c1d6a58..a9232a8db 100644
--- a/src/lang/polish.txt
+++ b/src/lang/polish.txt
@@ -1925,9 +1925,9 @@ STR_4003_DELETE :{BLACK}Usuń
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} MB wolnego miejsca
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Nie można odczytać napędu
-STR_4007_GAME_SAVE_FAILED :{WHITE}Nie można zapisać gry
+STR_4007_GAME_SAVE_FAILED :{WHITE}Nie można zapisać gry{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Nie można usunąć pliku
-STR_4009_GAME_LOAD_FAILED :{WHITE}Nie można wczytać gry
+STR_4009_GAME_LOAD_FAILED :{WHITE}Nie można wczytać gry{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista napędów, katalogów i zapisanych gier
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Obecnie zaznaczona nazwa dla zapisanej gry
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Skasuj zaznaczoną zapisaną grę
diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt
index 89e2058bd..c6d09c92f 100644
--- a/src/lang/portuguese.txt
+++ b/src/lang/portuguese.txt
@@ -1867,9 +1867,9 @@ STR_4003_DELETE :{BLACK}Eliminar
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes livres
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Não é possível ler unidade
-STR_4007_GAME_SAVE_FAILED :{WHITE}Falha ao Guardar Jogo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Falha ao Guardar Jogo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Não é possível eliminar ficheiro
-STR_4009_GAME_LOAD_FAILED :{WHITE}Falha ao Abrir Jogo
+STR_4009_GAME_LOAD_FAILED :{WHITE}Falha ao Abrir Jogo{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista de unidades, directorias e ficheiros de jogos guardados
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nome escolhido para guardar o jogo
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Eliminar o jogo guardado seleccionado
diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt
index 58cf91de5..15950ec0b 100644
--- a/src/lang/romanian.txt
+++ b/src/lang/romanian.txt
@@ -1904,9 +1904,9 @@ STR_4003_DELETE :{BLACK}Şterge
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} liberi
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Nu pot citi acest disc
-STR_4007_GAME_SAVE_FAILED :{WHITE}Salvarea jocului eşuată
+STR_4007_GAME_SAVE_FAILED :{WHITE}Salvarea jocului eşuată{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Ştergerea jocului eşuată
-STR_4009_GAME_LOAD_FAILED :{WHITE}Încărcarea jocului eşuată
+STR_4009_GAME_LOAD_FAILED :{WHITE}Încărcarea jocului eşuată{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lista de discuri, directoare şi fişiere cu jocuri salvate
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Numele selectat pentru un joc salvat
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Şterge jocul salvat selectat
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
index b3828e1c5..395c59843 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -1868,9 +1868,9 @@ STR_4003_DELETE :{BLACK}Удал
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} Мб свободно
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Не удалось прочитать диск
-STR_4007_GAME_SAVE_FAILED :{WHITE}Невозможно сохранить игру
+STR_4007_GAME_SAVE_FAILED :{WHITE}Невозможно сохранить игру{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Невозможно удалить файл
-STR_4009_GAME_LOAD_FAILED :{WHITE}Невозможно загрузить игру
+STR_4009_GAME_LOAD_FAILED :{WHITE}Невозможно загрузить игру{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Список дисков, папок и сохраненных игр
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Выбранное имя для сохранения игры
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Удалить выбранную сохраненную игру
diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt
index e9f3d5047..198498c64 100644
--- a/src/lang/simplified_chinese.txt
+++ b/src/lang/simplified_chinese.txt
@@ -1828,9 +1828,9 @@ STR_4003_DELETE :{BLACK}删除
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte(s) 可用
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}不能读取驱动器
-STR_4007_GAME_SAVE_FAILED :{WHITE}保存游戏失败
+STR_4007_GAME_SAVE_FAILED :{WHITE}保存游戏失败{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}不能删除文件
-STR_4009_GAME_LOAD_FAILED :{WHITE}游戏存档读取失败
+STR_4009_GAME_LOAD_FAILED :{WHITE}游戏存档读取失败{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}驱动器、目录和游戏存档列表
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}保存当前游戏用的存档名字
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}删除选定的游戏存档
diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt
index ff5c868d9..6665760c7 100644
--- a/src/lang/slovak.txt
+++ b/src/lang/slovak.txt
@@ -1946,9 +1946,9 @@ STR_4003_DELETE :{BLACK}Vymazat
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabajtov volnych
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Zariadenie je necitatelne
-STR_4007_GAME_SAVE_FAILED :{WHITE}Ulozenie hry zlyhalo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Ulozenie hry zlyhalo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Subor sa neda vymazat
-STR_4009_GAME_LOAD_FAILED :{WHITE}Nahratie hry zlyhalo
+STR_4009_GAME_LOAD_FAILED :{WHITE}Nahratie hry zlyhalo{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Zoznam diskov, adresarov a subory ulozenych hier
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Vybrany nazov pre ulozenie hry
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Vymazat vybranu ulozenu hru
diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt
index 5608d63d1..4f970b058 100644
--- a/src/lang/slovenian.txt
+++ b/src/lang/slovenian.txt
@@ -1944,9 +1944,9 @@ STR_4003_DELETE :{BLACK}Izbriši
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabajt{P "" a i ov} prosto
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Nemogoče branje pogona
-STR_4007_GAME_SAVE_FAILED :{WHITE}Shranjevanje igre ni uspelo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Shranjevanje igre ni uspelo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Nemogoče brisanje datoteke
-STR_4009_GAME_LOAD_FAILED :{WHITE}Nalaganje igre ni uspelo
+STR_4009_GAME_LOAD_FAILED :{WHITE}Nalaganje igre ni uspelo{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Seznam pogonov, map in shranjenih iger
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Trenutno izbrano ime za shranjevanje
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Izbriši trenutno izbrano shranjeno igro
diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt
index 81b6e0f84..df07be02e 100644
--- a/src/lang/spanish.txt
+++ b/src/lang/spanish.txt
@@ -1849,9 +1849,9 @@ STR_4003_DELETE :{BLACK}Borrar
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabytes libres
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}No es posible leer la unidad
-STR_4007_GAME_SAVE_FAILED :{WHITE}Error guardando juego
+STR_4007_GAME_SAVE_FAILED :{WHITE}Error guardando juego{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}No es posible borrar el fichero
-STR_4009_GAME_LOAD_FAILED :{WHITE}Carga de juego erronea
+STR_4009_GAME_LOAD_FAILED :{WHITE}Carga de juego erronea{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Listado de unidades, directorios y juegos guardados
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nombre seleccionado actualmente para el juego guardado
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Borrar el juego guardado seleccionado
diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt
index 613020e0a..c26824445 100644
--- a/src/lang/swedish.txt
+++ b/src/lang/swedish.txt
@@ -1904,9 +1904,9 @@ STR_4003_DELETE :{BLACK}Ta bort
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} ledigt
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan inte läsa från disk
-STR_4007_GAME_SAVE_FAILED :{WHITE}Sparandet av spelet misslyckades
+STR_4007_GAME_SAVE_FAILED :{WHITE}Sparandet av spelet misslyckades{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan inte ta bort filen
-STR_4009_GAME_LOAD_FAILED :{WHITE}Läsningen av spelet misslyckades
+STR_4009_GAME_LOAD_FAILED :{WHITE}Läsningen av spelet misslyckades{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Listar enheter, kataloger och sparade spel
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Valt namn för spelet
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Ta bort markerat sparat spel
diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt
index 8f3ede970..bd1768a4b 100644
--- a/src/lang/traditional_chinese.txt
+++ b/src/lang/traditional_chinese.txt
@@ -1867,9 +1867,9 @@ STR_4003_DELETE :{BLACK}刪除
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}空間尚有 {COMMA} MB
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}無法讀取磁碟
-STR_4007_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗
+STR_4007_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}無法刪除檔案
-STR_4009_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗
+STR_4009_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}列出磁碟、目錄與遊戲存檔
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}目前選定的存檔名稱
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}刪除目前選定的存檔
diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt
index 273501ba1..18b6fcd95 100644
--- a/src/lang/turkish.txt
+++ b/src/lang/turkish.txt
@@ -1868,9 +1868,9 @@ STR_4003_DELETE :{BLACK}Sil
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} MB bos
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Sürücü okunamıyor
-STR_4007_GAME_SAVE_FAILED :{WHITE}Oyun kaydedilemedi
+STR_4007_GAME_SAVE_FAILED :{WHITE}Oyun kaydedilemedi{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Dosya silinemedi
-STR_4009_GAME_LOAD_FAILED :{WHITE}Dosya yüklenemedi
+STR_4009_GAME_LOAD_FAILED :{WHITE}Dosya yüklenemedi{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Sürücü, klasör ve kayıtli oyun listesi
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Kaydetmek için kullanılacak dosya adı
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Seçili oyunu sil
diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt
index 1975984bb..7092b61a5 100644
--- a/src/lang/ukrainian.txt
+++ b/src/lang/ukrainian.txt
@@ -2030,9 +2030,9 @@ STR_4003_DELETE :{BLACK}Вида
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} мегабайт{P "" и ""} вільно
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Неможливо прочитати пристрій
-STR_4007_GAME_SAVE_FAILED :{WHITE}Помилка запису гри
+STR_4007_GAME_SAVE_FAILED :{WHITE}Помилка запису гри{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Неможливо стерти файл
-STR_4009_GAME_LOAD_FAILED :{WHITE}Помилка завантаження гри
+STR_4009_GAME_LOAD_FAILED :{WHITE}Помилка завантаження гри{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Список пристроїв, каталогів і збережених файлів гри
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Поточне вибране ім'я файлу для збереження гри
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Стерти вибрану збережену гру
diff --git a/src/lang/unfinished/afrikaans.txt b/src/lang/unfinished/afrikaans.txt
index ee63c204c..99ba06221 100644
--- a/src/lang/unfinished/afrikaans.txt
+++ b/src/lang/unfinished/afrikaans.txt
@@ -1697,9 +1697,9 @@ STR_4003_DELETE :{BLACK}Uitwis
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} vry
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Kan nie skyf lees nie
-STR_4007_GAME_SAVE_FAILED :{WHITE}Spel Bewaar Gedop
+STR_4007_GAME_SAVE_FAILED :{WHITE}Spel Bewaar Gedop{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kan nie l�r uitwis nie
-STR_4009_GAME_LOAD_FAILED :{WHITE}Spel Laai Gedop
+STR_4009_GAME_LOAD_FAILED :{WHITE}Spel Laai Gedop{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Lys van skywe, voublaaie en spel-bewaar l�rs
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Huidige naam vir bewaarde-spel
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Uitwis die verkieste bewaarde-spel
diff --git a/src/lang/unfinished/croatian.txt b/src/lang/unfinished/croatian.txt
index ae0193089..e909c15cd 100644
--- a/src/lang/unfinished/croatian.txt
+++ b/src/lang/unfinished/croatian.txt
@@ -1828,9 +1828,9 @@ STR_4003_DELETE :{BLACK}Obriši
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabajt{P "" a a} slobod{P an na no}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Ne mogu pročitati disk
-STR_4007_GAME_SAVE_FAILED :{WHITE}Spremanje igre nije uspjelo
+STR_4007_GAME_SAVE_FAILED :{WHITE}Spremanje igre nije uspjelo{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Ne mogu obrisati datoteku
-STR_4009_GAME_LOAD_FAILED :{WHITE}Učitavanje igre nije uspjelo
+STR_4009_GAME_LOAD_FAILED :{WHITE}Učitavanje igre nije uspjelo{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Popis diskova, mapa i spremljenih datoteka
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Trenutno odabrano ime za spremanje igre
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Obriši trenutno odabranu spremljenu igru
diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt
index 7ad14ea2d..be84bbe6e 100644
--- a/src/lang/unfinished/frisian.txt
+++ b/src/lang/unfinished/frisian.txt
@@ -1048,9 +1048,9 @@ STR_4002_SAVE :{BLACK}Opslaan
STR_4003_DELETE :{BLACK}Fuortsmite
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Koe net fan 'e skiif lêze
-STR_4007_GAME_SAVE_FAILED :{WHITE}Opslaan Mislearre
+STR_4007_GAME_SAVE_FAILED :{WHITE}Opslaan Mislearre{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Kin triem net fuortsmite
-STR_4009_GAME_LOAD_FAILED :{WHITE}Laden Mislearre
+STR_4009_GAME_LOAD_FAILED :{WHITE}Laden Mislearre{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}List fan skiven, mappen en triemen
STR_4011_LOAD_HEIGHTMAP :{WHITE}Laad Hichtemap
diff --git a/src/lang/unfinished/greek.txt b/src/lang/unfinished/greek.txt
index a1a185355..8079d90c0 100644
--- a/src/lang/unfinished/greek.txt
+++ b/src/lang/unfinished/greek.txt
@@ -1557,9 +1557,9 @@ STR_4003_DELETE :{BLACK}Διαγ
STR_4004 :{COMPANY}, {DATE_LONG}
STR_4005_BYTES_FREE :{BLACK}{COMMA} megabyte{P "" s} ελεύθερα
STR_4006_UNABLE_TO_READ_DRIVE :{BLACK}Αδύνατη η ανάγνωση του δίσκου
-STR_4007_GAME_SAVE_FAILED :{WHITE}Αποθήκευση Παιχνιδιού Απέτυχε
+STR_4007_GAME_SAVE_FAILED :{WHITE}Αποθήκευση Παιχνιδιού Απέτυχε{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Αδύνατη η διαγραφή του αρχείου
-STR_4009_GAME_LOAD_FAILED :{WHITE}Φόρτωση Παιχνιδιού Απέτυχε
+STR_4009_GAME_LOAD_FAILED :{WHITE}Φόρτωση Παιχνιδιού Απέτυχε{}{STRING}
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Λίστα δίσκων, φακέλλων και αποθηκευμένων παιχνιδιών
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Τρέχον όνομα για το αποθηκευμένο παιχνίδι
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Διαγραφή του επιλεγμένου αποθηκευμένου παιχνιδιού
diff --git a/src/openttd.cpp b/src/openttd.cpp
index 13ce248aa..afbeaafe7 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -740,7 +740,8 @@ static void StartScenario()
/* invalid type */
if (_file_to_saveload.mode == SL_INVALID) {
DEBUG(sl, 0, "Savegame is obsolete or invalid format: '%s'", _file_to_saveload.name);
- ShowErrorMessage(INVALID_STRING_ID, STR_4009_GAME_LOAD_FAILED, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
_game_mode = GM_MENU;
return;
}
@@ -755,7 +756,8 @@ static void StartScenario()
/* Load game */
if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, SCENARIO_DIR) != SL_OK) {
LoadIntroGame();
- ShowErrorMessage(INVALID_STRING_ID, STR_4009_GAME_LOAD_FAILED, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
}
_opt_ptr = &_opt;
@@ -863,7 +865,8 @@ void SwitchMode(int new_mode)
if (!SafeSaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL, NO_DIRECTORY)) {
LoadIntroGame();
- ShowErrorMessage(INVALID_STRING_ID, STR_4009_GAME_LOAD_FAILED, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
} else {
/* Update the local player for a loaded game. It is either always
* player #1 (eg 0) or in the case of a dedicated server a spectator */
@@ -901,7 +904,8 @@ void SwitchMode(int new_mode)
SetLocalPlayer(OWNER_NONE);
_patches_newgame.starting_year = _cur_year;
} else {
- ShowErrorMessage(INVALID_STRING_ID, STR_4009_GAME_LOAD_FAILED, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
}
break;
}
@@ -912,7 +916,8 @@ void SwitchMode(int new_mode)
case SM_SAVE: /* Save game */
if (SaveOrLoad(_file_to_saveload.name, SL_SAVE, NO_DIRECTORY) != SL_OK) {
- ShowErrorMessage(INVALID_STRING_ID, STR_4007_GAME_SAVE_FAILED, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
} else {
DeleteWindowById(WC_SAVELOAD, 0);
}
@@ -1268,7 +1273,10 @@ bool AfterLoadGame()
/* Check if all NewGRFs are present, we are very strict in MP mode */
GRFListCompatibility gcf_res = IsGoodGRFConfigList();
- if (_networking && gcf_res != GLC_ALL_GOOD) return false;
+ if (_networking && gcf_res != GLC_ALL_GOOD) {
+ SetSaveLoadError(STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH);
+ return false;
+ }
switch (gcf_res) {
case GLC_COMPATIBLE: _switch_mode_errorstr = STR_NEWGRF_COMPATIBLE_LOAD_WARNING; break;
@@ -1313,7 +1321,7 @@ bool AfterLoadGame()
/* make sure there is a town in the game */
if (_game_mode == GM_NORMAL && !ClosestTownFromTile(0, (uint)-1)) {
- _error_message = STR_NO_TOWN_IN_SCENARIO;
+ SetSaveLoadError(STR_NO_TOWN_IN_SCENARIO);
return false;
}
diff --git a/src/saveload.cpp b/src/saveload.cpp
index f8af5dc9b..64d502b1d 100644
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -26,6 +26,8 @@
#include "saveload.h"
#include "network/network.h"
#include "variables.h"
+#include "table/strings.h"
+#include "strings.h"
#include <setjmp.h>
#include <list>
@@ -65,7 +67,8 @@ static struct {
FILE *fh; ///< the file from which is read or written to
void (*excpt_uninit)(); ///< the function to execute on any encountered error
- const char *excpt_msg; ///< the error message
+ StringID error_str; ///< the translateable error message to show
+ char *extra_msg; ///< the error message
jmp_buf excpt; ///< @todo used to jump to "exception handler"; really ugly
} _sl;
@@ -136,9 +139,11 @@ static void SlWriteFill()
/** Error handler, calls longjmp to simulate an exception.
* @todo this was used to have a central place to handle errors, but it is
* pretty ugly, and seriously interferes with any multithreaded approaches */
-static void NORETURN SlError(const char *msg)
+static void NORETURN SlError(StringID string, const char *extra_msg = NULL)
{
- _sl.excpt_msg = msg;
+ _sl.error_str = string;
+ free(_sl.extra_msg);
+ _sl.extra_msg = (extra_msg == NULL) ? NULL : strdup(extra_msg);
longjmp(_sl.excpt, 0);
}
@@ -224,7 +229,7 @@ static uint SlReadSimpleGamma()
if (HASBIT(i, 5)) {
i &= ~0x20;
if (HASBIT(i, 4))
- SlError("Unsupported gamma");
+ SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unsupported gamma");
i = (i << 8) | SlReadByte();
}
i = (i << 8) | SlReadByte();
@@ -859,7 +864,7 @@ void SlAutolength(AutolengthProc *proc, void *arg)
/* And write the stuff */
proc(arg);
- assert(offs == SlGetOffs());
+ if (offs != SlGetOffs()) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
}
/**
@@ -891,9 +896,9 @@ static void SlLoadChunk(const ChunkHandler *ch)
_sl.obj_len = len;
endoffs = SlGetOffs() + len;
ch->load_proc();
- assert(SlGetOffs() == endoffs);
+ if (SlGetOffs() != endoffs) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
} else {
- SlError("Invalid chunk type");
+ SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk type");
}
break;
}
@@ -994,7 +999,7 @@ static void SlLoadChunks()
DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id);
ch = SlFindChunkHandler(id);
- if (ch == NULL) SlError("found unknown tag in savegame (sync error)");
+ if (ch == NULL) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unknown chunk type");
SlLoadChunk(ch);
}
}
@@ -1014,7 +1019,7 @@ static uint ReadLZO()
uint len;
/* Read header*/
- if (fread(tmp, sizeof(tmp), 1, _sl.fh) != 1) SlError("file read failed");
+ if (fread(tmp, sizeof(tmp), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE, "File read failed");
/* Check if size is bad */
((uint32*)out)[0] = size = tmp[1];
@@ -1024,13 +1029,13 @@ static uint ReadLZO()
size = TO_BE32(size);
}
- if (size >= sizeof(out)) SlError("inconsistent size");
+ if (size >= sizeof(out)) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Inconsistent size");
/* Read block */
- if (fread(out + sizeof(uint32), size, 1, _sl.fh) != 1) SlError("file read failed");
+ if (fread(out + sizeof(uint32), size, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
/* Verify checksum */
- if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError("bad checksum");
+ if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Bad checksum");
/* Decompress */
lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL);
@@ -1048,7 +1053,7 @@ static void WriteLZO(uint size)
lzo1x_1_compress(_sl.buf, size, out + sizeof(uint32)*2, &outlen, wrkmem);
((uint32*)out)[1] = TO_BE32(outlen);
((uint32*)out)[0] = TO_BE32(lzo_adler32(0, out + sizeof(uint32), outlen + sizeof(uint32)));
- if (fwrite(out, outlen + sizeof(uint32)*2, 1, _sl.fh) != 1) SlError("file write failed");
+ if (fwrite(out, outlen + sizeof(uint32)*2, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
}
static bool InitLZO()
@@ -1092,7 +1097,6 @@ static void UninitNoComp()
********** START OF MEMORY CODE (in ram)****
********************************************/
-#include "table/strings.h"
#include "table/sprites.h"
#include "gfx.h"
#include "gui.h"
@@ -1171,8 +1175,7 @@ static uint ReadZlib()
if (r == Z_STREAM_END)
break;
- if (r != Z_OK)
- SlError("inflate() failed");
+ if (r != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "inflate() failed");
} while (_z.avail_out);
return 4096 - _z.avail_out;
@@ -1207,11 +1210,11 @@ static void WriteZlibLoop(z_streamp z, byte *p, uint len, int mode)
r = deflate(z, mode);
/* bytes were emitted? */
if ((n=sizeof(buf) - z->avail_out) != 0) {
- if (fwrite(buf, n, 1, _sl.fh) != 1) SlError("file write error");
+ if (fwrite(buf, n, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
}
if (r == Z_STREAM_END)
break;
- if (r != Z_OK) SlError("zlib returned error code");
+ if (r != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "zlib returned error code");
} while (z->avail_in || !z->avail_out);
}
@@ -1476,10 +1479,28 @@ void SaveFileDone()
_ts.saveinprogress = false;
}
+/** Set the error message from outside of the actual loading/saving of the game (AfterLoadGame and friends) */
+void SetSaveLoadError(StringID str)
+{
+ _sl.error_str = str;
+}
+
+/** Get the string representation of the error message */
+const char *GetSaveLoadErrorString()
+{
+ SetDParam(0, _sl.error_str);
+ SetDParamStr(1, _sl.extra_msg);
+
+ static char err_str[512];
+ GetString(err_str, _sl.save ? STR_4007_GAME_SAVE_FAILED : STR_4009_GAME_LOAD_FAILED, lastof(err_str));
+ return err_str;
+}
+
/** Show a gui message when saving has failed */
void SaveFileError()
{
- ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0);
+ SetDParamStr(0, GetSaveLoadErrorString());
+ ShowErrorMessage(STR_012D, STR_NULL, 0, 0);
SaveFileDone();
}
@@ -1493,13 +1514,16 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded)
const SaveLoadFormat *fmt;
uint32 hdr[2];
+ _sl.excpt_uninit = NULL;
/* XXX - Setup setjmp error handler if an error occurs anywhere deep during
* loading/saving execute a longjmp() and continue execution here */
if (setjmp(_sl.excpt)) {
AbortSaveLoad();
- _sl.excpt_uninit();
+ if (_sl.excpt_uninit != NULL) _sl.excpt_uninit();
+
+ ShowInfo(GetSaveLoadErrorString());
+ fprintf(stderr, GetSaveLoadErrorString());
- fprintf(stderr, "Save game failed: %s.", _sl.excpt_msg);
if (threaded) {
OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_ERROR);
} else {
@@ -1513,9 +1537,9 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded)
/* We have written our stuff to memory, now write it to file! */
hdr[0] = fmt->tag;
hdr[1] = TO_BE32(SAVEGAME_VERSION << 16);
- if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError("file write failed");
+ if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
- if (!fmt->init_write()) SlError("cannot initialize compressor");
+ if (!fmt->init_write()) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor");
{
uint i;
@@ -1584,6 +1608,22 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
return SL_OK;
}
+ /* XXX - Setup setjmp error handler if an error occurs anywhere deep during
+ * loading/saving execute a longjmp() and continue execution here */
+ _sl.excpt_uninit = NULL;
+ if (setjmp(_sl.excpt)) {
+ AbortSaveLoad();
+
+ /* deinitialize compressor. */
+ if (_sl.excpt_uninit != NULL) _sl.excpt_uninit();
+
+ /* Skip the "color" character */
+ ShowInfoF(GetSaveLoadErrorString() + 3);
+
+ /* A saver/loader exception!! reinitialize all variables to prevent crash! */
+ return (mode == SL_LOAD) ? SL_REINIT : SL_ERROR;
+ }
+
_sl.fh = (mode == SL_SAVE) ? FioFOpenFile(filename, "wb", sb) : FioFOpenFile(filename, "rb", sb);
/* Make it a little easier to load savegames from the console */
@@ -1591,8 +1631,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
if (_sl.fh == NULL && mode == SL_LOAD) _sl.fh = FioFOpenFile(filename, "rb", BASE_DIR);
if (_sl.fh == NULL) {
- DEBUG(sl, 0, "Cannot open savegame '%s' for saving/loading.", filename);
- return SL_ERROR;
+ SlError(mode == SL_SAVE ? STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE : STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
}
_sl.bufe = _sl.bufp = NULL;
@@ -1601,24 +1640,6 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
_sl.includes = _desc_includes;
_sl.chs = _chunk_handlers;
- /* XXX - Setup setjmp error handler if an error occurs anywhere deep during
- * loading/saving execute a longjmp() and continue execution here */
- if (setjmp(_sl.excpt)) {
- AbortSaveLoad();
-
- /* deinitialize compressor. */
- _sl.excpt_uninit();
-
- /* A saver/loader exception!! reinitialize all variables to prevent crash! */
- if (mode == SL_LOAD) {
- ShowInfoF("Load game failed: %s.", _sl.excpt_msg);
- return SL_REINIT;
- }
-
- ShowInfoF("Save game failed: %s.", _sl.excpt_msg);
- return SL_ERROR;
- }
-
/* General tactic is to first save the game to memory, then use an available writer
* to write it to file, either in threaded mode if possible, or single-threaded */
if (mode == SL_SAVE) { /* SAVE game */
@@ -1650,10 +1671,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
} else { /* LOAD game */
assert(mode == SL_LOAD);
- if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) {
- DEBUG(sl, 0, "Cannot read savegame header, aborting");
- return AbortSaveLoad();
- }
+ if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
/* see if we have any loader for this type. */
for (fmt = _saveload_formats; ; fmt++) {
@@ -1685,10 +1703,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
DEBUG(sl, 1, "Loading savegame version %d", _sl_version);
/* Is the version higher than the current? */
- if (_sl_version > SAVEGAME_VERSION) {
- DEBUG(sl, 0, "Savegame version invalid");
- return AbortSaveLoad();
- }
+ if (_sl_version > SAVEGAME_VERSION) SlError(STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME);
break;
}
}
@@ -1698,13 +1713,15 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
/* loader for this savegame type is not implemented? */
if (fmt->init_read == NULL) {
- ShowInfoF("Loader for '%s' is not available.", fmt->name);
- return AbortSaveLoad();
+ char err_str[64];
+ snprintf(err_str, lengthof(err_str), "Loader for '%s' is not available.", fmt->name);
+ SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, err_str);
}
if (!fmt->init_read()) {
- DEBUG(sl, 0, "Initializing loader '%s' failed", fmt->name);
- return AbortSaveLoad();
+ char err_str[64];
+ snprintf(err_str, lengthof(err_str), "Initializing loader '%s' failed", fmt->name);
+ SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, err_str);
}
/* Old maps were hardcoded to 256x256 and thus did not contain
diff --git a/src/saveload.h b/src/saveload.h
index 009e73267..c215a83ef 100644
--- a/src/saveload.h
+++ b/src/saveload.h
@@ -28,6 +28,8 @@ enum SaveOrLoadMode {
SL_BMP = 4,
};
+void SetSaveLoadError(uint16 str);
+const char *GetSaveLoadErrorString();
SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb);
void WaitTillSaved();
void DoExitSave();