Hamers
08.12.2012, 23:34
Hey Jungs :D
Da die Frage nun schon öfters aufgekommen ist, möchte ich an dieser Stelle kurz beschreiben wie man das Problem behebt, dass Crysis keine Dateien im Localized Ordner einer Mod erkennt und es daher unmöglich ist mehrsprachige Mods mithilfe des Crysis Systems zu realisieren.
Für den Fix ist eine Code-Änderung erforderlich. Ich gehe daher davon aus, dass Grundkenntnisse in der C++ Programmierung vorhanden sind. Ich kann auch keine Garantien geben für Korrektheit. Ich werde aber versuchen auf Fragen einzugehen, soweit es meine (begrenzte) Zeit erlaubt.
Ich werde mich daher auch auf das nötigste beschränken und nur zeigen wie man seinen Code anpasst, damit man mehrere Sprachpakete nutzen kann. Wie das Crysis Lokalisations System an sich funktioniert, dauert zu lang zu erklären und sollte jeder für sich selber herausfinden.
Empfehlenswert dafür sind folgende Seiten des Free SDK:
http://freesdk.crydev.net/display/SDKDOC3/Overview+of+the+Localization+System (Achtung: Wie die Seite selber sagt, hat sich einiges geändert mit der Version 3.4.3 des Free SDK. Davor war das System identisch mit Crysis 1 und Crysis Wars)
http://freesdk.crydev.net/display/SDKDOC3/The+Dialog+System
Nun aber zum Code Teil :)
Ich habe versucht möglichst viel zusammenzufassen und unnötiges wegzulassen, damit es einfacher wird. Ein Teil stammt noch aus der Rainy Days Zeit, daher nicht immer ganz ordentlich und perfekt ;)
Notwendige Änderung:
In der Game.cpp in die Funktion CGame::Init vor der Zeile m_pFlashMenuObject = new CFlashMenuObject einfügen:
//Set Mod language based on automatically detected language
ILocalizationManager* pLocMgr = gEnv->pSystem->GetLocalizationManager();
//Get current language
string m_bDetectLanguage = pLocMgr->GetLanguage();
//Wreckage only supports German or English language. Others will be set to English!
if (m_bDetectLanguage != "German" && m_bDetectLanguage != "English")
m_bDetectLanguage = "English";
//Free all data for refresh
gEnv->pSystem->GetLocalizationManager()->FreeData();
//Set language
gEnv->pSystem->GetLocalizationManager()->SetLanguage("../../mods/wreckage/game/localized/" + m_bDetectLanguage);
//Add language pak file to FileSystem
gEnv->pSystem->GetIPak()->OpenPack( "","Mods/Wreckage/Game/Localized/" + m_bDetectLanguage + ".pak");
//Set CVar for Sub-Systems
string sCommand = "g_language";
sCommand.append(" ");
sCommand.append(m_bDetectLanguage);
gEnv->pConsole->ExecuteString(sCommand.c_str());
//Reload all XmlSpreadsheets
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_credit_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ps_basic_tutorial_subtitles.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/movielist.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_controls.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ai_dialog_recording_list.xml", true);
Der fertige Code sollte so aussehen:
if (!gEnv->pSystem->IsDedicated())
{
---Der Code von oben---
m_pFlashMenuObject = new CFlashMenuObject;
m_pFlashMenuObject->Load();
}
Bitte darauf achten, dass ihr das Wort Wreckage in den Pfadangaben durch den Namen eurer Mod ersetzt!
Auch gilt es zu beachten, dass in diesem Beispiel der Sprachsupport auf Englisch und Deutsch beschränkt wird. Wenn ihr die eine IF Abfrage entfernt, könnt ihr auch alle Sprachen zulassen, müsst dann aber auch die entsprechenden Sprachpakete bereitstellen. Selbstverständlich kann die Abfrage beliebig erweitert werden, um jede erdenkliche Sprach-Kombination zuzulassen z.B. nur Englisch oder Deutsch, Englisch und Spanisch usw.
Das sollte es bereits gewesen sein. Für Wreckage wurden noch zahlreiche weitere Modifikationen vorgenommen, die aber wahrscheinlich für die meisten nicht sonderlich interessant sind. Das hier sollte ausreichen, damit Crysis eure gewünschten pak Dateien aus eurem "MeineMod->Game->Localized" Ordner lädt und verwendet.
Schönes Wochenende noch :D
Da die Frage nun schon öfters aufgekommen ist, möchte ich an dieser Stelle kurz beschreiben wie man das Problem behebt, dass Crysis keine Dateien im Localized Ordner einer Mod erkennt und es daher unmöglich ist mehrsprachige Mods mithilfe des Crysis Systems zu realisieren.
Für den Fix ist eine Code-Änderung erforderlich. Ich gehe daher davon aus, dass Grundkenntnisse in der C++ Programmierung vorhanden sind. Ich kann auch keine Garantien geben für Korrektheit. Ich werde aber versuchen auf Fragen einzugehen, soweit es meine (begrenzte) Zeit erlaubt.
Ich werde mich daher auch auf das nötigste beschränken und nur zeigen wie man seinen Code anpasst, damit man mehrere Sprachpakete nutzen kann. Wie das Crysis Lokalisations System an sich funktioniert, dauert zu lang zu erklären und sollte jeder für sich selber herausfinden.
Empfehlenswert dafür sind folgende Seiten des Free SDK:
http://freesdk.crydev.net/display/SDKDOC3/Overview+of+the+Localization+System (Achtung: Wie die Seite selber sagt, hat sich einiges geändert mit der Version 3.4.3 des Free SDK. Davor war das System identisch mit Crysis 1 und Crysis Wars)
http://freesdk.crydev.net/display/SDKDOC3/The+Dialog+System
Nun aber zum Code Teil :)
Ich habe versucht möglichst viel zusammenzufassen und unnötiges wegzulassen, damit es einfacher wird. Ein Teil stammt noch aus der Rainy Days Zeit, daher nicht immer ganz ordentlich und perfekt ;)
Notwendige Änderung:
In der Game.cpp in die Funktion CGame::Init vor der Zeile m_pFlashMenuObject = new CFlashMenuObject einfügen:
//Set Mod language based on automatically detected language
ILocalizationManager* pLocMgr = gEnv->pSystem->GetLocalizationManager();
//Get current language
string m_bDetectLanguage = pLocMgr->GetLanguage();
//Wreckage only supports German or English language. Others will be set to English!
if (m_bDetectLanguage != "German" && m_bDetectLanguage != "English")
m_bDetectLanguage = "English";
//Free all data for refresh
gEnv->pSystem->GetLocalizationManager()->FreeData();
//Set language
gEnv->pSystem->GetLocalizationManager()->SetLanguage("../../mods/wreckage/game/localized/" + m_bDetectLanguage);
//Add language pak file to FileSystem
gEnv->pSystem->GetIPak()->OpenPack( "","Mods/Wreckage/Game/Localized/" + m_bDetectLanguage + ".pak");
//Set CVar for Sub-Systems
string sCommand = "g_language";
sCommand.append(" ");
sCommand.append(m_bDetectLanguage);
gEnv->pConsole->ExecuteString(sCommand.c_str());
//Reload all XmlSpreadsheets
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_credit_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ps_basic_tutorial_subtitles.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/movielist.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_controls.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ai_dialog_recording_list.xml", true);
Der fertige Code sollte so aussehen:
if (!gEnv->pSystem->IsDedicated())
{
---Der Code von oben---
m_pFlashMenuObject = new CFlashMenuObject;
m_pFlashMenuObject->Load();
}
Bitte darauf achten, dass ihr das Wort Wreckage in den Pfadangaben durch den Namen eurer Mod ersetzt!
Auch gilt es zu beachten, dass in diesem Beispiel der Sprachsupport auf Englisch und Deutsch beschränkt wird. Wenn ihr die eine IF Abfrage entfernt, könnt ihr auch alle Sprachen zulassen, müsst dann aber auch die entsprechenden Sprachpakete bereitstellen. Selbstverständlich kann die Abfrage beliebig erweitert werden, um jede erdenkliche Sprach-Kombination zuzulassen z.B. nur Englisch oder Deutsch, Englisch und Spanisch usw.
Das sollte es bereits gewesen sein. Für Wreckage wurden noch zahlreiche weitere Modifikationen vorgenommen, die aber wahrscheinlich für die meisten nicht sonderlich interessant sind. Das hier sollte ausreichen, damit Crysis eure gewünschten pak Dateien aus eurem "MeineMod->Game->Localized" Ordner lädt und verwendet.
Schönes Wochenende noch :D