diff --git a/Console/Console_VS2005.vcproj b/Console/Console_VS2005.vcproj
index b579ea18..1e6f4eaa 100644
--- a/Console/Console_VS2005.vcproj
+++ b/Console/Console_VS2005.vcproj
@@ -47,7 +47,7 @@
/>
uiFlags & BUTTON_CLICKED_ON) ? (gfVanillaMode = TRUE) : (gfVanillaMode = FALSE);
}
+void ResizeMapOnLoadingCallback(GUI_BUTTON *btn, INT32 reason)
+{
+ if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP)
+ {
+ if (btn->uiFlags & BUTTON_CLICKED_ON)
+ {
+ // TODO.MAP: Enable/Disable the Rows textbox
+ gfResizeMapOnLoading = TRUE;
+ //EnableTextField(1);
+ }
+ else
+ {
+ gfResizeMapOnLoading = FALSE;
+ //DisableTextField(1);
+ }
+ }
+}
+
//ITEMS
void MouseMovedInItemsRegion( MOUSE_REGION *reg, INT32 reason )
{
diff --git a/Editor/Editor Taskbar Creation.cpp b/Editor/Editor Taskbar Creation.cpp
index eed584ec..02994742 100644
--- a/Editor/Editor Taskbar Creation.cpp
+++ b/Editor/Editor Taskbar Creation.cpp
@@ -21,6 +21,7 @@
#include "Soldier Create.h"
#include "overhead types.h"
#include "local.h"
+ #include "Text.h"
#endif
//Category tabs of the editor buttons
@@ -42,71 +43,71 @@ void InitEditorItemStatsButtons()
iEditorButton[ ITEMSTATS_HIDDEN_BTN ] =
CreateCheckBoxButton( iScreenWidthOffset + 485, 2 * iScreenHeightOffset + 365, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, ItemStatsToggleHideCallback );
iEditorButton[ ITEMSTATS_DELETE_BTN ] =
- CreateTextButton( L"Delete", FONT10ARIAL, FONT_RED, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorItemStatsButtonsText[0], FONT10ARIAL, FONT_RED, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 600, 2 * iScreenHeightOffset + 441, 36, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL+1, DEFAULT_MOVE_CALLBACK, ItemStatsDeleteCallback );
}
void InitEditorMercsToolbar()
{
CHAR16 TempString[30];
- STR16 FaceDirs[8] = {L"north",L"northeast",L"east",L"southeast",L"south",L"southwest",L"west",L"northwest"};
+// STR16 FaceDirs[8] = {L"north",L"northeast",L"east",L"southeast",L"south",L"southwest",L"west",L"northwest"};
INT32 x;
iEditorButton[ MERCS_PLAYERTOGGLE ] =
CreateCheckBoxButton( iScreenWidthOffset + 4, 2 * iScreenHeightOffset + 362, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, MercsTogglePlayers );
if( gfShowPlayers )
ClickEditorButton( MERCS_PLAYERTOGGLE );
- SetButtonFastHelpText( iEditorButton[ MERCS_PLAYERTOGGLE ], L"Toggle viewing of players");
+ SetButtonFastHelpText( iEditorButton[ MERCS_PLAYERTOGGLE ], iEditorMercsToolbarText[0]);
DisableButton( iEditorButton[ MERCS_PLAYERTOGGLE ] );
iEditorButton[ MERCS_ENEMYTOGGLE ] =
CreateCheckBoxButton( iScreenWidthOffset + 4, 2 * iScreenHeightOffset + 382, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, MercsToggleEnemies );
if( gfShowEnemies )
ClickEditorButton( MERCS_ENEMYTOGGLE );
- SetButtonFastHelpText( iEditorButton[ MERCS_ENEMYTOGGLE ], L"Toggle viewing of enemies");
+ SetButtonFastHelpText( iEditorButton[ MERCS_ENEMYTOGGLE ], iEditorMercsToolbarText[1]);
iEditorButton[ MERCS_CREATURETOGGLE ] =
CreateCheckBoxButton( iScreenWidthOffset + 4, 2 * iScreenHeightOffset + 402, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, MercsToggleCreatures );
if( gfShowCreatures )
ClickEditorButton( MERCS_CREATURETOGGLE );
- SetButtonFastHelpText( iEditorButton[ MERCS_CREATURETOGGLE ], L"Toggle viewing of creatures");
+ SetButtonFastHelpText( iEditorButton[ MERCS_CREATURETOGGLE ], iEditorMercsToolbarText[2]);
iEditorButton[ MERCS_REBELTOGGLE ] =
CreateCheckBoxButton( iScreenWidthOffset + 4, 2 * iScreenHeightOffset + 422, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, MercsToggleRebels );
if( gfShowRebels )
ClickEditorButton( MERCS_REBELTOGGLE );
- SetButtonFastHelpText( iEditorButton[ MERCS_REBELTOGGLE ], L"Toggle viewing of rebels");
+ SetButtonFastHelpText( iEditorButton[ MERCS_REBELTOGGLE ], iEditorMercsToolbarText[3]);
iEditorButton[ MERCS_CIVILIANTOGGLE ] =
CreateCheckBoxButton( iScreenWidthOffset + 4, 2 * iScreenHeightOffset + 442, "EDITOR//SmCheckbox.sti", MSYS_PRIORITY_NORMAL, MercsToggleCivilians );
if( gfShowCivilians )
ClickEditorButton( MERCS_CIVILIANTOGGLE );
- SetButtonFastHelpText( iEditorButton[ MERCS_CIVILIANTOGGLE ], L"Toggle viewing of civilians");
+ SetButtonFastHelpText( iEditorButton[ MERCS_CIVILIANTOGGLE ], iEditorMercsToolbarText[4]);
iEditorButton[MERCS_PLAYER] =
- CreateTextButton( L"Player",(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[5],(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 20, 2 * iScreenHeightOffset + 362, 78, 19, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsPlayerTeamCallback );
SpecifyButtonDownTextColors( iEditorButton[MERCS_PLAYER], FONT_YELLOW, FONT_BLACK );
DisableButton( iEditorButton[MERCS_PLAYER] );
iEditorButton[MERCS_ENEMY] =
- CreateTextButton( L"Enemy",(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[6],(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 20, 2 * iScreenHeightOffset + 382, 78, 19, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsEnemyTeamCallback );
SpecifyButtonDownTextColors( iEditorButton[MERCS_ENEMY], FONT_YELLOW, FONT_BLACK );
iEditorButton[MERCS_CREATURE] =
- CreateTextButton( L"Creature",(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[7],(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 20, 2 * iScreenHeightOffset + 402, 78, 19, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsCreatureTeamCallback );
SpecifyButtonDownTextColors( iEditorButton[MERCS_CREATURE], FONT_YELLOW, FONT_BLACK );
iEditorButton[MERCS_REBEL] =
- CreateTextButton( L"Rebels",(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[8],(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 20, 2 * iScreenHeightOffset + 422, 78, 19, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsRebelTeamCallback );
SpecifyButtonDownTextColors( iEditorButton[MERCS_REBEL], FONT_YELLOW, FONT_BLACK );
iEditorButton[MERCS_CIVILIAN] =
- CreateTextButton( L"Civilian",(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[9],(UINT16)BLOCKFONT, 165, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 20, 2 * iScreenHeightOffset + 442, 78, 19, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsCivilianTeamCallback );
SpecifyButtonDownTextColors( iEditorButton[MERCS_CIVILIAN], FONT_YELLOW, FONT_BLACK );
iEditorButton[ MERCS_1 ] =
- CreateTextButton( L"DETAILED PLACEMENT", SMALLCOMPFONT, FONT_ORANGE, 60, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[10], SMALLCOMPFONT, FONT_ORANGE, 60, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 100, 2 * iScreenHeightOffset + 362, 68, 20, BUTTON_TOGGLE,
MSYS_PRIORITY_NORMAL, BUTTON_NO_CALLBACK, BUTTON_NO_CALLBACK );
DisableButton( iEditorButton[ MERCS_1 ] );
@@ -118,81 +119,81 @@ void InitEditorMercsToolbar()
iEditorButton[ MERCS_GENERAL ] =
CreateEasyToggleButton( iScreenWidthOffset + 100, 2 * iScreenHeightOffset + 382, "EDITOR//MercGeneral.sti", MercsGeneralModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_GENERAL ], L"General information mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_GENERAL ], iEditorMercsToolbarText[11]);
iEditorButton[ MERCS_APPEARANCE ] =
CreateEasyToggleButton( iScreenWidthOffset + 134, 2 * iScreenHeightOffset + 382, "EDITOR//MercAppearance.sti", MercsAppearanceModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_APPEARANCE ], L"Physical appearance mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_APPEARANCE ], iEditorMercsToolbarText[12]);
iEditorButton[ MERCS_ATTRIBUTES ] =
CreateEasyToggleButton( iScreenWidthOffset + 100, 2 * iScreenHeightOffset + 408, "EDITOR//MercAttributes.sti", MercsAttributesModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_ATTRIBUTES ], L"Attributes mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_ATTRIBUTES ], iEditorMercsToolbarText[13]);
iEditorButton[ MERCS_INVENTORY ] =
CreateEasyToggleButton( iScreenWidthOffset + 134, 2 * iScreenHeightOffset + 408, "EDITOR//MercInventory.sti", MercsInventoryModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_INVENTORY ], L"Inventory mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_INVENTORY ], iEditorMercsToolbarText[14]);
iEditorButton[ MERCS_PROFILE ] =
CreateEasyToggleButton( iScreenWidthOffset + 100, 2 * iScreenHeightOffset + 434, "EDITOR//MercProfile.sti", MercsProfileModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_PROFILE ], L"Profile ID mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_PROFILE ], iEditorMercsToolbarText[15]);
iEditorButton[ MERCS_SCHEDULE ] =
CreateEasyToggleButton( iScreenWidthOffset + 134, 2 * iScreenHeightOffset + 434, "EDITOR//MercSchedule.sti", MercsScheduleModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE ], L"Schedule mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE ], iEditorMercsToolbarText[16]);
//Workaround for identical buttons.
MSYS_SetBtnUserData( iEditorButton[ MERCS_SCHEDULE ], 3, 0xffffffff );
iEditorButton[ MERCS_GLOWSCHEDULE ] =
CreateEasyToggleButton( iScreenWidthOffset + 134, 2 * iScreenHeightOffset + 434, "EDITOR//MercGlowSchedule.sti", MercsScheduleModeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_GLOWSCHEDULE ], L"Schedule mode");
+ SetButtonFastHelpText( iEditorButton[ MERCS_GLOWSCHEDULE ], iEditorMercsToolbarText[17]);
HideEditorButton( MERCS_GLOWSCHEDULE );
iEditorButton[ MERCS_DELETE ] =
- CreateTextButton( L"DELETE", (UINT16)SMALLCOMPFONT, FONT_DKBLUE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[18], (UINT16)SMALLCOMPFONT, FONT_DKBLUE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 600, 2 * iScreenHeightOffset + 362, 40, 20, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsDeleteCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_DELETE ], L"Delete currently selected merc (DEL).");
+ SetButtonFastHelpText( iEditorButton[ MERCS_DELETE ], iEditorMercsToolbarText[19]);
iEditorButton[ MERCS_NEXT ] =
- CreateTextButton( L"NEXT", (UINT16)SMALLCOMPFONT, FONT_DKBLUE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[20], (UINT16)SMALLCOMPFONT, FONT_DKBLUE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 600, 2 * iScreenHeightOffset + 382, 40, 20, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsNextCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_NEXT ], L"Find next merc (SPACE).");
+ SetButtonFastHelpText( iEditorButton[ MERCS_NEXT ], iEditorMercsToolbarText[21]);
//Priority Existance
iEditorButton[ MERCS_PRIORITYEXISTANCE_CHECKBOX ] =
CreateCheckBoxButton( iScreenWidthOffset + 170, 2 * iScreenHeightOffset + 365, "EDITOR//checkbox.sti", MSYS_PRIORITY_NORMAL, MercsPriorityExistanceCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_PRIORITYEXISTANCE_CHECKBOX ], L"Toggle priority existance" );
+ SetButtonFastHelpText( iEditorButton[ MERCS_PRIORITYEXISTANCE_CHECKBOX ], iEditorMercsToolbarText[22] );
//If merc has keys
iEditorButton[ MERCS_HASKEYS_CHECKBOX ] =
CreateCheckBoxButton( iScreenWidthOffset + 170, 2 * iScreenHeightOffset + 390, "EDITOR//checkbox.sti", MSYS_PRIORITY_NORMAL, MercsHasKeysCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_HASKEYS_CHECKBOX ], L"Toggle whether or not placement has/naccess to all doors." );
+ SetButtonFastHelpText( iEditorButton[ MERCS_HASKEYS_CHECKBOX ], iEditorMercsToolbarText[23] );
//Orders
iEditorButton[ MERCS_ORDERS_STATIONARY ] =
- CreateTextButton( L"STATIONARY", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[24], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 368, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_ONGUARD] =
- CreateTextButton( L"ON GUARD", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[25], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 380, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_ONCALL ] =
- CreateTextButton( L"ON CALL", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[26], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 392, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_SEEKENEMY ] =
- CreateTextButton( L"SEEK ENEMY", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[27], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 404, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_CLOSEPATROL ] =
- CreateTextButton( L"CLOSE PATROL", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[28], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 368, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_FARPATROL ] =
- CreateTextButton( L"FAR PATROL", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[29], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 380, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_POINTPATROL ] =
- CreateTextButton( L"POINT PATROL", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[30], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 392, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
iEditorButton[ MERCS_ORDERS_RNDPTPATROL ] =
- CreateTextButton( L"RND PT PATROL", (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[31], (UINT16)SMALLCOMPFONT, FONT_GRAY2, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 404, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetOrdersCallback );
for ( x = 0; x < 8; x++ )
@@ -202,27 +203,27 @@ void InitEditorMercsToolbar()
//Attitudes
iEditorButton[ MERCS_ATTITUDE_DEFENSIVE ] =
- CreateTextButton( L"DEFENSIVE", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[32], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 424, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
iEditorButton[ MERCS_ATTITUDE_BRAVESOLO ] =
- CreateTextButton( L"BRAVE SOLO", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[33], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 436, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
iEditorButton[ MERCS_ATTITUDE_BRAVEAID ] =
- CreateTextButton( L"BRAVE AID", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[34], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 200, 2 * iScreenHeightOffset + 448, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
iEditorButton[ MERCS_ATTITUDE_AGGRESSIVE ] =
- CreateTextButton( L"AGGRESSIVE", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[35], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 424, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
iEditorButton[ MERCS_ATTITUDE_CUNNINGSOLO ] =
- CreateTextButton( L"CUNNING SOLO", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[36], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 436, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
iEditorButton[ MERCS_ATTITUDE_CUNNINGAID ] =
- CreateTextButton( L"CUNNING AID", (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[37], (UINT16)SMALLCOMPFONT, FONT_GRAY4, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 270, 2 * iScreenHeightOffset + 448, 70, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK,
MercsSetAttitudeCallback );
for ( x = 0; x < 6; x++ )
@@ -256,34 +257,34 @@ void InitEditorMercsToolbar()
iScreenWidthOffset + 360, 2 * iScreenHeightOffset + 395, 30, 30, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, MercsDirectionSetCallback );
for ( x = 0; x < 8; x++ )
{
- swprintf( TempString, L"Set merc to face %s", FaceDirs[x] );
+ swprintf( TempString, iEditorMercsToolbarText[38], FaceDirs[x] );
SetButtonFastHelpText( iEditorButton[ FIRST_MERCS_DIRECTION_BUTTON + x ], TempString );
MSYS_SetBtnUserData( iEditorButton[ FIRST_MERCS_DIRECTION_BUTTON + x ], 0, x);
}
iEditorButton[ MERCS_DIRECTION_FIND ] =
- CreateTextButton( L"Find", (INT16)FONT12POINT1, FONT_MCOLOR_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[39], (INT16)FONT12POINT1, FONT_MCOLOR_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 390, 2 * iScreenHeightOffset + 395, 30, 30, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, MercsFindSelectedMercCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_DIRECTION_FIND] , L"Find selected merc" );
+ SetButtonFastHelpText( iEditorButton[ MERCS_DIRECTION_FIND] , iEditorMercsToolbarText[63] );
iEditorButton[ MERCS_EQUIPMENT_BAD ] =
- CreateTextButton( L"BAD", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[40], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 385, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeEquipmentCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_EQUIPMENT_BAD ], FONT_LTRED, FONT_BLACK );
iEditorButton[ MERCS_EQUIPMENT_POOR ] =
- CreateTextButton( L"POOR", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[41], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 400, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeEquipmentCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_EQUIPMENT_POOR ], FONT_ORANGE, FONT_BLACK );
iEditorButton[ MERCS_EQUIPMENT_AVERAGE ] =
- CreateTextButton( L"AVERAGE", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[42], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 415, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeEquipmentCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_EQUIPMENT_AVERAGE ], FONT_YELLOW, FONT_BLACK );
iEditorButton[ MERCS_EQUIPMENT_GOOD ] =
- CreateTextButton( L"GOOD", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[43], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 430, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeEquipmentCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_EQUIPMENT_GOOD ], FONT_LTGREEN, FONT_BLACK );
iEditorButton[ MERCS_EQUIPMENT_GREAT ] =
- CreateTextButton( L"GREAT", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[44], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 445, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeEquipmentCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_EQUIPMENT_GREAT ], FONT_LTBLUE, FONT_BLACK );
for ( x = 0; x < 5; x++ )
@@ -292,23 +293,23 @@ void InitEditorMercsToolbar()
}
iEditorButton[ MERCS_ATTRIBUTES_BAD ] =
- CreateTextButton( L"BAD", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[45], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 385, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeAttributesCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_ATTRIBUTES_BAD ], FONT_LTRED, FONT_BLACK );
iEditorButton[ MERCS_ATTRIBUTES_POOR ] =
- CreateTextButton( L"POOR", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[46], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 400, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeAttributesCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_ATTRIBUTES_POOR ], FONT_ORANGE, FONT_BLACK );
iEditorButton[ MERCS_ATTRIBUTES_AVERAGE ] =
- CreateTextButton( L"AVERAGE", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[47], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 415, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeAttributesCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_ATTRIBUTES_AVERAGE ], FONT_YELLOW, FONT_BLACK );
iEditorButton[ MERCS_ATTRIBUTES_GOOD ] =
- CreateTextButton( L"GOOD", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[48], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 430, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeAttributesCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_ATTRIBUTES_GOOD ], FONT_LTGREEN, FONT_BLACK );
iEditorButton[ MERCS_ATTRIBUTES_GREAT ] =
- CreateTextButton( L"GREAT", (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[49], (INT16)SMALLCOMPFONT, FONT_GRAY1, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 445, 40, 15, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsSetRelativeAttributesCallback );
SpecifyButtonDownTextColors( iEditorButton[ MERCS_ATTRIBUTES_GREAT ], FONT_LTBLUE, FONT_BLACK );
for( x = 0; x < 5; x++ )
@@ -348,43 +349,43 @@ void InitEditorMercsToolbar()
CreateEasyNoToggleButton( iScreenWidthOffset + 360,2 * iScreenHeightOffset +436,"EDITOR//rightarrow.sti", MercsSetColorsCallback );
for ( x = FIRST_MERCS_COLOR_BUTTON; x < LAST_MERCS_COLOR_BUTTON; x+=2 )
{
- SetButtonFastHelpText( iEditorButton[x], L"Previous color set" );
- SetButtonFastHelpText( iEditorButton[x + 1], L"Next color set" );
+ SetButtonFastHelpText( iEditorButton[x], iEditorMercsToolbarText[50] );
+ SetButtonFastHelpText( iEditorButton[x + 1], iEditorMercsToolbarText[51] );
DisableButton( iEditorButton[ x ] );
DisableButton( iEditorButton[ x + 1 ] );
}
iEditorButton[MERCS_BODYTYPE_DOWN] =
CreateEasyNoToggleButton( iScreenWidthOffset + 460, 2 * iScreenHeightOffset +364,"EDITOR//leftarrow.sti", MercsSetBodyTypeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_BODYTYPE_DOWN ], L"Previous body type");
+ SetButtonFastHelpText( iEditorButton[ MERCS_BODYTYPE_DOWN ], iEditorMercsToolbarText[52]);
iEditorButton[MERCS_BODYTYPE_UP] =
CreateEasyNoToggleButton( iScreenWidthOffset + 560, 2 * iScreenHeightOffset +364,"EDITOR//rightarrow.sti", MercsSetBodyTypeCallback );
- SetButtonFastHelpText( iEditorButton[ MERCS_BODYTYPE_UP ], L"Next body type");
+ SetButtonFastHelpText( iEditorButton[ MERCS_BODYTYPE_UP ], iEditorMercsToolbarText[53]);
iEditorButton[ MERCS_SCHEDULE_VARIANCE1 ] =
CreateCheckBoxButton( iScreenWidthOffset + 309, 2 * iScreenHeightOffset +375, "EDITOR//SmCheckBox.sti", MSYS_PRIORITY_NORMAL, MercsScheduleToggleVariance1Callback );
- SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE1 ], L"Toggle time variance (+ or - 15 minutes)");
+ SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE1 ], iEditorMercsToolbarText[54]);
iEditorButton[ MERCS_SCHEDULE_VARIANCE2 ] =
CreateCheckBoxButton( iScreenWidthOffset + 309, 2 * iScreenHeightOffset +396, "EDITOR//SmCheckBox.sti", MSYS_PRIORITY_NORMAL, MercsScheduleToggleVariance2Callback );
- SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE2 ], L"Toggle time variance (+ or - 15 minutes)");
+ SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE2 ], iEditorMercsToolbarText[55]);
iEditorButton[ MERCS_SCHEDULE_VARIANCE3 ] =
CreateCheckBoxButton( iScreenWidthOffset + 309, 2 * iScreenHeightOffset +417, "EDITOR//SmCheckBox.sti", MSYS_PRIORITY_NORMAL, MercsScheduleToggleVariance3Callback );
- SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE3 ], L"Toggle time variance (+ or - 15 minutes)");
+ SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE3 ], iEditorMercsToolbarText[56]);
iEditorButton[ MERCS_SCHEDULE_VARIANCE4 ] =
CreateCheckBoxButton( iScreenWidthOffset + 309, 2 * iScreenHeightOffset +438, "EDITOR//SmCheckBox.sti", MSYS_PRIORITY_NORMAL, MercsScheduleToggleVariance4Callback );
- SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE4 ], L"Toggle time variance (+ or - 15 minutes)");
+ SetButtonFastHelpText( iEditorButton[ MERCS_SCHEDULE_VARIANCE4 ], iEditorMercsToolbarText[57]);
iEditorButton[ MERCS_SCHEDULE_ACTION1 ] =
- CreateTextButton( L"No action", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[58], FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 373, 77, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleAction1Callback );
iEditorButton[ MERCS_SCHEDULE_ACTION2 ] =
- CreateTextButton( L"No action", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[59], FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 394, 77, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleAction2Callback );
iEditorButton[ MERCS_SCHEDULE_ACTION3 ] =
- CreateTextButton( L"No action", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[60], FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 415, 77, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleAction3Callback );
iEditorButton[ MERCS_SCHEDULE_ACTION4 ] =
- CreateTextButton( L"No action", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[61], FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 436, 77, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleAction4Callback );
iEditorButton[ MERCS_SCHEDULE_DATA1A ] =
@@ -412,7 +413,7 @@ void InitEditorMercsToolbar()
CreateTextButton( L"", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 381, 2 * iScreenHeightOffset + 436, 40, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleData4BCallback );
iEditorButton[ MERCS_SCHEDULE_CLEAR ] =
- CreateTextButton( L"Clear Schedule", FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( iEditorMercsToolbarText[62], FONT10ARIAL, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 516, 2 * iScreenHeightOffset + 362, 77, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, MercsScheduleClearCallback );
HideEditorButtons( MERCS_SCHEDULE_DATA1A, MERCS_SCHEDULE_DATA4B );
@@ -448,143 +449,143 @@ void InitEditorMercsToolbar()
void InitEditorBuildingsToolbar()
{
iEditorButton[BUILDING_TOGGLE_ROOF_VIEW] =
- CreateTextButton(L"ROOFS",(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorBuildingsToolbarText[0],(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 110, 2 * iScreenHeightOffset + 400, 50, 15, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,BUTTON_NO_CALLBACK,
BuildingToggleRoofViewCallback);
iEditorButton[BUILDING_TOGGLE_WALL_VIEW] =
- CreateTextButton(L"WALLS",(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorBuildingsToolbarText[1],(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 110, 2 * iScreenHeightOffset + 415, 50, 15, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,BUTTON_NO_CALLBACK,
BuildingToggleWallViewCallback);
iEditorButton[BUILDING_TOGGLE_INFO_VIEW] =
- CreateTextButton(L"ROOM INFO",(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorBuildingsToolbarText[2],(UINT16)SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 110, 2 * iScreenHeightOffset + 430, 50, 15, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,BUTTON_NO_CALLBACK,
BuildingToggleInfoViewCallback);
//Selection method buttons
iEditorButton[BUILDING_PLACE_WALLS] =
CreateEasyToggleButton( iScreenWidthOffset + 180,2 * iScreenHeightOffset + 370,"EDITOR//wall.sti", BuildingWallCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_WALLS],L"Place walls using selection method");//dnl fix for to many tooltip message in place walls
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_WALLS],iEditorBuildingsToolbarText[3]);//dnl fix for to many tooltip message in place walls
iEditorButton[BUILDING_PLACE_DOORS] =
CreateEasyToggleButton( iScreenWidthOffset + 210,2 * iScreenHeightOffset + 370,"EDITOR//door.sti", BuildingDoorCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_DOORS],L"Place doors using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_DOORS],iEditorBuildingsToolbarText[4]);
iEditorButton[BUILDING_PLACE_ROOFS] =
CreateEasyToggleButton( iScreenWidthOffset + 240,2 * iScreenHeightOffset + 370,"EDITOR//roof.sti", BuildingRoofCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_ROOFS],L"Place roofs using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_ROOFS],iEditorBuildingsToolbarText[5]);
iEditorButton[BUILDING_PLACE_WINDOWS] =
CreateEasyToggleButton( iScreenWidthOffset + 180,2 * iScreenHeightOffset + 400,"EDITOR//window.sti", BuildingWindowCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_WINDOWS],L"Place windows using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_WINDOWS],iEditorBuildingsToolbarText[6]);
iEditorButton[BUILDING_PLACE_BROKEN_WALLS] =
CreateEasyToggleButton( iScreenWidthOffset + 210, 2 * iScreenHeightOffset + 400,"EDITOR//crackwall.sti", BuildingCrackWallCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_BROKEN_WALLS],L"Place damaged walls using selection method.");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_BROKEN_WALLS],iEditorBuildingsToolbarText[7]);
iEditorButton[BUILDING_PLACE_FURNITURE] =
CreateEasyToggleButton( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 400,"EDITOR//decor.sti", BuildingFurnitureCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_FURNITURE],L"Place furniture using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_FURNITURE],iEditorBuildingsToolbarText[8]);
iEditorButton[BUILDING_PLACE_DECALS] =
CreateEasyToggleButton( iScreenWidthOffset + 180, 2 * iScreenHeightOffset + 430,"EDITOR//decal.sti", BuildingDecalCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_DECALS],L"Place wall decals using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_DECALS],iEditorBuildingsToolbarText[9]);
iEditorButton[BUILDING_PLACE_FLOORS] =
CreateEasyToggleButton( iScreenWidthOffset + 210, 2 * iScreenHeightOffset + 430,"EDITOR//floor.sti", BuildingFloorCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_FLOORS],L"Place floors using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_FLOORS],iEditorBuildingsToolbarText[10]);
iEditorButton[BUILDING_PLACE_TOILETS] =
CreateEasyToggleButton( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 430,"EDITOR//toilet.sti", BuildingToiletCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_TOILETS],L"Place generic furniture using selection method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_PLACE_TOILETS],iEditorBuildingsToolbarText[11]);
//Smart method buttons
iEditorButton[BUILDING_SMART_WALLS] =
CreateEasyToggleButton( iScreenWidthOffset + 290, 2 * iScreenHeightOffset + 370,"EDITOR//wall.sti", BuildingSmartWallCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_SMART_WALLS],L"Place walls using smart method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_SMART_WALLS],iEditorBuildingsToolbarText[12]);
iEditorButton[BUILDING_SMART_DOORS] =
CreateEasyToggleButton( iScreenWidthOffset + 320, 2 * iScreenHeightOffset + 370,"EDITOR//door.sti", BuildingSmartDoorCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_SMART_DOORS],L"Place doors using smart method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_SMART_DOORS],iEditorBuildingsToolbarText[13]);
iEditorButton[BUILDING_SMART_WINDOWS] =
CreateEasyToggleButton( iScreenWidthOffset + 290, 2 * iScreenHeightOffset + 400,"EDITOR//window.sti", BuildingSmartWindowCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_SMART_WINDOWS],L"Place windows using smart method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_SMART_WINDOWS],iEditorBuildingsToolbarText[14]);
iEditorButton[BUILDING_SMART_BROKEN_WALLS] =
CreateEasyToggleButton( iScreenWidthOffset + 320, 2 * iScreenHeightOffset + 400,"EDITOR//crackwall.sti", BuildingSmartCrackWallCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_SMART_BROKEN_WALLS],L"Place damaged walls using smart method");
+ SetButtonFastHelpText(iEditorButton[BUILDING_SMART_BROKEN_WALLS],iEditorBuildingsToolbarText[15]);
iEditorButton[BUILDING_DOORKEY] =
CreateEasyToggleButton( iScreenWidthOffset + 290, 2 * iScreenHeightOffset + 430,"EDITOR//key.sti", BuildingDoorKeyCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_DOORKEY], L"Lock or trap existing doors" );
+ SetButtonFastHelpText(iEditorButton[BUILDING_DOORKEY], iEditorBuildingsToolbarText[16] );
iEditorButton[BUILDING_NEW_ROOM] =
CreateEasyToggleButton( iScreenWidthOffset + 370, 2 * iScreenHeightOffset + 370,"EDITOR//newroom.sti", BuildingNewRoomCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_NEW_ROOM],L"Add a new room");
+ SetButtonFastHelpText(iEditorButton[BUILDING_NEW_ROOM],iEditorBuildingsToolbarText[17]);
iEditorButton[BUILDING_CAVE_DRAWING] =
CreateEasyToggleButton( iScreenWidthOffset + 370, 2 * iScreenHeightOffset + 370,"EDITOR//caves.sti", BuildingCaveDrawingCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_CAVE_DRAWING],L"Edit cave walls.");
+ SetButtonFastHelpText(iEditorButton[BUILDING_CAVE_DRAWING],iEditorBuildingsToolbarText[18]);
iEditorButton[BUILDING_SAW_ROOM] =
CreateEasyToggleButton( iScreenWidthOffset + 370, 2 * iScreenHeightOffset + 400,"EDITOR//sawroom.sti", BuildingSawRoomCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_SAW_ROOM],L"Remove an area from existing building.");
+ SetButtonFastHelpText(iEditorButton[BUILDING_SAW_ROOM],iEditorBuildingsToolbarText[19]);
iEditorButton[BUILDING_KILL_BUILDING] =
CreateEasyToggleButton( iScreenWidthOffset + 370, 2 * iScreenHeightOffset + 430,"EDITOR//delroom.sti", BuildingKillBuildingCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_KILL_BUILDING],L"Remove a building");
+ SetButtonFastHelpText(iEditorButton[BUILDING_KILL_BUILDING],iEditorBuildingsToolbarText[20]);
iEditorButton[BUILDING_NEW_ROOF] =
CreateEasyToggleButton( iScreenWidthOffset + 400, 2 * iScreenHeightOffset + 430,"EDITOR//newroof.sti", BuildingNewRoofCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_NEW_ROOF],L"Add/replace building's roof with new flat roof.");
+ SetButtonFastHelpText(iEditorButton[BUILDING_NEW_ROOF],iEditorBuildingsToolbarText[21]);
iEditorButton[BUILDING_COPY_BUILDING] =
CreateEasyToggleButton( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 430,"EDITOR//copyroom.sti", BuildingCopyBuildingCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_COPY_BUILDING],L"Copy a building");
+ SetButtonFastHelpText(iEditorButton[BUILDING_COPY_BUILDING],iEditorBuildingsToolbarText[22]);
iEditorButton[BUILDING_MOVE_BUILDING] =
CreateEasyToggleButton( iScreenWidthOffset + 460, 2 * iScreenHeightOffset + 430,"EDITOR//moveroom.sti", BuildingMoveBuildingCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_MOVE_BUILDING],L"Move a building");
+ SetButtonFastHelpText(iEditorButton[BUILDING_MOVE_BUILDING],iEditorBuildingsToolbarText[23]);
iEditorButton[BUILDING_DRAW_ROOMNUM] =
CreateEasyToggleButton( iScreenWidthOffset + 410, 2 * iScreenHeightOffset + 370,"EDITOR//addTileRoom.sti", BuildingDrawRoomNumCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_DRAW_ROOMNUM],L"Draw room number");
+ SetButtonFastHelpText(iEditorButton[BUILDING_DRAW_ROOMNUM],iEditorBuildingsToolbarText[24]);
iEditorButton[BUILDING_ERASE_ROOMNUM] =
CreateEasyToggleButton( iScreenWidthOffset + 440, 2 * iScreenHeightOffset + 370,"EDITOR//killTileRoom.sti", BuildingEraseRoomNumCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_ERASE_ROOMNUM],L"Erase room numbers");
+ SetButtonFastHelpText(iEditorButton[BUILDING_ERASE_ROOMNUM],iEditorBuildingsToolbarText[25]);
iEditorButton[BUILDING_TOGGLE_ERASEMODE] =
CreateEasyToggleButton( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400,"EDITOR//eraser.sti", BtnEraseCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_TOGGLE_ERASEMODE],L"Toggle erase mode");
+ SetButtonFastHelpText(iEditorButton[BUILDING_TOGGLE_ERASEMODE],iEditorBuildingsToolbarText[26]);
iEditorButton[BUILDING_UNDO] =
CreateEasyNoToggleButton( iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 400,"EDITOR//undo.sti", BtnUndoCallback);
- SetButtonFastHelpText(iEditorButton[BUILDING_UNDO],L"Undo last change");
+ SetButtonFastHelpText(iEditorButton[BUILDING_UNDO],iEditorBuildingsToolbarText[27]);
iEditorButton[BUILDING_CYCLE_BRUSHSIZE] =
CreateEasyNoToggleButton( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 430,"EDITOR//paint.sti",BtnBrushCallback);
- SetButtonFastHelpText( iEditorButton[ BUILDING_CYCLE_BRUSHSIZE ], L"Cycle brush size");
+ SetButtonFastHelpText( iEditorButton[ BUILDING_CYCLE_BRUSHSIZE ], iEditorBuildingsToolbarText[28]);
}
void InitEditorItemsToolbar()
{
SetFontForeground( FONT_MCOLOR_LTRED );
iEditorButton[ITEMS_WEAPONS] =
- CreateTextButton(L"Weapons",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[0],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 100, 2 * iScreenHeightOffset + 440, 59, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsWeaponsCallback);
iEditorButton[ITEMS_AMMO] =
- CreateTextButton(L"Ammo",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[1],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 159, 2 * iScreenHeightOffset + 440, 40, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsAmmoCallback);
iEditorButton[ITEMS_ARMOUR] =
- CreateTextButton(L"Armour",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[2],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 199, 2 * iScreenHeightOffset + 440, 52, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsArmourCallback);
iEditorButton[ITEMS_LBEGEAR] =
- CreateTextButton(L"LBE",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[3],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 251, 2 * iScreenHeightOffset + 440, 30, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsLBECallback);
iEditorButton[ITEMS_EXPLOSIVES] =
- CreateTextButton(L"Exp",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[4],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 281, 2 * iScreenHeightOffset + 440, 39, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsExplosivesCallback);
iEditorButton[ITEMS_EQUIPMENT1] =
- CreateTextButton(L"E1",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[5],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 320, 2 * iScreenHeightOffset + 440, 21, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsEquipment1Callback);
iEditorButton[ITEMS_EQUIPMENT2] =
- CreateTextButton(L"E2",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[6],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 341, 2 * iScreenHeightOffset + 440, 21, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsEquipment2Callback);
iEditorButton[ITEMS_EQUIPMENT3] =
- CreateTextButton(L"E3",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[7],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 362, 2 * iScreenHeightOffset + 440, 21, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsEquipment3Callback);
iEditorButton[ITEMS_TRIGGERS] =
- CreateTextButton( L"Triggers",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[8],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 383, 2 * iScreenHeightOffset + 440, 59, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsTriggersCallback );
iEditorButton[ITEMS_KEYS] =
- CreateTextButton( L"Keys",(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorItemsToolbarText[9],(UINT16)BLOCKFONT, FONT_MCOLOR_DKWHITE, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 442, 2 * iScreenHeightOffset + 440, 38, 20, BUTTON_TOGGLE,MSYS_PRIORITY_NORMAL,DEFAULT_MOVE_CALLBACK,
ItemsKeysCallback );
@@ -599,7 +600,7 @@ void InitEditorMapInfoToolbar()
{
iEditorButton[MAPINFO_ADD_LIGHT1_SOURCE] =
CreateEasyToggleButton( iScreenWidthOffset + 10, SCREEN_HEIGHT - 118, "EDITOR//light.sti", BtnDrawLightsCallback );
- SetButtonFastHelpText(iEditorButton[MAPINFO_ADD_LIGHT1_SOURCE],L"Add ambient light source");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_ADD_LIGHT1_SOURCE],iEditorMapInfoToolbarText[0]);
iEditorButton[ MAPINFO_LIGHT_PANEL ] =
CreateTextButton( 0, 0, 0, 0, BUTTON_USE_DEFAULT, iScreenWidthOffset + 45, SCREEN_HEIGHT - 118, 60, 50, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, BUTTON_NO_CALLBACK, BUTTON_NO_CALLBACK );
@@ -615,7 +616,7 @@ void InitEditorMapInfoToolbar()
iEditorButton[MAPINFO_TOGGLE_FAKE_LIGHTS] =
CreateEasyToggleButton( iScreenWidthOffset + 120, SCREEN_HEIGHT - 118, "EDITOR//fakelight.sti", BtnFakeLightCallback );
- SetButtonFastHelpText(iEditorButton[MAPINFO_TOGGLE_FAKE_LIGHTS], L"Toggle fake ambient lights.");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_TOGGLE_FAKE_LIGHTS], iEditorMapInfoToolbarText[1]);
iEditorButton[ MAPINFO_RADIO_PANEL ] =
CreateTextButton( 0, 0, 0, 0, BUTTON_USE_DEFAULT, iScreenWidthOffset + 207, SCREEN_HEIGHT - 118, 70, 50, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, BUTTON_NO_CALLBACK, BUTTON_NO_CALLBACK );
@@ -630,176 +631,181 @@ void InitEditorMapInfoToolbar()
iEditorButton[MAPINFO_DRAW_EXITGRIDS] =
CreateEasyToggleButton( iScreenWidthOffset + 305, SCREEN_HEIGHT - 108, "EDITOR//exitgridbut.sti", MapInfoDrawExitGridCallback );
- SetButtonFastHelpText(iEditorButton[MAPINFO_DRAW_EXITGRIDS],L"Add exit grids (r-clk to query existing).");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_DRAW_EXITGRIDS],iEditorMapInfoToolbarText[2]);
iEditorButton[MAPINFO_CYCLE_BRUSHSIZE] =
CreateEasyNoToggleButton( iScreenWidthOffset + 420, SCREEN_HEIGHT - 50, "EDITOR//paint.sti", BtnBrushCallback );
- SetButtonFastHelpText(iEditorButton[MAPINFO_CYCLE_BRUSHSIZE],L"Cycle brush size");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_CYCLE_BRUSHSIZE],iEditorMapInfoToolbarText[3]);
iEditorButton[MAPINFO_UNDO] =
CreateEasyNoToggleButton( iScreenWidthOffset + 510, SCREEN_HEIGHT - 50, "EDITOR//undo.sti", BtnUndoCallback );
- SetButtonFastHelpText(iEditorButton[MAPINFO_UNDO],L"Undo last change");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_UNDO],iEditorMapInfoToolbarText[4]);
iEditorButton[MAPINFO_TOGGLE_ERASEMODE] =
CreateEasyToggleButton( iScreenWidthOffset + 540, SCREEN_HEIGHT - 50, "EDITOR//eraser.sti", BtnEraseCallback);
- SetButtonFastHelpText(iEditorButton[MAPINFO_TOGGLE_ERASEMODE],L"Toggle erase mode");
+ SetButtonFastHelpText(iEditorButton[MAPINFO_TOGGLE_ERASEMODE],iEditorMapInfoToolbarText[5]);
iEditorButton[ MAPINFO_NORTH_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 540, SCREEN_HEIGHT - 115, "EDITOR//north.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_NORTH_POINT ], L"Specify north point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_NORTH_POINT ], iEditorMapInfoToolbarText[6]);
iEditorButton[ MAPINFO_WEST_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 525, SCREEN_HEIGHT - 94, "EDITOR//west.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_WEST_POINT ], L"Specify west point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_WEST_POINT ], iEditorMapInfoToolbarText[7]);
iEditorButton[ MAPINFO_EAST_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 555, SCREEN_HEIGHT - 94, "EDITOR//east.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_EAST_POINT ], L"Specify east point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_EAST_POINT ], iEditorMapInfoToolbarText[8]);
iEditorButton[ MAPINFO_SOUTH_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 540, SCREEN_HEIGHT - 73, "EDITOR//south.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_SOUTH_POINT ], L"Specify south point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_SOUTH_POINT ], iEditorMapInfoToolbarText[9]);
iEditorButton[ MAPINFO_CENTER_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 590, SCREEN_HEIGHT - 105, "EDITOR//center.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_CENTER_POINT ], L"Specify center point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_CENTER_POINT ], iEditorMapInfoToolbarText[10]);
iEditorButton[ MAPINFO_ISOLATED_POINT ] =
CreateEasyToggleButton( iScreenWidthOffset + 590, SCREEN_HEIGHT - 84, "EDITOR//isolated.sti", MapInfoEntryPointsCallback);
- SetButtonFastHelpText( iEditorButton[ MAPINFO_ISOLATED_POINT ], L"Specify isolated point for validation purposes.");
+ SetButtonFastHelpText( iEditorButton[ MAPINFO_ISOLATED_POINT ], iEditorMapInfoToolbarText[11]);
}
void InitEditorOptionsToolbar()
{
iEditorButton[OPTIONS_NEW_MAP] =
CreateEasyNoToggleButton( iScreenWidthOffset + 71,SCREEN_HEIGHT - 79,"EDITOR//new.sti", BtnNewMapCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_MAP],L"New map");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_MAP],iEditorOptionsToolbarText[0]);
iEditorButton[OPTIONS_NEW_BASEMENT] =
CreateEasyNoToggleButton( iScreenWidthOffset + 101,SCREEN_HEIGHT - 79,"EDITOR//new.sti", BtnNewBasementCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_BASEMENT],L"New basement");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_BASEMENT],iEditorOptionsToolbarText[1]);
iEditorButton[OPTIONS_NEW_CAVES] =
CreateEasyNoToggleButton( iScreenWidthOffset + 131,SCREEN_HEIGHT - 79,"EDITOR//new.sti", BtnNewCavesCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_CAVES],L"New cave level");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_NEW_CAVES],iEditorOptionsToolbarText[2]);
iEditorButton[OPTIONS_SAVE_MAP] =
CreateEasyNoToggleButton( iScreenWidthOffset + 161,SCREEN_HEIGHT - 79,"EDITOR//save.sti", BtnSaveCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_SAVE_MAP],L"Save map");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_SAVE_MAP],iEditorOptionsToolbarText[3]);
iEditorButton[OPTIONS_LOAD_MAP] =
CreateEasyNoToggleButton( iScreenWidthOffset + 191,SCREEN_HEIGHT - 79,"EDITOR//load.sti", BtnLoadCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_LOAD_MAP],L"Load map");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_LOAD_MAP],iEditorOptionsToolbarText[4]);
iEditorButton[OPTIONS_CHANGE_TILESET] =
CreateEasyNoToggleButton( iScreenWidthOffset + 221,SCREEN_HEIGHT - 79,"EDITOR//tileset.sti", BtnChangeTilesetCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_CHANGE_TILESET],L"Select tileset");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_CHANGE_TILESET],iEditorOptionsToolbarText[5]);
iEditorButton[OPTIONS_LEAVE_EDITOR] =
CreateEasyNoToggleButton( iScreenWidthOffset + 251,SCREEN_HEIGHT - 79,"EDITOR//cancel.sti", BtnCancelCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_LEAVE_EDITOR],L"Leave Editor mode");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_LEAVE_EDITOR],iEditorOptionsToolbarText[6]);
iEditorButton[OPTIONS_QUIT_GAME] =
CreateEasyNoToggleButton( iScreenWidthOffset + 281,SCREEN_HEIGHT - 79,"EDITOR//cancel.sti", BtnQuitCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_QUIT_GAME],L"Exit game.");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_QUIT_GAME],iEditorOptionsToolbarText[7]);
//dnl ch9 071009
iEditorButton[OPTIONS_RADAR_MAP] =
CreateEasyNoToggleButton( iScreenWidthOffset + 311,SCREEN_HEIGHT - 79,"EDITOR//tileset.sti", BtnRadarMapCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_RADAR_MAP],L"Create radar map");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_RADAR_MAP],iEditorOptionsToolbarText[8]);
//dnl ch33 160909
iEditorButton[OPTIONS_VANILLA_MODE] =
CreateCheckBoxButton(iScreenWidthOffset+71, SCREEN_HEIGHT-119, "EDITOR//smcheckbox.sti", MSYS_PRIORITY_NORMAL, VanillaModeCallback);
- SetButtonFastHelpText(iEditorButton[OPTIONS_VANILLA_MODE],L"When checked, the map will be saved in original JA2 format (Version: 5.00 / 25)");
+ SetButtonFastHelpText(iEditorButton[OPTIONS_VANILLA_MODE],iEditorOptionsToolbarText[9]);
+
+ // TODO.MAP
+ iEditorButton[OPTIONS_RESIZE_MAP_ON_LOADING] =
+ CreateCheckBoxButton(iScreenWidthOffset+5, SCREEN_HEIGHT-42, "EDITOR//smcheckbox.sti", MSYS_PRIORITY_NORMAL, ResizeMapOnLoadingCallback);
+ SetButtonFastHelpText(iEditorButton[OPTIONS_RESIZE_MAP_ON_LOADING],iEditorOptionsToolbarText[10]);
}
void InitEditorTerrainToolbar()
{
iEditorButton[TERRAIN_FGROUND_TEXTURES] =
CreateEasyToggleButton( iScreenWidthOffset + 100,SCREEN_HEIGHT - 80,"EDITOR//downgrid.sti", BtnFgGrndCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_FGROUND_TEXTURES],L"Draw ground textures");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_FGROUND_TEXTURES],iEditorTerrainToolbarText[0]);
iEditorButton[TERRAIN_BGROUND_TEXTURES] =
CreateEasyToggleButton( iScreenWidthOffset + 130,SCREEN_HEIGHT - 80,"EDITOR//upgrid.sti", BtnBkGrndCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_BGROUND_TEXTURES],L"Set map ground textures");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_BGROUND_TEXTURES],iEditorTerrainToolbarText[1]);
iEditorButton[TERRAIN_PLACE_CLIFFS] =
CreateEasyToggleButton( iScreenWidthOffset + 160,SCREEN_HEIGHT - 80,"EDITOR//banks.sti", BtnBanksCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_CLIFFS],L"Place banks and cliffs");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_CLIFFS],iEditorTerrainToolbarText[2]);
iEditorButton[TERRAIN_PLACE_ROADS] =
CreateEasyToggleButton( iScreenWidthOffset + 190,SCREEN_HEIGHT - 80,"EDITOR//road.sti", BtnRoadsCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_ROADS],L"Draw roads");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_ROADS],iEditorTerrainToolbarText[3]);
iEditorButton[TERRAIN_PLACE_DEBRIS] =
CreateEasyToggleButton( iScreenWidthOffset + 220,SCREEN_HEIGHT - 80,"EDITOR//debris.sti", BtnDebrisCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_DEBRIS],L"Draw debris");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_DEBRIS],iEditorTerrainToolbarText[4]);
iEditorButton[TERRAIN_PLACE_TREES] =
CreateEasyToggleButton( iScreenWidthOffset + 250,SCREEN_HEIGHT - 80,"EDITOR//tree.sti", BtnObjectCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_TREES],L"Place trees & bushes");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_TREES],iEditorTerrainToolbarText[5]);
iEditorButton[TERRAIN_PLACE_ROCKS] =
CreateEasyToggleButton( iScreenWidthOffset + 280,SCREEN_HEIGHT - 80,"EDITOR//num1.sti", BtnObject1Callback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_ROCKS],L"Place rocks");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_ROCKS],iEditorTerrainToolbarText[6]);
iEditorButton[TERRAIN_PLACE_MISC] =
CreateEasyToggleButton( iScreenWidthOffset + 310,SCREEN_HEIGHT - 80,"EDITOR//num2.sti", BtnObject2Callback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_MISC],L"Place barrels & other junk");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_PLACE_MISC],iEditorTerrainToolbarText[7]);
iEditorButton[TERRAIN_FILL_AREA] =
CreateEasyToggleButton( iScreenWidthOffset + 100,SCREEN_HEIGHT - 50,"EDITOR//fill.sti", BtnFillCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_FILL_AREA],L"Fill area");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_FILL_AREA],iEditorTerrainToolbarText[8]);
iEditorButton[TERRAIN_UNDO] =
CreateEasyNoToggleButton( iScreenWidthOffset + 130,SCREEN_HEIGHT - 50,"EDITOR//undo.sti", BtnUndoCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_UNDO],L"Undo last change");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_UNDO],iEditorTerrainToolbarText[9]);
iEditorButton[TERRAIN_TOGGLE_ERASEMODE] =
CreateEasyToggleButton( iScreenWidthOffset + 160,SCREEN_HEIGHT - 50,"EDITOR//eraser.sti", BtnEraseCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_TOGGLE_ERASEMODE],L"Toggle erase mode");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_TOGGLE_ERASEMODE],iEditorTerrainToolbarText[10]);
iEditorButton[TERRAIN_CYCLE_BRUSHSIZE] =
CreateEasyNoToggleButton( iScreenWidthOffset + 190,SCREEN_HEIGHT - 50,"EDITOR//paint.sti", BtnBrushCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_CYCLE_BRUSHSIZE],L"Cycle brush size");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_CYCLE_BRUSHSIZE],iEditorTerrainToolbarText[11]);
iEditorButton[TERRAIN_RAISE_DENSITY] =
CreateEasyNoToggleButton( iScreenWidthOffset + 280,SCREEN_HEIGHT - 50,"EDITOR//uparrow.sti", BtnIncBrushDensityCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_RAISE_DENSITY],L"Raise brush density");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_RAISE_DENSITY],iEditorTerrainToolbarText[12]);
iEditorButton[TERRAIN_LOWER_DENSITY] =
CreateEasyNoToggleButton( iScreenWidthOffset + 350,SCREEN_HEIGHT - 50,"EDITOR//downarrow.sti", BtnDecBrushDensityCallback);
- SetButtonFastHelpText(iEditorButton[TERRAIN_LOWER_DENSITY],L"Lower brush density");
+ SetButtonFastHelpText(iEditorButton[TERRAIN_LOWER_DENSITY],iEditorTerrainToolbarText[13]);
}
void CreateEditorTaskbarInternal()
{
//Create the tabs for the editor taskbar
iEditorButton[ TAB_TERRAIN ] =
- CreateTextButton(L"Terrain", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[0], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 100, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskTerrainCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_TERRAIN], FONT_YELLOW, FONT_ORANGE );
iEditorButton[ TAB_BUILDINGS ] =
- CreateTextButton(L"Buildings", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[1], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 190, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskBuildingCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_BUILDINGS], FONT_YELLOW, FONT_ORANGE );
iEditorButton[ TAB_ITEMS ] =
- CreateTextButton(L"Items", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[2], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 280, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskItemsCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_ITEMS], FONT_YELLOW, FONT_ORANGE );
iEditorButton[ TAB_MERCS ] =
- CreateTextButton(L"Mercs", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[3], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 370, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskMercsCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_MERCS], FONT_YELLOW, FONT_ORANGE );
iEditorButton[ TAB_MAPINFO ] =
- CreateTextButton(L"Map Info", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[4], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 460, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskMapInfoCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_MAPINFO], FONT_YELLOW, FONT_ORANGE );
iEditorButton[ TAB_OPTIONS ] =
- CreateTextButton(L"Options", (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
+ CreateTextButton(iEditorTaskbarInternalText[5], (UINT16)SMALLFONT1, FONT_LTKHAKI, FONT_DKKHAKI, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 550, SCREEN_HEIGHT - 20, 90, 20, BUTTON_TOGGLE,MSYS_PRIORITY_HIGH,BUTTON_NO_CALLBACK,
TaskOptionsCallback);
SpecifyButtonDownTextColors( iEditorButton[TAB_OPTIONS], FONT_YELLOW, FONT_ORANGE );
diff --git a/Editor/Editor Taskbar Utils.cpp b/Editor/Editor Taskbar Utils.cpp
index f69d7ac7..1b1b3d01 100644
--- a/Editor/Editor Taskbar Utils.cpp
+++ b/Editor/Editor Taskbar Utils.cpp
@@ -398,8 +398,13 @@ void DoTaskbar(void)
iDrawMode = DRAW_MODE_NOTHING;//dnl ch22 210909
ClickEditorButton( TAB_OPTIONS );
TerrainTileDrawMode = TERRAIN_TILES_NODRAW;
- if(gfVanillaMode)//dnl ch33 160909
+
+ if (gfResizeMapOnLoading)
+ ClickEditorButton(OPTIONS_RESIZE_MAP_ON_LOADING);
+
+ if (gfVanillaMode)
ClickEditorButton(OPTIONS_VANILLA_MODE);
+
SetupTextInputForOptions();
break;
}
@@ -630,7 +635,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= (- 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"North Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[0], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
sGridNo = gMapInformation.sWestGridNo;
@@ -639,7 +644,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= (- 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"West Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[1], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
sGridNo = gMapInformation.sEastGridNo;
@@ -648,7 +653,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= (- 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"East Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[2], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
sGridNo = gMapInformation.sSouthGridNo;
@@ -657,7 +662,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= ( - 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"South Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[3], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
sGridNo = gMapInformation.sCenterGridNo;
@@ -666,7 +671,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= (- 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"Center Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[4], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
sGridNo = gMapInformation.sIsolatedGridNo;
@@ -675,7 +680,7 @@ void RenderMapEntryPointsAndLights()
GetGridNoScreenPos( sGridNo, 0, &sScreenX, &sScreenY );
if( sScreenY >= (- 20) && sScreenY < (2 * iScreenHeightOffset + 340) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, L"Isolated Entry Point", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 40, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[5], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
@@ -697,11 +702,11 @@ void RenderMapEntryPointsAndLights()
if( sScreenY >= (- 50) && sScreenY < (2 * iScreenHeightOffset + 300) && sScreenX >= (- 40) && sScreenX < SCREEN_WIDTH )
{
if( LightSprites[ i ].uiFlags & LIGHT_PRIMETIME )
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_ORANGE, L"Prime", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_ORANGE, iRenderMapEntryPointsAndLightsText[6], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
else if( LightSprites[ i ].uiFlags & LIGHT_NIGHTTIME )
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_RED, L"Night", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_RED, iRenderMapEntryPointsAndLightsText[7], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
else
- DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_YELLOW, L"24Hour", FONT_BLACK, TRUE, CENTER_JUSTIFIED );
+ DisplayWrappedString( sScreenX, (INT16)(sScreenY-5), 50, 2, FONT10ARIAL, FONT_YELLOW, iRenderMapEntryPointsAndLightsText[8], FONT_BLACK, TRUE, CENTER_JUSTIFIED );
}
}
}
@@ -712,26 +717,26 @@ void BuildTriggerName( OBJECTTYPE *pItem, STR16 szItemName )
if( pItem->usItem == SWITCH )
{
if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY )
- swprintf( szItemName, L"Panic Trigger1" );
+ swprintf( szItemName, iBuildTriggerNameText[0] );
else if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY_2 )
- swprintf( szItemName, L"Panic Trigger2" );
+ swprintf( szItemName, iBuildTriggerNameText[1] );
else if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY_3 )
- swprintf( szItemName, L"Panic Trigger3" );
+ swprintf( szItemName, iBuildTriggerNameText[2] );
else
- swprintf( szItemName, L"Trigger%d", (*pItem)[0]->data.misc.bFrequency - 50 );
+ swprintf( szItemName, iBuildTriggerNameText[3], (*pItem)[0]->data.misc.bFrequency - 50 );
}
else
{ //action item
if( (*pItem)[0]->data.misc.bDetonatorType == BOMB_PRESSURE )
- swprintf( szItemName, L"Pressure Action" );
+ swprintf( szItemName, iBuildTriggerNameText[4] );
else if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY )
- swprintf( szItemName, L"Panic Action1" );
+ swprintf( szItemName, iBuildTriggerNameText[5] );
else if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY_2 )
- swprintf( szItemName, L"Panic Action2" );
+ swprintf( szItemName, iBuildTriggerNameText[6] );
else if( (*pItem)[0]->data.misc.bFrequency == PANIC_FREQUENCY_3 )
- swprintf( szItemName, L"Panic Action3" );
+ swprintf( szItemName, iBuildTriggerNameText[7] );
else
- swprintf( szItemName, L"Action%d", (*pItem)[0]->data.misc.bFrequency - 50 );
+ swprintf( szItemName, iBuildTriggerNameText[8], (*pItem)[0]->data.misc.bFrequency - 50 );
}
}
@@ -748,7 +753,7 @@ void RenderDoorLockInfo()
if( DoorTable[ i ].ubLockID != 255 )
swprintf( str, L"%S", LockTable[ DoorTable[ i ].ubLockID ].ubEditorName );
else
- swprintf( str, L"No Lock ID" );
+ swprintf( str, iRenderDoorLockInfoText[0] );
xp = sScreenX - 10;
yp = sScreenY - 40;
DisplayWrappedString( xp, yp, 60, 2, FONT10ARIAL, FONT_LTKHAKI, str, FONT_BLACK, TRUE, CENTER_JUSTIFIED );
@@ -760,30 +765,30 @@ void RenderDoorLockInfo()
switch( DoorTable[ i ].ubTrapID )
{
case EXPLOSION:
- swprintf( str, L"Explosion Trap" );
+ swprintf( str, iRenderDoorLockInfoText[1] );
break;
case ELECTRIC:
- swprintf( str, L"Electric Trap" );
+ swprintf( str, iRenderDoorLockInfoText[2] );
break;
case SIREN:
- swprintf( str, L"Siren Trap" );
+ swprintf( str, iRenderDoorLockInfoText[3] );
break;
case SILENT_ALARM:
- swprintf( str, L"Silent Alarm" );
+ swprintf( str, iRenderDoorLockInfoText[4] );
break;
case SUPER_ELECTRIC:
- swprintf( str, L"Super Electric Trap" );
+ swprintf( str, iRenderDoorLockInfoText[5] );
break;
// WANNE: Fix a vanilla glitch in the editor: The text for the brothel siren trap was missing.
// Fixed by Tron (Stracciatella): Revision: 6253
case BROTHEL_SIREN:
- swprintf( str, L"Brothel Siren Trap" );
+ swprintf( str, iRenderDoorLockInfoText[6] );
break;
}
xp = sScreenX + 20 - StringPixLength( str, FONT10ARIAL ) / 2;
yp = sScreenY;
mprintf( xp, yp, str );
- swprintf( str, L"Trap Level %d", DoorTable[ i ].ubTrapLevel );
+ swprintf( str, iRenderDoorLockInfoText[7], DoorTable[ i ].ubTrapLevel );
xp = sScreenX + 20 - StringPixLength( str, FONT10ARIAL ) / 2;
mprintf( xp, yp+10, str );
}
@@ -906,12 +911,15 @@ void RenderEditorInfo( )
switch( iCurrentTaskbar )
{
case TASK_OPTIONS:
- mprintf(iScreenWidthOffset+71+15, SCREEN_HEIGHT-117, L"Save map in original JA2 map format (Version: 5.00 / 25)");//dnl ch33 160909
+ mprintf(iScreenWidthOffset+71+15, SCREEN_HEIGHT-117, iRenderEditorInfoText[0]);//dnl ch33 160909
if( !gfWorldLoaded || giCurrentTilesetID < 0 )
- mprintf( iScreenWidthOffset + 260, 2 * iScreenHeightOffset + 445, L"No map currently loaded." );
+ mprintf( iScreenWidthOffset + 260, 2 * iScreenHeightOffset + 445, iRenderEditorInfoText[1] );
else
- mprintf( iScreenWidthOffset + 260, 2 * iScreenHeightOffset + 445, L"File: %S, Current Tileset: %s",
- gubFilename, gTilesets[ giCurrentTilesetID ].zName );
+ mprintf( iScreenWidthOffset + 260, 2 * iScreenHeightOffset + 445, iRenderEditorInfoText[2], gubFilename, gTilesets[ giCurrentTilesetID ].zName );
+
+ // TODO.MAP
+ mprintf(iScreenWidthOffset+20, SCREEN_HEIGHT-40, iRenderEditorInfoText[3]);
+
UpdateOptions();
break;
case TASK_TERRAIN:
diff --git a/Editor/EditorBuildings.cpp b/Editor/EditorBuildings.cpp
index c156caa9..0829474a 100644
--- a/Editor/EditorBuildings.cpp
+++ b/Editor/EditorBuildings.cpp
@@ -27,6 +27,7 @@
#include "environment.h"
#include "selectwin.h"
#include "Simple Render Utils.h"
+ #include "Text.h"
#endif
BOOLEAN fBuildingShowRoofs, fBuildingShowWalls, fBuildingShowRoomInfo;
@@ -82,16 +83,16 @@ void UpdateBuildingsInfo()
//print the headers on top of the columns
SetFont( SMALLCOMPFONT );
SetFontForeground( FONT_RED );
- mprintfEditor( iScreenWidthOffset + 112, 2 * iScreenHeightOffset + 362, L"TOGGLE");
- mprintfEditor( iScreenWidthOffset + 114, 2 * iScreenHeightOffset + 372, L"VIEWS");
+ mprintfEditor( iScreenWidthOffset + 112, 2 * iScreenHeightOffset + 362, iUpdateBuildingsInfoText[0]);
+ mprintfEditor( iScreenWidthOffset + 114, 2 * iScreenHeightOffset + 372, iUpdateBuildingsInfoText[1]);
SetFontForeground( FONT_YELLOW );
- mprintfEditor( iScreenWidthOffset + 185, 2 * iScreenHeightOffset + 362, L"SELECTION METHOD");
+ mprintfEditor( iScreenWidthOffset + 185, 2 * iScreenHeightOffset + 362, iUpdateBuildingsInfoText[2]);
SetFontForeground( FONT_LTGREEN );
- mprintfEditor( iScreenWidthOffset + 290, 2 * iScreenHeightOffset + 362, L"SMART METHOD");
+ mprintfEditor( iScreenWidthOffset + 290, 2 * iScreenHeightOffset + 362, iUpdateBuildingsInfoText[3]);
SetFontForeground( FONT_LTBLUE );
- mprintfEditor( iScreenWidthOffset + 390, 2 * iScreenHeightOffset + 362, L"BUILDING METHOD");
+ mprintfEditor( iScreenWidthOffset + 390, 2 * iScreenHeightOffset + 362, iUpdateBuildingsInfoText[4]);
SetFontForeground( FONT_GRAY2 );
- mprintfEditor( iScreenWidthOffset + 437, 2 * iScreenHeightOffset + 404, L"Room#" );
+ mprintfEditor( iScreenWidthOffset + 437, 2 * iScreenHeightOffset + 404, iUpdateBuildingsInfoText[5] );
}
//Uses a recursive method to elimate adjacent tiles of structure information.
@@ -653,13 +654,13 @@ void RenderDoorEditingWindow()
SetFontForeground( FONT_YELLOW );
SetFontShadow( FONT_NEARBLACK );
SetFontBackground( 0 );
- mprintf( iScreenWidthOffset + 210, iScreenHeightOffset + 140, L"Editing lock attributes at map index %d.", iDoorMapIndex );
+ mprintf( iScreenWidthOffset + 210, iScreenHeightOffset + 140, iRenderDoorEditingWindowText[0], iDoorMapIndex );
SetFontForeground( FONT_GRAY2 );
- mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 160, L"Lock ID" );
- mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 180, L"Trap Type" );
- mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 200, L"Trap Level" );
- mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 218, L"Locked" );
+ mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 160, iRenderDoorEditingWindowText[1] );
+ mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 180, iRenderDoorEditingWindowText[2] );
+ mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 200, iRenderDoorEditingWindowText[3] );
+ mprintf( iScreenWidthOffset + 238, iScreenHeightOffset + 218, iRenderDoorEditingWindowText[4] );
}
void KillDoorEditing()
diff --git a/Editor/EditorItems.cpp b/Editor/EditorItems.cpp
index 42a500c5..376485fb 100644
--- a/Editor/EditorItems.cpp
+++ b/Editor/EditorItems.cpp
@@ -497,35 +497,35 @@ void InitEditorItemsInfo(UINT32 uiItemType)
{
if( i == PRESSURE_ACTION_ID )
{
- swprintf( pStr, L"Pressure Action" );
+ swprintf( pStr, pInitEditorItemsInfoText[0] );
}
else if( i < 2 )
{
if( usCounter == SWITCH )
- swprintf( pStr, L"Panic Trigger1" );
+ swprintf( pStr, pInitEditorItemsInfoText[5] );
else
- swprintf( pStr, L"Panic Action1" );
+ swprintf( pStr, pInitEditorItemsInfoText[1] );
}
else if( i < 4 )
{
if( usCounter == SWITCH )
- swprintf( pStr, L"Panic Trigger2" );
+ swprintf( pStr, pInitEditorItemsInfoText[6] );
else
- swprintf( pStr, L"Panic Action2" );
+ swprintf( pStr, pInitEditorItemsInfoText[2] );
}
else if( i < 6 )
{
if( usCounter == SWITCH )
- swprintf( pStr, L"Panic Trigger3" );
+ swprintf( pStr, pInitEditorItemsInfoText[7] );
else
- swprintf( pStr, L"Panic Action3" );
+ swprintf( pStr, pInitEditorItemsInfoText[3] );
}
else
{
if( usCounter == SWITCH )
- swprintf( pStr, L"Trigger%d", (i-4)/2 );
+ swprintf( pStr, pInitEditorItemsInfoText[8], (i-4)/2 );
else
- swprintf( pStr, L"Action%d", (i-4)/2 );
+ swprintf( pStr, pInitEditorItemsInfoText[4], (i-4)/2 );
}
}
@@ -1669,11 +1669,11 @@ void DisplayItemStatistics()
LoadItemInfo( usItemIndex, pItemName, NULL );
mprintf( iScreenWidthOffset + 50 - StringPixLength( pItemName , SMALLCOMPFONT )/2, 2 * iScreenHeightOffset + 403, pItemName );
- mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 410, L"Status Info Line 1");
- mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 420, L"Status Info Line 2");
- mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 430, L"Status Info Line 3");
- mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 440, L"Status Info Line 4");
- mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 450, L"Status Info Line 5");
+ mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 410, pDisplayItemStatisticsTex[0]);
+ mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 420, pDisplayItemStatisticsTex[1]);
+ mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 430, pDisplayItemStatisticsTex[2]);
+ mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 440, pDisplayItemStatisticsTex[3]);
+ mprintf( iScreenWidthOffset + 2, 2 * iScreenHeightOffset + 450, pDisplayItemStatisticsTex[4]);
}
diff --git a/Editor/EditorMapInfo.cpp b/Editor/EditorMapInfo.cpp
index 8c0ebb58..785ca03c 100644
--- a/Editor/EditorMapInfo.cpp
+++ b/Editor/EditorMapInfo.cpp
@@ -56,6 +56,7 @@
#include "EditorMapInfo.h"
#include "environment.h"
#include "Simple Render Utils.h"
+ #include "Text.h"
#endif
//forward declarations of common classes to eliminate includes
@@ -85,6 +86,11 @@ void SetupTextInputForOptions(void)//dnl ch52 091009
void UpdateOptions()
{
+ if (gfResizeMapOnLoading)
+ EnableTextField(1);
+ else
+ DisableTextField(1);
+
SetFont( FONT10ARIAL );
SetFontShadow( FONT_NEARBLACK );
@@ -98,11 +104,11 @@ void UpdateOptions()
void ExtractAndUpdateOptions(void)//dnl ch52 091009
{
- iNewMapWorldRows = max(min(GetNumericStrictValueFromField(1), 9600), OLD_WORLD_ROWS);
+ iNewMapWorldRows = max(min(GetNumericStrictValueFromField(1), WORLD_ROWS_MAX), OLD_WORLD_ROWS);
iNewMapWorldRows /= 4;
iNewMapWorldRows *= 4;
iNewMapWorldCols = iNewMapWorldRows;
- //iNewMapWorldCols = max(min(GetNumericStrictValueFromField(2), 9600), OLD_WORLD_COLS);
+ //iNewMapWorldCols = max(min(GetNumericStrictValueFromField(2), WORLD_COLS_MAX), OLD_WORLD_COLS);
//iNewMapWorldCols /= 4;
//iNewMapWorldCols *= 4;
}
@@ -141,7 +147,7 @@ void SetupTextInputForMapInfo()
swprintf( str, L"%d", gExitGrid.ubGotoSectorZ );
AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 383, 30, 18, MSYS_PRIORITY_NORMAL, str, 1, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gExitGrid.usGridNo );
- AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 403, 45, 18, MSYS_PRIORITY_NORMAL, str, 6, INPUTTYPE_NUMERICSTRICT );
+ AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 403, 50, 18, MSYS_PRIORITY_NORMAL, str, 7, INPUTTYPE_NUMERICSTRICT );
}
void UpdateMapInfo()
@@ -150,41 +156,41 @@ void UpdateMapInfo()
SetFontShadow( FONT_NEARBLACK );
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 399, L"R");
+ mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[0]);
SetFontForeground( FONT_GREEN );
- mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 419, L"G");
+ mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 419, pUpdateMapInfoText[1]);
SetFontForeground( FONT_DKBLUE );
- mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 439, L"B");
+ mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 439, pUpdateMapInfoText[2]);
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 369, L"Prime" );
- mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 382, L"Night" );
- mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 397, L"24Hrs" );
+ mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 369, pUpdateMapInfoText[3] );
+ mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 382, pUpdateMapInfoText[4] );
+ mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 397, pUpdateMapInfoText[5] );
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 399, L"Radius");
+ mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[6] );
if( !gfBasement && !gfCaves )
SetFontForeground( FONT_DKYELLOW );
- mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 414, L"Underground" );
- mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 423, L"Light Level" );
+ mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 414, pUpdateMapInfoText[7] );
+ mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 423, pUpdateMapInfoText[8] );
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 369, L"Outdoors" );
- mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 384, L"Basement" );
- mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 399, L"Caves" );
+ mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 369, pUpdateMapInfoText[9] );
+ mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 384, pUpdateMapInfoText[10] );
+ mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[11] );
SetFontForeground( FONT_ORANGE );
- mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 420, L"Restricted" );
- mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 430, L"Scroll ID" );
+ mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 420, pUpdateMapInfoText[12] );
+ mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 430, pUpdateMapInfoText[13] );
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 363, L"Destination");
- mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 372, L"Sector" );
- mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 383, L"Destination");
- mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 392, L"Bsmt. Level" );
- mprintf( iScreenWidthOffset + 383, 2 * iScreenHeightOffset + 403, L"Dest." );
- mprintf( iScreenWidthOffset + 383, 2 * iScreenHeightOffset + 412, L"GridNo" );
+ mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 363, pUpdateMapInfoText[14] );
+ mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 372, pUpdateMapInfoText[15] );
+ mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 383, pUpdateMapInfoText[16] );
+ mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 392, pUpdateMapInfoText[17] );
+ mprintf( iScreenWidthOffset + 388, 2 * iScreenHeightOffset + 403, pUpdateMapInfoText[18] );
+ mprintf( iScreenWidthOffset + 388, 2 * iScreenHeightOffset + 412, pUpdateMapInfoText[19] );
SetFontForeground( FONT_RED );
}
@@ -280,7 +286,7 @@ void ExtractAndUpdateMapInfo()
gExitGrid.ubGotoSectorY = (UINT8)max( min( gExitGrid.ubGotoSectorY, 16 ), 1 );
}
gExitGrid.ubGotoSectorZ = (UINT8)max( min( GetNumericStrictValueFromField( 8 ), 3 ), 0 );
- gExitGrid.usGridNo = max( min( GetNumericStrictValueFromField( 9 ), 25600 ), 0 );
+ gExitGrid.usGridNo = max( min( GetNumericStrictValueFromField( 9 ), (WORLD_COLS_MAX * WORLD_ROWS_MAX) ), 0 );
UpdateMapInfoFields();
}
diff --git a/Editor/EditorMercs.cpp b/Editor/EditorMercs.cpp
index fca45019..b56d45ff 100644
--- a/Editor/EditorMercs.cpp
+++ b/Editor/EditorMercs.cpp
@@ -120,6 +120,7 @@ CHAR16 gszCivGroupNames[ NUM_CIV_GROUPS ][ 20 ] =
// SCHEDULE_ACTION_ENTERSECTOR,
// SCHEDULE_ACTION_STAYINSECTOR,
// SCHEDULE_ACTION_SLEEP,
+/*
CHAR16 gszScheduleActions[ NUM_SCHEDULE_ACTIONS ][20] =
{
L"No action",
@@ -134,7 +135,7 @@ CHAR16 gszScheduleActions[ NUM_SCHEDULE_ACTIONS ][20] =
L"Sleep",
L"Ignore this!"
};
-
+*/
enum
{
@@ -272,16 +273,17 @@ BOOLEAN gfShowCivilians = TRUE;
INT16 sCurBaseDiff = DEFAULT_DIFF;
BOOLEAN fAskForBaseDifficulty = TRUE;
-STR16 zDiffNames[NUM_DIFF_LVLS] = { L"Wimp", L"Easy", L"Average", L"Tough", L"Steroid Users Only" };
+//STR16 zDiffNames[NUM_DIFF_LVLS] = { L"Wimp", L"Easy", L"Average", L"Tough", L"Steroid Users Only" };
INT16 sBaseStat[NUM_DIFF_LVLS] = { 50, 60, 70, 80, 90 };
INT16 sBaseExpLvl[NUM_DIFF_LVLS] = { 1, 3, 5, 7, 9 };
-
+/*
STR16 EditMercStat[12] = { L"Max Health",L"Cur Health",L"Strength",
L"Agility",L"Dexterity",L"Charisma",
L"Wisdom",L"Marksmanship",L"Explosives",
L"Medical",L"Scientific",L"Exp Level" };
-
+*/
#define NUM_MERC_ORDERS 8
+/*
STR16 EditMercOrders[8] = { L"Stationary",L"On Guard",L"Close Patrol",
L"Far Patrol",L"Point Patrol",L"On Call",
L"Seek Enemy", L"Random Point Patrol"};
@@ -289,7 +291,7 @@ STR16 EditMercOrders[8] = { L"Stationary",L"On Guard",L"Close Patrol",
STR16 EditMercAttitudes[6] = { L"Defensive",L"Brave Loner",L"Brave Buddy",
L"Cunning Loner",L"Cunning Buddy",
L"Aggressive" };
-
+*/
//information for bodytypes.
#ifdef RANDOM
#undef RANDOM
@@ -835,7 +837,7 @@ void DisplayEditMercWindow( void )
SetFont( FONT12POINT1 );
// Name window
- gprintf( iXPos + 128, iYPos + 3, L"Merc Name:" );
+ gprintf( iXPos + 128, iYPos + 3, pDisplayEditMercWindowText[0] );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 128, iYPos + 16, iXPos + 128 + 104, iYPos + 16 + 19, usFillColorDark );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 17, iXPos + 128 + 104, iYPos + 17 + 19, usFillColorLight );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 17, iXPos + 128 + 103, iYPos + 17 + 18, usFillColorTextBk );
@@ -843,7 +845,7 @@ void DisplayEditMercWindow( void )
gprintf( iXPos + 130 + iXOff, iYPos + 20, L"%s", pSoldier->name );
// Orders window
- gprintf( iXPos + 128, iYPos + 38, L"Orders:" );
+ gprintf( iXPos + 128, iYPos + 38, pDisplayEditMercWindowText[1] );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 128, iYPos + 51, iXPos + 128 + 104, iYPos + 51 + 19, usFillColorDark );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 52, iXPos + 128 + 104, iYPos + 52 + 19, usFillColorLight );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 52, iXPos + 128 + 103, iYPos + 52 + 18, usFillColorTextBk );
@@ -851,7 +853,7 @@ void DisplayEditMercWindow( void )
gprintf( iXPos + 130 + iXOff, iYPos + 55, L"%s", EditMercOrders[pSoldier->aiData.bOrders] );
// Combat window
- gprintf( iXPos + 128, iYPos + 73, L"Combat Attitude:" );
+ gprintf( iXPos + 128, iYPos + 73, pDisplayEditMercWindowText[2] );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 128, iYPos + 86, iXPos + 128 + 104, iYPos + 86 + 19, usFillColorDark );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 87, iXPos + 128 + 104, iYPos + 87 + 19, usFillColorLight );
ColorFillVideoSurfaceArea(FRAME_BUFFER, iXPos + 129, iYPos + 87, iXPos + 128 + 103, iYPos + 87 + 18, usFillColorTextBk );
@@ -1397,9 +1399,9 @@ void CreateEditMercWindow( void )
iEditMercBkgrndArea = CreateHotSpot((INT16)iXPos, (INT16)iYPos, (INT16)iWidth, (INT16)iHeight, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, EditMercBkgrndCallback );
- iEditMercColorPage = CreateTextButton( L"Merc Colors", (INT16)FONT12POINT1, FONT_BLACK, FONT_BLACK,
+ iEditMercColorPage = CreateTextButton( pCreateEditMercWindowText[0], (INT16)FONT12POINT1, FONT_BLACK, FONT_BLACK,
BUTTON_USE_DEFAULT, (INT16)(iXPos + 183), (INT16)(iYPos + 315), 80, 20, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercChangeToColorPageCallback );
- iEditMercEnd = CreateTextButton( L"Done", (INT16)FONT12POINT1, FONT_MCOLOR_BLACK, FONT_BLACK,
+ iEditMercEnd = CreateTextButton( pCreateEditMercWindowText[1], (INT16)FONT12POINT1, FONT_MCOLOR_BLACK, FONT_BLACK,
BUTTON_USE_DEFAULT, (INT16)(iXPos + 183), (INT16)(iYPos + 337), 80, 20, BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercDoneEditCallback );
// Disable color editing for PC Mercs
@@ -1408,13 +1410,13 @@ void CreateEditMercWindow( void )
iEditorButton[8] = QuickCreateButton( giEditMercImage[0], (INT16)(iXPos + 98), (INT16)(iYPos + 51), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercPrevOrderCallback );
iEditorButton[9] = QuickCreateButton( giEditMercImage[1], (INT16)(iXPos + 233), (INT16)(iYPos + 51), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercNextOrderCallback );
- SetButtonFastHelpText( iEditorButton[8], L"Previous merc standing orders" );
- SetButtonFastHelpText( iEditorButton[9], L"Next merc standing orders" );
+ SetButtonFastHelpText( iEditorButton[8], pCreateEditMercWindowText[2] );
+ SetButtonFastHelpText( iEditorButton[9], pCreateEditMercWindowText[3] );
iEditorButton[10] = QuickCreateButton( giEditMercImage[0], (INT16)(iXPos + 98), (INT16)(iYPos + 86), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercPrevAttCallback );
iEditorButton[11] = QuickCreateButton( giEditMercImage[1], (INT16)(iXPos + 233), (INT16)(iYPos + 86), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercNextAttCallback );
- SetButtonFastHelpText( iEditorButton[10], L"Previous merc combat attitude" );
- SetButtonFastHelpText( iEditorButton[11], L"Next merc combat attitude" );
+ SetButtonFastHelpText( iEditorButton[10], pCreateEditMercWindowText[4] );
+ SetButtonFastHelpText( iEditorButton[11], pCreateEditMercWindowText[5] );
iEditorButton[12] = QuickCreateButton( giEditMercImage[0], (INT16)(iXPos + 86), (INT16)(iYPos + 110), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercStatDwnCallback );
iEditorButton[13] = QuickCreateButton( giEditMercImage[1], (INT16)(iXPos + 146), (INT16)(iYPos + 110), BUTTON_NO_TOGGLE, MSYS_PRIORITY_NORMAL + 1, DEFAULT_MOVE_CALLBACK, EditMercStatUpCallback );
@@ -1454,8 +1456,8 @@ void CreateEditMercWindow( void )
for ( x = 12; x < 36; x += 2 )
{
- SetButtonFastHelpText( iEditorButton[x], L"Decrease merc stat" );
- SetButtonFastHelpText( iEditorButton[x + 1], L"Increase merc stat" );
+ SetButtonFastHelpText( iEditorButton[x], pCreateEditMercWindowText[6] );
+ SetButtonFastHelpText( iEditorButton[x + 1], pCreateEditMercWindowText[7] );
}
}
void SetMercOrders( INT8 bOrders )
@@ -2409,34 +2411,34 @@ void DisplayBodyTypeInfo()
CHAR16 str[20];
switch( gpSelected->pBasicPlacement->bBodyType )
{
- case RANDOM: swprintf( str, L"Random" ); break;
- case REGMALE: swprintf( str, L"Reg Male" ); break;
- case BIGMALE: swprintf( str, L"Big Male" ); break;
- case STOCKYMALE: swprintf( str, L"Stocky Male" ); break;
- case REGFEMALE: swprintf( str, L"Reg Female" ); break;
- case TANK_NE: swprintf( str, L"NE Tank" ); break;
- case TANK_NW: swprintf( str, L"NW Tank" ); break;
- case FATCIV: swprintf( str, L"Fat Civilian" ); break;
- case MANCIV: swprintf( str, L"M Civilian" ); break;
- case MINICIV: swprintf( str, L"Miniskirt" ); break;
- case DRESSCIV: swprintf( str, L"F Civilian" ); break;
- case HATKIDCIV: swprintf( str, L"Kid w/ Hat" ); break;
- case HUMVEE: swprintf( str, L"Humvee" ); break;
- case ELDORADO: swprintf( str, L"Eldorado" ); break;
- case ICECREAMTRUCK: swprintf( str, L"Icecream Truck" ); break;
- case JEEP: swprintf( str, L"Jeep" ); break;
- case KIDCIV: swprintf( str, L"Kid Civilian" ); break;
- case COW: swprintf( str, L"Domestic Cow" ); break;
- case CRIPPLECIV: swprintf( str, L"Cripple" ); break;
- case ROBOTNOWEAPON: swprintf( str, L"Unarmed Robot" ); break;
- case LARVAE_MONSTER: swprintf( str, L"Larvae" ); break;
- case INFANT_MONSTER: swprintf( str, L"Infant" ); break;
- case YAF_MONSTER: swprintf( str, L"Yng F Monster" ); break;
- case YAM_MONSTER: swprintf( str, L"Yng M Monster" ); break;
- case ADULTFEMALEMONSTER: swprintf( str, L"Adt F Monster" ); break;
- case AM_MONSTER: swprintf( str, L"Adt M Monster" ); break;
- case QUEENMONSTER: swprintf( str, L"Queen Monster" ); break;
- case BLOODCAT: swprintf( str, L"Bloodcat" ); break;
+ case RANDOM: swprintf( str, pDisplayBodyTypeInfoText[0] ); break;
+ case REGMALE: swprintf( str, pDisplayBodyTypeInfoText[1] ); break;
+ case BIGMALE: swprintf( str, pDisplayBodyTypeInfoText[2] ); break;
+ case STOCKYMALE: swprintf( str, pDisplayBodyTypeInfoText[3] ); break;
+ case REGFEMALE: swprintf( str, pDisplayBodyTypeInfoText[4] ); break;
+ case TANK_NE: swprintf( str, pDisplayBodyTypeInfoText[5] ); break;
+ case TANK_NW: swprintf( str, pDisplayBodyTypeInfoText[6] ); break;
+ case FATCIV: swprintf( str, pDisplayBodyTypeInfoText[7] ); break;
+ case MANCIV: swprintf( str, pDisplayBodyTypeInfoText[8] ); break;
+ case MINICIV: swprintf( str, pDisplayBodyTypeInfoText[9] ); break;
+ case DRESSCIV: swprintf( str, pDisplayBodyTypeInfoText[10] ); break;
+ case HATKIDCIV: swprintf( str, pDisplayBodyTypeInfoText[11] ); break;
+ case HUMVEE: swprintf( str, pDisplayBodyTypeInfoText[12] ); break;
+ case ELDORADO: swprintf( str, pDisplayBodyTypeInfoText[13] ); break;
+ case ICECREAMTRUCK: swprintf( str, pDisplayBodyTypeInfoText[14] ); break;
+ case JEEP: swprintf( str, pDisplayBodyTypeInfoText[15] ); break;
+ case KIDCIV: swprintf( str, pDisplayBodyTypeInfoText[16] ); break;
+ case COW: swprintf( str, pDisplayBodyTypeInfoText[17] ); break;
+ case CRIPPLECIV: swprintf( str, pDisplayBodyTypeInfoText[18] ); break;
+ case ROBOTNOWEAPON: swprintf( str, pDisplayBodyTypeInfoText[19] ); break;
+ case LARVAE_MONSTER: swprintf( str, pDisplayBodyTypeInfoText[20] ); break;
+ case INFANT_MONSTER: swprintf( str, pDisplayBodyTypeInfoText[21] ); break;
+ case YAF_MONSTER: swprintf( str, pDisplayBodyTypeInfoText[22] ); break;
+ case YAM_MONSTER: swprintf( str, pDisplayBodyTypeInfoText[23] ); break;
+ case ADULTFEMALEMONSTER: swprintf( str, pDisplayBodyTypeInfoText[24] ); break;
+ case AM_MONSTER: swprintf( str, pDisplayBodyTypeInfoText[25] ); break;
+ case QUEENMONSTER: swprintf( str, pDisplayBodyTypeInfoText[26] ); break;
+ case BLOODCAT: swprintf( str, pDisplayBodyTypeInfoText[27] ); break;
}
DrawEditorInfoBox( str, FONT10ARIAL, iScreenWidthOffset + 490, 2 * iScreenHeightOffset + 364, 70, 20 );
}
@@ -2468,51 +2470,51 @@ void UpdateMercsInfo()
SetFont( SMALLCOMPFONT );
SetFontForeground( FONT_YELLOW );
SetFontShadow( FONT_NEARBLACK );
- mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 363, L" --=ORDERS=-- ");
- mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 419, L"--=ATTITUDE=--");
+ mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[0] );
+ mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 419, pUpdateMercsInfoText[1] );
if( iDrawMode == DRAW_MODE_CREATURE )
{
DisplayBodyTypeInfo();
SetFont( SMALLCOMPFONT );
SetFontForeground( FONT_LTBLUE );
- mprintf( iScreenWidthOffset + 493, 2 * iScreenHeightOffset + 416, L"RELATIVE");
- mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 422, L"ATTRIBUTES");
+ mprintf( iScreenWidthOffset + 493, 2 * iScreenHeightOffset + 416, pUpdateMercsInfoText[2] );
+ mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 422, pUpdateMercsInfoText[3] );
}
else
{
SetFontForeground( FONT_LTGREEN );
- mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 363, L"RELATIVE");
- mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 371, L"EQUIPMENT");
+ mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[4] );
+ mprintf( iScreenWidthOffset + 480, 2 * iScreenHeightOffset + 371, pUpdateMercsInfoText[5] );
SetFontForeground( FONT_LTBLUE );
- mprintf( iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 363, L"RELATIVE");
- mprintf( iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 371, L"ATTRIBUTES");
+ mprintf( iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[6] );
+ mprintf( iScreenWidthOffset + 530, 2 * iScreenHeightOffset + 371, pUpdateMercsInfoText[7] );
}
if( iDrawMode == DRAW_MODE_ENEMY )
{
SetFont( FONT10ARIAL );
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 411, L"Army" );
- mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 425, L"Admin" );
- mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 439, L"Elite" );
+ mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 411, pUpdateMercsInfoText[8] );
+ mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 425, pUpdateMercsInfoText[9] );
+ mprintf( iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 439, pUpdateMercsInfoText[10] );
}
break;
case MERC_ATTRIBUTEMODE:
SetFont( FONT10ARIAL );
SetFontForeground( FONT_YELLOW );
SetFontShadow( FONT_NEARBLACK );
- mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 370, L"Exp. Level");
- mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 395, L"Life");
- mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 420, L"LifeMax");
- mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 445, L"Marksmanship");
- mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 370, L"Strength");
- mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 395, L"Agility");
- mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 420, L"Dexterity");
- mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 445, L"Wisdom");
- mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 370, L"Leadership");
- mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 395, L"Explosives");
- mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 420, L"Medical");
- mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 445, L"Mechanical");
- mprintf( iScreenWidthOffset + 525, 2 * iScreenHeightOffset + 370, L"Morale");
+ mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 370, pUpdateMercsInfoText[11] );
+ mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 395, pUpdateMercsInfoText[12] );
+ mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 420, pUpdateMercsInfoText[13] );
+ mprintf( iScreenWidthOffset + 225, 2 * iScreenHeightOffset + 445, pUpdateMercsInfoText[14] );
+ mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 370, pUpdateMercsInfoText[15] );
+ mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 395, pUpdateMercsInfoText[16] );
+ mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 420, pUpdateMercsInfoText[17] );
+ mprintf( iScreenWidthOffset + 325, 2 * iScreenHeightOffset + 445, pUpdateMercsInfoText[18] );
+ mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 370, pUpdateMercsInfoText[19] );
+ mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 395, pUpdateMercsInfoText[20] );
+ mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 420, pUpdateMercsInfoText[21] );
+ mprintf( iScreenWidthOffset + 425, 2 * iScreenHeightOffset + 445, pUpdateMercsInfoText[22] );
+ mprintf( iScreenWidthOffset + 525, 2 * iScreenHeightOffset + 370, pUpdateMercsInfoText[23] );
break;
case MERC_APPEARANCEMODE:
SetFont( FONT10ARIAL );
@@ -2522,10 +2524,10 @@ void UpdateMercsInfo()
SetFontForeground( FONT_DKYELLOW );
SetFontShadow( FONT_NEARBLACK );
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 364, L"Hair color:");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 388, L"Skin color:");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 412, L"Vest color:");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 436, L"Pant color:");
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 364, pUpdateMercsInfoText[24] );
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 388, pUpdateMercsInfoText[25]);
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 412, pUpdateMercsInfoText[26]);
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 436, pUpdateMercsInfoText[27]);
SetFont( SMALLCOMPFONT );
SetFontForeground( FONT_BLACK );
@@ -2539,10 +2541,10 @@ void UpdateMercsInfo()
}
else
{
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 374, L"RANDOM");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 398, L"RANDOM");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 422, L"RANDOM");
- mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 446, L"RANDOM");
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 374, pUpdateMercsInfoText[28]);
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 398, pUpdateMercsInfoText[29]);
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 422, pUpdateMercsInfoText[30]);
+ mprintf( iScreenWidthOffset + 396, 2 * iScreenHeightOffset + 446, pUpdateMercsInfoText[31]);
ShowEditMercPalettes( NULL ); //will display grey scale to signify random
}
DisplayBodyTypeInfo();
@@ -2554,23 +2556,23 @@ void UpdateMercsInfo()
{ //scope trick
CHAR16 tempStr[500];
swprintf( tempStr, L"%s%s%s%s%s%d.",
- L"By specifying a profile index, all of the information will be extracted from the profile ",
- L"and override any values that you have edited. It will also disable the editing features ",
- L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
- L"extract the number you have typed. A blank field will clear the profile. The current ",
- L"number of profiles range from 0 to ", NUM_PROFILES );
+ pUpdateMercsInfoText[32],
+ pUpdateMercsInfoText[33],
+ pUpdateMercsInfoText[34],
+ pUpdateMercsInfoText[35],
+ pUpdateMercsInfoText[36], NUM_PROFILES-1 );
DisplayWrappedString(iScreenWidthOffset + 180, 2 * iScreenHeightOffset + 370, 400, 2, FONT10ARIAL, 146, tempStr, FONT_BLACK, FALSE, LEFT_JUSTIFIED );
SetFont( FONT12POINT1 );
if( gpSelected->pDetailedPlacement->ubProfile == NO_PROFILE )
{
SetFontForeground( FONT_GRAY3 );
- mprintfEditor( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 435, L"Current Profile: n/a ");
+ mprintfEditor( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 435, pUpdateMercsInfoText[37]);
}
else
{
SetFontForeground( FONT_WHITE );
ClearTaskbarRegion( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 435, iScreenWidthOffset + 580, 2 * iScreenHeightOffset + 445 );
- mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 435, L"Current Profile: %s", gMercProfiles[ gpSelected->pDetailedPlacement->ubProfile ].zName );
+ mprintf( iScreenWidthOffset + 240, 2 * iScreenHeightOffset + 435, pUpdateMercsInfoText[38], gMercProfiles[ gpSelected->pDetailedPlacement->ubProfile ].zName );
}
}
break;
@@ -2580,25 +2582,25 @@ void UpdateMercsInfo()
SetFontShadow( FONT_NEARBLACK );
switch( gpSelected->pSoldier->aiData.bOrders )
{
- case STATIONARY: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"STATIONARY" ); break;
- case ONCALL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"ON CALL" ); break;
- case ONGUARD: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"ON GUARD" ); break;
- case SEEKENEMY: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"SEEK ENEMY" ); break;
- case CLOSEPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"CLOSE PATROL" ); break;
- case FARPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"FAR PATROL" ); break;
- case POINTPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"POINT PATROL" ); break;
- case RNDPTPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, L"RND PT PATROL" ); break;
+ case STATIONARY: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[39] ); break;
+ case ONCALL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[40] ); break;
+ case ONGUARD: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[41] ); break;
+ case SEEKENEMY: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[42] ); break;
+ case CLOSEPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[43] ); break;
+ case FARPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[44] ); break;
+ case POINTPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[45] ); break;
+ case RNDPTPATROL: mprintf( iScreenWidthOffset + 430, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[46] ); break;
}
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 363, L"Action" );
- mprintf( iScreenWidthOffset + 268, 2 * iScreenHeightOffset + 363, L"Time" );
- mprintf( iScreenWidthOffset + 309, 2 * iScreenHeightOffset + 363, L"V" );
- mprintf( iScreenWidthOffset + 331, 2 * iScreenHeightOffset + 363, L"GridNo 1" );
- mprintf( iScreenWidthOffset + 381, 2 * iScreenHeightOffset + 363, L"GridNo 2" );
- mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 376, L"1)" );
- mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 397, L"2)" );
- mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 418, L"3)" );
- mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 439, L"4)" );
+ mprintf( iScreenWidthOffset + 186, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[47] );
+ mprintf( iScreenWidthOffset + 268, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[48] );
+ mprintf( iScreenWidthOffset + 309, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[49] );
+ mprintf( iScreenWidthOffset + 331, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[50] );
+ mprintf( iScreenWidthOffset + 381, 2 * iScreenHeightOffset + 363, pUpdateMercsInfoText[51] );
+ mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 376, pUpdateMercsInfoText[52] );
+ mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 397, pUpdateMercsInfoText[53] );
+ mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 418, pUpdateMercsInfoText[54] );
+ mprintf( iScreenWidthOffset + 172, 2 * iScreenHeightOffset + 439, pUpdateMercsInfoText[55] );
if( gubScheduleInstructions )
{
CHAR16 str[255];
@@ -2606,28 +2608,31 @@ void UpdateMercsInfo()
ColorFillVideoSurfaceArea( FRAME_BUFFER, iScreenWidthOffset + 431, 2 * iScreenHeightOffset + 388, iScreenWidthOffset + 590, 2 * iScreenHeightOffset + 450, Get16BPPColor( FROMRGB( 32, 45, 72 ) ) );
switch( gCurrSchedule.ubAction[ gubCurrentScheduleActionIndex ] )
{
- case SCHEDULE_ACTION_LOCKDOOR: swprintf( keyword, L"lock" ); break;
- case SCHEDULE_ACTION_UNLOCKDOOR: swprintf( keyword, L"unlock" ); break;
- case SCHEDULE_ACTION_OPENDOOR: swprintf( keyword, L"open" ); break;
- case SCHEDULE_ACTION_CLOSEDOOR: swprintf( keyword, L"close" ); break;
- }
+ case SCHEDULE_ACTION_LOCKDOOR: swprintf( keyword, pUpdateMercsInfoText[56] ); break;
+ case SCHEDULE_ACTION_UNLOCKDOOR: swprintf( keyword, pUpdateMercsInfoText[57] ); break;
+ case SCHEDULE_ACTION_OPENDOOR: swprintf( keyword, pUpdateMercsInfoText[58] ); break;
+ case SCHEDULE_ACTION_CLOSEDOOR: swprintf( keyword, pUpdateMercsInfoText[59] ); break;
+ }
switch( gubScheduleInstructions )
{
case SCHEDULE_INSTRUCTIONS_DOOR1:
- swprintf( str, L"Click on the gridno adjacent to the door that you wish to %s.", keyword );
+ swprintf( str, pUpdateMercsInfoText[60], keyword );
break;
case SCHEDULE_INSTRUCTIONS_DOOR2:
- swprintf( str, L"Click on the gridno where you wish to move after you %s the door.", keyword );
+ swprintf( str, pUpdateMercsInfoText[61], keyword );
break;
case SCHEDULE_INSTRUCTIONS_GRIDNO:
- swprintf( str, L"Click on the gridno where you wish to move to." );
+ swprintf( str, pUpdateMercsInfoText[62] );
break;
case SCHEDULE_INSTRUCTIONS_SLEEP:
- swprintf( str, L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up." );
+ swprintf( str, pUpdateMercsInfoText[63] );
default:
return;
}
- wcscat( str, L" Hit ESC to abort entering this line in the schedule." );
+
+ if ( gCurrSchedule.ubAction[ gubCurrentScheduleActionIndex ] == SCHEDULE_ACTION_SLEEP ) swprintf( str, pUpdateMercsInfoText[63] );
+
+ wcscat( str, pUpdateMercsInfoText[64] );
DisplayWrappedString( iScreenWidthOffset + 436, 2 * iScreenHeightOffset + 392, 149, 2, FONT10ARIAL, FONT_YELLOW, str, FONT_BLACK, FALSE, LEFT_JUSTIFIED );
}
break;
@@ -3172,7 +3177,7 @@ void RenderMercStrings()
sYPos += 10;
SetFontForeground( FONT_GRAY2 );
- swprintf( str, L"Slot #%d", pSoldier->ubID );
+ swprintf( str, pRenderMercStringsText[0], pSoldier->ubID );
FindFontCenterCoordinates( sXPos, sYPos, 80, 1, str, TINYFONT1, &sX, &sY );
if( sY < (2 * iScreenHeightOffset + 352 ))
{
@@ -3216,7 +3221,7 @@ void RenderMercStrings()
sYPos += 10;
SetFontForeground( FONT_GRAY2 );
- swprintf( str, L"Slot #%d", pSoldier->ubID );
+ swprintf( str, pRenderMercStringsText[0], pSoldier->ubID );
FindFontCenterCoordinates( sXPos, sYPos, 80, 1, str, TINYFONT1, &sX, &sY );
if( sY < (2 * iScreenHeightOffset + 352) )
{
@@ -3252,7 +3257,7 @@ void RenderMercStrings()
SetFontForeground( FONT_DKRED );
else
SetFontForeground( FONT_RED );
- swprintf( str, L"Patrol orders with no waypoints" );
+ swprintf( str, pRenderMercStringsText[1] );
FindFontCenterCoordinates( sXPos, sYPos, 80, 1, str, TINYFONT1, &sX, &sY );
if( sY < (2 * iScreenHeightOffset + 352) )
{
@@ -3268,7 +3273,7 @@ void RenderMercStrings()
SetFontForeground( FONT_DKRED );
else
SetFontForeground( FONT_RED );
- swprintf( str, L"Waypoints with no patrol orders" );
+ swprintf( str, pRenderMercStringsText[2] );
FindFontCenterCoordinates( sXPos, sYPos, 80, 1, str, TINYFONT1, &sX, &sY );
if( sY < (2 * iScreenHeightOffset + 352) )
{
@@ -3451,7 +3456,7 @@ void StartScheduleAction()
case SCHEDULE_ACTION_GRIDNO:
case SCHEDULE_ACTION_ENTERSECTOR:
case SCHEDULE_ACTION_SLEEP:
- ShowEditorButton( MERCS_SCHEDULE_DATA1A + gubCurrentScheduleActionIndex );
+ ShowEditorButton( MERCS_SCHEDULE_DATA1A + gubCurrentScheduleActionIndex );
HideEditorButton( MERCS_SCHEDULE_DATA1B + gubCurrentScheduleActionIndex );
DisableEditorButtons( MERCS_SCHEDULE_ACTION1, MERCS_SCHEDULE_DATA4B );
DisableTextFields( 1, 4 );
@@ -3530,7 +3535,7 @@ void ClearCurrentSchedule()
for( i = 0; i < 4; i++ )
{
MSYS_SetBtnUserData( iEditorButton[ MERCS_SCHEDULE_ACTION1 + i ], 0, 0 );
- SpecifyButtonText( iEditorButton[ MERCS_SCHEDULE_ACTION1 + i ], L"No action" );
+ SpecifyButtonText( iEditorButton[ MERCS_SCHEDULE_ACTION1 + i ], pClearCurrentScheduleText[0] );
gCurrSchedule.usTime[i] = 0xffff;
SetExclusive24HourTimeValue( (UINT8)(i+1), gCurrSchedule.usTime[ i ] ); //blanks the field
gCurrSchedule.usData1[i] = 0xffffffff;
@@ -3655,7 +3660,7 @@ void CopyMercPlacement( INT32 iMapIndex )
{
if( gsSelectedMercID == -1 )
{
- ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, L"Placement not copied because no placement selected." );
+ ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, pCopyMercPlacementText[0] );
return;
}
gfSaveBuffer = TRUE;
@@ -3664,7 +3669,7 @@ void CopyMercPlacement( INT32 iMapIndex )
{
gSaveBufferDetailedPlacement = *gpSelected->pDetailedPlacement;
}
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Placement copied." );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pCopyMercPlacementText[1] );
}
void PasteMercPlacement( INT32 iMapIndex )
@@ -3675,7 +3680,7 @@ void PasteMercPlacement( INT32 iMapIndex )
if( !gfSaveBuffer )
{
- ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, L"Placement not pasted as no placement is saved in buffer." );
+ ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, pPasteMercPlacementText[0] );
return;
}
@@ -3787,11 +3792,11 @@ void PasteMercPlacement( INT32 iMapIndex )
{
SetEnemyDroppableStatus( gbMercSlotTypes[i-FIRST_MERCS_INVENTORY_BUTTON], FALSE );
}
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Placement pasted." );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pPasteMercPlacementText[1] );
}
else
{
- ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, L"Placement not pasted as the maximum number of placements for this team is already used." );
+ ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, pPasteMercPlacementText[2] );
}
}
}
diff --git a/Editor/Editor_VS2005.vcproj b/Editor/Editor_VS2005.vcproj
index 090d57ee..92bb418d 100644
--- a/Editor/Editor_VS2005.vcproj
+++ b/Editor/Editor_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
usItem != ACTION_ITEM )
@@ -487,68 +490,68 @@ void UpdateItemStatsPanel()
if( gpItem && iCurrentTaskbar == TASK_ITEMS &&
gbEditingMode != EDITING_TRIGGERS && gbEditingMode != EDITING_ACTIONITEMS )
{
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 366, L"Toggle hide flag" );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 366, pUpdateItemStatsPanelText[0] );
}
SetFontForeground( FONT_YELLOW );
switch( gbEditingMode )
{
case EDITING_NOTHING:
if( iCurrentTaskbar == TASK_ITEMS )
- mprintf( iScreenWidthOffset + 520, 2 * iScreenHeightOffset + 400, L"No item selected." );
+ mprintf( iScreenWidthOffset + 520, 2 * iScreenHeightOffset + 400, pUpdateItemStatsPanelText[1] );
else
{
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 390, L"Slot available for" );
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, L"random generation." );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 390, pUpdateItemStatsPanelText[2] );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, pUpdateItemStatsPanelText[3] );
}
return;
case EDITING_KEYS:
if( !gpEditingItemPool )
{
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, L"Keys not editable." );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, pUpdateItemStatsPanelText[4] );
return;
}
break;
case EDITING_OWNERSHIP:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, L"ProfileID of owner" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, pUpdateItemStatsPanelText[5] );
return;
case EDITING_NOT_YET_IMPLEMENTED:
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, L"Item class not implemented." );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, pUpdateItemStatsPanelText[6] );
return;
case EDITING_DROPPABLE:
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, L"Slot locked as empty.");
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 400, pUpdateItemStatsPanelText[7] );
return;
case EDITING_GUNS:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, L"Status" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, L"Rounds" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 424, L"Trap Level" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, pUpdateItemStatsPanelText[8] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, pUpdateItemStatsPanelText[9] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 424, pUpdateItemStatsPanelText[10] );
break;
case EDITING_AMMO:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, L"Quantity" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, L"Trap Level" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, pUpdateItemStatsPanelText[11] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, pUpdateItemStatsPanelText[12] );
break;
case EDITING_ARMOUR:
case EDITING_LBEGEAR:
case EDITING_EQUIPMENT:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, L"Status" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, L"Trap Level" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 384, pUpdateItemStatsPanelText[13] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, pUpdateItemStatsPanelText[14] );
break;
case EDITING_EXPLOSIVES:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 380, L"Status" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, L"Quantity" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 424, L"Trap Level" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 380, pUpdateItemStatsPanelText[15] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 404, pUpdateItemStatsPanelText[16] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 424, pUpdateItemStatsPanelText[17] );
break;
case EDITING_MONEY:
- mprintf( iScreenWidthOffset + 532, 2 * iScreenHeightOffset + 384, L"Dollars" );
+ mprintf( iScreenWidthOffset + 532, 2 * iScreenHeightOffset + 384, pUpdateItemStatsPanelText[18] );
break;
case EDITING_ACTIONITEMS:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 369, L"Status" );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 389, L"Trap Level" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 369, pUpdateItemStatsPanelText[19] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 389, pUpdateItemStatsPanelText[20] );
break;
case EDITING_TRIGGERS:
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 369, L"Trap Level");
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 389, L"Tolerance" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 369, pUpdateItemStatsPanelText[21] );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 389, pUpdateItemStatsPanelText[22] );
if( gpEditingItemPool && (*gpItem)[0]->data.misc.bFrequency >= PANIC_FREQUENCY_3 && (*gpItem)[0]->data.misc.bFrequency <= PANIC_FREQUENCY )
- mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 407, L"Alarm Trigger" );
+ mprintf( iScreenWidthOffset + 500, 2 * iScreenHeightOffset + 407, pUpdateItemStatsPanelText[23] );
break;
}
if( gpEditingItemPool )
@@ -560,10 +563,10 @@ void UpdateItemStatsPanel()
SetFontForeground( FONT_ORANGE );
else
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 444, L"Exist Chance" );
- mprintf( iScreenWidthOffset + 587, 2 * iScreenHeightOffset + 366, L"B" );
- mprintf( iScreenWidthOffset + 609, 2 * iScreenHeightOffset + 366, L"R" );
- mprintf( iScreenWidthOffset + 630, 2 * iScreenHeightOffset + 366, L"S" );
+ mprintf( iScreenWidthOffset + 512, 2 * iScreenHeightOffset + 444, pUpdateItemStatsPanelText[24] );
+ mprintf( iScreenWidthOffset + 587, 2 * iScreenHeightOffset + 366, pUpdateItemStatsPanelText[25] );
+ mprintf( iScreenWidthOffset + 609, 2 * iScreenHeightOffset + 366, pUpdateItemStatsPanelText[26] );
+ mprintf( iScreenWidthOffset + 630, 2 * iScreenHeightOffset + 366, pUpdateItemStatsPanelText[27] );
}
InvalidateRegion( iScreenWidthOffset + 477, 2 * iScreenHeightOffset + 362, 161, 97 );
}
@@ -615,13 +618,13 @@ void SetupGameTypeFlags()
{
giBothCheckboxButton =
CreateCheckBoxButton( iScreenWidthOffset + 573, 2 * iScreenHeightOffset + 365, "EDITOR//radiobutton.sti", MSYS_PRIORITY_NORMAL, BothModesCheckboxCallback );
- SetButtonFastHelpText( giBothCheckboxButton, L"Item appears in both Sci-Fi and Realistic modes. (|B)" );
+ SetButtonFastHelpText( giBothCheckboxButton, pSetupGameTypeFlagsText[0] );
giRealisticCheckboxButton =
CreateCheckBoxButton( iScreenWidthOffset + 595, 2 * iScreenHeightOffset + 365, "EDITOR//radiobutton.sti", MSYS_PRIORITY_NORMAL, RealisticOnlyCheckboxCallback );
- SetButtonFastHelpText( giRealisticCheckboxButton, L"Item appears in |Realistic mode only." );
+ SetButtonFastHelpText( giRealisticCheckboxButton, pSetupGameTypeFlagsText[1] );
giSciFiCheckboxButton =
CreateCheckBoxButton( iScreenWidthOffset + 616, 2 * iScreenHeightOffset + 365, "EDITOR//radiobutton.sti", MSYS_PRIORITY_NORMAL, SciFiOnlyCheckboxCallback );
- SetButtonFastHelpText( giSciFiCheckboxButton, L"Item appears in |Sci-Fi mode only." );
+ SetButtonFastHelpText( giSciFiCheckboxButton, pSetupGameTypeFlagsText[2] );
if( gWorldItems[ gpEditingItemPool->iItemIndex ].usFlags & WORLD_ITEM_REALISTIC_ONLY )
ButtonList[ giRealisticCheckboxButton ]->uiFlags |= (BUTTON_CLICKED_ON | BUTTON_DIRTY);
@@ -674,7 +677,7 @@ void SetupGunGUI()
if( ValidAttachment( SILENCER, gpItem ) )
{
guiAttachmentButton[ SILENCER_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"SILENCER", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[0], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, SILENCER ) )
@@ -687,7 +690,7 @@ void SetupGunGUI()
if( ValidAttachment( SNIPERSCOPE, gpItem ) )
{
guiAttachmentButton[ SNIPERSCOPE_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"SNIPERSCOPE", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[1], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, SNIPERSCOPE ) )
@@ -700,7 +703,7 @@ void SetupGunGUI()
if( ValidAttachment( LASERSCOPE, gpItem ) )
{
guiAttachmentButton[ LASERSCOPE_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"LASERSCOPE", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[2], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, LASERSCOPE ) )
@@ -713,7 +716,7 @@ void SetupGunGUI()
if( ValidAttachment( BIPOD, gpItem ) )
{
guiAttachmentButton[ BIPOD_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"BIPOD", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[3], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, BIPOD ) )
@@ -726,7 +729,7 @@ void SetupGunGUI()
if( ValidAttachment( DUCKBILL, gpItem ) )
{
guiAttachmentButton[ DUCKBILL_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"DUCKBILL", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[4], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, DUCKBILL ) )
@@ -739,7 +742,7 @@ void SetupGunGUI()
if( ValidAttachment( UNDER_GLAUNCHER, gpItem ) )
{
guiAttachmentButton[ GLAUNCHER_ATTACHMENT_BUTTON ] =
- CreateTextButton( L"G-LAUNCHER", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupGunGUIText[5], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleAttachment );
yp += 14;
if( FindAttachment( gpItem, UNDER_GLAUNCHER ) )
@@ -858,7 +861,7 @@ void SetupArmourGUI()
if( ValidAttachment( CERAMIC_PLATES, gpItem ) )
{
guiCeramicPlatesButton =
- CreateTextButton( L"CERAMIC PLATES", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupArmourGUIText[0], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 558, 2 * iScreenHeightOffset + 375, 72, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleCeramicPlates );
if( FindAttachment( gpItem, CERAMIC_PLATES ) )
{
@@ -1009,13 +1012,13 @@ void SetupExplosivesGUI()
swprintf( str, L"%d", 100 - gWorldItems[ gpEditingItemPool->iItemIndex ].ubNonExistChance );
AddTextInputField( iScreenWidthOffset + 485, 2 * iScreenHeightOffset + 440, 25, 15, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
}
- yp = 375;
+ yp = 2 * iScreenHeightOffset + 375;
gfDetonator = FALSE;
guiDetonatorButton = -1;
if( ValidAttachment( DETONATOR, gpItem ) )
{
guiDetonatorButton =
- CreateTextButton( L"DETONATOR", SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pSetupExplosivesGUIText[0], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 570, yp, 60, 12, BUTTON_TOGGLE, MSYS_PRIORITY_NORMAL, DEFAULT_MOVE_CALLBACK, ToggleDetonator );
yp += 14;
if( FindAttachment( gpItem, DETONATOR ) )
@@ -1112,7 +1115,17 @@ void RemoveMoneyGUI()
void SetupOwnershipGUI()
{
CHAR16 str[20];
+
swprintf( str, L"%d", (*gpItem)[0]->data.owner.ubOwnerProfile );
+
+ // WANNE: Check for valid profile id range, if not, set to NO_PROFILE, which defines an "invalid" profile in the source
+ UINT16 ownerProfileId = (*gpItem)[0]->data.owner.ubOwnerProfile;
+ if (ownerProfileId >= NUM_PROFILES)
+ {
+ ownerProfileId = NO_PROFILE;
+ _itow(ownerProfileId, str, 10);
+ }
+
AddTextInputField( iScreenWidthOffset + 485, 2 * iScreenHeightOffset + 380, 25, 15, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
giOwnershipGroupButton =
CreateTextButton( gszCivGroupNames[ (*gpItem)[0]->data.owner.ubOwnerCivGroup ], SMALLCOMPFONT, FONT_YELLOW, FONT_BLACK, BUTTON_USE_DEFAULT,
@@ -1263,7 +1276,7 @@ void SetupTriggersGUI()
{
giAlarmTriggerButton =
CreateCheckBoxButton( iScreenWidthOffset + 485, 2 * iScreenHeightOffset + 405, "EDITOR//smCheckBox.sti", MSYS_PRIORITY_NORMAL, AlarmTriggerCheckboxCallback );
- SetButtonFastHelpText( giAlarmTriggerButton, L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.");
+ SetButtonFastHelpText( giAlarmTriggerButton, pSetupTriggersGUIText[0] );
if( (*gpItem).fFlags & OBJECT_ALARM_TRIGGER )
ButtonList[ giAlarmTriggerButton ]->uiFlags |= BUTTON_CLICKED_ON;
}
diff --git a/Editor/Sector Summary.cpp b/Editor/Sector Summary.cpp
index 4f38c493..8201c2ad 100644
--- a/Editor/Sector Summary.cpp
+++ b/Editor/Sector Summary.cpp
@@ -290,7 +290,7 @@ void CreateSummaryWindow()
DisableButton( iSummaryButton[ SUMMARY_BACKGROUND ] );
iSummaryButton[ SUMMARY_OKAY ] =
- CreateTextButton(L"Okay", FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT, MAP_LEFT+160, MAP_BOTTOM+99, 50, 30, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, SummaryOkayCallback);//dnl ch36 190909
+ CreateTextButton(pCreateSummaryWindowText[0], FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT, MAP_LEFT+160, MAP_BOTTOM+99, 50, 30, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, SummaryOkayCallback);//dnl ch36 190909
//GiveButtonDefaultStatus( iSummaryButton[ SUMMARY_OKAY ], DEFAULT_STATUS_WINDOWS95 );
iSummaryButton[ SUMMARY_GRIDCHECKBOX ] =
@@ -304,31 +304,31 @@ void CreateSummaryWindow()
gfRenderProgress = TRUE;
iSummaryButton[ SUMMARY_ALL ] =
- CreateTextButton( L"A", SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[1], SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+110, MAP_BOTTOM+5, 16, 16, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryToggleLevelCallback );
if( giCurrentViewLevel == ALL_LEVELS_MASK || giCurrentViewLevel == ALTERNATE_LEVELS_MASK )
ButtonList[ iSummaryButton[ SUMMARY_ALL ] ]->uiFlags |= BUTTON_CLICKED_ON;
iSummaryButton[ SUMMARY_G ] =
- CreateTextButton( L"G", SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[2], SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+128, MAP_BOTTOM+5, 16, 16, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryToggleLevelCallback );
if( giCurrentViewLevel == GROUND_LEVEL_MASK || giCurrentViewLevel == ALTERNATE_GROUND_MASK )
ButtonList[ iSummaryButton[ SUMMARY_G ] ]->uiFlags |= BUTTON_CLICKED_ON;
iSummaryButton[ SUMMARY_B1 ] =
- CreateTextButton( L"B1", SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[3], SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+146, MAP_BOTTOM+5, 16, 16, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryToggleLevelCallback );
if( giCurrentViewLevel == BASEMENT1_LEVEL_MASK || giCurrentViewLevel == ALTERNATE_B1_MASK )
ButtonList[ iSummaryButton[ SUMMARY_B1 ] ]->uiFlags |= BUTTON_CLICKED_ON;
iSummaryButton[ SUMMARY_B2 ] =
- CreateTextButton( L"B2", SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[4], SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+164, MAP_BOTTOM+5, 16, 16, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryToggleLevelCallback );
if( giCurrentViewLevel == BASEMENT2_LEVEL_MASK || giCurrentViewLevel == ALTERNATE_B2_MASK )
ButtonList[ iSummaryButton[ SUMMARY_B2 ] ]->uiFlags |= BUTTON_CLICKED_ON;
iSummaryButton[ SUMMARY_B3 ] =
- CreateTextButton( L"B3", SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[5], SMALLCOMPFONT, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+182, MAP_BOTTOM+5, 16, 16, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryToggleLevelCallback );
if( giCurrentViewLevel == BASEMENT3_LEVEL_MASK || giCurrentViewLevel == ALTERNATE_B3_MASK )
@@ -340,11 +340,11 @@ void CreateSummaryWindow()
ButtonList[ iSummaryButton[ SUMMARY_ALTERNATE ] ]->uiFlags |= BUTTON_CLICKED_ON;
iSummaryButton[ SUMMARY_LOAD ] =
- CreateTextButton( L"LOAD", FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[6], FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT, MAP_BOTTOM+45, 50, 26, BUTTON_NO_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryLoadMapCallback );
iSummaryButton[ SUMMARY_SAVE ] =
- CreateTextButton( L"SAVE", FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[7], FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
MAP_LEFT+55, MAP_BOTTOM+45, 50, 26, BUTTON_NO_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummarySaveMapCallback );
iSummaryButton[ SUMMARY_OVERRIDE ] =
@@ -365,7 +365,7 @@ void CreateSummaryWindow()
iSummaryButton[ SUMMARY_UPDATE ] =
- CreateTextButton( L"Update", FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
+ CreateTextButton( pCreateSummaryWindowText[8], FONT12POINT1, FONT_BLACK, FONT_BLACK, BUTTON_USE_DEFAULT,
iScreenWidthOffset + 255, iScreenHeightOffset + 15, 40, 16, BUTTON_NO_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK,
SummaryUpdateCallback );
@@ -534,67 +534,67 @@ void RenderSectorInformation()
ePoints++;
//start at 10,35
SetFontForeground( FONT_ORANGE );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 32, L"Tileset: %s", gTilesets[ s->ubTilesetID ].zName );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 32, pRenderSectorInformationText[0], gTilesets[ s->ubTilesetID ].zName );
if( m->ubMapVersion < 10 )
SetFontForeground( FONT_RED );
- mprintf(iScreenWidthOffset+10, iScreenHeightOffset+42, L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d", s->ubSummaryVersion, s->dMajorMapVersion, m->ubMapVersion);//dnl ch30 240909
+ mprintf(iScreenWidthOffset+10, iScreenHeightOffset+42, pRenderSectorInformationText[1], s->ubSummaryVersion, s->dMajorMapVersion, m->ubMapVersion);//dnl ch30 240909
SetFontForeground( FONT_GRAY2 );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 55, L"Number of items: %d", s->usNumItems );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 65, L"Number of lights: %d", s->usNumLights );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 75, L"Number of entry points: %d", ePoints );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 55, pRenderSectorInformationText[2], s->usNumItems );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 65, pRenderSectorInformationText[3], s->usNumLights );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 75, pRenderSectorInformationText[4], ePoints );
if( ePoints )
{
INT32 x;
x = iScreenWidthOffset + 140;
mprintf( x, iScreenHeightOffset + 75, L"(" );
x += StringPixLength( L"(", FONT10ARIAL ) + 2;
- if( m->sNorthGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"N" ); x += StringPixLength( L"N", FONT10ARIAL ) + 2; }
- if( m->sEastGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"E" ); x += StringPixLength( L"E", FONT10ARIAL ) + 2; }
- if( m->sSouthGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"S" ); x += StringPixLength( L"S", FONT10ARIAL ) + 2; }
- if( m->sWestGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"W" ); x += StringPixLength( L"W", FONT10ARIAL ) + 2; }
- if( m->sCenterGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"C" ); x += StringPixLength( L"C", FONT10ARIAL ) + 2; }
- if( m->sIsolatedGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, L"I" ); x += StringPixLength( L"I", FONT10ARIAL ) + 2; }
+ if( m->sNorthGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[5] ); x += StringPixLength( pRenderSectorInformationText[5], FONT10ARIAL ) + 2; }
+ if( m->sEastGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[6] ); x += StringPixLength( pRenderSectorInformationText[6], FONT10ARIAL ) + 2; }
+ if( m->sSouthGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[7] ); x += StringPixLength( pRenderSectorInformationText[7], FONT10ARIAL ) + 2; }
+ if( m->sWestGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[8] ); x += StringPixLength( pRenderSectorInformationText[8], FONT10ARIAL ) + 2; }
+ if( m->sCenterGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[9] ); x += StringPixLength( pRenderSectorInformationText[9], FONT10ARIAL ) + 2; }
+ if( m->sIsolatedGridNo != -1 ) { mprintf( x, iScreenHeightOffset + 75, pRenderSectorInformationText[10] ); x += StringPixLength( pRenderSectorInformationText[10], FONT10ARIAL ) + 2; }
mprintf( x, iScreenHeightOffset + 75, L")" );
}
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 85, L"Number of rooms: %d", s->ubNumRooms );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 95, L"Total map population: %d", m->ubNumIndividuals );
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 105, L"Enemies: %d", s->EnemyTeam.ubTotal );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 115, L"Admins: %d", s->ubNumAdmins );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 85, pRenderSectorInformationText[11], s->ubNumRooms );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 95, pRenderSectorInformationText[12], m->ubNumIndividuals );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 105, pRenderSectorInformationText[13], s->EnemyTeam.ubTotal );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 115, pRenderSectorInformationText[14], s->ubNumAdmins );
if( s->ubNumAdmins )
- mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 115, L"(%d detailed, %d profile -- %d have priority existance)", s->ubAdminDetailed, s->ubAdminProfile, s->ubAdminExistance );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 125, L"Troops: %d", s->ubNumTroops );
+ mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 115, pRenderSectorInformationText[15], s->ubAdminDetailed, s->ubAdminProfile, s->ubAdminExistance );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 125, pRenderSectorInformationText[16], s->ubNumTroops );
if( s->ubNumTroops )
- mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 125, L"(%d detailed, %d profile -- %d have priority existance)", s->ubTroopDetailed, s->ubTroopProfile, s->ubTroopExistance );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 135, L"Elites: %d", s->ubNumElites );
+ mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 125, pRenderSectorInformationText[17], s->ubTroopDetailed, s->ubTroopProfile, s->ubTroopExistance );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 135, pRenderSectorInformationText[18], s->ubNumElites );
if( s->ubNumElites )
- mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 135, L"(%d detailed, %d profile -- %d have priority existance)", s->ubEliteDetailed, s->ubEliteProfile, s->ubEliteExistance );
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 145, L"Civilians: %d", s->CivTeam.ubTotal );
+ mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 135, pRenderSectorInformationText[19], s->ubEliteDetailed, s->ubEliteProfile, s->ubEliteExistance );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 145, pRenderSectorInformationText[20], s->CivTeam.ubTotal );
if( s->CivTeam.ubTotal )
- mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 145, L"(%d detailed, %d profile -- %d have priority existance)", s->CivTeam.ubDetailed, s->CivTeam.ubProfile, s->CivTeam.ubExistance );
+ mprintf( iScreenWidthOffset + 100, iScreenHeightOffset + 145, pRenderSectorInformationText[21], s->CivTeam.ubDetailed, s->CivTeam.ubProfile, s->CivTeam.ubExistance );
if( s->ubSummaryVersion >= 9 )
{
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 155, L"Humans: %d", s->CivTeam.ubTotal - s->ubCivCows - s->ubCivBloodcats );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 165, L"Cows: %d", s->ubCivCows );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 175, L"Bloodcats: %d", s->ubCivBloodcats );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 155, pRenderSectorInformationText[22], s->CivTeam.ubTotal - s->ubCivCows - s->ubCivBloodcats );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 165, pRenderSectorInformationText[23], s->ubCivCows );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 175, pRenderSectorInformationText[24], s->ubCivBloodcats );
}
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 185, L"Creatures: %d", s->CreatureTeam.ubTotal );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 185, pRenderSectorInformationText[25], s->CreatureTeam.ubTotal );
if( s->ubSummaryVersion >= 9 )
{
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 195, L"Monsters: %d", s->CreatureTeam.ubTotal - s->CreatureTeam.ubNumAnimals );
- mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 205, L"Bloodcats: %d", s->CreatureTeam.ubNumAnimals );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 195, pRenderSectorInformationText[26], s->CreatureTeam.ubTotal - s->CreatureTeam.ubNumAnimals );
+ mprintf( iScreenWidthOffset + 30, iScreenHeightOffset + 205, pRenderSectorInformationText[27], s->CreatureTeam.ubNumAnimals );
}
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 215, L"Number of locked and/or trapped doors: %d", s->ubNumDoors );
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 225, L"Locked: %d", s->ubNumDoorsLocked );
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 235, L"Trapped: %d", s->ubNumDoorsTrapped );
- mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 245, L"Locked & Trapped: %d", s->ubNumDoorsLockedAndTrapped );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 215, pRenderSectorInformationText[28], s->ubNumDoors );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 225, pRenderSectorInformationText[29], s->ubNumDoorsLocked );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 235, pRenderSectorInformationText[30], s->ubNumDoorsTrapped );
+ mprintf( iScreenWidthOffset + 20, iScreenHeightOffset + 245, pRenderSectorInformationText[31], s->ubNumDoorsLockedAndTrapped );
if( s->ubSummaryVersion >= 8 )
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 255, L"Civilians with schedules: %d", s->ubCivSchedules );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 255, pRenderSectorInformationText[32], s->ubCivSchedules );
if( s->ubSummaryVersion >= 10 )
{
if( s->fTooManyExitGridDests )
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"Too many exit grid destinations (more than 4)...");
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[33]);
}
else
{
@@ -608,25 +608,25 @@ void RenderSectorInformation()
if( ubNumInvalid )
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: %d (%d with a long distance destination)", s->ubNumExitGridDests, ubNumInvalid );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[34], s->ubNumExitGridDests, ubNumInvalid );
}
else switch( s->ubNumExitGridDests )
{
case 0:
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: none" );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[35] );
break;
case 1:
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: 1 destination using %d exitgrids", s->usExitGridSize[0] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[36], s->usExitGridSize[0] );
break;
case 2:
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d", s->usExitGridSize[0], s->usExitGridSize[1] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[37], s->usExitGridSize[0], s->usExitGridSize[1] );
break;
case 3:
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[38],
s->usExitGridSize[0], s->usExitGridSize[1], s->usExitGridSize[2] );
break;
case 4:
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 265, pRenderSectorInformationText[39],
s->usExitGridSize[0], s->usExitGridSize[1], s->usExitGridSize[2], s->usExitGridSize[3] );
break;
}
@@ -634,7 +634,7 @@ void RenderSectorInformation()
}
iOverall = - ( 2 * s->EnemyTeam.ubBadA ) - s->EnemyTeam.ubPoorA + s->EnemyTeam.ubGoodA + ( 2 * s->EnemyTeam.ubGreatA );
usLine = iScreenHeightOffset + 275;
- mprintf( iScreenWidthOffset + 10, usLine, L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ mprintf( iScreenWidthOffset + 10, usLine, pRenderSectorInformationText[40],
s->EnemyTeam.ubBadA,
s->EnemyTeam.ubPoorA,
s->EnemyTeam.ubAvgA,
@@ -643,7 +643,7 @@ void RenderSectorInformation()
iOverall );
iOverall = - ( 2 * s->EnemyTeam.ubBadE ) - s->EnemyTeam.ubPoorE + s->EnemyTeam.ubGoodE + ( 2 * s->EnemyTeam.ubGreatE );
usLine += 10;
- mprintf( iScreenWidthOffset + 10, usLine, L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ mprintf( iScreenWidthOffset + 10, usLine, pRenderSectorInformationText[41],
s->EnemyTeam.ubBadE,
s->EnemyTeam.ubPoorE,
s->EnemyTeam.ubAvgE,
@@ -656,7 +656,7 @@ void RenderSectorInformation()
if( s->ubEnemiesReqWaypoints )
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 10, usLine, L"%d placements have patrol orders without any waypoints defined.", s->ubEnemiesReqWaypoints );
+ mprintf( iScreenWidthOffset + 10, usLine, pRenderSectorInformationText[42], s->ubEnemiesReqWaypoints );
usLine += 10;
}
}
@@ -665,7 +665,7 @@ void RenderSectorInformation()
if( s->ubEnemiesHaveWaypoints )
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 10, usLine, L"%d placements have waypoints, but without any patrol orders.", s->ubEnemiesHaveWaypoints );
+ mprintf( iScreenWidthOffset + 10, usLine, pRenderSectorInformationText[43], s->ubEnemiesHaveWaypoints );
usLine += 10;
}
}
@@ -674,7 +674,7 @@ void RenderSectorInformation()
if( s->usWarningRoomNums )
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 10, usLine, L"%d gridnos have questionable room numbers. Please validate.", s->usWarningRoomNums );
+ mprintf( iScreenWidthOffset + 10, usLine, pRenderSectorInformationText[44], s->usWarningRoomNums );
}
}
}
@@ -693,9 +693,9 @@ void RenderItemDetails()
SetFont( FONT10ARIAL );
SetFontForeground( FONT_GRAY2 );
SetFontShadow( FONT_NEARBLACK );
- mprintf( iScreenWidthOffset + 364, iScreenHeightOffset + 49, L"R" );
- mprintf( iScreenWidthOffset + 390, iScreenHeightOffset + 49, L"S" );
- mprintf( iScreenWidthOffset + 364, iScreenHeightOffset + 62, L"Enemy" );
+ mprintf( iScreenWidthOffset + 364, iScreenHeightOffset + 49, pRenderItemDetailsText[0] );
+ mprintf( iScreenWidthOffset + 390, iScreenHeightOffset + 49, pRenderItemDetailsText[1] );
+ mprintf( iScreenWidthOffset + 364, iScreenHeightOffset + 62, pRenderItemDetailsText[2] );
xp = iScreenWidthOffset + 5;
yp = iScreenHeightOffset + 20;
@@ -789,7 +789,7 @@ void RenderItemDetails()
if( xp >= (UINT32)(iScreenWidthOffset + 300 ))
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, L"TOO MANY ITEMS TO DISPLAY!");
+ mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, pRenderItemDetailsText[3]);
return;
}
}
@@ -808,14 +808,14 @@ void RenderItemDetails()
SetFontForeground( 77 );
switch( i )
{
- case 0: swprintf( str, L"Panic1" ); break;
- case 1: swprintf( str, L"Panic2" ); break;
- case 2: swprintf( str, L"Panic3" ); break;
- case 3: swprintf( str, L"Norm1" ); break;
- case 4: swprintf( str, L"Norm2" ); break;
- case 5: swprintf( str, L"Norm3" ); break;
- case 6: swprintf( str, L"Norm4" ); break;
- case 7: swprintf( str, L"Pressure Actions" ); break;
+ case 0: swprintf( str, pRenderItemDetailsText[4] ); break;
+ case 1: swprintf( str, pRenderItemDetailsText[5] ); break;
+ case 2: swprintf( str, pRenderItemDetailsText[6] ); break;
+ case 3: swprintf( str, pRenderItemDetailsText[7] ); break;
+ case 4: swprintf( str, pRenderItemDetailsText[8] ); break;
+ case 5: swprintf( str, pRenderItemDetailsText[9] ); break;
+ case 6: swprintf( str, pRenderItemDetailsText[10] ); break;
+ case 7: swprintf( str, pRenderItemDetailsText[11] ); break;
}
if( i < 7 )
{
@@ -836,7 +836,7 @@ void RenderItemDetails()
if( xp >= (UINT32)(iScreenWidthOffset + 300 ))
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, L"TOO MANY ITEMS TO DISPLAY!");
+ mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, pRenderItemDetailsText[12]);
return;
}
}
@@ -847,14 +847,14 @@ void RenderItemDetails()
{
SetFontForeground( FONT_YELLOW );
- mprintf( xp, yp, L"PRIORITY ENEMY DROPPED ITEMS" );
+ mprintf( xp, yp, pRenderItemDetailsText[13] );
yp += 10;
//Do the priority existance guys first
if( !gpPEnemyItemsSummaryArray )
{
SetFontForeground( FONT_DKYELLOW );
- mprintf( xp, yp, L"None" );
+ mprintf( xp, yp, pRenderItemDetailsText[14] );
yp += 10;
}
else for( index = 1; index < MAXITEMS; index++ )
@@ -898,7 +898,7 @@ void RenderItemDetails()
if( xp >= (UINT32)(iScreenWidthOffset + 300 ))
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, L"TOO MANY ITEMS TO DISPLAY!");
+ mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, pRenderItemDetailsText[15] );
return;
}
}
@@ -908,7 +908,7 @@ void RenderItemDetails()
yp += 5;
SetFontForeground( FONT_YELLOW );
- mprintf( xp, yp, L"NORMAL ENEMY DROPPED ITEMS" );
+ mprintf( xp, yp, pRenderItemDetailsText[16] );
yp += 10;
if( yp >= (UINT32)(iScreenHeightOffset + 355 ))
{
@@ -917,7 +917,7 @@ void RenderItemDetails()
if( xp >= (UINT32)(iScreenWidthOffset + 300 ))
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, L"TOO MANY ITEMS TO DISPLAY!");
+ mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, pRenderItemDetailsText[17] );
return;
}
}
@@ -926,7 +926,7 @@ void RenderItemDetails()
if( !gpNEnemyItemsSummaryArray )
{
SetFontForeground( FONT_DKYELLOW );
- mprintf( xp, yp, L"None" );
+ mprintf( xp, yp, pRenderItemDetailsText[18] );
yp += 10;
}
for( index = 1; index < MAXITEMS; index++ )
@@ -968,7 +968,7 @@ void RenderItemDetails()
if( xp >= (UINT32)(iScreenWidthOffset + 300 ))
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, L"TOO MANY ITEMS TO DISPLAY!");
+ mprintf( iScreenWidthOffset + 350, iScreenHeightOffset + 350, pRenderItemDetailsText[19] );
return;
}
}
@@ -981,7 +981,7 @@ void RenderItemDetails()
else
{
SetFontForeground( FONT_RED );
- mprintf( iScreenWidthOffset + 5, iScreenHeightOffset + 50, L"ERROR: Can't load the items for this map. Reason unknown." );
+ mprintf( iScreenWidthOffset + 5, iScreenHeightOffset + 50, pRenderItemDetailsText[20] );
}
}
@@ -1017,7 +1017,7 @@ void RenderSummaryWindow()
SetFontBackground( 0 );
if( !gfItemDetailsMode )
{
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, L"CAMPAIGN EDITOR -- %s Version 1.%02d",
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, pRenderSummaryWindowText[0],
gszVersionType[ GLOBAL_SUMMARY_STATE ], GLOBAL_SUMMARY_VERSION );
}
@@ -1026,7 +1026,7 @@ void RenderSummaryWindow()
{
SetFontForeground( FONT_RED );
SetFontShadow( FONT_NEARBLACK );
- mprintf( iScreenWidthOffset + 270, iScreenHeightOffset + 5, L"(NO MAP LOADED).");
+ mprintf( iScreenWidthOffset + 270, iScreenHeightOffset + 5, pRenderSummaryWindowText[1]);
}
SetFont( FONT10ARIAL );
SetFontShadow( FONT_NEARBLACK );
@@ -1038,29 +1038,29 @@ void RenderSummaryWindow()
{
DisableButton( iSummaryButton[ SUMMARY_LOAD ] );
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"You currently have %d outdated maps.", gusNumEntriesWithOutdatedOrNoSummaryInfo);
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, L"The more maps that need to be updated, the longer it takes. It'll take ");
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, L"approximately 4 minutes on a P200MMX to analyse 100 maps, so");
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 50, L"depending on your computer, it may vary.");
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[2], gusNumEntriesWithOutdatedOrNoSummaryInfo);
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, pRenderSummaryWindowText[3]);
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, pRenderSummaryWindowText[4]);
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 50, pRenderSummaryWindowText[5]);
SetFontForeground( FONT_LTRED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 65, L"Do you wish to regenerate info for ALL these maps at this time (y/n)?" );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 65, pRenderSummaryWindowText[6] );
}
else if( !gsSelSectorX && !gsSectorX || gfTempFile )
{
DisableButton( iSummaryButton[ SUMMARY_LOAD ] );
SetFontForeground( FONT_LTRED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"There is no sector currently selected." );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[7] );
if( gfTempFile )
{
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, L"Entering a temp file name that doesn't follow campaign editor conventions..." );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, pRenderSummaryWindowText[8] );
goto SPECIALCASE_LABEL; //OUCH!!!
}
else if( !gfWorldLoaded )
{
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, L"You need to either load an existing map or create a new map before being" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, L"able to enter the editor, or you can quit (ESC or Alt+x).");
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, pRenderSummaryWindowText[9] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, pRenderSummaryWindowText[10] );
}
else if(gCustomFileSectorSummary.ubSummaryVersion)//dnl ch30 150909
{
@@ -1147,42 +1147,42 @@ void RenderSummaryWindow()
{
case GROUND_LEVEL_MASK:
giCurrLevel = 0;
- wcscat( str, L", ground level" );
+ wcscat( str, pRenderSummaryWindowText[11] );
gpCurrentSectorSummary = gpSectorSummary[x][y][0];
break;
case BASEMENT1_LEVEL_MASK:
giCurrLevel = 1;
- wcscat( str, L", underground level 1" );
+ wcscat( str, pRenderSummaryWindowText[12] );
gpCurrentSectorSummary = gpSectorSummary[x][y][1];
break;
case BASEMENT2_LEVEL_MASK:
giCurrLevel = 2;
- wcscat( str, L", underground level 2" );
+ wcscat( str, pRenderSummaryWindowText[13] );
gpCurrentSectorSummary = gpSectorSummary[x][y][2];
break;
case BASEMENT3_LEVEL_MASK:
giCurrLevel = 3;
- wcscat( str, L", underground level 3" );
+ wcscat( str, pRenderSummaryWindowText[14] );
gpCurrentSectorSummary = gpSectorSummary[x][y][3];
break;
case ALTERNATE_GROUND_MASK:
giCurrLevel = 4;
- wcscat( str, L", alternate G level" );
+ wcscat( str, pRenderSummaryWindowText[15] );
gpCurrentSectorSummary = gpSectorSummary[x][y][4];
break;
case ALTERNATE_B1_MASK:
giCurrLevel = 5;
- wcscat( str, L", alternate B1 level" );
+ wcscat( str, pRenderSummaryWindowText[16] );
gpCurrentSectorSummary = gpSectorSummary[x][y][5];
break;
case ALTERNATE_B2_MASK:
giCurrLevel = 6;
- wcscat( str, L", alternate B2 level" );
+ wcscat( str, pRenderSummaryWindowText[17] );
gpCurrentSectorSummary = gpSectorSummary[x][y][6];
break;
case ALTERNATE_B3_MASK:
giCurrLevel = 7;
- wcscat( str, L", alternate B3 level" );
+ wcscat( str, pRenderSummaryWindowText[18] );
gpCurrentSectorSummary = gpSectorSummary[x][y][7];
break;
}
@@ -1223,12 +1223,12 @@ void RenderSummaryWindow()
SetupItemDetailsMode( TRUE );
gfSetupItemDetailsMode = FALSE;
}
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, L"ITEM DETAILS -- sector %s", str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, pRenderSummaryWindowText[19], str );
RenderItemDetails();
}
else
{
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"Summary Information for sector %s:", str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[20], str );
HideButton( iSummaryButton[ SUMMARY_REAL ] );
HideButton( iSummaryButton[ SUMMARY_SCIFI ] );
HideButton( iSummaryButton[ SUMMARY_ENEMY ] );
@@ -1240,13 +1240,13 @@ void RenderSummaryWindow()
SetFontForeground( FONT_RED );
if( gfItemDetailsMode )
{
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, L"Summary Information for sector %s" , str );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 15, L"does not exist." );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, pRenderSummaryWindowText[21] , str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 15, pRenderSummaryWindowText[22] );
}
else
{
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"Summary Information for sector %s" , str );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, L"does not exist." );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[23] , str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, pRenderSummaryWindowText[24] );
}
ShowButton( iSummaryButton[ SUMMARY_UPDATE ] );
}
@@ -1261,9 +1261,9 @@ void RenderSummaryWindow()
SetFontShadow( 0 );
}
if( gfItemDetailsMode )
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, L"No information exists for sector %s.", str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 5, pRenderSummaryWindowText[25], str );
else
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"No information exists for sector %s.", str );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[26], str );
SetFontShadow( FONT_NEARBLACK );
switch( giCurrentViewLevel )
@@ -1291,7 +1291,7 @@ void RenderSummaryWindow()
SetFontForeground( FONT_LTKHAKI );
else
SetFontForeground( FONT_LTBLUE );
- mprintf( MAP_LEFT+110, MAP_BOTTOM+55, L"FILE: %s", gszDisplayName );
+ mprintf( MAP_LEFT+110, MAP_BOTTOM+55, pRenderSummaryWindowText[27], gszDisplayName );
}
else //little higher to make room for the override checkbox and text.
{
@@ -1299,16 +1299,16 @@ void RenderSummaryWindow()
SetFontForeground( FONT_LTKHAKI );
else
SetFontForeground( FONT_LTBLUE );
- mprintf( MAP_LEFT+110, MAP_BOTTOM+46, L"FILE: %s", gszDisplayName );
+ mprintf( MAP_LEFT+110, MAP_BOTTOM+46, pRenderSummaryWindowText[28], gszDisplayName );
if( gubOverrideStatus == READONLY )
{
SetFontForeground( (UINT8)(gfOverride ? FONT_YELLOW : FONT_LTRED) );
- mprintf( MAP_LEFT+124, MAP_BOTTOM+61, L"Override READONLY" );
+ mprintf( MAP_LEFT+124, MAP_BOTTOM+61, pRenderSummaryWindowText[29] );
}
else
{
SetFontForeground( (UINT8)(gfOverride ? FONT_YELLOW: FONT_ORANGE ) );
- mprintf( MAP_LEFT+124, MAP_BOTTOM+61, L"Overwrite File");
+ mprintf( MAP_LEFT+124, MAP_BOTTOM+61, pRenderSummaryWindowText[30]);
}
}
}
@@ -1316,29 +1316,29 @@ void RenderSummaryWindow()
else if( !gfDeniedSummaryCreation )
{
SetFontForeground( FONT_GRAY1 );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"You currently have no summary data. By creating one, you will be able to keep track" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, L"of information pertaining to all of the sectors you edit and save. The creation process" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, L"will analyse all maps in your \\MAPS directory, and generate a new one. This could" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 50, L"take a few minutes depending on how many valid maps you have. Valid maps are" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 60, L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps" );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 70, L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ");
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[31] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 30, pRenderSummaryWindowText[32] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 40, pRenderSummaryWindowText[33] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 50, pRenderSummaryWindowText[34] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 60, pRenderSummaryWindowText[35] );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 70, pRenderSummaryWindowText[36] );
SetFontForeground( FONT_LTRED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 85, L"Do you wish to do this now (y/n)?" );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 85, pRenderSummaryWindowText[37] );
}
else
{
SetFontForeground( FONT_LTRED );
- mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, L"No summary info. Creation denied." );
+ mprintf( iScreenWidthOffset + 10, iScreenHeightOffset + 20, pRenderSummaryWindowText[38] );
}
SetFont( FONT10ARIAL );
SetFontForeground( FONT_GRAY3 );
- mprintf( MAP_LEFT + 15, MAP_BOTTOM + 7, L"Grid" );
- mprintf( MAP_LEFT + 65, MAP_BOTTOM + 7, L"Progress" );
- mprintf( MAP_LEFT + 15, MAP_BOTTOM + 27, L"Use Alternate Maps" );
+ mprintf( MAP_LEFT + 15, MAP_BOTTOM + 7, pRenderSummaryWindowText[39] );
+ mprintf( MAP_LEFT + 65, MAP_BOTTOM + 7,pRenderSummaryWindowText[40] );
+ mprintf( MAP_LEFT + 15, MAP_BOTTOM + 27, pRenderSummaryWindowText[41] );
//Draw the mode tabs
SetFontForeground( FONT_YELLOW );
- mprintf( iScreenWidthOffset + 354, iScreenHeightOffset + 18, L"Summary" );
+ mprintf( iScreenWidthOffset + 354, iScreenHeightOffset + 18, pRenderSummaryWindowText[42] );
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
RectangleDraw( TRUE, iScreenWidthOffset + 350, iScreenHeightOffset + 15, iScreenWidthOffset + 405, iScreenHeightOffset + 28, 0, pDestBuf );
@@ -1355,7 +1355,7 @@ void RenderSummaryWindow()
{
SetFontForeground( FONT_RED );
}
- mprintf( iScreenWidthOffset + 354, iScreenHeightOffset + 33, L"Items" );
+ mprintf( iScreenWidthOffset + 354, iScreenHeightOffset + 33, pRenderSummaryWindowText[43] );
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
RectangleDraw( TRUE, iScreenWidthOffset + 350, iScreenHeightOffset + 30, iScreenWidthOffset + 405, iScreenHeightOffset + 43, 0, pDestBuf );
@@ -1675,7 +1675,7 @@ void UpdateSectorSummary( STR16 gszFilename, BOOLEAN fUpdate )
SetFont( FONT10ARIAL );
SetFontForeground( FONT_LTKHAKI );
SetFontShadow( FONT_NEARBLACK );
- swprintf( str, L"Analyzing map: %s...", gszFilename );
+ swprintf( str, pUpdateSectorSummaryText[0], gszFilename );
if( gfSummaryWindowActive )
{
@@ -2168,10 +2168,13 @@ void SummaryLoadMapCallback( GUI_BUTTON *btn, INT32 reason )
//DefineProgressBarPanel( 0, 65, 79, 94, MAP_LEFT, iScreenHeightOffset + 318, iScreenWidthOffset + 578, iScreenHeightOffset + 356 );
DefineProgressBarPanel( 0, 65, 79, 94, MAP_LEFT, iScreenHeightOffset + 318, MAP_LEFT + 161, iScreenHeightOffset + 356 );
- swprintf( str, L"Loading map: %s", gszDisplayName );
+ swprintf( str, pSummaryLoadMapCallbackText[0], gszDisplayName );
SetProgressBarTitle( 0, str, BLOCKFONT2, FONT_RED, FONT_NEARBLACK );
SetProgressBarMsgAttributes( 0, SMALLCOMPFONT, FONT_BLACK, FONT_BLACK );
+ // WANNE: When loading from summary map, never resize the map, just load it!
+ gfResizeMapOnLoading = FALSE;
+
if( ExternalLoadMap( gszDisplayName ) )
{
EnableButton( iSummaryButton[ SUMMARY_OKAY ] );
@@ -2889,7 +2892,7 @@ void ReportError( STR8 pSector, UINT8 ubLevel )
swprintf( temp, L"_b%d.dat", ubLevel % 4 );
wcscat( str, temp );
}
- mprintf( iScreenWidthOffset + 10, yp, L"Skipping update for %s. Probably due to tileset conflicts...", str );
+ mprintf( iScreenWidthOffset + 10, yp, pReportErrorText[0] , str );
InvalidateScreen();
yp++;
}
@@ -2905,7 +2908,7 @@ void RegenerateSummaryInfoForAllOutdatedMaps()
//DefineProgressBarPanel( 0, 65, 79, 94, 10, 80, 310, 152 );
CreateProgressBar( 0, iScreenWidthOffset + 20, iScreenHeightOffset + 100, iScreenWidthOffset + 300, iScreenHeightOffset + 112 ); //master (total)
DefineProgressBarPanel( 0, 65, 79, 94, iScreenWidthOffset + 10, iScreenHeightOffset + 80, iScreenWidthOffset + 310, iScreenHeightOffset + 132 );
- SetProgressBarTitle( 0, L"Generating map information", BLOCKFONT2, FONT_RED, FONT_NEARBLACK );
+ SetProgressBarTitle( 0, pRegenerateSummaryInfoForAllOutdatedMapsText[0], BLOCKFONT2, FONT_RED, FONT_NEARBLACK );
SetProgressBarMsgAttributes( 0, SMALLCOMPFONT, FONT_BLACK, FONT_BLACK );
gfUpdatingNow = TRUE;
@@ -2985,7 +2988,7 @@ void SummaryUpdateCallback( GUI_BUTTON *btn, INT32 reason )
CHAR8 str[40];
CreateProgressBar( 0, iScreenWidthOffset + 20, iScreenHeightOffset + 100, iScreenWidthOffset + 300, iScreenHeightOffset + 112 ); //slave (individual)
DefineProgressBarPanel( 0, 65, 79, 94, iScreenWidthOffset + 10, iScreenHeightOffset + 80, iScreenWidthOffset + 310, iScreenHeightOffset + 132 );
- SetProgressBarTitle( 0, L"Generating map summary", BLOCKFONT2, FONT_RED, FONT_NEARBLACK );
+ SetProgressBarTitle( 0, pSummaryUpdateCallbackText[0], BLOCKFONT2, FONT_RED, FONT_NEARBLACK );
SetProgressBarMsgAttributes( 0, SMALLCOMPFONT, FONT_BLACK, FONT_BLACK );
#if 0
@@ -3094,16 +3097,16 @@ void ApologizeOverrideAndForceUpdateEverything()
SetFont( HUGEFONT );
SetFontForeground( FONT_RED );
SetFontShadow( FONT_NEARBLACK );
- swprintf( str, L"MAJOR VERSION UPDATE" );
+ swprintf( str, pApologizeOverrideAndForceUpdateEverythingText[0] );
mprintf( (iScreenWidthOffset + 320) - StringPixLength( str, HUGEFONT )/2, iScreenHeightOffset + 105, str );
SetFont( FONT10ARIAL );
SetFontForeground( FONT_YELLOW );
- swprintf( str, L"There are %d maps requiring a major version update.", gusNumberOfMapsToBeForceUpdated );
+ swprintf( str, pApologizeOverrideAndForceUpdateEverythingText[1], gusNumberOfMapsToBeForceUpdated );
mprintf( (iScreenWidthOffset + 320) - StringPixLength( str, FONT10ARIAL )/2, iScreenHeightOffset + 130, str );
CreateProgressBar( 2, iScreenWidthOffset + 120, iScreenHeightOffset + 170, iScreenWidthOffset + 520, iScreenHeightOffset + 202 );
DefineProgressBarPanel( 2, 65, 79, 94, iScreenWidthOffset + 100, iScreenHeightOffset + 150, iScreenWidthOffset + 540, iScreenHeightOffset + 222 );
- SetProgressBarTitle( 2, L"Updating all outdated maps", BLOCKFONT2, FONT_RED, 0 );
+ SetProgressBarTitle( 2, pApologizeOverrideAndForceUpdateEverythingText[2], BLOCKFONT2, FONT_RED, 0 );
SetProgressBarMsgAttributes( 2, SMALLCOMPFONT, FONT_BLACK, FONT_BLACK );
gusCurrent = 0;
diff --git a/Editor/editscreen.cpp b/Editor/editscreen.cpp
index b2e49663..403a8d94 100644
--- a/Editor/editscreen.cpp
+++ b/Editor/editscreen.cpp
@@ -77,6 +77,7 @@
#include "cursors.h"//dnl ch2 210909
#include "Cursor Control.h"//dnl ch2 210909
#include "maputility.h"//dnl ch49 061009
+ #include "Text.h"
#endif
//forward declarations of common classes to eliminate includes
@@ -164,6 +165,7 @@ BOOLEAN fDontUseClick = FALSE;//dnl ch7 210909
BOOLEAN fShowHighGround = FALSE;//dnl ch2 210909
BOOLEAN fRaiseWorld = FALSE;//dnl ch3 210909
BOOLEAN gfVanillaMode = TRUE;//dnl ch33 091009
+BOOLEAN gfResizeMapOnLoading = FALSE;
INT32 TestButtons[10];
@@ -476,7 +478,7 @@ BOOLEAN EditModeShutdown( void )
if( gfConfirmExitFirst )
{
gfConfirmExitPending = TRUE;
- CreateMessageBox( L"Exit editor?" );
+ CreateMessageBox( pEditModeShutdownText[0] );
return FALSE;
}
@@ -1619,15 +1621,15 @@ void HandleKeyboardShortcuts( )
case F9:
break;
case F10:
- CreateMessageBox( L"Are you sure you wish to remove all lights?" );
+ CreateMessageBox( pHandleKeyboardShortcutsText[0] );
gfRemoveLightsPending = TRUE;
break;
case F11:
- CreateMessageBox( L"Are you sure you wish to reverse the schedules?" );
+ CreateMessageBox( pHandleKeyboardShortcutsText[1] );
gfScheduleReversalPending = TRUE;
break;
case F12:
- CreateMessageBox( L"Are you sure you wish to clear all of the schedules?" );
+ CreateMessageBox( pHandleKeyboardShortcutsText[2] );
gfScheduleClearPending = TRUE;
break;
@@ -1710,12 +1712,12 @@ void HandleKeyboardShortcuts( )
if(fDontUseClick)
{
fDontUseClick = FALSE;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Clicked Placement Enabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[3] );
}
else
{
fDontUseClick = TRUE;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Clicked Placement Disabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[4] );
}
break;
case 'd': // debris
@@ -1810,12 +1812,12 @@ void HandleKeyboardShortcuts( )
if(iDrawMode != DRAW_MODE_HIGH_GROUND)
{
iDrawMode = DRAW_MODE_HIGH_GROUND;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Draw High Ground Enabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[5] );
}
else
{
iDrawMode = DRAW_MODE_NOTHING;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Draw High Ground Disabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[6] );
}
break;
#ifdef dnlTEST
@@ -1851,7 +1853,7 @@ void HandleKeyboardShortcuts( )
}
break;
case 'L'://dnl ch23 210909
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Number of edge points: N=%d E=%d S=%d W=%d", gus1stNorthEdgepointArraySize, gus1stEastEdgepointArraySize, gus1stSouthEdgepointArraySize, gus1stWestEdgepointArraySize);
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[7], gus1stNorthEdgepointArraySize, gus1stEastEdgepointArraySize, gus1stSouthEdgepointArraySize, gus1stWestEdgepointArraySize);
ToggleMapEdgepoints();
break;
#ifdef dnlTEST
@@ -1898,12 +1900,12 @@ void HandleKeyboardShortcuts( )
if(fDontUseRandom)
{
fDontUseRandom = FALSE;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Random Placement Enabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[8] );
}
else
{
fDontUseRandom = TRUE;
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Random Placement Disabled");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pHandleKeyboardShortcutsText[9] );
}
break;
case 's':
@@ -1926,12 +1928,12 @@ void HandleKeyboardShortcuts( )
case 'T':
if ( fShowTrees )
{
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Removing Treetops" );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pHandleKeyboardShortcutsText[10] );
WorldHideTrees( );
}
else
{
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Showing Treetops" );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pHandleKeyboardShortcutsText[11] );
WorldShowTrees( );
}
fShowTrees = !fShowTrees;
@@ -1948,7 +1950,7 @@ void HandleKeyboardShortcuts( )
gpWorldLevelData[cnt].sHeight = 0;
fShowHighGround = FALSE;
ShowHighGround(3);
- ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"World Raise Reset");
+ ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pHandleKeyboardShortcutsText[12] );
}
else
{
@@ -1956,12 +1958,12 @@ void HandleKeyboardShortcuts( )
if(EditorInputEvent.usParam == 'U')
{
RaiseWorldLandOld();
- ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"World Raise Set Old");
+ ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pHandleKeyboardShortcutsText[13] );
}
else
{
RaiseWorldLand();
- ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"World Raise Set");
+ ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pHandleKeyboardShortcutsText[14] );
}
}
break;
@@ -2068,7 +2070,7 @@ UINT32 PerformSelectedAction( void )
break;
case ACTION_RADAR_MAP://dnl ch9 071009
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Creating radar map for %S", gubFilename);
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pPerformSelectedActionText[0], gubFilename);
MarkWorldDirty();
return(MAPUTILITY_SCREEN);
break;
@@ -2119,16 +2121,16 @@ UINT32 PerformSelectedAction( void )
ExtractAndUpdateOptions();//dnl ch52 091009
fNewMap = TRUE;
if( gfPendingBasement )
- CreateMessageBox( L"Delete current map and start a new basement level?" );
+ CreateMessageBox( pPerformSelectedActionText[1] );
else if( gfPendingCaves )
- CreateMessageBox( L"Delete current map and start a new cave level?" );
+ CreateMessageBox( pPerformSelectedActionText[2] );
else
- CreateMessageBox( L"Delete current map and start a new outdoor level?" );
+ CreateMessageBox( pPerformSelectedActionText[3] );
break;
case ACTION_SET_NEW_BACKGROUND:
if (!fBeenWarned)
- CreateMessageBox( L" Wipe out ground textures? " );
+ CreateMessageBox( pPerformSelectedActionText[4] );
else
{
gCurrentBackground = TerrainBackgroundTile;
@@ -2566,68 +2568,68 @@ UINT32 WaitForHelpScreenResponse( void )
SetFont( gp12PointFont1 );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 55, L"HOME" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 55, L"Toggle fake editor lighting ON/OFF" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 55, pWaitForHelpScreenResponseText[0] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 55, pWaitForHelpScreenResponseText[1] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 67, L"INSERT" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 67, L"Toggle fill mode ON/OFF" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 67, pWaitForHelpScreenResponseText[2] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 67, pWaitForHelpScreenResponseText[3] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 79, L"BKSPC" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 79, L"Undo last change" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 79, pWaitForHelpScreenResponseText[4] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 79, pWaitForHelpScreenResponseText[5] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 91, L"DEL" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 91, L"Quick erase object under mouse cursor" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 91, pWaitForHelpScreenResponseText[6] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 91, pWaitForHelpScreenResponseText[7] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 103, L"ESC" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 103, L"Exit editor" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 103, pWaitForHelpScreenResponseText[8] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 103, pWaitForHelpScreenResponseText[9] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 115, L"PGUP/PGDN" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 115, L"Change object to be pasted" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 115, pWaitForHelpScreenResponseText[10] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 115, pWaitForHelpScreenResponseText[11] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 127, L"F1" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 127, L"This help screen" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 127, pWaitForHelpScreenResponseText[12] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 127, pWaitForHelpScreenResponseText[13] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 139, L"F10" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 139, L"Save current map" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 139, pWaitForHelpScreenResponseText[14] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 139, pWaitForHelpScreenResponseText[15] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 151, L"F11" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 151, L"Load map as current" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 151, pWaitForHelpScreenResponseText[16] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 151, pWaitForHelpScreenResponseText[17] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 163, L"+/-" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 163, L"Change shadow darkness by .01" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 163, pWaitForHelpScreenResponseText[18] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 163, pWaitForHelpScreenResponseText[19] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 175, L"SHFT +/-" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 175, L"Change shadow darkness by .05" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 175, pWaitForHelpScreenResponseText[20] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 175, pWaitForHelpScreenResponseText[21] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 187, L"0 - 9" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 187, L"Change map/tileset filename" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 187, pWaitForHelpScreenResponseText[22] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 187, pWaitForHelpScreenResponseText[23] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 199, L"b" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 199, L"Change brush size" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 199, pWaitForHelpScreenResponseText[24] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 199, pWaitForHelpScreenResponseText[25] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 211, L"d" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 211, L"Draw debris" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 211, pWaitForHelpScreenResponseText[26] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 211, pWaitForHelpScreenResponseText[27] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 223, L"o" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 223, L"Draw obstacle" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 223, pWaitForHelpScreenResponseText[28] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 223, pWaitForHelpScreenResponseText[29] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 235, L"r" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 235, L"Draw rocks" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 235, pWaitForHelpScreenResponseText[30] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 235, pWaitForHelpScreenResponseText[31] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 247, L"t" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 247, L"Toggle trees display ON/OFF" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 247, pWaitForHelpScreenResponseText[32] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 247, pWaitForHelpScreenResponseText[33] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 259, L"g" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 259, L"Draw ground textures" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 259, pWaitForHelpScreenResponseText[34] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 259, pWaitForHelpScreenResponseText[35] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 271, L"w" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 271, L"Draw building walls" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 271, pWaitForHelpScreenResponseText[36] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 271, pWaitForHelpScreenResponseText[37] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 283, L"e" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 283, L"Toggle erase mode ON/OFF" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 283, pWaitForHelpScreenResponseText[38] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 283, pWaitForHelpScreenResponseText[39] );
- gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 295, L"h" );
- gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 295, L"Toggle roofs ON/OFF" );
+ gprintf( iScreenWidthOffset + 55, iScreenHeightOffset + 295, pWaitForHelpScreenResponseText[40] );
+ gprintf( iScreenWidthOffset + 205, iScreenHeightOffset + 295, pWaitForHelpScreenResponseText[41] );
fLeaveScreen = FALSE;
@@ -4312,7 +4314,7 @@ UINT32 EditScreenHandle( void )
if( gfWorldLoaded && gMapInformation.ubMapVersion <= 7 && !gfCorruptMap )
{
- ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!" );
+ ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, pAutoLoadMapText[0] );
gfCorruptMap = TRUE;
}
if( gfWorldLoaded && gubScheduleID > 40 && !gfCorruptSchedules )
@@ -4320,7 +4322,7 @@ UINT32 EditScreenHandle( void )
OptimizeSchedules();
if( gubScheduleID > 32 )
{
- ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!" );
+ ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, pAutoLoadMapText[1] );
gfCorruptSchedules = TRUE;
}
}
@@ -4527,7 +4529,7 @@ void ShowHighGround(INT32 iShowHighGroundCommand)//dnl ch2 210909
}
break;
case 1:
- ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, L"Showing High Ground Markers");
+ ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, pShowHighGroundText[0] );
for(int cnt=0; cntuiIndex;
if( !gTilesets[ giCurrentTilesetID].TileSurfaceFilenames[ pNode->uiObjIndx ][0] )
{
- mprintf( 2, 2, L"%S[%d] is from default tileset %s (%S)",
+ mprintf( 2, 2, pDisplaySelectionWindowGraphicalInformationText[0],
gTilesets[0].TileSurfaceFilenames[ pNode->uiObjIndx ],
pNode->uiIndex, gTilesets[0].zName,
gTileSurfaceName[ pNode->uiObjIndx ] );
}
else
{
- mprintf( 2, 2, L"File: %S, subindex: %d (%S)",
+ mprintf( 2, 2, pDisplaySelectionWindowGraphicalInformationText[1],
gTilesets[ giCurrentTilesetID ].TileSurfaceFilenames[ pNode->uiObjIndx ],
pNode->uiIndex, gTileSurfaceName[ pNode->uiObjIndx ] );
}
}
- mprintf( 350, 2, L"Current Tileset: %s", gTilesets[ giCurrentTilesetID ].zName );
+ mprintf( 350, 2, pDisplaySelectionWindowGraphicalInformationText[2], gTilesets[ giCurrentTilesetID ].zName );
}
//----------------------------------------------------------------------------------------------
diff --git a/GameSettings.cpp b/GameSettings.cpp
index 08f9e1b2..2b80fa73 100644
--- a/GameSettings.cpp
+++ b/GameSettings.cpp
@@ -41,6 +41,8 @@
#include "connect.h"
#include "sgp_logger.h"
+#include "Map Information.h"
+
#include
#include
#include
@@ -95,7 +97,7 @@ bool UsingNewAttachmentSystem()
bool UsingNewCTHSystem()
{
- return (gGameExternalOptions.fUseNCTH == TRUE);
+ return (gGameSettings.fOptions[TOPTION_USE_NCTH] == TRUE);
}
std::string StringToLower(std::string strToConvert)
@@ -152,7 +154,7 @@ BOOLEAN LoadGameSettings()
gGameSettings.fOptions[TOPTION_SHOW_MISSES] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SHOW_MISSES" , FALSE );
gGameSettings.fOptions[TOPTION_RTCONFIRM] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_RTCONFIRM" , FALSE );
gGameSettings.fOptions[TOPTION_SLEEPWAKE_NOTIFICATION] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SLEEPWAKE_NOTIFICATION" , TRUE );
- gGameSettings.fOptions[TOPTION_USE_METRIC_SYSTEM] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_USE_METRIC_SYSTEM" , FALSE );
+ gGameSettings.fOptions[TOPTION_USE_METRIC_SYSTEM] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_USE_METRIC_SYSTEM" , TRUE );
gGameSettings.fOptions[TOPTION_MERC_ALWAYS_LIGHT_UP] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_MERC_ALWAYS_LIGHT_UP" , FALSE );
gGameSettings.fOptions[TOPTION_SMART_CURSOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SMART_CURSOR" , FALSE );
gGameSettings.fOptions[TOPTION_SNAP_CURSOR_TO_DOOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SNAP_CURSOR_TO_DOOR" , TRUE );
@@ -174,13 +176,16 @@ BOOLEAN LoadGameSettings()
gGameSettings.fOptions[TOPTION_ALLOW_SOLDIER_TOOLTIPS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_ALLOW_SOLDIER_TOOLTIPS" , TRUE );
gGameSettings.fOptions[TOPTION_USE_AUTO_SAVE] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_USE_AUTO_SAVE" , FALSE );
gGameSettings.fOptions[TOPTION_SILENT_SKYRIDER] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SILENT_SKYRIDER" , FALSE );
- gGameSettings.fOptions[TOPTION_LOW_CPU_USAGE] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_LOW_CPU_USAGE" , FALSE );
- gGameSettings.fOptions[TOPTION_ENHANCED_DESC_BOX] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_ENHANCED_DESC_BOX" , FALSE );
+ //gGameSettings.fOptions[TOPTION_LOW_CPU_USAGE] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_LOW_CPU_USAGE" , FALSE );
+ gGameSettings.fOptions[TOPTION_ENHANCED_DESC_BOX] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_ENHANCED_DESC_BOX" , TRUE );
gGameSettings.fOptions[TOPTION_TOGGLE_TURN_MODE] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_TOGGLE_TURN_MODE" , FALSE );
gGameSettings.fOptions[TOPTION_STAT_PROGRESS_BARS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_STAT_PROGRESS_BARS" , TRUE ); // HEADROCK HAM 3.6: Progress Bars
gGameSettings.fOptions[TOPTION_REPORT_MISS_MARGIN] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_REPORT_MISS_MARGIN" , FALSE ); // HEADROCK HAM 4: Shot offset report
gGameSettings.fOptions[TOPTION_ALT_MAP_COLOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_ALT_MAP_COLOR" , FALSE ); // HEADROCK HAM 4: Strategic Map Colors
gGameSettings.fOptions[TOPTION_ALTERNATE_BULLET_GRAPHICS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_ALTERNATE_BULLET_GRAPHICS" , TRUE );
+ gGameSettings.fOptions[TOPTION_USE_NCTH] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_USE_NCTH" , TRUE );
+ gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SHOW_TACTICAL_FACE_GEAR" , TRUE );
+ gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_ICONS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SHOW_TACTICAL_FACE_ICONS" , TRUE );
gGameSettings.fOptions[TOPTION_CHEAT_MODE_OPTIONS_HEADER] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_CHEAT_MODE_OPTIONS_HEADER" , FALSE );
gGameSettings.fOptions[TOPTION_FORCE_BOBBY_RAY_SHIPMENTS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_FORCE_BOBBY_RAY_SHIPMENTS" , FALSE );
gGameSettings.fOptions[TOPTION_CHEAT_MODE_OPTIONS_END] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_CHEAT_MODE_OPTIONS_END" , FALSE );
@@ -343,12 +348,15 @@ BOOLEAN SaveGameSettings()
settings << "TOPTION_ALLOW_SOLDIER_TOOLTIPS = " << (gGameSettings.fOptions[TOPTION_ALLOW_SOLDIER_TOOLTIPS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_USE_AUTO_SAVE = " << (gGameSettings.fOptions[TOPTION_USE_AUTO_SAVE] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_SILENT_SKYRIDER = " << (gGameSettings.fOptions[TOPTION_SILENT_SKYRIDER] ? "TRUE" : "FALSE" ) << endl;
- settings << "TOPTION_LOW_CPU_USAGE = " << (gGameSettings.fOptions[TOPTION_LOW_CPU_USAGE] ? "TRUE" : "FALSE" ) << endl;
+ //settings << "TOPTION_LOW_CPU_USAGE = " << (gGameSettings.fOptions[TOPTION_LOW_CPU_USAGE] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_ENHANCED_DESC_BOX = " << (gGameSettings.fOptions[TOPTION_ENHANCED_DESC_BOX] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_TOGGLE_TURN_MODE = " << (gGameSettings.fOptions[TOPTION_TOGGLE_TURN_MODE] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_STAT_PROGRESS_BARS = " << (gGameSettings.fOptions[TOPTION_STAT_PROGRESS_BARS] ? "TRUE" : "FALSE" ) << endl; // HEADROCK HAM 3.6: Progress Bars
settings << "TOPTION_ALT_MAP_COLOR = " << (gGameSettings.fOptions[TOPTION_ALT_MAP_COLOR] ? "TRUE" : "FALSE" ) << endl; // HEADROCK HAM 4: Alt Map Colors
settings << "TOPTION_ALTERNATE_BULLET_GRAPHICS = " << (gGameSettings.fOptions[TOPTION_ALTERNATE_BULLET_GRAPHICS] ? "TRUE" : "FALSE" ) << endl;
+ settings << "TOPTION_USE_NCTH = " << (gGameSettings.fOptions[TOPTION_USE_NCTH] ? "TRUE" : "FALSE" ) << endl;
+ settings << "TOPTION_SHOW_TACTICAL_FACE_GEAR = " << (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR] ? "TRUE" : "FALSE" ) << endl;
+ settings << "TOPTION_SHOW_TACTICAL_FACE_ICONS = " << (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_ICONS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_CHEAT_MODE_OPTIONS_HEADER = " << (gGameSettings.fOptions[TOPTION_CHEAT_MODE_OPTIONS_HEADER] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_FORCE_BOBBY_RAY_SHIPMENTS = " << (gGameSettings.fOptions[TOPTION_FORCE_BOBBY_RAY_SHIPMENTS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_CHEAT_MODE_OPTIONS_END = " << (gGameSettings.fOptions[TOPTION_CHEAT_MODE_OPTIONS_END] ? "TRUE" : "FALSE" ) << endl;
@@ -420,7 +428,7 @@ void InitGameSettings()
gGameSettings.fOptions[ TOPTION_SHOW_MISSES ] = FALSE;
gGameSettings.fOptions[ TOPTION_RTCONFIRM ] = FALSE;
gGameSettings.fOptions[ TOPTION_SLEEPWAKE_NOTIFICATION ] = TRUE;
- gGameSettings.fOptions[ TOPTION_USE_METRIC_SYSTEM ] = FALSE;
+ gGameSettings.fOptions[ TOPTION_USE_METRIC_SYSTEM ] = TRUE;
gGameSettings.fOptions[ TOPTION_MERC_ALWAYS_LIGHT_UP ] = FALSE;
gGameSettings.fOptions[ TOPTION_SMART_CURSOR ] = FALSE;
gGameSettings.fOptions[ TOPTION_SNAP_CURSOR_TO_DOOR ] = TRUE;
@@ -446,8 +454,8 @@ void InitGameSettings()
gGameSettings.fOptions[ TOPTION_ALLOW_SOLDIER_TOOLTIPS ] = TRUE;
gGameSettings.fOptions[ TOPTION_USE_AUTO_SAVE ] = FALSE;
gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] = FALSE;
- gGameSettings.fOptions[ TOPTION_LOW_CPU_USAGE ] = FALSE;
- gGameSettings.fOptions[ TOPTION_ENHANCED_DESC_BOX ] = FALSE;
+ //gGameSettings.fOptions[ TOPTION_LOW_CPU_USAGE ] = FALSE;
+ gGameSettings.fOptions[ TOPTION_ENHANCED_DESC_BOX ] = TRUE;
// arynn
gGameSettings.fOptions[ TOPTION_TOGGLE_TURN_MODE ] = FALSE;
@@ -458,7 +466,14 @@ void InitGameSettings()
// HEADROCK HAM 4:
gGameSettings.fOptions[ TOPTION_ALT_MAP_COLOR ] = FALSE;
- gGameSettings.fOptions[ TOPTION_ALTERNATE_BULLET_GRAPHICS ] = FALSE;
+ gGameSettings.fOptions[ TOPTION_ALTERNATE_BULLET_GRAPHICS ] = TRUE;
+
+ // CHRISL: HAM 4: Activate/Deactivate NCTH mode
+ gGameSettings.fOptions[ TOPTION_USE_NCTH ] = TRUE;
+
+ // WANNE:
+ gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_GEAR ] = TRUE;
+ gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_ICONS ] = TRUE;
gGameSettings.fOptions[ TOPTION_REPORT_MISS_MARGIN ] = FALSE;
@@ -503,22 +518,12 @@ void InitGameOptions()
{
memset( &gGameOptions, 0, sizeof( GAME_OPTIONS ) );
- //Init the game options
-
- if (is_networked)
- gGameOptions.ubBobbyRay = BR_AWESOME;// hayden, was BR_GOOD;
- else
- gGameOptions.ubBobbyRay = BR_GOOD;
-
+ gGameOptions.ubBobbyRay = BR_GOOD;
gGameOptions.fGunNut = TRUE;
gGameOptions.fAirStrikes = FALSE;
-
- if (is_networked)
- gGameOptions.ubGameStyle = STYLE_REALISTIC;//hayden, was STYLE_SCIFI;
- else
- gGameOptions.ubGameStyle = STYLE_SCIFI;
-
+ gGameOptions.ubGameStyle = STYLE_SCIFI;
gGameOptions.ubDifficultyLevel = DIF_LEVEL_MEDIUM;
+
//CHRISL: override default inventory mode when in low res
if(IsNIVModeValid(true) == FALSE)
{
@@ -531,11 +536,7 @@ void InitGameOptions()
gGameOptions.ubAttachmentSystem = ATTACHMENT_OLD;
}
- if (is_networked)
- gGameOptions.fTurnTimeLimit = TRUE;//hayden
- else
- gGameOptions.fTurnTimeLimit = FALSE;
-
+ gGameOptions.fTurnTimeLimit = FALSE;
gGameOptions.fIronManMode = FALSE;
// following added by SANDRO
@@ -711,7 +712,7 @@ void LoadGameExternalOptions()
gGameExternalOptions.iImpAttributePoints = ((gGameExternalOptions.iMinAttribute * 5) + (gGameExternalOptions.iMaxZeroBonus * 5));
}
- gGameExternalOptions.iMaxAttribute = iniReader.ReadInteger("Recruitment Settings","IMP_MAX_ATTRIBUTE",90, gGameExternalOptions.iMinAttribute+1, 100);
+ gGameExternalOptions.iMaxAttribute = iniReader.ReadInteger("Recruitment Settings","IMP_MAX_ATTRIBUTE",90, gGameExternalOptions.iMinAttribute, 100);
gGameExternalOptions.iIMPStartingLevelCostMultiplier = iniReader.ReadInteger("Recruitment Settings","IMP_STARTING_LEVEL_COST_MULTIPLIER", 5, 0, 100);
gGameExternalOptions.iBonusPointsForDisability = iniReader.ReadInteger("Recruitment Settings","IMP_BONUS_POINTS_FOR_DISABILITY",20, 0, 500);
gGameExternalOptions.iBonusPointsPerSkillNotTaken = iniReader.ReadInteger("Recruitment Settings","IMP_BONUS_POINTS_PER_SKILL_NOT_TAKEN",25, 0, 500);
@@ -862,9 +863,11 @@ void LoadGameExternalOptions()
break;
}
+ // WANNE: Moved to options screen
//legion by Jazz
- gGameExternalOptions.fShowTacticalFaceGear = iniReader.ReadBoolean("Tactical Interface Settings","SHOW_TACTICAL_FACE_GEAR",FALSE);
- gGameExternalOptions.fShowTacticalFaceIcons = iniReader.ReadBoolean("Tactical Interface Settings","SHOW_TACTICAL_FACE_ICONS",FALSE);
+ /*gGameExternalOptions.fShowTacticalFaceGear = iniReader.ReadBoolean("Tactical Interface Settings","SHOW_TACTICAL_FACE_GEAR",FALSE);
+ gGameExternalOptions.fShowTacticalFaceIcons = iniReader.ReadBoolean("Tactical Interface Settings","SHOW_TACTICAL_FACE_ICONS",FALSE);*/
+
gGameExternalOptions.bTacticalFaceIconStyle = iniReader.ReadInteger("Tactical Interface Settings","TACTICAL_FACE_ICON_STYLE", 0, 0, 3);
// Camo portraits by Jazz
@@ -997,6 +1000,9 @@ void LoadGameExternalOptions()
//################# Tactical Gameplay Settings ##################
+ // WANNE: Externalized grid number of new merc when they arrive with the helicopter (by Jazz)
+ gGameExternalOptions.iInitialMercArrivalLocation = iniReader.ReadInteger("Tactical Gameplay Settings","INITIAL_MERC_ARRIVAL_LOCATION", 4870 );
+
// HEADROCK HAM B1: Set minimum and maximum CTH
gGameExternalOptions.ubMaximumCTH = iniReader.ReadInteger("Tactical Gameplay Settings","MAXIMUM_POSSIBLE_CTH", 99, 1, 100);
@@ -1037,21 +1043,25 @@ void LoadGameExternalOptions()
// allow old behaviour
gGameExternalOptions.fAimLevelsDependOnDistance = iniReader.ReadBoolean("Tactical Gameplay Settings", "AIM_LEVELS_DEPEND_ON_DISTANCE", TRUE);
+ gGameExternalOptions.iAimLevelsCompatibilityOption = iniReader.ReadInteger("Tactical Gameplay Settings", "AIM_LEVELS_COMPATIBILITY_OPTION", 0, -10000, 10000);
//WarmSteel - These determine in which group each scope belongs. Needed for dynamic aiming limits.
gGameExternalOptions.sVeryHighPowerScope = iniReader.ReadInteger("Tactical Gameplay Settings","VERY_HIGH_POWER_SCOPE_AIM_THRESHOLD", 18, 0, 255);
gGameExternalOptions.sHighPowerScope = iniReader.ReadInteger("Tactical Gameplay Settings","HIGH_POWER_SCOPE_AIM_THRESHOLD", 13, 0, 255);
gGameExternalOptions.sMediumPowerScope = iniReader.ReadInteger("Tactical Gameplay Settings","MEDIUM_POWER_SCOPE_AIM_THRESHOLD", 8, 0, 255);
+ //CHRISL: AI Sniper fields
+ gGameExternalOptions.fAISniperElite = iniReader.ReadBoolean("Tactical Gameplay Settings", "AI_SNIPER_RESTRICT_TO_ELITE", TRUE);
+ gGameExternalOptions.fAISniperRange = iniReader.ReadInteger("Tactical Gameplay Settings","AI_SNIPER_MIN_RANGE ", 40, 0, 1000);
+ gGameExternalOptions.fAISniperChance = iniReader.ReadInteger("Tactical Gameplay Settings","AI_SNIPER_CHANCE ", 30, 0, 100);
+ gGameExternalOptions.fAISniperChanceWithSR = iniReader.ReadInteger("Tactical Gameplay Settings","AI_SNIPER_CHANCE_WITH_SR ", 80, 0, 100);
+
// HEADROCK HAM B2.6: Controls how much effect target movement has on aiming
gGameExternalOptions.iMovementEffectOnAiming = (float)iniReader.ReadDouble("Tactical Gameplay Settings","CTH_PENALTY_FOR_TARGET_MOVEMENT", 1.5, 0.0, 255.0);
// HEADROCK HAM 3.3: Externalized maximum possible penalty for hitting a moving target. JA2 Default = 30.
gGameExternalOptions.usMaxCTHPenaltyForMovingTarget = iniReader.ReadInteger("Tactical Gameplay Settings","MAX_CTH_PENALTY_FOR_TARGET_MOVEMENT", 30, 0, 300);
- // CHRISL: HAM4-NCTH
- gGameExternalOptions.fUseNCTH = iniReader.ReadBoolean("Tactical Gameplay Settings", "USE_NCTH", FALSE, false);
-
// HEADROCK HAM 3.2: Critical Headshots may cause blindness. Rolls 1 to X change of being blinded. 0 = disabled.
gGameExternalOptions.ubChanceBlindedByHeadshot = iniReader.ReadInteger("Tactical Gameplay Settings","CHANCE_BLINDED_BY_HEADSHOT", 0, 0, 100);
@@ -1186,8 +1196,9 @@ void LoadGameExternalOptions()
// HEADROCK HAM B2.3: A "cowering" soldier is twice as susceptible to suppression.
gGameExternalOptions.ubCowerEffectOnSuppression = iniReader.ReadInteger("Tactical Suppression Fire Settings","COWERING_PENALTY_TO_SUPPRESSION_TOLERANCE", 4, 0, 24 );
- // HEADROCK HAM B2.6: Toggle whether AI checks for larger magazine when wanting to use burst/auto or suppress from beyond sight range. Also makes enemies less prone to fleeing.
- gGameExternalOptions.fIncreaseAISuppressionFire = iniReader.ReadBoolean("Tactical Suppression Fire Settings","INCREASE_AI_WILLINGNESS_TO_SUPPRESS", FALSE);
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ gGameExternalOptions.ubAISuppressionMinimumMagSize = iniReader.ReadInteger("Tactical Suppression Fire Settings","AI_SUPPRESS_MIN_MAG_SIZE", 30, 0, 1000);
+ gGameExternalOptions.ubAISuppressionMinimumAmmo = iniReader.ReadInteger("Tactical Suppression Fire Settings","AI_SUPPRESS_MIN_AMMO_REMAINING", 20, 0, 1000);
// HEADROCK HAM 3.5: Explosive Suppression Effectiveness alters the amount of Suppression Points you get from nearby blasts.
gGameExternalOptions.usExplosionSuppressionEffect = iniReader.ReadInteger("Tactical Suppression Fire Settings","EXPLOSIVE_SUPPRESSION_EFFECTIVENESS", 100, 0, 1000);
@@ -1584,9 +1595,9 @@ void LoadGameExternalOptions()
gGameExternalOptions.ubTrainingSkillMin = iniReader.ReadInteger("Strategic Assignment Settings","MIN_REQUIRED_SKILL_TO_BEGIN_TRAINING",0, 0, 100);
gGameExternalOptions.ubTrainingSkillMax = iniReader.ReadInteger("Strategic Assignment Settings","MAX_SKILL_ACHIEVABLE_BY_TRAINING",100, 0, 100);
gGameExternalOptions.ubSelfTrainingDivisor = iniReader.ReadInteger("Strategic Assignment Settings","TRAINING_RATE_DIVISOR",1000, 1, 10000);
- gGameExternalOptions.ubInstructedTrainingDivisor = iniReader.ReadInteger("Strategic Assignment Settings","INSTRUCTED_TRAINING_BONUS_DIVISOR",3000, 1, 10000);
+ gGameExternalOptions.ubInstructedTrainingDivisor = iniReader.ReadInteger("Strategic Assignment Settings","INSTRUCTED_TRAINING_DIVISOR",3000, 1, 10000);
- gGameExternalOptions.ubTeachBonusToTrain = iniReader.ReadInteger("Strategic Assignment Settings","TEACHER_TRAIT_BONUS_TO_TEACHING_EFFICIENCY",30, 0, 100);
+ gGameExternalOptions.ubTeachBonusToTrain = iniReader.ReadInteger("Strategic Assignment Settings","TEACHER_TRAIT_BONUS_TO_TRAINING_EFFICIENCY",30, 0, 100);
gGameExternalOptions.ubMinSkillToTeach = iniReader.ReadInteger("Strategic Assignment Settings","MIN_SKILL_REQUIRED_TO_TEACH_OTHER",25, 0, 100);
// HEADROCK HAM B2.8: New Trainer Relations: 2 = Trainees will go to sleep when their trainer goes to sleep. 3 = Trainer will go to sleep if all trainees are asleep. 1 = Both. 0 = Neither.
@@ -1619,8 +1630,8 @@ void LoadGameExternalOptions()
//SaveGame slot by Jazz
// WANNE: No need to make it external to switch between old/new. We always use the new save/load screen with more save slots
//gGameExternalOptions.fSaveGameSlot = iniReader.ReadBoolean("Extension","SAVE_GAMES_SLOT",FALSE);
- gGameExternalOptions.fSaveGameSlot = TRUE;
-
+ gGameExternalOptions.fSaveGameSlot = TRUE;
+
// WANNE: This is just a debug setting. Only in debug version we set that property to TRUE.
// In Release version this should always be set to FALSE
// dnl ch51 081009 JA2 Debug Settings
@@ -1910,6 +1921,10 @@ void LoadGameAPBPConstants()
//CHRISL: Once we've loaded the AP_MAXIMUM value, we can use it to modifiy all the remaining values
APBPConstants[AP_MINIMUM] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_MINIMUM",40, 10, 100),40);
+
+ // WANNE: Externalized minimum APs to get an interrupt
+ APBPConstants[MIN_APS_TO_INTERRUPT] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","MIN_APS_TO_INTERRUPT",16),16);
+
APBPConstants[AP_MONSTER_MAXIMUM] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_MONSTER_MAXIMUM",160),160);
APBPConstants[AP_VEHICLE_MAXIMUM] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_VEHICLE_MAXIMUM",200),200);
APBPConstants[MAX_AP_CARRIED] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","MAX_AP_CARRIED",20),20);
@@ -2000,11 +2015,15 @@ void LoadGameAPBPConstants()
APBPConstants[AP_FIFTH_CLICK_AIM_SCOPE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_FIFTH_CLICK_AIM_SCOPE",4),4);
APBPConstants[AP_SIXTH_CLICK_AIM_SCOPE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_SIXTH_CLICK_AIM_SCOPE",4),4);
APBPConstants[AP_SEVENTH_CLICK_AIM_SCOPE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_SEVENTH_CLICK_AIM_SCOPE",4),4);
- APBPConstants[AP_EIGHTTH_CLICK_AIM_SCOPE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_EIGHTTH_CLICK_AIM_SCOPE",4),4);
+ APBPConstants[AP_EIGHTH_CLICK_AIM_SCOPE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_EIGHTH_CLICK_AIM_SCOPE",4),4);
APBPConstants[AUTOFIRE_SHOTS_AP_VALUE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AUTOFIRE_SHOTS_AP_VALUE",20),20);
APBPConstants[BAD_AP_COST] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","BAD_AP_COST",36),36);
APBPConstants[AP_RELOAD_LOOSE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_RELOAD_LOOSE",8),8);
APBPConstants[AP_UNJAM] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_UNJAM",2),2);
+
+ // WANNE: APs needed when you jump through a window
+ APBPConstants[AP_JUMPWINDOW] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_JUMPWINDOW",40),40);
+
APBPConstants[AP_MAX_SUPPRESSED] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_MAX_SUPPRESSED",64),64);
APBPConstants[AP_MAX_TURN_SUPPRESSED] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_MAX_TURN_SUPPRESSED",200),200);
APBPConstants[AP_MIN_LIMIT] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_MIN_LIMIT",-100),-100);
@@ -2014,6 +2033,7 @@ void LoadGameAPBPConstants()
APBPConstants[AP_SUPPRESSION_SHOCK_DIVISOR] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_SUPPRESSION_SHOCK_DIVISOR",4),4);
// HEADROCK HAM 3.2: Modifier for legshot AP loss based on damage
APBPConstants[AP_LOSS_PER_LEGSHOT_DAMAGE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_LOSS_PER_LEGSHOT_DAMAGE",4),4);
+
APBPConstants[DEFAULT_APS] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","DEFAULT_APS",80),80);
APBPConstants[DEFAULT_AIMSKILL] = iniReader.ReadInteger("APConstants","DEFAULT_AIMSKILL",80);
@@ -2064,7 +2084,11 @@ void LoadGameAPBPConstants()
APBPConstants[BP_WORK_ZIPPER] = iniReader.ReadInteger("APConstants","BP_WORK_ZIPPER",250);
APBPConstants[BP_UNJAM] = iniReader.ReadInteger("APConstants","BP_WORK_ZIPPER",0);
- APBPConstants[AP_JUMPWINDOW] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_JUMPWINDOW",40),40);
+ APBPConstants[BP_JUMPOFFWALL] = iniReader.ReadInteger("BPConstants","BP_JUMPOFFWALL",250);
+ APBPConstants[BP_JUMPWALL] = iniReader.ReadInteger("BPConstants","BP_JUMPWALL",500);
+
+ APBPConstants[AP_JUMPWALL] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_JUMPOFFWALL",40),40);
+ APBPConstants[AP_JUMPOFFWALL] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_JUMPWALL",24),24);
SetupMaxActionPointsAnimation();
#undef ReadInteger
@@ -2077,11 +2101,13 @@ void LoadCTHConstants()
//Kaiden: Setting Ja2_Options.ini file to be read
CIniReader iniReader(CTH_COEFFICIENTS_FILE);
- gGameCTHConstants.NORMAL_SHOOTING_DISTANCE = iniReader.ReadInteger("General","NORMAL_SHOOTING_DISTANCE",100, 1, 10000);
+ gGameCTHConstants.NORMAL_SHOOTING_DISTANCE = iniReader.ReadInteger("General","NORMAL_SHOOTING_DISTANCE",100, 10, 10000);
gGameCTHConstants.DEGREES_MAXIMUM_APERTURE = iniReader.ReadFloat("General", "DEGREES_MAXIMUM_APERTURE", 15.0, 0.0, 22.5);
- gGameCTHConstants.GRAVITY_COEFFICIENT = iniReader.ReadFloat("General", "GRAVITY_COEFFICIENT", 2.0, 0.001f, 100.0);
+ gGameCTHConstants.RANGE_COEFFICIENT = iniReader.ReadFloat("General", "RANGE_COEFFICIENT", 2.0, 0.001f, 100.0);
+ gGameCTHConstants.GRAVITY_COEFFICIENT = iniReader.ReadFloat("General", "GRAVITY_COEFFICIENT", 1.0, 0.001f, 100.0);
gGameCTHConstants.VERTICAL_BIAS = iniReader.ReadFloat("General", "VERTICAL_BIAS", 1.0f, 0.01f, 2.0f);
gGameCTHConstants.SCOPE_RANGE_MULTIPLIER = iniReader.ReadFloat("General", "SCOPE_RANGE_MULTIPLIER", 0.7f, 0.5f, 1.5f);
+ gGameCTHConstants.SIDE_FACING_DIVISOR = iniReader.ReadFloat("General", "SIDE_FACING_DIVISOR", 2.0, 1.0f, 10.0f);
////////////////////////////////////////////////////////////
// Coefficients for factors affecting Base CTH
@@ -2109,11 +2135,12 @@ void LoadCTHConstants()
gGameCTHConstants.BASE_AGILE_TARGET = iniReader.ReadFloat("Base CTH","BASE_AGILE_TARGET",-5.0, -1000.0, 1000.0);
gGameCTHConstants.BASE_TARGET_INVISIBLE = iniReader.ReadFloat("Base CTH","BASE_TARGET_INVISIBLE",-100.0, -1000.0, 1000.0);
- gGameCTHConstants.BASE_DRAW_COST = iniReader.ReadFloat("Base CTH","BASE_DRAW_COST",-2.0, -1000.0, 1000.0);
- gGameCTHConstants.BASE_TWO_GUNS = iniReader.ReadFloat("Base CTH","BASE_TWO_GUNS",3.5, -1000.0, 1000.0);
- gGameCTHConstants.BASE_ONE_HANDED = iniReader.ReadFloat("Base CTH","BASE_ONE_HANDED",2.0, -1000.0, 1000.0);
- gGameCTHConstants.BASE_CROUCHING_STANCE = iniReader.ReadFloat("Base CTH","BASE_CROUCHING_STANCE",2.0, -1000.0, 1000.0);
- gGameCTHConstants.BASE_PRONE_STANCE = iniReader.ReadFloat("Base CTH","BASE_PRONE_STANCE",3.0, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_DRAW_COST = iniReader.ReadFloat("Base CTH","BASE_DRAW_COST",2.0, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_TWO_GUNS = iniReader.ReadFloat("Base CTH","BASE_TWO_GUNS",5.0, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_ONE_HANDED = iniReader.ReadFloat("Base CTH","BASE_ONE_HANDED",2.5, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_STANDING_STANCE = iniReader.ReadFloat("Base CTH","BASE_STANDING_STANCE",2.0, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_CROUCHING_STANCE = iniReader.ReadFloat("Base CTH","BASE_CROUCHING_STANCE",3.0, -1000.0, 1000.0);
+ gGameCTHConstants.BASE_PRONE_STANCE = iniReader.ReadFloat("Base CTH","BASE_PRONE_STANCE",4.0, -1000.0, 1000.0);
gGameCTHConstants.BASE_HEAVY_WEAPON = iniReader.ReadFloat("Base CTH","BASE_HEAVY_WEAPON",2.0, -1000.0, 1000.0);
gGameCTHConstants.BASE_DIFFICULTY[0] = -100.0;
@@ -2151,9 +2178,9 @@ void LoadCTHConstants()
gGameCTHConstants.AIM_TARGET_INVISIBLE = iniReader.ReadFloat("Aiming CTH","AIM_TARGET_INVISIBLE",-50.0, -1000.0, 1000.0);
gGameCTHConstants.AIM_SNIPER_SKILL = iniReader.ReadFloat("Aiming CTH","AIM_SNIPER_SKILL",25.0, -100.0, 100.0);
- gGameCTHConstants.AIM_DRAW_COST = iniReader.ReadFloat("Aiming CTH","AIM_DRAW_COST",-2.5, -1000.0, 1000.0);
- gGameCTHConstants.AIM_STANDING_STANCE = iniReader.ReadFloat("Aiming CTH","AIM_STANDING_STANCE",2.5, -1000.0, 1000.0);
- gGameCTHConstants.AIM_CROUCHING_STANCE = iniReader.ReadFloat("Aiming CTH","AIM_CROUCHING_STANCE",1.5, -1000.0, 1000.0);
+ gGameCTHConstants.AIM_DRAW_COST = iniReader.ReadFloat("Aiming CTH","AIM_DRAW_COST",0.5, -1000.0, 1000.0);
+ gGameCTHConstants.AIM_STANDING_STANCE = iniReader.ReadFloat("Aiming CTH","AIM_STANDING_STANCE",1.5, -1000.0, 1000.0);
+ gGameCTHConstants.AIM_CROUCHING_STANCE = iniReader.ReadFloat("Aiming CTH","AIM_CROUCHING_STANCE",1.25, -1000.0, 1000.0);
gGameCTHConstants.AIM_PRONE_STANCE = iniReader.ReadFloat("Aiming CTH","AIM_PRONE_STANCE",1.0, -1000.0, 1000.0);
gGameCTHConstants.AIM_TWO_GUNS = iniReader.ReadFloat("Aiming CTH","AIM_TWO_GUNS",4.0, -1000.0, 1000.0);
gGameCTHConstants.AIM_ONE_HANDED = iniReader.ReadFloat("Aiming CTH","AIM_ONE_HANDED",2.5, -1000.0, 1000.0);
@@ -2185,18 +2212,26 @@ void LoadCTHConstants()
gGameCTHConstants.RECOIL_MAX_COUNTER_AGI = iniReader.ReadFloat("Shooting Mechanism","RECOIL_MAX_COUNTER_AGI",1.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_MAX_COUNTER_EXP_LEVEL = iniReader.ReadFloat("Shooting Mechanism","RECOIL_MAX_COUNTER_EXP_LEVEL",1.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_MAX_COUNTER_FORCE = iniReader.ReadFloat("Shooting Mechanism","RECOIL_MAX_COUNTER_FORCE",5.0, 0.0, 100.0);
- gGameCTHConstants.RECOIL_COUNTER_ACCURACY_MIN_ERROR = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_MIN",1.0, 0.0, 100.0);
+ gGameCTHConstants.RECOIL_MAX_COUNTER_CROUCH = iniReader.ReadFloat("Shooting Mechanism","RECOIL_MAX_COUNTER_CROUCH",10.0, -100.0, 100.0);
+ gGameCTHConstants.RECOIL_MAX_COUNTER_PRONE = iniReader.ReadFloat("Shooting Mechanism","RECOIL_MAX_COUNTER_PRONE",25.0, -100.0, 100.0);
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_MIN_ERROR = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_MIN",0.2f, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_DEX = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_DEX",3.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_WIS = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_WIS",1.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AGI = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_AGI",1.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_EXP_LEVEL = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_EXP_LEVEL",2.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AUTO_WEAPONS_DIVISOR = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_AUTO_WEAPONS_DIVISOR",2.0, 1.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_ACCURACY_TRACER_BONUS = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_TRACER_BONUS",10.0, -1000.0, 1000.0);
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_ANTICIPATION = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_ANTICIPATION",25.0, -1000.0, 1000.0);
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_COMPENSATION = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_ACCURACY_COMPENSATION",2.0, 0.0, 5.0);
gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_FREQUENCY_AGI",3.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_FREQUENCY_EXP_LEVEL",2.0, 0.0, 100.0);
gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR = iniReader.ReadFloat("Shooting Mechanism","RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR",2.0, -1000.0, 1000.0);
- gGameCTHConstants.MAX_BULLET_DEV = iniReader.ReadFloat("Shooting Mechanism","MAX_BULLET_DEV ",10.0, -1000.0, 1000.0);
+ gGameCTHConstants.RECOIL_COUNTER_INCREMENT = iniReader.ReadInteger("Shooting Mechanism","RECOIL_COUNTER_INCREMENT",20, 0, 100);
+ gGameCTHConstants.RECOIL_COUNTER_INCREMENT_TRACER = iniReader.ReadInteger("Shooting Mechanism","RECOIL_COUNTER_INCREMENT_TRACER",25, 0, 100);
+ gGameCTHConstants.NORMAL_RECOIL_DISTANCE = iniReader.ReadInteger("Shooting Mechanism","NORMAL_RECOIL_DISTANCE",140, 10, 10000);
+ gGameCTHConstants.MAX_BULLET_DEV = iniReader.ReadFloat("Shooting Mechanism","MAX_BULLET_DEV ",10.0, -1000.0, 1000.0);
+ gGameCTHConstants.RANGE_EFFECTS_DEV = iniReader.ReadBoolean("Shooting Mechanism","RANGE_EFFECTS_DEV", TRUE );
}
diff --git a/GameSettings.h b/GameSettings.h
index e7c50cf3..60432f35 100644
--- a/GameSettings.h
+++ b/GameSettings.h
@@ -52,7 +52,7 @@ enum
TOPTION_ALLOW_SOLDIER_TOOLTIPS,
TOPTION_USE_AUTO_SAVE,
TOPTION_SILENT_SKYRIDER,
- TOPTION_LOW_CPU_USAGE,
+ //TOPTION_LOW_CPU_USAGE,
TOPTION_ENHANCED_DESC_BOX,
// arynn
@@ -69,6 +69,13 @@ enum
// WANNE: Moved alternate bullets graphics (tracers) to options
TOPTION_ALTERNATE_BULLET_GRAPHICS,
+ // CHRISL: HAM 4: Activate/Deactivate NCTH mode
+ TOPTION_USE_NCTH,
+
+ // WANNE:
+ TOPTION_SHOW_TACTICAL_FACE_GEAR,
+ TOPTION_SHOW_TACTICAL_FACE_ICONS,
+
// arynn: Debug/Cheat
TOPTION_CHEAT_MODE_OPTIONS_HEADER,
TOPTION_FORCE_BOBBY_RAY_SHIPMENTS, // force all pending Bobby Ray shipments
@@ -696,13 +703,20 @@ typedef struct
BOOLEAN fDynamicAimingTime;
// allow old behaviour
- BOOLEAN fAimLevelsDependOnDistance;
+ BOOLEAN fAimLevelsDependOnDistance; // feel free to dump this option
+ INT32 iAimLevelsCompatibilityOption; // but not this one
//WarmSteel - These determine in which group each scope belongs. Needed for dynamic aiming limits.
INT16 sVeryHighPowerScope;
INT16 sHighPowerScope;
INT16 sMediumPowerScope;
+ //CHRISL: AI Sniper fields
+ BOOLEAN fAISniperElite;
+ UINT16 fAISniperRange;
+ UINT16 fAISniperChance;
+ UINT16 fAISniperChanceWithSR;
+
// HEADROCK HAM B2.6: Controls how much effect target movement has on aiming
FLOAT iMovementEffectOnAiming;
@@ -718,8 +732,9 @@ typedef struct
// HEADROCK HAM B2.6/2/1: Toggle new Burst/Auto CTH bars: 0=neither, 1=both, 2=Burst, 3=Auto
UINT8 ubNewCTHBars;
- // HEADROCK HAM B2.6: Toggle whether AI checks for larger magazine when wanting to suppress at a distance
- BOOLEAN fIncreaseAISuppressionFire;
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ UINT16 ubAISuppressionMinimumMagSize;
+ UINT16 ubAISuppressionMinimumAmmo;
// HEADROCK HAM B2.7: Change the speed of skill progression. (defaults set to JA2 normal)
UINT16 usHealthSubpointsToImprove;
@@ -840,9 +855,6 @@ typedef struct
// HEADROCK HAM 3.3: Externalized maximum possible penalty for hitting a moving target. JA2 Default = 30.
UINT16 usMaxCTHPenaltyForMovingTarget;
- // CHRISL: HAM4-NCTH
- BOOLEAN fUseNCTH;
-
// HEADROCK HAM 3.3: Increases tolerance while moving.
UINT8 ubTilesMovedPerBonusTolerancePoint;
@@ -960,8 +972,8 @@ typedef struct
BOOLEAN fEnableInventoryPoolQ;
//legion by Jazz
- BOOLEAN fShowTacticalFaceGear; //legion 2
- BOOLEAN fShowTacticalFaceIcons; //legion 2
+ //BOOLEAN fShowTacticalFaceGear; //legion 2
+ //BOOLEAN fShowTacticalFaceIcons; //legion 2
INT8 bTacticalFaceIconStyle;
//Enemy Names Group Legion 2 by Jazz
@@ -980,6 +992,9 @@ typedef struct
UINT8 ubChanceTonyAvailable; // silversurfer/SANDRO
BOOLEAN fStandUpAfterBattle;
+
+ INT32 iInitialMercArrivalLocation;
+
} GAME_EXTERNAL_OPTIONS;
typedef struct
@@ -1230,9 +1245,11 @@ typedef struct
{
UINT32 NORMAL_SHOOTING_DISTANCE; // Distance at which 1x magnification is 100% effective. This is a major component of the entire shooting mechanism.
FLOAT DEGREES_MAXIMUM_APERTURE; // Maximum possible aperture for a 100% muzzle sway shot. Decrease to make all shots more accurate.
+ FLOAT RANGE_COEFFICIENT; // Determines maximum range which decides when gravity forces bullets to drop
FLOAT GRAVITY_COEFFICIENT; // Changes the way gravity works in the game. Higher values mean bullets don't drop as quickly after reaching max range.
FLOAT VERTICAL_BIAS; // This float can be used to reduce the chance of missing too far upwards or downwards (compared to left/right).
FLOAT SCOPE_RANGE_MULTIPLIER; // Adjusts the minimum effective range of scopes
+ FLOAT SIDE_FACING_DIVISOR; // Deals with a visual error in NCTH relating to shooting at a target who is facing directly perpendicular to the shooters facing.
FLOAT BASE_EXP; // Importance of Experience for BASE CTH
FLOAT BASE_MARKS; // Importance of Marksmanship for BASE CTH
@@ -1255,6 +1272,7 @@ typedef struct
FLOAT BASE_DRAW_COST; // Applied per 1 AP of the weapon's Ready Cost, under 100AP.
FLOAT BASE_TWO_GUNS; // Gun Difficulty Multiplier for shooting two guns
FLOAT BASE_ONE_HANDED; // Gun Difficulty Multiplier for shooting a pistol with one hand.
+ FLOAT BASE_STANDING_STANCE; // Gun Difficulty Multiplier for shooting from a standing stance
FLOAT BASE_CROUCHING_STANCE; // Gun Difficulty Multiplier for shooting from a crouched stance
FLOAT BASE_PRONE_STANCE; // Gun Difficulty Multiplier for shooting from a prone stance
FLOAT BASE_HEAVY_WEAPON; // Gun Difficulty Multiplier for shooting a launcher
@@ -1304,6 +1322,8 @@ typedef struct
FLOAT RECOIL_MAX_COUNTER_AGI;
FLOAT RECOIL_MAX_COUNTER_EXP_LEVEL;
FLOAT RECOIL_MAX_COUNTER_FORCE;
+ FLOAT RECOIL_MAX_COUNTER_CROUCH;
+ FLOAT RECOIL_MAX_COUNTER_PRONE;
FLOAT RECOIL_COUNTER_ACCURACY_MIN_ERROR;
FLOAT RECOIL_COUNTER_ACCURACY_DEX;
FLOAT RECOIL_COUNTER_ACCURACY_WIS;
@@ -1311,11 +1331,17 @@ typedef struct
FLOAT RECOIL_COUNTER_ACCURACY_EXP_LEVEL;
FLOAT RECOIL_COUNTER_ACCURACY_AUTO_WEAPONS_DIVISOR;
FLOAT RECOIL_COUNTER_ACCURACY_TRACER_BONUS;
+ FLOAT RECOIL_COUNTER_ACCURACY_ANTICIPATION;
+ FLOAT RECOIL_COUNTER_ACCURACY_COMPENSATION;
FLOAT RECOIL_COUNTER_FREQUENCY_AGI;
FLOAT RECOIL_COUNTER_FREQUENCY_EXP_LEVEL;
FLOAT RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR;
+ UINT8 RECOIL_COUNTER_INCREMENT;
+ UINT8 RECOIL_COUNTER_INCREMENT_TRACER;
+ UINT32 NORMAL_RECOIL_DISTANCE;
FLOAT MAX_BULLET_DEV;
+ BOOLEAN RANGE_EFFECTS_DEV;
} CTH_CONSTANTS;
diff --git a/GameVersion.cpp b/GameVersion.cpp
index 43497e20..56848ba2 100644
--- a/GameVersion.cpp
+++ b/GameVersion.cpp
@@ -13,11 +13,11 @@
#ifdef JA2EDITOR
//MAP EDITOR BUILD VERSION
-CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.4071 (Beta 2011)" };
+CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.4396 (Official Release)" };
#elif defined JA2BETAVERSION
//BETA/TEST BUILD VERSION
-CHAR16 zVersionLabel[256] = { L"Debug v1.13.4071 (Beta 2011)" };
+CHAR16 zVersionLabel[256] = { L"Debug v1.13.4396 (Official Release)" };
#elif defined CRIPPLED_VERSION
//RELEASE BUILD VERSION s
@@ -26,10 +26,10 @@ CHAR16 zVersionLabel[256] = { L"Beta v. 0.98" };
#else
//RELEASE BUILD VERSION
- CHAR16 zVersionLabel[256] = { L"Release v1.13.4071 (Beta 2011)" };
+ CHAR16 zVersionLabel[256] = { L"Release v1.13.4396 (Official Release)" };
#endif
-CHAR8 czVersionNumber[16] = { "Build 11.01.18" }; //YY.MM.DD
+CHAR8 czVersionNumber[16] = { "Build 11.05.11" }; //YY.MM.DD
CHAR16 zTrackingNumber[16] = { L"Z" };
diff --git a/GameVersion.h b/GameVersion.h
index feed7b3c..1f304676 100644
--- a/GameVersion.h
+++ b/GameVersion.h
@@ -20,10 +20,14 @@ extern CHAR16 zTrackingNumber[16];
//
// Keeps track of the saved game version. Increment the saved game version whenever
// you will invalidate the saved game file
-#define SAVE_GAME_VERSION 117 //114 //113 //112 //111 //110 //109 //108 //107 //106 //105 //104 //103 //102 //101 //100 // 99
+#define SAVE_GAME_VERSION 121 //114 //113 //112 //111 //110 //109 //108 //107 //106 //105 //104 //103 //102 //101 //100 // 99
-#define CURRENT_SAVEGAME_DATATYPE_VERSION 116
+#define CURRENT_SAVEGAME_DATATYPE_VERSION 121
+#define FIXED_NPC_QUOTE_BUG 121 // Before this, we need to reload all npc quote information because it was not being saved and loaded correctly.
+#define MOVED_GENERAL_INFO 120 // Before this, general game information was saved much later in the save game process.
+#define NCTH_AUTOFIRE_UPDATE 119 // Before this, we didn't track the original autofire offsets
+#define BR_EMAIL_DATA_CHANGE 118 // Before this, BR emails caused CTD
#define NCTH_DATATYPE_CHANGE 117 // Before this, we did not have HAM 4.0 NCTH
#define NEW_GENERAL_SAVE_INFO_DATA 116 // Before this, we did not have HAM 4.0 general info
#define IMP_TRAIT_EXPERT_ITEMS_CHANGE 115 // Before this, we did not have additional expert items defined in IMPItemChoices.xml
diff --git a/Init.cpp b/Init.cpp
index 7cfa8040..390b5f89 100644
--- a/Init.cpp
+++ b/Init.cpp
@@ -844,6 +844,12 @@ BOOLEAN LoadExternalGameplayData(STR directoryName)
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName));
SGP_THROW_IFFALSE(ReadInMercAvailability(fileName,FALSE), MERCAVAILABILITY);
+ strcpy(fileName, directoryName);
+ strcat(fileName, FACEGEARFILENAME);
+ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName));
+ SGP_THROW_IFFALSE(ReadInFaceGear(zNewFaceGear, fileName), FACEGEARFILENAME);
+ //WriteFaceGear();
+
#ifndef ENGLISH
AddLanguagePrefix(fileName);
if ( FileExists(fileName) )
diff --git a/Init.h b/Init.h
index 14d8f498..d4053278 100644
--- a/Init.h
+++ b/Init.h
@@ -12,6 +12,7 @@ void SetupMaxActionPointsAnimation();
enum {
AP_MAXIMUM,
AP_MINIMUM,
+MIN_APS_TO_INTERRUPT,
AP_MONSTER_MAXIMUM,
AP_VEHICLE_MAXIMUM,
MAX_AP_CARRIED,
@@ -94,9 +95,12 @@ AP_FOURTH_CLICK_AIM_SCOPE,
AP_FIFTH_CLICK_AIM_SCOPE,
AP_SIXTH_CLICK_AIM_SCOPE,
AP_SEVENTH_CLICK_AIM_SCOPE,
-AP_EIGHTTH_CLICK_AIM_SCOPE,
+AP_EIGHTH_CLICK_AIM_SCOPE,
AP_RELOAD_LOOSE,
AP_UNJAM,
+
+AP_JUMPWINDOW, //WANNE: jump window APs
+
AP_WRONG_MAG,
AP_MAX_SUPPRESSED,
AP_MAX_TURN_SUPPRESSED,
@@ -107,6 +111,7 @@ AP_SUPPRESSION_MOD,
AP_SUPPRESSION_SHOCK_DIVISOR,
// HEADROCK HAM 3.3: AP loss per point of damage, inflicted when a character is knocked down by a hit to the legs.
AP_LOSS_PER_LEGSHOT_DAMAGE,
+
AUTOFIRE_SHOTS_AP_VALUE,
BAD_AP_COST,
DEFAULT_APS,
@@ -157,7 +162,10 @@ BP_JUMP_OVER,
BP_BACK_PACK,
BP_WORK_ZIPPER,
BP_UNJAM,
-AP_JUMPWINDOW, //jump window
+BP_JUMPOFFWALL,
+BP_JUMPWALL,
+AP_JUMPWALL,
+AP_JUMPOFFWALL,
TOTAL_APBP_VALUES
};
#endif
diff --git a/Intro.cpp b/Intro.cpp
index a57cd99c..da095c97 100644
--- a/Intro.cpp
+++ b/Intro.cpp
@@ -71,6 +71,7 @@ public:
}
void Shutdown()
{
+ stopVideo(); // if one is still "running"
if(_type & VT_SMK)
{
SmkShutdown();
@@ -104,7 +105,7 @@ public:
{
return false;
}
- SGP_THROW(L"Invalid Video Player state!");
+ SGP_THROW(L"Invalid Video Player state : last video was not properly stopped ");
}
void stopVideo()
@@ -128,6 +129,14 @@ public:
{
return false;
}
+
+ // stop running video before starting a new one
+ stopVideo();
+
+ if(filename.empty())
+ {
+ return false;
+ }
/// check file extension
std::string ext;
@@ -289,20 +298,24 @@ UINT32 IntroScreenInit( void )
gfIntroScreenEntry = TRUE;
CIniReader inireader("IntroVideos.ini");
- s_VFN[INTRO_REBEL_CRDT] = inireader.ReadString("INTRO_BEGINNING","INTRO_REBEL_CRDT","INTRO\\Rebel_cr");
- s_VFN[INTRO_OMERTA] = inireader.ReadString("INTRO_BEGINNING","INTRO_OMERTA","INTRO\\Omerta");
- s_VFN[INTRO_PRAGUE_CRDT] = inireader.ReadString("INTRO_BEGINNING","INTRO_PRAGUE_CRDT","INTRO\\Prague_cr");
- s_VFN[INTRO_PRAGUE] = inireader.ReadString("INTRO_BEGINNING","INTRO_PRAGUE","INTRO\\Prague");
+
+ // BF: If NO_DEFAULT_VALUES is set to true, then only the explicitely used videos will be shown.
+ BOOLEAN no_defaults = inireader.ReadBoolean("INTRO", "NO_DEFAULT_VALUES", false);
+
+ s_VFN[INTRO_REBEL_CRDT] = inireader.ReadString("INTRO_BEGINNING", "INTRO_REBEL_CRDT", no_defaults ? "" : "INTRO\\Rebel_cr");
+ s_VFN[INTRO_OMERTA] = inireader.ReadString("INTRO_BEGINNING", "INTRO_OMERTA", no_defaults ? "" : "INTRO\\Omerta");
+ s_VFN[INTRO_PRAGUE_CRDT] = inireader.ReadString("INTRO_BEGINNING", "INTRO_PRAGUE_CRDT", no_defaults ? "" : "INTRO\\Prague_cr");
+ s_VFN[INTRO_PRAGUE] = inireader.ReadString("INTRO_BEGINNING", "INTRO_PRAGUE", no_defaults ? "" : "INTRO\\Prague");
//there are no more videos shown for the begining
- s_VFN[INTRO_END_END_SPEECH_MIGUEL] = inireader.ReadString("INTRO_ENDING","INTRO_END_END_SPEECH_MIGUEL","INTRO\\Throne_Mig");
- s_VFN[INTRO_END_END_SPEECH_NO_MIGUEL] = inireader.ReadString("INTRO_ENDING","INTRO_END_END_SPEECH_NO_MIGUEL","INTRO\\Throne_NoMig");
- s_VFN[INTRO_END_HELI_FLYBY] = inireader.ReadString("INTRO_ENDING","INTRO_END_HELI_FLYBY","INTRO\\Heli_FlyBy");
- s_VFN[INTRO_END_SKYRIDER_HELICOPTER] = inireader.ReadString("INTRO_ENDING","INTRO_END_SKYRIDER_HELICOPTER","INTRO\\Heli_Sky");
- s_VFN[INTRO_END_NOSKYRIDER_HELICOPTER] = inireader.ReadString("INTRO_ENDING","INTRO_END_NOSKYRIDER_HELICOPTER","INTRO\\Heli_NoSky");
+ s_VFN[INTRO_END_END_SPEECH_MIGUEL] = inireader.ReadString("INTRO_ENDING","INTRO_END_END_SPEECH_MIGUEL", no_defaults ? "" : "INTRO\\Throne_Mig");
+ s_VFN[INTRO_END_END_SPEECH_NO_MIGUEL] = inireader.ReadString("INTRO_ENDING","INTRO_END_END_SPEECH_NO_MIGUEL", no_defaults ? "" : "INTRO\\Throne_NoMig");
+ s_VFN[INTRO_END_HELI_FLYBY] = inireader.ReadString("INTRO_ENDING","INTRO_END_HELI_FLYBY", no_defaults ? "" : "INTRO\\Heli_FlyBy");
+ s_VFN[INTRO_END_SKYRIDER_HELICOPTER] = inireader.ReadString("INTRO_ENDING","INTRO_END_SKYRIDER_HELICOPTER", no_defaults ? "" : "INTRO\\Heli_Sky");
+ s_VFN[INTRO_END_NOSKYRIDER_HELICOPTER] = inireader.ReadString("INTRO_ENDING","INTRO_END_NOSKYRIDER_HELICOPTER", no_defaults ? "" : "INTRO\\Heli_NoSky");
- s_VFN[INTRO_SPLASH_SCREEN] = inireader.ReadString("INTRO_SPLASH","INTRO_SPLASH_SCREEN","INTRO\\SplashScreen");
- s_VFN[INTRO_SPLASH_TALONSOFT] = inireader.ReadString("INTRO_SPLASH","INTRO_SPLASH_TALONSOFT","INTRO\\TalonSoftid_endhold");
+ s_VFN[INTRO_SPLASH_SCREEN] = inireader.ReadString("INTRO_SPLASH","INTRO_SPLASH_SCREEN", no_defaults ? "" : "INTRO\\SplashScreen");
+ s_VFN[INTRO_SPLASH_TALONSOFT] = inireader.ReadString("INTRO_SPLASH","INTRO_SPLASH_TALONSOFT", no_defaults ? "" : "INTRO\\TalonSoftid_endhold");
//there are no more videos shown for the endgame
@@ -401,6 +414,11 @@ void ExitIntroScreen()
s_VP.Shutdown();
}
+void StopIntroVideo()
+{
+ s_VP.stopVideo();
+}
+
void HandleIntroScreen()
{
//if we are exiting this screen, this frame, dont update the screen
@@ -679,7 +697,7 @@ void DisplaySirtechSplashScreen()
VOBJECT_DESC VObjectDesc;
memset( &VObjectDesc, 0, sizeof( VOBJECT_DESC ) );
- VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
+ VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE | VOBJECT_CREATE_FROMPNG_FALLBACK;
FilenameForBPP("INTERFACE\\SirtechSplash.sti", VObjectDesc.ImageFile);
// FilenameForBPP("INTERFACE\\TShold.sti", VObjectDesc.ImageFile);
diff --git a/Intro.h b/Intro.h
index f2bfc56e..26afc036 100644
--- a/Intro.h
+++ b/Intro.h
@@ -7,6 +7,7 @@ UINT32 IntroScreenShutdown( void );
UINT32 IntroScreenHandle( void );
UINT32 IntroScreenInit( void );
+void StopIntroVideo();
//enums used for when the intro screen can come up, used with 'gbIntroScreenMode'
enum EIntroType
diff --git a/JA2 Splash.cpp b/JA2 Splash.cpp
index 8debb31a..73ddc93d 100644
--- a/JA2 Splash.cpp
+++ b/JA2 Splash.cpp
@@ -28,7 +28,7 @@ void InitJA2SplashScreen()
INT32 i = 0;
memset( &VSurfaceDesc, 0, sizeof( VSURFACE_DESC ) );
- VSurfaceDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE;
+ VSurfaceDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE | VSURFACE_CREATE_FROMPNG_FALLBACK;
sprintf( VSurfaceDesc.ImageFile, "LOADSCREENS\\Notification.sti" );
if( !AddVideoSurface( &VSurfaceDesc, &uiLogoID ) )
{
@@ -55,7 +55,7 @@ void InitJA2SplashScreen()
# endif // JA2TESTVERSION
memset( &VSurfaceDesc, 0, sizeof( VSURFACE_DESC ) );
- VSurfaceDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE;
+ VSurfaceDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE | VSURFACE_CREATE_FROMPNG_FALLBACK;
GetMLGFilename( VSurfaceDesc.ImageFile, MLG_SPLASH );
try
{
diff --git a/Language Defines.h b/Language Defines.h
index e69af8d2..35911203 100644
--- a/Language Defines.h
+++ b/Language Defines.h
@@ -21,20 +21,24 @@
#if !defined(ENGLISH) && !defined(GERMAN) && !defined(RUSSIAN) && !defined(DUTCH) && !defined(POLISH) && !defined(FRENCH) && !defined(ITALIAN) && !defined(TAIWANESE) && !defined(CHINESE)
/* please set one manually here (by uncommenting) if not willingly to set Workspace wide */
+
#define ENGLISH
//#define GERMAN
//#define RUSSIAN
//#define DUTCH
-//#define POLISH
//#define FRENCH
//#define ITALIAN
//#define TAIWANESE
-// For CHINESE language we also have to define WINFONTS!
+// WANNE: If we like to build Polish version, we have to do this in VS2008/VS2010, because in VS2005 we get weird behavior (progress bar not moving when loading sector, ...).
+// To get correct display of Polish letters, it is needed to set "#pragma setlocale("POLISH")" in "_PolishText.cpp" and "_"Ja25PolishText.cpp.
+// Unfortunatelly setting the "pragma" causes the weird behavior when building in VS2005, this is why we should build in VS2008/VS2010.
+//#define POLISH
+
+// WANNE: For CHINESE language we also have to define WINFONTS! So when building Chinese version, enable both defines.
//#define CHINESE
//#define WINFONTS
-
#endif
//**ddd direct link libraries
@@ -51,9 +55,6 @@
# error "At least You have to specify a Language somewhere. See comments above."
#endif
-
-
-
//if the language represents words as single chars
#ifdef TAIWAN
#define SINGLE_CHAR_WORDS
diff --git a/Laptop/BobbyRMailOrder.cpp b/Laptop/BobbyRMailOrder.cpp
index 179b9f4d..6297dd39 100644
--- a/Laptop/BobbyRMailOrder.cpp
+++ b/Laptop/BobbyRMailOrder.cpp
@@ -30,6 +30,10 @@
#include "Strategic Event Handler.h"
#include "connect.h"
+#include "GameSettings.h"
+#include
+#include
+#include
/*
typedef struct
@@ -334,7 +338,7 @@ MOUSE_REGION gSelectedUpDownArrowOnScrollAreaRegion[2];
void SelectUpDownArrowOnScrollAreaRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
//Dealtar's Airport Externalization.
-UINT16 gusCurShipmentDestinationID;
+INT16 gusCurShipmentDestinationID;
extern CPostalService gPostalService;
UINT8 guiNumOfDisplayedCities=0;
vector gDestinationTable;
@@ -2219,15 +2223,29 @@ void AddJohnsGunShipment()
// want to add two guns (Automags, AUTOMAG_III), and four clips of ammo.
+
+
+
Temp[0].usItemIndex = AUTOMAG_III;
Temp[0].ubNumberPurchased = 2;
Temp[0].bItemQuality = 100;
Temp[0].usBobbyItemIndex = 0;// does this get used anywhere???
Temp[0].fUsed = FALSE;
-
+
// memcpy( &(LaptopSaveInfo.BobbyRayOrdersOnDeliveryArray[ cnt ].BobbyRayPurchase[0]), &Temp, sizeof(BobbyRayPurchaseStruct) );
- Temp[1].usItemIndex = CLIP762N_5_AP;
+ // WANNE: We have to check if profile 1.13 is available or not, to get the correct ammo
+ BOOLEAN isData113ProfileAvailable = FALSE;
+ if(getVFS()->getProfileStack()->getProfile(L"v1.13") != NULL)
+ isData113ProfileAvailable = TRUE;
+ else
+ isData113ProfileAvailable = FALSE;
+
+ if (isData113ProfileAvailable)
+ Temp[1].usItemIndex = 557;
+ else
+ Temp[1].usItemIndex = CLIP762N_5_AP;
+
Temp[1].ubNumberPurchased = 2;
Temp[1].bItemQuality = 5;
Temp[1].usBobbyItemIndex = 0;// does this get used anywhere???
diff --git a/Laptop/CharProfile.cpp b/Laptop/CharProfile.cpp
index a50c796e..98b6b35c 100644
--- a/Laptop/CharProfile.cpp
+++ b/Laptop/CharProfile.cpp
@@ -117,6 +117,7 @@ void GameInitCharProfile()
{
LaptopSaveInfo.iIMPIndex = 0;
iCurrentPortrait = 0;
+ iCurrentProfileMode = 0;
// iCurrentVoice = 0;
iPortraitNumber = 0;
diff --git a/Laptop/IMP Confirm.cpp b/Laptop/IMP Confirm.cpp
index 189c319b..8ce4798f 100644
--- a/Laptop/IMP Confirm.cpp
+++ b/Laptop/IMP Confirm.cpp
@@ -370,7 +370,7 @@ void BtnIMPConfirmYes(GUI_BUTTON *btn,INT32 reason)
//Kaiden: And here is my Answer to the IMP E-mails only
// profiling the last IMP made. You get the results immediately
- AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex );
+ AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex, -1 );
//RenderCharProfile( );
@@ -1526,6 +1526,7 @@ BOOLEAN LoadImpCharacter( STR nickName )
return FALSE;
}
+ /*
//new camo face
if ( gGameExternalOptions.fShowCamouflageFaces == TRUE )
{
@@ -1534,7 +1535,7 @@ BOOLEAN LoadImpCharacter( STR nickName )
gCamoFace[iProfileId].gDesertCamoface = FALSE;
gCamoFace[iProfileId].gSnowCamoface = FALSE;
}
-
+ */
// charge the player
// is the character male?
diff --git a/Laptop/IMP HomePage.cpp b/Laptop/IMP HomePage.cpp
index 8b1081cc..0c0d8ed0 100644
--- a/Laptop/IMP HomePage.cpp
+++ b/Laptop/IMP HomePage.cpp
@@ -444,7 +444,7 @@ void ProcessPlayerInputActivationString( void )
ResetActivationStringTextBox();
//DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 11 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
- AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex );
+ AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex, -1 );
}
}
else
@@ -470,7 +470,7 @@ void ProcessPlayerInputActivationString( void )
ResetActivationStringTextBox();
//DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 11 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
- AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex );
+ AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex, -1 );
}
}
else
diff --git a/Laptop/IMP Skill Trait.cpp b/Laptop/IMP Skill Trait.cpp
index 7bd7b652..8127d083 100644
--- a/Laptop/IMP Skill Trait.cpp
+++ b/Laptop/IMP Skill Trait.cpp
@@ -987,6 +987,7 @@ BOOLEAN ShouldTraitBeSkipped( UINT32 uiTrait )
}
else
{
+ // WANNE: No material arts selection allowed for big body types and females, because we don't have a material art animation on big body types!
if( uiTrait == IMP_SKILL_TRAITS__MARTIAL_ARTS && (!fCharacterIsMale || bBigBodySelected()) )
return( TRUE );
else
@@ -998,6 +999,13 @@ BOOLEAN DoesSkillHaveExpertLevel( UINT32 uiSkillTrait )
{
if( gGameOptions.fNewTraitSystem )
{
+ // WANNE: Yes we have no animation, but the Trait bonus also works with the missing animations.
+ /*
+ // WANNE: No material arts allowed for big body types and females, because we don't have a material art animation on big body types!
+ if (uiSkillTrait == IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS && (!fCharacterIsMale || bBigBodySelected()))
+ return (FALSE);
+ */
+
return( TRUE );
}
else
@@ -1008,11 +1016,10 @@ BOOLEAN DoesSkillHaveExpertLevel( UINT32 uiSkillTrait )
{
return( FALSE );
}
- else
- {
- return( TRUE );
- }
+
+ return( TRUE );
}
+
return( TRUE );
}
diff --git a/Laptop/Laptop_VS2005.vcproj b/Laptop/Laptop_VS2005.vcproj
index 5080264e..e2fac04b 100644
--- a/Laptop/Laptop_VS2005.vcproj
+++ b/Laptop/Laptop_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
curElement = ELEMENT;
- pData->tempDest.sGridNo = (UINT16) atoi(pData->szCharData);
+ pData->tempDest.sGridNo = (UINT32) atoi(pData->szCharData);
}
else if(strcmp(name, "uiIndex") == 0)
{
diff --git a/Laptop/email.cpp b/Laptop/email.cpp
index f62f968b..a9e7c26c 100644
--- a/Laptop/email.cpp
+++ b/Laptop/email.cpp
@@ -329,7 +329,7 @@ void PreProcessEmail( EmailPtr pMail );
void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail, UINT8 ubNumberOfRecords );
BOOLEAN ReplaceMercNameAndAmountWithProperData( CHAR16 *pFinishedString, EmailPtr pMail );
BOOLEAN ReplaceBiffNameWithProperMercName( CHAR16 *pFinishedString, EmailPtr pMail, CHAR16 *pMercName );
-extern UINT16 gusCurShipmentDestinationID;
+extern INT16 gusCurShipmentDestinationID;
extern CPostalService gPostalService;
@@ -415,7 +415,7 @@ BOOLEAN EnterEmail()
FilenameForBPP("LAPTOP\\maillistdivider.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiMAILDIVIDER));
- //AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ) );
+ //AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1, -1 );
// initialize mouse regions
InitializeMouseRegions();
@@ -438,7 +438,7 @@ BOOLEAN EnterEmail()
RenderEmail();
- //AddEmail( MERC_REPLY_GRIZZLY, MERC_REPLY_LENGTH_GRIZZLY, GRIZZLY_MAIL, GetWorldTotalMin() );
+ //AddEmail( MERC_REPLY_GRIZZLY, MERC_REPLY_LENGTH_GRIZZLY, GRIZZLY_MAIL, GetWorldTotalMin(), -1, -1 );
//RenderButtons( );
@@ -682,7 +682,7 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u
ReplaceMercNameAndAmountWithProperData( pSubject, &FakeEmail );
// add message to list
- AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, iFirstData, uiSecondData, -1 );
+ AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, iFirstData, uiSecondData, -1 , -1);
// if we are in fact int he laptop, redraw icons, might be change in mail status
@@ -695,14 +695,22 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u
return;
}
-void AddEmailWFMercLevelUp(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition)
+void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition)
{
CHAR16 pSubject[320];
-
- UINT8 subjectLine = (170 - iMessageLength) * 2;
+
+ UINT8 subjectLine = 0;
+
+ // WF mercs
+ if (iMessageLength < 178) // -> see: New113AIMMercMailTexts
+ subjectLine = (iMessageLength - 170) * 2;
+ // Generic mercs
+ else
+ subjectLine = 16; // -> see: New113AIMMercMailTexts
+
wcscpy( pSubject, New113AIMMercMailTexts[subjectLine] );
- AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition );
+ AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, -1 );
// if we are in fact int he laptop, redraw icons, might be change in mail status
@@ -715,7 +723,7 @@ void AddEmailWFMercLevelUp(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubS
return;
}
-void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition)
+void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID)
{
CHAR16 pSubject[320];
//MessagePtr pMessageList;
@@ -726,7 +734,7 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640);
// add message to list
- AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition );
+ AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID );
// if we are in fact int he laptop, redraw icons, might be change in mail status
@@ -751,7 +759,7 @@ void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender,
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640);
// add message to list
- AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1 );
+ AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1 );
// if we are in fact int he laptop, redraw icons, might be change in mail status
@@ -764,7 +772,7 @@ void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender,
return;
}
-void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition )
+void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID )
{
// will add a message to the list of messages
EmailPtr pEmail=pEmailList;
@@ -832,6 +840,10 @@ void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject,
pTempEmail->iCurrentIMPPosition = iCurrentIMPPosition;
+ // WANNE.MAIL: Fix
+ pTempEmail->iCurrentShipmentDestinationID = iCurrentShipmentDestinationID;
+
+
// set date and sender, Id
if(pEmail)
pTempEmail->iId=iId+1;
@@ -3221,6 +3233,11 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr
if (!pMessageRecordList)
{
+ // WANNE.MAIL: Fix
+ gusCurShipmentDestinationID = -1; // Reset
+ gusCurShipmentDestinationID = pMail->iCurrentShipmentDestinationID;
+
+ // Loop through each line of the shipment EDT-file
for (int i = 0; i < BOBBYR_SHIPMENT_ARRIVED_LENGTH; i++)
{
wstrMail.clear();
@@ -3229,11 +3246,15 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr
index = wstrMail.find(L"$DESTINATIONNAME$");
- if (index != wstring::npos)
+ // WANNE.MAIL: Fix
+ if (gusCurShipmentDestinationID > 0)
{
- wstrMail.erase(index, strlen("$DESTINATIONNAME$"));
- RefToDestinationStruct ds = gPostalService.GetDestination(gusCurShipmentDestinationID);
- wstrMail.insert(index, ds.wstrName.c_str());
+ if (index != wstring::npos)
+ {
+ wstrMail.erase(index, strlen("$DESTINATIONNAME$"));
+ RefToDestinationStruct ds = gPostalService.GetDestination(gusCurShipmentDestinationID);
+ wstrMail.insert(index, ds.wstrName.c_str());
+ }
}
AddEmailRecordToList((STR16)wstrMail.c_str());
@@ -3502,56 +3523,122 @@ void HandleIMPCharProfileResultsMessage( void)
// now the personality intro
iOffSet = IMP_RESULTS_ATTITUDE_INTRO;
iEndOfSection = IMP_RESULTS_ATTITUDE_LENGTH;
- iCounter = 0;
+ iCounter = 0;
while(iEndOfSection > iCounter)
{
- // read one record from email file
- LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
+ // read one record from email file
+ LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
- // add to list
- AddEmailRecordToList( pString );
+ // add to list
+ AddEmailRecordToList( pString );
- // increment email record counter
- iCounter++;
+ // increment email record counter
+ iCounter++;
}
-
- // personality itself
- switch( gMercProfiles[ iCurrentIMPSlot ].bAttitude )
+
+ // WANNE: Old trait system: attitudes
+ if (!gGameOptions.fNewTraitSystem)
{
- // normal as can be
- case( ATT_NORMAL ):
- iOffSet = IMP_ATTITUDE_NORMAL;
- break;
- case( ATT_FRIENDLY ):
- iOffSet = IMP_ATTITUDE_FRIENDLY;
- break;
- case( ATT_LONER ):
- iOffSet = IMP_ATTITUDE_LONER;
- break;
- case( ATT_OPTIMIST ):
- iOffSet = IMP_ATTITUDE_OPTIMIST;
- break;
- case( ATT_PESSIMIST ):
- iOffSet = IMP_ATTITUDE_PESSIMIST;
- break;
- case( ATT_AGGRESSIVE ):
- iOffSet = IMP_ATTITUDE_AGGRESSIVE;
- break;
- case( ATT_ARROGANT ):
- iOffSet = IMP_ATTITUDE_ARROGANT;
- break;
- case( ATT_ASSHOLE ):
- iOffSet = IMP_ATTITUDE_ASSHOLE;
- break;
- case( ATT_COWARD ):
- iOffSet = IMP_ATTITUDE_COWARD;
- break;
+ // personality itself
+ switch( gMercProfiles[ iCurrentIMPSlot ].bAttitude )
+ {
+ // normal as can be
+ case( ATT_NORMAL ):
+ iOffSet = IMP_ATTITUDE_NORMAL;
+ break;
+ case( ATT_FRIENDLY ):
+ iOffSet = IMP_ATTITUDE_FRIENDLY;
+ break;
+ case( ATT_LONER ):
+ iOffSet = IMP_ATTITUDE_LONER;
+ break;
+ case( ATT_OPTIMIST ):
+ iOffSet = IMP_ATTITUDE_OPTIMIST;
+ break;
+ case( ATT_PESSIMIST ):
+ iOffSet = IMP_ATTITUDE_PESSIMIST;
+ break;
+ case( ATT_AGGRESSIVE ):
+ iOffSet = IMP_ATTITUDE_AGGRESSIVE;
+ break;
+ case( ATT_ARROGANT ):
+ iOffSet = IMP_ATTITUDE_ARROGANT;
+ break;
+ case( ATT_ASSHOLE ):
+ iOffSet = IMP_ATTITUDE_ASSHOLE;
+ break;
+ case( ATT_COWARD ):
+ iOffSet = IMP_ATTITUDE_COWARD;
+ break;
+ }
+ // attitude title
+ LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet ), MAIL_STRING_SIZE );
}
+ // WANNE: New trait system: Character traits
+ else
+ {
+ // WANNE: Try to map "new character traits" to matching old attitudes, so we have meaningful text in IMP mail
+ switch( gMercProfiles[ iCurrentIMPSlot ].bCharacterTrait )
+ {
+ case (CHAR_TRAIT_NORMAL):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_NORMAL]);
+ iOffSet = IMP_ATTITUDE_NORMAL;
+ break;
+ case (CHAR_TRAIT_SOCIABLE):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SOCIABLE]);
+ iOffSet = IMP_ATTITUDE_FRIENDLY;
+ break;
+ case (CHAR_TRAIT_LONER):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_LONER]);
+ iOffSet = IMP_ATTITUDE_LONER;
+ break;
+ case (CHAR_TRAIT_OPTIMIST):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_OPTIMIST]);
+ iOffSet = IMP_ATTITUDE_OPTIMIST;
+ break;
+ case (CHAR_TRAIT_ASSERTIVE):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_ASSERTIVE]);
+ iOffSet = IMP_ATTITUDE_OPTIMIST;
+ break;
+ case (CHAR_TRAIT_INTELLECTUAL):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_INTELLECTUAL]);
+ iOffSet = IMP_ATTITUDE_FRIENDLY;
+ break;
+ case (CHAR_TRAIT_PRIMITIVE):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PRIMITIVE]);
+ iOffSet = IMP_ATTITUDE_ARROGANT;
+ break;
+ case (CHAR_TRAIT_AGGRESSIVE):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_AGGRESSIVE]);
+ iOffSet = IMP_ATTITUDE_AGGRESSIVE;
+ break;
+ case (CHAR_TRAIT_PHLEGMATIC):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PHLEGMATIC]);
+ iOffSet = IMP_ATTITUDE_PESSIMIST;
+ break;
+ case (CHAR_TRAIT_DAUNTLESS):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_DAUNTLESS]);
+ iOffSet = IMP_ATTITUDE_AGGRESSIVE;
+ break;
+ case (CHAR_TRAIT_PACIFIST):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PACIFIST]);
+ iOffSet = IMP_ATTITUDE_COWARD;
+ break;
+ case (CHAR_TRAIT_MALICIOUS):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_MALICIOUS]);
+ iOffSet = IMP_ATTITUDE_ASSHOLE;
+ break;
+ case (CHAR_TRAIT_SHOWOFF):
+ wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SHOWOFF]);
+ iOffSet = IMP_ATTITUDE_ARROGANT;
+ break;
+ }
- // attitude title
- LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet ), MAIL_STRING_SIZE );
+ wcscat(pString, L". ±");
+ }
+
// add to list
AddEmailRecordToList( pString );
@@ -3889,13 +3976,16 @@ void HandleIMPCharProfileResultsMessage( void)
// Ranger
if ( ProfileHasSkillTrait( iCurrentIMPSlot, RANGER_NT ) > 0 )
{
+ /*
if ( gGameExternalOptions.fShowCamouflageFaces == TRUE )
{
gCamoFace[iCurrentIMPSlot].gCamoface = TRUE;
gCamoFace[iCurrentIMPSlot].gUrbanCamoface = FALSE;
gCamoFace[iCurrentIMPSlot].gDesertCamoface = FALSE;
gCamoFace[iCurrentIMPSlot].gSnowCamoface = FALSE;
- }
+ }
+ */
+
wcscpy(pString, MissingIMPSkillsDescriptions[2]);
AddEmailRecordToList( pString );
}
@@ -4964,34 +5054,39 @@ void PreProcessEmail( EmailPtr pMail )
{
wcscpy( pString, New113AIMMercMailTexts[1] );
}
- else if (iNew113MERCMerc == 171)
+ else if (iNew113AIMMerc == 171)
{
wcscpy( pString, New113AIMMercMailTexts[3] );
}
- else if (iNew113MERCMerc == 172)
+ else if (iNew113AIMMerc == 172)
{
wcscpy( pString, New113AIMMercMailTexts[5] );
}
- else if (iNew113MERCMerc == 173)
+ else if (iNew113AIMMerc == 173)
{
wcscpy( pString, New113AIMMercMailTexts[7] );
}
- else if (iNew113MERCMerc == 174)
+ else if (iNew113AIMMerc == 174)
{
wcscpy( pString, New113AIMMercMailTexts[9] );
}
- else if (iNew113MERCMerc == 175)
+ else if (iNew113AIMMerc == 175)
{
wcscpy( pString, New113AIMMercMailTexts[11] );
}
- else if (iNew113MERCMerc == 176)
+ else if (iNew113AIMMerc == 176)
{
wcscpy( pString, New113AIMMercMailTexts[13] );
}
- else if (iNew113MERCMerc == 177)
+ else if (iNew113AIMMerc == 177)
{
wcscpy( pString, New113AIMMercMailTexts[15] );
}
+ // Additional Generic Merc mail message
+ else
+ {
+ wcscpy( pString, New113AIMMercMailTexts[17] );
+ }
}
}
@@ -5440,60 +5535,60 @@ void AddAllEmails()
UINT32 uiCnt;
UINT32 uiOffset;
- AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin(), -1 );
- AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1 );
- AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1 );
- AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1 );
- AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1 );
+ AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin(), -1, -1 );
+ AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
+ AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1, -1 );
+ AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1 );
+ AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1 );
- AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1 );
+ AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1, -1 );
- AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
- AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
- AddEmail( NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
- AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
+ AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
+ AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
+ AddEmail( NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
+ AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
uiOffset = MERC_UP_LEVEL_BIFF;
for( uiCnt=0; uiCnt<10; uiCnt++)
{
- AddEmail( uiOffset, MERC_UP_LEVEL_LENGTH_BIFF, SPECK_FROM_MERC, GetWorldTotalMin(), -1 );
+ AddEmail( uiOffset, MERC_UP_LEVEL_LENGTH_BIFF, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1 );
uiOffset += MERC_UP_LEVEL_LENGTH_BIFF;
}
-// AddEmail( ( UINT8 )( AIM_REPLY_BARRY + ( AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, AIM_REPLY_BARRY, GetWorldTotalMin() );
+// AddEmail( ( UINT8 )( AIM_REPLY_BARRY + ( AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, AIM_REPLY_BARRY, GetWorldTotalMin(), -1, -1 );
uiOffset = AIM_REPLY_BARRY;
for( uiCnt=0; uiCnt<40; uiCnt++)
{
- AddEmail( ( UINT8 )( uiOffset + ( uiCnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + uiCnt ), GetWorldTotalMin(), -1 );
+ AddEmail( ( UINT8 )( uiOffset + ( uiCnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + uiCnt ), GetWorldTotalMin(), -1, -1 );
}
- AddEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1 );
- AddEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1 );
- AddEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1 );
- AddEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin(), -1 );
+ AddEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
+ AddEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
+ AddEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
+ AddEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin(), -1, -1 );
- AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1 );
- AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
- AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
+ AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
+ AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
//Add an email telling the user that he received an insurance payment
AddEmailWithSpecialData( INSUR_PAYMENT, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), 20, 0 );
AddEmailWithSpecialData( INSUR_SUSPIC, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), 20, 0 );
AddEmailWithSpecialData( INSUR_SUSPIC_2, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), 20, 0 );
- AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1);
- AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1 );
- AddEmail( BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, GetWorldTotalMin(), -1 );
+ AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1);
+ AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1 );
+ AddEmail( BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1 );
- AddEmail( JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1 );
+ AddEmail( JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1 );
AddEmailWithSpecialData(MERC_DIED_ON_OTHER_ASSIGNMENT, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, GetWorldTotalMin(), 0, 0 );
diff --git a/Laptop/email.h b/Laptop/email.h
index c8112929..6fb1d4c8 100644
--- a/Laptop/email.h
+++ b/Laptop/email.h
@@ -182,6 +182,9 @@ struct email
// So we know which analyse email belongs to the imp
INT32 iCurrentIMPPosition;
+ // WANNE.MAIL: Fix
+ INT16 iCurrentShipmentDestinationID;
+
struct email *Next;
struct email *Prev;
};
@@ -211,6 +214,9 @@ typedef struct
INT32 iCurrentIMPPosition;
+ // WANNE.MAIL: Fix
+ INT16 iCurrentShipmentDestinationID;
+
} SavedEmailStruct;
@@ -294,14 +300,14 @@ void RenderEmail();
// message manipulation
-void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 uiFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition );
+void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 uiFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID );
void RemoveEmailMessage(INT32 iId);
EmailPtr GetEmailMessage(INT32 iId);
void LookForUnread();
-void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition);
+void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID);
-// WANNE: For the new WF merc
-void AddEmailWFMercLevelUp(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition);
+// WANNE: For the new WF merc, when they available again
+void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition);
void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate);
BOOLEAN DisplayNewMailBox();
diff --git a/Laptop/history.cpp b/Laptop/history.cpp
index adddd507..ff4f5129 100644
--- a/Laptop/history.cpp
+++ b/Laptop/history.cpp
@@ -950,7 +950,7 @@ void DisplayPageNumberAndDateRange( void )
if( !pCurrentHistory )
{
- swprintf( sString, L"%s %d / %d",pHistoryHeaders[1], 1, 1 );
+ swprintf( sString, L"%s %d / %d",pHistoryHeaders[1], 1, 1 );
mprintf( PAGE_NUMBER_X, PAGE_NUMBER_Y, sString );
swprintf( sString, L"%s %d - %d",pHistoryHeaders[2], 1 , 1 );
@@ -997,7 +997,7 @@ void DisplayPageNumberAndDateRange( void )
// get the last page
- swprintf( sString, L"%s %d / %d",pHistoryHeaders[1], iCurrentHistoryPage , iLastPage +1 );
+ swprintf( sString, L"%s %d / %d",pHistoryHeaders[1], iCurrentHistoryPage , iLastPage +1 );
mprintf( PAGE_NUMBER_X, PAGE_NUMBER_Y, sString );
swprintf( sString, L"%s %d - %d",pHistoryHeaders[2], pCurrentHistory->uiDate / ( 24 * 60 ) , uiLastDate/( 24 * 60 ) );
diff --git a/Laptop/laptop.cpp b/Laptop/laptop.cpp
index a376e84b..fa18bab3 100644
--- a/Laptop/laptop.cpp
+++ b/Laptop/laptop.cpp
@@ -2655,7 +2655,7 @@ void HaventMadeImpMercEmailCallBack()
if( ( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) && ( LaptopSaveInfo.fSentImpWarningAlready == FALSE ) )
{
LaptopSaveInfo.fSentImpWarningAlready = TRUE;
- AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1 );
+ AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1, -1 );
}
}
diff --git a/Laptop/mercs.cpp b/Laptop/mercs.cpp
index fc481d3b..4d4968a9 100644
--- a/Laptop/mercs.cpp
+++ b/Laptop/mercs.cpp
@@ -806,7 +806,7 @@ void DailyUpdateOfMercSite( UINT16 usDate)
if( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_INVALID )
{
LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_INVALID;
- AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
+ AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
}
}
else if( iNumDays > MERC_NUM_DAYS_TILL_ACCOUNT_SUSPENDED )
@@ -814,7 +814,7 @@ void DailyUpdateOfMercSite( UINT16 usDate)
if( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_SUSPENDED )
{
LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_SUSPENDED;
- AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
+ AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
// Have speck complain next time player come to site
LaptopSaveInfo.uiSpeckQuoteFlags |= SPECK_QUOTE__SENT_EMAIL_ABOUT_LACK_OF_PAYMENT;
@@ -825,7 +825,7 @@ void DailyUpdateOfMercSite( UINT16 usDate)
if( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_VALID_FIRST_WARNING )
{
LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_VALID_FIRST_WARNING;
- AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
+ AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
// Have speck complain next time player come to site
LaptopSaveInfo.uiSpeckQuoteFlags |= SPECK_QUOTE__SENT_EMAIL_ABOUT_LACK_OF_PAYMENT;
@@ -2352,7 +2352,7 @@ BOOLEAN ShouldTheMercSiteServerGoDown()
void GetMercSiteBackOnline()
{
//Add an email telling the user the site is back up
- AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1 );
+ AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1 );
//Set a flag indicating that the server just went up ( so speck can make a comment when the player next visits the site )
LaptopSaveInfo.fFirstVisitSinceServerWentDown = TRUE;
@@ -2491,108 +2491,31 @@ BOOLEAN AreAnyOfTheNewMercsAvailable()
}
void ShouldAnyNewMercMercBecomeAvailable()
-{
- BOOLEAN fNewMercAreAvailable = FALSE;
-
- UINT8 i;
- BOOLEAN Stop = FALSE;
-
+{
//Kaiden: Added this if test to make sure that the "New Mercs Available"
// e-mail doesn't show up and no unneccessary checks are made when you
// have the ALL_MERCS_AT_MERC set to TRUE in the INI file.
if(!gGameExternalOptions.fAllMercsAvailable)
{
- for(i=0; iinitialize();
//if we are at the most current version, then fine
@@ -1243,6 +1244,17 @@ BOOLEAN MERCPROFILESTRUCT::Load(HWFILE hFile, bool forceLoadOldVersion, bool for
numBytesRead = ReadFieldByField( hFile, &this->bExplosivesDelta, sizeof(this->bExplosivesDelta), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bStrengthDelta, sizeof(this->bStrengthDelta), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bLeadershipDelta, sizeof(this->bLeadershipDelta), sizeof(INT8), numBytesRead);
+ if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ { // No longer included but need to read them anyway
+ temp = numBytesRead;
+ temp = ReadFieldByField( hFile, &this->records.usKillsRegulars, sizeof(UINT16), sizeof(UINT16), temp);
+ temp = ReadFieldByField( hFile, &this->records.usAssistsMercs, sizeof(UINT16), sizeof(UINT16), temp);
+ temp = ReadFieldByField( hFile, &this->records.usShotsFired, sizeof(UINT16), sizeof(UINT16), temp);
+ temp = ReadFieldByField( hFile, &this->records.usShotsHit, sizeof(UINT16), sizeof(UINT16), temp);
+ temp = ReadFieldByField( hFile, &this->records.usBattlesTactical, sizeof(UINT16), sizeof(UINT16), temp);
+ temp = ReadFieldByField( hFile, &this->records.usTimesWoundedShot, sizeof(UINT16), sizeof(UINT16), temp);
+ numBytesRead++;
+ }
numBytesRead = ReadFieldByField( hFile, &this->usTotalDaysServed, sizeof(this->usTotalDaysServed), sizeof(UINT16), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->sLeadershipGain, sizeof(this->sLeadershipGain), sizeof(INT16), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->sStrengthGain, sizeof(this->sStrengthGain), sizeof(INT16), numBytesRead);
@@ -1257,10 +1269,16 @@ BOOLEAN MERCPROFILESTRUCT::Load(HWFILE hFile, bool forceLoadOldVersion, bool for
numBytesRead = ReadFieldByField( hFile, this->bSkillTraits, sizeof(INT8), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bReputationTolerance, sizeof(this->bReputationTolerance), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bExplosive, sizeof(this->bExplosive), sizeof(INT8), numBytesRead);
- if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE2)
+ if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE2 && guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE)
{ //CHRISL: These two variables no longer exist but we should read them into bSKillTraits[1] and [2]
numBytesRead = ReadFieldByField( hFile, &this->bSkillTraits[1], sizeof(INT8), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bSkillTraits[2], sizeof(INT8), sizeof(INT8), numBytesRead);
+ numBytesRead += 27;
+ }
+ else if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ {
+ numBytesRead = ReadFieldByField( hFile, &this->bSkillTraits[1], sizeof(INT8), sizeof(INT8), numBytesRead);
+ numBytesRead += 28;
}
numBytesRead = ReadFieldByField( hFile, &this->bLeadership, sizeof(this->bLeadership), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, this->bBuddy, sizeof(this->bBuddy), sizeof(INT8), numBytesRead);
@@ -1299,8 +1317,13 @@ BOOLEAN MERCPROFILESTRUCT::Load(HWFILE hFile, bool forceLoadOldVersion, bool for
numBytesRead = ReadFieldByField( hFile, &this->uiBiWeeklySalary, sizeof(this->uiBiWeeklySalary), sizeof(UINT32), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bMedicalDeposit, sizeof(this->bMedicalDeposit), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bAttitude, sizeof(this->bAttitude), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField( hFile, &this->bCharacterTrait, sizeof(this->bCharacterTrait), sizeof(INT8), numBytesRead);
+ if(guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ numBytesRead = ReadFieldByField( hFile, &this->bCharacterTrait, sizeof(this->bCharacterTrait), sizeof(INT8), numBytesRead);
+ else
+ numBytesRead++;
numBytesRead = ReadFieldByField( hFile, &this->bBaseMorale, sizeof(this->bBaseMorale), sizeof(INT8), numBytesRead);
+ if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ ReadFieldByField( hFile, &filler, sizeof(UINT8), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->sMedicalDepositAmount, sizeof(this->sMedicalDepositAmount), sizeof(UINT16), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->bLearnToLike, sizeof(this->bLearnToLike), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField( hFile, this->ubApproachVal, sizeof(this->ubApproachVal), sizeof(UINT8), numBytesRead);
@@ -1344,6 +1367,13 @@ BOOLEAN MERCPROFILESTRUCT::Load(HWFILE hFile, bool forceLoadOldVersion, bool for
numBytesRead = ReadFieldByField( hFile, &this->sGridNo, sizeof(this->sGridNo), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField( hFile, &this->sPreCombatGridNo, sizeof(this->sPreCombatGridNo), sizeof(INT32), numBytesRead);
//numBytesRead = ReadFieldByField( hFile, &this->endOfPOD, sizeof(this->endOfPOD), sizeof(char), numBytesRead);
+ while( (numBytesRead % 2) != 0 )
+ numBytesRead = ReadFieldByField(hFile, &filler, sizeof(filler), sizeof(UINT8), numBytesRead);
+ if ( numBytesRead != SIZEOF_MERCPROFILESTRUCT_POD )
+ {
+ return(FALSE);
+ }
+
int size;
if ( !FileRead( hFile, &size, sizeof(int), &uiNumBytesRead ) )
{
@@ -1373,9 +1403,12 @@ BOOLEAN MERCPROFILESTRUCT::Load(HWFILE hFile, bool forceLoadOldVersion, bool for
bInvNumber[x] = number;
}
// SANDRO - read records
- if ( !FileRead( hFile, &this->records, sizeof(STRUCT_Records), &uiNumBytesRead ) )
+ if(guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE)
{
- return(FALSE);
+ if ( !FileRead( hFile, &this->records, sizeof(STRUCT_Records), &uiNumBytesRead ) )
+ {
+ return(FALSE);
+ }
}
if ( this->uiProfileChecksum != this->GetChecksum() )
{
@@ -1533,8 +1566,9 @@ INT32 ReadFieldByField(HWFILE hFile, PTR pDest, UINT32 uiFieldSize, UINT32 uiEle
BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
{
UINT32 uiNumBytesRead;
- INT32 numBytesRead = 0, temp = 0;
+ INT32 numBytesRead = 0, buffer = 0;
char padding[10];
+ FLOAT temp;
//if we are at the most current version, then fine
if ( guiCurrentSaveGameVersion >= NIV_SAVEGAME_DATATYPE_CHANGE )
@@ -1575,10 +1609,14 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
numBytesRead = ReadFieldByField(hFile, &this->bLastRenderVisibleValue, sizeof(bLastRenderVisibleValue), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->ubAttackingHand, sizeof(ubAttackingHand), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->sWeightCarriedAtTurnStart, sizeof(sWeightCarriedAtTurnStart), sizeof(INT16), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->iHealableInjury, sizeof(iHealableInjury), sizeof(INT32), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->fDoingSurgery, sizeof(fDoingSurgery), sizeof(BOOLEAN), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->lUnregainableBreath, sizeof(lUnregainableBreath), sizeof(signed long), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->ubCriticalStatDamage, sizeof(ubCriticalStatDamage), sizeof(UINT8), numBytesRead);
+ if(guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE){
+ numBytesRead = ReadFieldByField(hFile, &this->iHealableInjury, sizeof(iHealableInjury), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->fDoingSurgery, sizeof(fDoingSurgery), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->lUnregainableBreath, sizeof(lUnregainableBreath), sizeof(signed long), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->ubCriticalStatDamage, sizeof(ubCriticalStatDamage), sizeof(UINT8), numBytesRead);
+ } else {
+ buffer += 24;
+ }
numBytesRead = ReadFieldByField(hFile, &this->ubGroupID, sizeof(ubGroupID), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->ubMovementNoiseHeard, sizeof(ubMovementNoiseHeard), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->dXPos, sizeof(dXPos), sizeof(FLOAT), numBytesRead);
@@ -1588,10 +1626,11 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
numBytesRead = ReadFieldByField(hFile, &this->sOldYPos, sizeof(sOldYPos), sizeof(INT16), numBytesRead);
} else {
//CHRISL: These used to be floats but we've reduced them to INT16
- numBytesRead = ReadFieldByField(hFile, &this->sOldXPos, sizeof(sOldXPos), sizeof(INT16), numBytesRead);
- temp = ReadFieldByField(hFile, &padding, sizeof(INT16), sizeof(INT16), temp);
- numBytesRead = ReadFieldByField(hFile, &this->sOldYPos, sizeof(sOldYPos), sizeof(INT16), numBytesRead);
- temp = ReadFieldByField(hFile, &padding, sizeof(INT16), sizeof(INT16), temp);
+ numBytesRead = ReadFieldByField(hFile, &temp, sizeof(FLOAT), sizeof(FLOAT), numBytesRead);
+ this->sOldXPos = (INT16)temp;
+ numBytesRead = ReadFieldByField(hFile, &temp, sizeof(FLOAT), sizeof(FLOAT), numBytesRead);
+ this->sOldYPos = (INT16)temp;
+ buffer -= 4;
}
numBytesRead = ReadFieldByField(hFile, &this->sInitialGridNo, sizeof(sInitialGridNo), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->sGridNo, sizeof(sGridNo), sizeof(INT32), numBytesRead);
@@ -1634,10 +1673,17 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
numBytesRead = ReadFieldByField(hFile, &this->dPrevCounterForceX, sizeof(dPrevCounterForceX), sizeof(FLOAT), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->dPrevCounterForceY, sizeof(dPrevCounterForceY), sizeof(FLOAT), numBytesRead);
} else {
- numBytesRead += sizeof(FLOAT);
- numBytesRead += sizeof(FLOAT);
- numBytesRead += sizeof(FLOAT);
- numBytesRead += sizeof(FLOAT);
+ buffer += sizeof(FLOAT);
+ buffer += sizeof(FLOAT);
+ buffer += sizeof(FLOAT);
+ buffer += sizeof(FLOAT);
+ }
+ if(guiCurrentSaveGameVersion >= NCTH_AUTOFIRE_UPDATE){
+ numBytesRead = ReadFieldByField(hFile, &this->dInitialMuzzleOffsetX, sizeof(dInitialMuzzleOffsetX), sizeof(FLOAT), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->dInitialMuzzleOffsetY, sizeof(dInitialMuzzleOffsetY), sizeof(FLOAT), numBytesRead);
+ } else {
+ buffer += sizeof(FLOAT);
+ buffer += sizeof(FLOAT);
}
numBytesRead = ReadFieldByField(hFile, &this->bTilesMoved, sizeof(bTilesMoved), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->dNextBleed, sizeof(dNextBleed), sizeof(FLOAT), numBytesRead);
@@ -1860,8 +1906,9 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
numBytesRead = ReadFieldByField(hFile, &this->snowCamo, sizeof(snowCamo), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->wornSnowCamo, sizeof(wornSnowCamo), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->sFacilityTypeOperated, sizeof(sFacilityTypeOperated), sizeof(INT16), numBytesRead);
-// if(numBytesRead != SIZEOF_SOLDIERTYPE_POD)
-// return(FALSE);
+ numBytesRead += buffer;
+ if(numBytesRead != SIZEOF_SOLDIERTYPE_POD)
+ return(FALSE);
/* //CHRISL: It was further changed at version 104 to allow for 16bit action points for the 100AP system
//first, load the POD
if ( guiCurrentSaveGameVersion >= AP100_SAVEGAME_DATATYPE_CHANGE )
@@ -2001,29 +2048,57 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
{
return(FALSE);
}
- //Load STRUCT_AIData
+ //Load STRUCT_Statistics
numBytesRead = 0;
- numBytesRead = ReadFieldByField(hFile, &this->stats.bExpLevel, sizeof(stats.bExpLevel), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bLife, sizeof(stats.bLife), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bLifeMax, sizeof(stats.bLifeMax), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bStrength, sizeof(stats.bStrength), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bAgility, sizeof(stats.bAgility), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bDexterity, sizeof(stats.bDexterity), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bWisdom, sizeof(stats.bWisdom), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bLeadership, sizeof(stats.bLeadership), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bMarksmanship, sizeof(stats.bMarksmanship), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bMechanical, sizeof(stats.bMechanical), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bExplosive, sizeof(stats.bExplosive), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bMedical, sizeof(stats.bMedical), sizeof(INT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.bScientific, sizeof(stats.bScientific), sizeof(INT8), numBytesRead);
- if ( guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE2 )
- numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits, sizeof(stats.ubSkillTraits), sizeof(UINT8), numBytesRead);
+ buffer = 0;
+ if ( guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE )
+ {
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bExpLevel, sizeof(stats.bExpLevel), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLife, sizeof(stats.bLife), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLifeMax, sizeof(stats.bLifeMax), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bStrength, sizeof(stats.bStrength), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bAgility, sizeof(stats.bAgility), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bDexterity, sizeof(stats.bDexterity), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bWisdom, sizeof(stats.bWisdom), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLeadership, sizeof(stats.bLeadership), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMarksmanship, sizeof(stats.bMarksmanship), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMechanical, sizeof(stats.bMechanical), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bExplosive, sizeof(stats.bExplosive), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMedical, sizeof(stats.bMedical), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bScientific, sizeof(stats.bScientific), sizeof(INT8), numBytesRead);
+ if ( guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE2 )
+ numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits, sizeof(stats.ubSkillTraits), sizeof(UINT8), numBytesRead);
+ else
+ {
+ numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[0], sizeof(UINT8), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[1], sizeof(UINT8), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[2], sizeof(UINT8), sizeof(UINT8), numBytesRead);
+ buffer = 27;
+ }
+ }
else
{
+ // Prior to STOMP12_SAVEGAME_DATATYPE_CHANGE, we stored these variables in a different order
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLife, sizeof(stats.bLife), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLifeMax, sizeof(stats.bLifeMax), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bExpLevel, sizeof(stats.bExpLevel), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bAgility, sizeof(stats.bAgility), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bStrength, sizeof(stats.bStrength), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMechanical, sizeof(stats.bMechanical), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMarksmanship, sizeof(stats.bMarksmanship), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bExplosive, sizeof(stats.bExplosive), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[0], sizeof(UINT8), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[1], sizeof(UINT8), sizeof(UINT8), numBytesRead);
- numBytesRead = ReadFieldByField(hFile, &this->stats.ubSkillTraits[2], sizeof(UINT8), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bDexterity, sizeof(stats.bDexterity), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bWisdom, sizeof(stats.bWisdom), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bMedical, sizeof(stats.bMedical), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bScientific, sizeof(stats.bScientific), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &this->stats.bLeadership, sizeof(stats.bLeadership), sizeof(INT8), numBytesRead);
+ buffer = 28;
}
+ numBytesRead += buffer;
+ if(numBytesRead != sizeof(STRUCT_Statistics))
+ return(FALSE);
// if ( !FileRead( hFile, &this->stats, sizeof(STRUCT_Statistics), &uiNumBytesRead ) )
// {
// return(FALSE);
@@ -2893,8 +2968,8 @@ BOOLEAN SaveGame( int ubSaveGameID, STR16 pGameDesc )
SaveGameFilePosition( FileGetPos( hFile ), "Save Game Header" );
#endif
-
-
+ //CHRISL: Added here so we can get game options earlier in the load process
+ FileWrite( hFile, &gGameOptions, sizeof( GAME_OPTIONS ), &uiNumBytesWritten );
//
//Save the gTactical Status array, plus the curent secotr location
@@ -3203,7 +3278,6 @@ BOOLEAN SaveGame( int ubSaveGameID, STR16 pGameDesc )
-
if( !SaveGeneralInfo( hFile ) )
{
ScreenMsg( FONT_MCOLOR_WHITE, MSG_ERROR, L"ERROR general info");
@@ -3488,7 +3562,7 @@ BOOLEAN SaveGame( int ubSaveGameID, STR16 pGameDesc )
//if we succesfully saved the game, mark this entry as the last saved game file
- if( ubSaveGameID < EARLIST_SPECIAL_SAVE)
+ if( ubSaveGameID < EARLIST_SPECIAL_SAVE && ubSaveGameID != SAVE__TIMED_AUTOSAVE )
{
gGameSettings.bLastSavedGameSlot = ubSaveGameID;
}
@@ -3706,10 +3780,19 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
guiCurrentSaveGameVersion = SaveGameHeader.uiSavedGameVersion;
guiBrokenSaveGameVersion = SaveGameHeader.uiSavedGameVersion;
- // CHRISL: We need to know what inventory system we're using early on
- if(SaveGameHeader.uiSavedGameVersion < NIV_SAVEGAME_DATATYPE_CHANGE)
- SaveGameHeader.ubInventorySystem = 0;
- gGameOptions.ubInventorySystem = SaveGameHeader.ubInventorySystem;
+ if(guiCurrentSaveGameVersion >= MOVED_GENERAL_INFO)
+ {
+ FileRead(hFile, &gGameOptions, sizeof( GAME_OPTIONS ), &uiNumBytesRead );
+ }
+ else
+ {
+ // CHRISL: We need to know what inventory system we're using early on
+ if(SaveGameHeader.uiSavedGameVersion < NIV_SAVEGAME_DATATYPE_CHANGE)
+ SaveGameHeader.ubInventorySystem = 0;
+
+ gGameOptions.ubInventorySystem = SaveGameHeader.ubInventorySystem;
+ gGameOptions.ubAttachmentSystem = SaveGameHeader.ubAttachmentSystem;
+ }
if((UsingNewInventorySystem() == true))
{
@@ -3733,8 +3816,6 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
InitializeSMPanelCoordsOld();
InitializeInvPanelCoordsOld();
}
-
- gGameOptions.ubAttachmentSystem = SaveGameHeader.ubAttachmentSystem;
//if the player is loading up an older version of the game, and the person DOESNT have the cheats on,
if( guiCurrentSaveGameVersion < 65 && !CHEATER_CHEAT_LEVEL( ) )
@@ -4281,7 +4362,6 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
#endif
-
uiRelEndPerc += 0;
SetRelativeStartAndEndPercentage( 0, uiRelStartPerc, uiRelEndPerc, L"Misc info..." );
RenderProgressBar( 0, 100 );
@@ -4303,7 +4383,6 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
uiRelStartPerc = uiRelEndPerc;
-
if( !LoadMineStatusFromSavedGameFile( hFile ) )
{
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("LoadMineStatusFromSavedGameFile failed" ) );
@@ -4889,6 +4968,45 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
//
FileClose( hFile );
+ //CHRISL: To correct a problem with the MERC email, at this point we want to see if the email has been sent and force it if necessary
+ if(gGameExternalOptions.fAllMercsAvailable == TRUE && GetWorldDay() >= 3 )
+ {
+ bool fBookMark = false;
+ bool fEmail = false;
+ for(UINT32 cnt = 0; cnt < MAX_BOOKMARKS; cnt++){
+ if(LaptopSaveInfo.iBookMarkList[cnt] == 3){
+ fBookMark = true;
+ break;
+ }
+ }
+ EmailPtr pEmail=pEmailList;
+ if(pEmail)
+ {
+ while(pEmail)
+ {
+ if(pEmail->ubSender == 4)
+ {
+ fEmail = true;
+ break;
+ }
+ pEmail=pEmail->Next;
+ }
+ }
+ if(!fBookMark && !fEmail)
+ AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1 );
+ }
+
+ // CHRISL: To set camo faces correctly from the start
+ for( UINT16 cnt=0; cnt< CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS; cnt++)
+ {
+ if(MercPtrs[cnt]->ubID == cnt)
+ {
+ SetCamoFace( MercPtrs[cnt] );
+ DeleteSoldierFace( MercPtrs[cnt] );// remove face
+ MercPtrs[cnt]->iFaceIndex = InitSoldierFace( MercPtrs[cnt] );// create new face
+ }
+ }
+
// ATE: Patch? Patch up groups.....( will only do for old saves.. )
UpdatePersistantGroupsFromOldSave( guiCurrentSaveGameVersion );
@@ -5175,6 +5293,20 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
//now change the savegame format so that temp files are saved and loaded correctly
guiCurrentSaveGameVersion = SAVE_GAME_VERSION;
+
+ // WANNE: This should fix the bug if any merc are still under PC control. This could happen after boxing in SAN MONA.
+ SOLDIERTYPE *pTeamSoldier;
+ for (INT8 bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++)
+ {
+ pTeamSoldier=MercPtrs[bLoop];
+
+ if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
+ pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
+
+ if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER)
+ pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER);
+ }
+
return( TRUE );
}
@@ -5207,6 +5339,9 @@ BOOLEAN LoadSavedMercProfiles( HWFILE hFile )
//Loop through all the profiles to Load
for( cnt=0; cnt< NUM_PROFILES; cnt++)
{
+ // At some point after STOMP12_SAVEGAME_DATATYPE_CHANGE, NUM_PROFILES was changed from NUM_PROFILES_v111
+ if(guiCurrentSaveGameVersion < STOMP12_SAVEGAME_DATATYPE_CHANGE && cnt >= NUM_PROFILES_v111)
+ break;
// Changed by ADB, rev 1513
//if ( !gMercProfiles[cnt].Load(hFile, false) )
if ( !gMercProfiles[cnt].Load(hFile, false, false, true) )
@@ -5772,6 +5907,7 @@ BOOLEAN LoadFilesFromSavedGame( STR pSrcFileName, HWFILE hFile )
#ifdef JA2BETAVERSION
WriteTempFileNameToFile( pSrcFileName, uiFileSize, hFile );
#endif
+
return( TRUE );
}
@@ -5842,6 +5978,9 @@ BOOLEAN SaveEmailToSavedGame( HWFILE hFile )
SavedEmail.uiSixData = pEmail->uiSixData;
SavedEmail.iCurrentIMPPosition = pEmail->iCurrentIMPPosition;
+ // WANNE.MAIL: Fix
+ SavedEmail.iCurrentShipmentDestinationID = pEmail->iCurrentShipmentDestinationID;
+
// write the email header to the saved game file
FileWrite( hFile, &SavedEmail, sizeof( SavedEmailStruct ), &uiNumBytesWritten );
if( uiNumBytesWritten != sizeof( SavedEmailStruct ) )
@@ -5910,9 +6049,34 @@ BOOLEAN LoadEmailFromSavedGame( HWFILE hFile )
return(FALSE);
}
- //get the rest of the data from the email
- FileRead( hFile, &SavedEmail, sizeof( SavedEmailStruct ), &uiNumBytesRead );
- if( uiNumBytesRead != sizeof( SavedEmailStruct ) )
+ //CHRISL: Adjust this so we can change the SavedEmailStruct without hurting savegame compatability
+ //get the rest of the data from the email
+ INT32 numBytesRead = 0, temp;
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.usOffset, sizeof(SavedEmail.usOffset), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.usLength, sizeof(SavedEmail.usLength), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.ubSender, sizeof(SavedEmail.ubSender), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iDate, sizeof(SavedEmail.iDate), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iId, sizeof(SavedEmail.iId), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iFirstData, sizeof(SavedEmail.iFirstData), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.uiSecondData, sizeof(SavedEmail.uiSecondData), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iThirdData, sizeof(SavedEmail.iThirdData), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iFourthData, sizeof(SavedEmail.iFourthData), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.uiFifthData, sizeof(SavedEmail.uiFifthData), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.uiSixData, sizeof(SavedEmail.uiSixData), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.fRead, sizeof(SavedEmail.fRead), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.fNew, sizeof(SavedEmail.fNew), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iCurrentIMPPosition, sizeof(SavedEmail.iCurrentIMPPosition), sizeof(INT32), numBytesRead);
+ if(guiCurrentSaveGameVersion >= BR_EMAIL_DATA_CHANGE){
+ numBytesRead = ReadFieldByField(hFile, &SavedEmail.iCurrentShipmentDestinationID, sizeof(SavedEmail.iCurrentShipmentDestinationID), sizeof(INT16), numBytesRead);
+ //We need these extra 2 bytes so that the structure's total size is evenly divisible by 4
+ numBytesRead = ReadFieldByField(hFile, &temp, sizeof(INT16), sizeof(INT16), numBytesRead);
+ } else {
+ numBytesRead += sizeof(INT16);
+ numBytesRead += sizeof(INT16);
+ }
+ //FileRead( hFile, &SavedEmail, sizeof( SavedEmailStruct ), &uiNumBytesRead );
+ //if( uiNumBytesRead != sizeof( SavedEmailStruct ) )
+ if(numBytesRead != sizeof( SavedEmailStruct ))
{
return(FALSE);
}
@@ -5943,6 +6107,9 @@ BOOLEAN LoadEmailFromSavedGame( HWFILE hFile )
pTempEmail->uiSixData = SavedEmail.uiSixData;
pTempEmail->iCurrentIMPPosition = SavedEmail.iCurrentIMPPosition;
+ // WANNE.MAIL: Fix
+ pTempEmail->iCurrentShipmentDestinationID = SavedEmail.iCurrentShipmentDestinationID;
+
//add the current email in
pEmail->Next = pTempEmail;
pTempEmail->Prev = pEmail;
@@ -6025,14 +6192,126 @@ void FailedLoadingGameCallBack( UINT8 bExitValue );
BOOLEAN LoadTacticalStatusFromSavedGame( HWFILE hFile )
{
UINT32 uiNumBytesRead;
+ INT32 numBytesRead = 0;
+ UINT8 filler = 0;
// for (unsigned idx=0; idx <= MAXTEAMS; ++idx) {
// savedTeamSettings[idx] = gTacticalStatus.Team[idx];
// }
//Read the gTacticalStatus to the saved game file
- FileRead( hFile, &gTacticalStatus, sizeof( TacticalStatusType ), &uiNumBytesRead );
- if( uiNumBytesRead != sizeof( TacticalStatusType ) ) {
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiFlags, sizeof(gTacticalStatus.uiFlags), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.Team, sizeof(gTacticalStatus.Team), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubCurrentTeam, sizeof(gTacticalStatus.ubCurrentTeam), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sSlideTarget, sizeof(gTacticalStatus.sSlideTarget), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sSlideReason, sizeof(gTacticalStatus.sSlideReason), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeSinceMercAIStart, sizeof(gTacticalStatus.uiTimeSinceMercAIStart), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fPanicFlags, sizeof(gTacticalStatus.fPanicFlags), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sPanicTriggerGridNoUnused, sizeof(gTacticalStatus.sPanicTriggerGridNoUnused), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sHandGrid, sizeof(gTacticalStatus.sHandGrid), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubSpottersCalledForBy, sizeof(gTacticalStatus.ubSpottersCalledForBy), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubTheChosenOne, sizeof(gTacticalStatus.ubTheChosenOne), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeOfLastInput, sizeof(gTacticalStatus.uiTimeOfLastInput), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeSinceDemoOn, sizeof(gTacticalStatus.uiTimeSinceDemoOn), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiCountdownToRestart, sizeof(gTacticalStatus.uiCountdownToRestart), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fGoingToEnterDemo, sizeof(gTacticalStatus.fGoingToEnterDemo), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fNOTDOLASTDEMO, sizeof(gTacticalStatus.fNOTDOLASTDEMO), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fMultiplayer, sizeof(gTacticalStatus.fMultiplayer), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fCivGroupHostile, sizeof(gTacticalStatus.fCivGroupHostile), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastBattleSectorX, sizeof(gTacticalStatus.ubLastBattleSectorX), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastBattleSectorY, sizeof(gTacticalStatus.ubLastBattleSectorY), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fLastBattleWon, sizeof(gTacticalStatus.fLastBattleWon), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bOriginalSizeOfEnemyForce, sizeof(gTacticalStatus.bOriginalSizeOfEnemyForce), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bPanicTriggerIsAlarmUnused, sizeof(gTacticalStatus.bPanicTriggerIsAlarmUnused), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fVirginSector, sizeof(gTacticalStatus.fVirginSector), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fEnemyInSector, sizeof(gTacticalStatus.fEnemyInSector), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fInterruptOccurred, sizeof(gTacticalStatus.fInterruptOccurred), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bRealtimeSpeed, sizeof(gTacticalStatus.bRealtimeSpeed), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemyIntention, sizeof(gTacticalStatus.ubEnemyIntention), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemyIntendedRetreatDirection, sizeof(gTacticalStatus.ubEnemyIntendedRetreatDirection), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID, sizeof(gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemySightingOnTheirTurnPlayerID, sizeof(gTacticalStatus.ubEnemySightingOnTheirTurnPlayerID), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fEnemySightingOnTheirTurn, sizeof(gTacticalStatus.fEnemySightingOnTheirTurn), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fAutoBandageMode, sizeof(gTacticalStatus.fAutoBandageMode), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubAttackBusyCount, sizeof(gTacticalStatus.ubAttackBusyCount), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bNumEnemiesFoughtInBattleUnused, sizeof(gTacticalStatus.bNumEnemiesFoughtInBattleUnused), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEngagedInConvFromActionMercID, sizeof(gTacticalStatus.ubEngagedInConvFromActionMercID), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.usTactialTurnLimitCounter, sizeof(gTacticalStatus.usTactialTurnLimitCounter), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fInTopMessage, sizeof(gTacticalStatus.fInTopMessage), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubTopMessageType, sizeof(gTacticalStatus.ubTopMessageType), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.zTopMessageString, sizeof(gTacticalStatus.zTopMessageString), sizeof(CHAR16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.usTactialTurnLimitMax, sizeof(gTacticalStatus.usTactialTurnLimitMax), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTactialTurnLimitClock, sizeof(gTacticalStatus.uiTactialTurnLimitClock), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fTactialTurnLimitStartedBeep, sizeof(gTacticalStatus.fTactialTurnLimitStartedBeep), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bBoxingState, sizeof(gTacticalStatus.bBoxingState), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bConsNumTurnsNotSeen, sizeof(gTacticalStatus.bConsNumTurnsNotSeen), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubArmyGuysKilled, sizeof(gTacticalStatus.ubArmyGuysKilled), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sPanicTriggerGridNo, sizeof(gTacticalStatus.sPanicTriggerGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bPanicTriggerIsAlarm, sizeof(gTacticalStatus.bPanicTriggerIsAlarm), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubPanicTolerance, sizeof(gTacticalStatus.ubPanicTolerance), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fAtLeastOneGuyOnMultiSelect, sizeof(gTacticalStatus.fAtLeastOneGuyOnMultiSelect), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fSaidCreatureFlavourQuote, sizeof(gTacticalStatus.fSaidCreatureFlavourQuote), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fHaveSeenCreature, sizeof(gTacticalStatus.fHaveSeenCreature), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fKilledEnemyOnAttack, sizeof(gTacticalStatus.fKilledEnemyOnAttack), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemyKilledOnAttack, sizeof(gTacticalStatus.ubEnemyKilledOnAttack), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bEnemyKilledOnAttackLevel, sizeof(gTacticalStatus.bEnemyKilledOnAttackLevel), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemyKilledOnAttackLocation, sizeof(gTacticalStatus.ubEnemyKilledOnAttackLocation), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fItemsSeenOnAttack, sizeof(gTacticalStatus.fItemsSeenOnAttack), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubItemsSeenOnAttackSoldier, sizeof(gTacticalStatus.ubItemsSeenOnAttackSoldier), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fBeenInCombatOnce, sizeof(gTacticalStatus.fBeenInCombatOnce), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fSaidCreatureSmellQuote, sizeof(gTacticalStatus.fSaidCreatureSmellQuote), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.usItemsSeenOnAttackGridNo, sizeof(gTacticalStatus.usItemsSeenOnAttackGridNo), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fLockItemLocators, sizeof(gTacticalStatus.fLockItemLocators), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastQuoteSaid, sizeof(gTacticalStatus.ubLastQuoteSaid), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastQuoteProfileNUm, sizeof(gTacticalStatus.ubLastQuoteProfileNUm), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fCantGetThrough, sizeof(gTacticalStatus.fCantGetThrough), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sCantGetThroughGridNo, sizeof(gTacticalStatus.sCantGetThroughGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sCantGetThroughSoldierGridNo, sizeof(gTacticalStatus.sCantGetThroughSoldierGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubCantGetThroughID, sizeof(gTacticalStatus.ubCantGetThroughID), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fDidGameJustStart, sizeof(gTacticalStatus.fDidGameJustStart), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fStatChangeCheatOn, sizeof(gTacticalStatus.fStatChangeCheatOn), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastRequesterTargetID, sizeof(gTacticalStatus.ubLastRequesterTargetID), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fGoodToAllowCrows, sizeof(gTacticalStatus.fGoodToAllowCrows), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubNumCrowsPossible, sizeof(gTacticalStatus.ubNumCrowsPossible), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeCounterForGiveItemSrc, sizeof(gTacticalStatus.uiTimeCounterForGiveItemSrc), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fUnLockUIAfterHiddenInterrupt, sizeof(gTacticalStatus.fUnLockUIAfterHiddenInterrupt), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bNumFoughtInBattle, sizeof(gTacticalStatus.bNumFoughtInBattle), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiDecayBloodLastUpdate, sizeof(gTacticalStatus.uiDecayBloodLastUpdate), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeSinceLastInTactical, sizeof(gTacticalStatus.uiTimeSinceLastInTactical), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fHasAGameBeenStarted, sizeof(gTacticalStatus.fHasAGameBeenStarted), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bConsNumTurnsWeHaventSeenButEnemyDoes, sizeof(gTacticalStatus.bConsNumTurnsWeHaventSeenButEnemyDoes), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fSomeoneHit, sizeof(gTacticalStatus.fSomeoneHit), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubPaddingSmall, sizeof(gTacticalStatus.ubPaddingSmall), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiTimeSinceLastOpplistDecay, sizeof(gTacticalStatus.uiTimeSinceLastOpplistDecay), sizeof(UINT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bMercArrivingQuoteBeingUsed, sizeof(gTacticalStatus.bMercArrivingQuoteBeingUsed), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubEnemyKilledOnAttackKiller, sizeof(gTacticalStatus.ubEnemyKilledOnAttackKiller), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fCountingDownForGuideDescription, sizeof(gTacticalStatus.fCountingDownForGuideDescription), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bGuideDescriptionCountDown, sizeof(gTacticalStatus.bGuideDescriptionCountDown), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubGuideDescriptionToUse, sizeof(gTacticalStatus.ubGuideDescriptionToUse), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bGuideDescriptionSectorX, sizeof(gTacticalStatus.bGuideDescriptionSectorX), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.bGuideDescriptionSectorY, sizeof(gTacticalStatus.bGuideDescriptionSectorY), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.fEnemyFlags, sizeof(gTacticalStatus.fEnemyFlags), sizeof(INT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus. fAutoBandagePending, sizeof(gTacticalStatus. fAutoBandagePending), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus. fHasEnteredCombatModeSinceEntering, sizeof(gTacticalStatus. fHasEnteredCombatModeSinceEntering), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus. fDontAddNewCrows, sizeof(gTacticalStatus. fDontAddNewCrows), sizeof(BOOLEAN), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubMorePadding, sizeof(gTacticalStatus.ubMorePadding), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.sCreatureTenseQuoteDelay, sizeof(gTacticalStatus.sCreatureTenseQuoteDelay), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.uiCreatureTenseQuoteLastUpdate, sizeof(gTacticalStatus.uiCreatureTenseQuoteLastUpdate), sizeof(UINT32), numBytesRead);
+ if ( guiCurrentSaveGameVersion >= BUGFIX_NPC_DATA_FOR_BIG_MAPS )
+ {
+ numBytesRead = ReadFieldByField(hFile, &gTacticalStatus.ubLastRequesterSurgeryTargetID, sizeof(gTacticalStatus.ubLastRequesterSurgeryTargetID), sizeof(UINT8), numBytesRead);
+ while( (numBytesRead%4) != 0 ) // This is to make sure the total read is of DWORD length
+ numBytesRead = ReadFieldByField(hFile, &filler, sizeof(filler), sizeof(UINT8), numBytesRead);
+ }
+ else
+ {
+ numBytesRead++;
+ while( (numBytesRead%4) != 0 ) // This is to make sure the total read is of DWORD length
+ numBytesRead++;
+ }
+ //FileRead( hFile, &gTacticalStatus, sizeof( TacticalStatusType ), &uiNumBytesRead );
+ //if( uiNumBytesRead != sizeof( TacticalStatusType ) ) {
+ if( numBytesRead != sizeof( TacticalStatusType ) ) {
return(FALSE);
}
@@ -6058,13 +6337,19 @@ BOOLEAN LoadTacticalStatusFromSavedGame( HWFILE hFile )
int cntFromIni[] = {gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs + gGameExternalOptions.ubGameMaximumNumberOfPlayerVehicles,
gGameExternalOptions.ubGameMaximumNumberOfEnemies, gGameExternalOptions.ubGameMaximumNumberOfCreatures,
gGameExternalOptions.ubGameMaximumNumberOfRebels, gGameExternalOptions.ubGameMaximumNumberOfCivilians};
- CHAR16 *errMsgTxt[] = {L"mercenary/vehicle", L"enemy", L"creature", L"militia", L"civilian"};
+
+ CHAR16 *errMsgTxt[] = {L"Mercenary / Vehicle", L"Enemy", L"Creature", L"Militia", L"Civilian"};
+ errMsgTxt[0] = Additional113Text[2];
+ errMsgTxt[1] = Additional113Text[3];
+ errMsgTxt[2] = Additional113Text[4];
+ errMsgTxt[3] = Additional113Text[5];
+ errMsgTxt[4] = Additional113Text[6];
bool needToRejigger = false;
for (int idx = OUR_TEAM; idx <= CIV_TEAM; ++idx) {
if ((cntFromFile[ idx ] > cntFromIni[ idx ]) || ((cntFromFile[ idx ] < cntFromIni[ idx ]) && (idx == OUR_TEAM))) {
CHAR16 errorMessage[512];
- swprintf(errorMessage, L"Internal error in reading %s slots from save file: number of slots in save file (%d) differs from .ini setting (%d)", errMsgTxt [ idx ], cntFromFile[ idx ], cntFromIni[ idx ]);
+ swprintf(errorMessage, Additional113Text[1], errMsgTxt [ idx ], cntFromFile[ idx ], cntFromIni[ idx ]);
DoScreenIndependantMessageBox(errorMessage, MSG_BOX_FLAG_OK, FailedLoadingGameCallBack );
return FALSE;
} else if (cntFromFile[ idx ] < cntFromIni[ idx ]) {
diff --git a/Standard Gaming Platform/SGP_VS2005.vcproj b/Standard Gaming Platform/SGP_VS2005.vcproj
index 927f8439..478efb69 100644
--- a/Standard Gaming Platform/SGP_VS2005.vcproj
+++ b/Standard Gaming Platform/SGP_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
@@ -422,6 +423,19 @@ BOOLEAN CopyImageToBuffer( HIMAGE hImage, UINT32 fBufferType, BYTE *pDestBuf, UI
return( Copy16BPPImageTo16BPPBuffer( hImage, pDestBuf, usDestWidth, usDestHeight, usX, usY, srcRect ) );
}
+ if ( hImage->ubBitDepth == 24 && fBufferType == BUFFER_16BPP )
+ {
+ DbgMessage( TOPIC_HIMAGE, DBG_LEVEL_3, "Copying 24 BPP Imagery to 16BPP Buffer." );
+ SGP_THROW("not yet implemented");
+ return( FALSE );
+ }
+
+ if ( hImage->ubBitDepth == 32 && fBufferType == BUFFER_16BPP )
+ {
+ DbgMessage( TOPIC_HIMAGE, DBG_LEVEL_3, "Copying 32 BPP Imagery to 16BPP Buffer." );
+ return Blt32BPPTo16BPPTrans((UINT16*)pDestBuf, usDestWidth * sizeof(UINT16), hImage->p32BPPData, usDestWidth*sizeof(UINT32), 0,0,0,0,usDestWidth, usDestHeight);
+ }
+
return( FALSE );
}
diff --git a/Standard Gaming Platform/soundman.cpp b/Standard Gaming Platform/soundman.cpp
index 6386eaa3..6063906d 100644
--- a/Standard Gaming Platform/soundman.cpp
+++ b/Standard Gaming Platform/soundman.cpp
@@ -1164,6 +1164,10 @@ BOOLEAN fRemoved;
if((hFile=FileOpen(pFilename, FILE_ACCESS_READ, FALSE))!=0)
{
uiSize=FileGetSize(hFile);
+ if(uiSize == 0)
+ {
+ return NO_SAMPLE;
+ }
// if insufficient memory, start unloading old samples until either
// there's nothing left to unload, or we fit
diff --git a/Standard Gaming Platform/vsurface.cpp b/Standard Gaming Platform/vsurface.cpp
index 1897d0a6..257e5bc1 100644
--- a/Standard Gaming Platform/vsurface.cpp
+++ b/Standard Gaming Platform/vsurface.cpp
@@ -1104,6 +1104,9 @@ HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc )
break;
case 16:
+ // BF: handle 24 bpp and 32 bpp images as 16 bpp ones = convert larger color space to the smaller one
+ case 24:
+ case 32:
PixelFormat.dwFlags = DDPF_RGB;
PixelFormat.dwRGBBitCount = 16;
@@ -1192,19 +1195,21 @@ HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc )
memset( hVSurface, 0, sizeof( SGPVSurface ) );
CHECKF( hVSurface != NULL );
- hVSurface->usHeight = usHeight;
- hVSurface->usWidth = usWidth;
- hVSurface->ubBitDepth = ubBitDepth;
- hVSurface->pSurfaceData1 = (PTR)lpDDS;
+ hVSurface->usHeight = usHeight;
+ hVSurface->usWidth = usWidth;
+ // BF : since we use a 16bpp framebuffer and images are converted to that format,
+ // there is no need to set the surface bit depth to a higher value than 16
+ hVSurface->ubBitDepth = ubBitDepth > 16 ? 16 : ubBitDepth;
+ hVSurface->pSurfaceData1 = (PTR)lpDDS;
hVSurface->pSurfaceData = (PTR)lpDDS2;
- hVSurface->pSavedSurfaceData1 = NULL;
- hVSurface->pSavedSurfaceData = NULL;
- hVSurface->pPalette = NULL;
- hVSurface->p16BPPPalette = NULL;
- hVSurface->TransparentColor = FROMRGB( 0, 0, 0 );
- hVSurface->RegionList = CreateList( DEFAULT_NUM_REGIONS, sizeof( VSURFACE_REGION ) );
- hVSurface->fFlags = 0;
- hVSurface->pClipper = NULL;
+ hVSurface->pSavedSurfaceData1 = NULL;
+ hVSurface->pSavedSurfaceData = NULL;
+ hVSurface->pPalette = NULL;
+ hVSurface->p16BPPPalette = NULL;
+ hVSurface->TransparentColor = FROMRGB( 0, 0, 0 );
+ hVSurface->RegionList = CreateList( DEFAULT_NUM_REGIONS, sizeof( VSURFACE_REGION ) );
+ hVSurface->fFlags = 0;
+ hVSurface->pClipper = NULL;
//
// Determine memory and other attributes of newly created surface
@@ -1306,8 +1311,9 @@ HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc )
//
hVSurface->usHeight = usHeight;
- hVSurface->usWidth = usWidth;
- hVSurface->ubBitDepth = ubBitDepth;
+ hVSurface->usWidth = usWidth;
+ // BF: re-set bit depth (see above)
+ hVSurface->ubBitDepth = ubBitDepth > 16 ? 16 : ubBitDepth;
giMemUsedInSurfaces += ( hVSurface->usHeight * hVSurface->usWidth * ( hVSurface->ubBitDepth / 8 ) );
@@ -1432,7 +1438,7 @@ BOOLEAN SetVideoSurfaceDataFromHImage( HVSURFACE hVSurface, HIMAGE hImage, UINT1
BYTE *pDest;
UINT32 fBufferBPP = 0;
UINT32 uiPitch;
- UINT16 usEffectiveWidth;
+ UINT16 usPixelWidth;
SGPRect aRect;
// Assertions
@@ -1451,6 +1457,11 @@ BOOLEAN SetVideoSurfaceDataFromHImage( HVSURFACE hVSurface, HIMAGE hImage, UINT1
{
fBufferBPP = BUFFER_16BPP;
}
+ else if ( (hImage->ubBitDepth == 24 || hImage->ubBitDepth == 32) && hVSurface->ubBitDepth == 16 )
+ {
+ // convert image to 16bpp
+ fBufferBPP = BUFFER_16BPP;
+ }
}
else
{
@@ -1476,7 +1487,7 @@ BOOLEAN SetVideoSurfaceDataFromHImage( HVSURFACE hVSurface, HIMAGE hImage, UINT1
pDest = LockVideoSurfaceBuffer( hVSurface, &uiPitch );
// Effective width ( in PIXELS ) is Pitch ( in bytes ) converted to pitch ( IN PIXELS )
- usEffectiveWidth = (UINT16)( uiPitch / ( hVSurface->ubBitDepth / 8 ) );
+ usPixelWidth = (UINT16)( uiPitch / ( hVSurface->ubBitDepth / 8 ) );
CHECKF( pDest != NULL );
@@ -1498,7 +1509,7 @@ BOOLEAN SetVideoSurfaceDataFromHImage( HVSURFACE hVSurface, HIMAGE hImage, UINT1
}
// This HIMAGE function will transparently copy buffer
- if ( !CopyImageToBuffer( hImage, fBufferBPP, pDest, usEffectiveWidth, hVSurface->usHeight, usX, usY, &aRect ) )
+ if ( !CopyImageToBuffer( hImage, fBufferBPP, pDest, usPixelWidth, hVSurface->usHeight, usX, usY, &aRect ) )
{
DbgMessage( TOPIC_VIDEOSURFACE, DBG_LEVEL_2, String( "Error Occured Copying HIMAGE to HVSURFACE" ));
UnLockVideoSurfaceBuffer( hVSurface );
diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp
index 8962cc8a..3a2b714c 100644
--- a/Strategic/Assignments.cpp
+++ b/Strategic/Assignments.cpp
@@ -3376,29 +3376,40 @@ static INT16 GetMinimumStackDurability(const OBJECTTYPE* pObj) {
return minDur;
}
+//CHRISL: During the repair process, we already attempt to repair the attachments on an item. So rather then adding the attachment to the stack, we want to
+// add the main item, even if it's just the attachment that actually needs to be repaired. Also, if multiple items in a stack are damaged, we only want to
+// include the stack once since the repair system already looks through the entire stack.
static void CollectRepairableItems(const SOLDIERTYPE* pSoldier, RepairQueue& itemsToFix) {
+ bool foundItem = false;
// Iterate over all pocket slots and add items in need of repair
for (UINT8 pocketIndex = HELMETPOS; pocketIndex < NUM_INV_SLOTS; ++pocketIndex) {
const OBJECTTYPE* pObj = &(const_cast(pSoldier)->inv[pocketIndex]);
+ if(pObj == NULL || pObj->ubNumberOfObjects == NOTHING || pObj->usItem == NOTHING)
+ continue;
// Check if item needs repairing
- BOOLEAN itemAddedToQueue = FALSE;
+ foundItem = false;
for (UINT8 stackIndex = 0; stackIndex < pObj->ubNumberOfObjects; ++stackIndex) {
// Check the stack item itself
- if (!itemAddedToQueue && IsItemRepairable(pObj->usItem, (*pObj)[stackIndex]->data.objectStatus)) {
- itemAddedToQueue = TRUE;
+ if (IsItemRepairable(pObj->usItem, (*pObj)[stackIndex]->data.objectStatus)) {
RepairItem item(pObj, pSoldier, (INVENTORY_SLOT) pocketIndex);
itemsToFix.push(item);
+ break;
}
// Check for attachments (are there stackable items that can take attachments though?)
UINT8 attachmentIndex = 0;
for (attachmentList::const_iterator iter = (*pObj)[stackIndex]->attachments.begin(); iter != (*pObj)[stackIndex]->attachments.end(); ++iter, ++attachmentIndex) {
if (IsItemRepairable(iter->usItem, (*iter)[attachmentIndex]->data.objectStatus )) {
- RepairItem item(&(*iter), pSoldier, (INVENTORY_SLOT) pocketIndex);
+ // Send the main item, not the attachment
+ RepairItem item(pObj, pSoldier, (INVENTORY_SLOT) pocketIndex);
itemsToFix.push(item);
+ foundItem = true;
+ break;
}
}
+ if(foundItem)
+ break;
}
}
}
@@ -3627,9 +3638,12 @@ BOOLEAN RepairObject( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOwner, OBJECTTYPE *
}
}
+
// now check for attachments after
- for (attachmentList::iterator iter = (*pObj)[ubLoop]->attachments.begin(); iter != (*pObj)[ubLoop]->attachments.end(); ++iter) {
- if (RepairObject(pSoldier, pOwner, &(*iter), pubRepairPtsLeft) && iter->exists()) {
+ for (attachmentList::iterator iter = (*pObj)[ubLoop]->attachments.begin(); iter != (*pObj)[ubLoop]->attachments.end(); ++iter)
+ {
+ if (iter->exists() && RepairObject(pSoldier, pOwner, &(*iter), pubRepairPtsLeft))
+ {
fSomethingWasRepaired = true;
if ( *pubRepairPtsLeft == 0 )
{
@@ -3638,6 +3652,7 @@ BOOLEAN RepairObject( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOwner, OBJECTTYPE *
}
}
}
+
//CHRISL: Now check and see if this is an LBENODE with items that need repairing
if(UsingNewInventorySystem() == true && Item[pObj->usItem].usItemClass == IC_LBEGEAR && pObj->IsActiveLBE(ubLoop) == true)
{
@@ -8057,65 +8072,76 @@ void BeginRemoveMercFromContract( SOLDIERTYPE *pSoldier )
// This function will setup the quote, then start dialogue beginning the actual leave sequence
if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) )
{
- if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) || ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) )
+ // WANNE: Nothing to do here, when we want to dismiss the robot
+ BOOLEAN fAmIaRobot = AM_A_ROBOT( pSoldier );
+ if (!fAmIaRobot)
{
- HandleImportantMercQuote( pSoldier, QUOTE_RESPONSE_TO_MIGUEL_SLASH_QUOTE_MERC_OR_RPC_LETGO );
-
- SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
- TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
-
- }
- else
- // quote is different if he's fired in less than 48 hours
- if( ( GetWorldTotalMin() - pSoldier->uiTimeOfLastContractUpdate ) < 60 * 48 )
- {
- SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,1 ,MAP_SCREEN ,0 ,0 ,0 );
- if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) )
- {
- // Only do this if they want to renew.....
- if ( WillMercRenew( pSoldier, FALSE ) )
- {
- HandleImportantMercQuote( pSoldier, QUOTE_DEPART_COMMET_CONTRACT_NOT_RENEWED_OR_TERMINATED_UNDER_48 );
- }
- }
-
- SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
- TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
-
- }
- else
- {
- SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,1 ,MAP_SCREEN ,0 ,0 ,0 );
- if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) )
- {
- // Only do this if they want to renew.....
- if ( WillMercRenew( pSoldier, FALSE ) )
- {
- HandleImportantMercQuote( pSoldier, QUOTE_DEPARTING_COMMENT_CONTRACT_NOT_RENEWED_OR_48_OR_MORE );
- }
- }
- else if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) || ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) )
+ if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) || ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) )
{
HandleImportantMercQuote( pSoldier, QUOTE_RESPONSE_TO_MIGUEL_SLASH_QUOTE_MERC_OR_RPC_LETGO );
+
+ SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
+ TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
+
}
-
- SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
- TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
- }
-
- if( ( GetWorldTotalMin() - pSoldier->uiTimeOfLastContractUpdate ) < 60 * 3 )
- {
- // this will cause him give us lame excuses for a while until he gets over it
- // 3-6 days (but the first 1-2 days of that are spent "returning" home)
- gMercProfiles[ pSoldier->ubProfile ].ubDaysOfMoraleHangover = (UINT8) (3 + Random(4));
-
- // if it's an AIM merc, word of this gets back to AIM... Bad rep.
- if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
+ else
{
- ModifyPlayerReputation(REPUTATION_EARLY_FIRING);
+ // quote is different if he's fired in less than 48 hours
+ if( ( GetWorldTotalMin() - pSoldier->uiTimeOfLastContractUpdate ) < 60 * 48 )
+ {
+ SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,1 ,MAP_SCREEN ,0 ,0 ,0 );
+ if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) )
+ {
+ // Only do this if they want to renew.....
+ if ( WillMercRenew( pSoldier, FALSE ) )
+ {
+ HandleImportantMercQuote( pSoldier, QUOTE_DEPART_COMMET_CONTRACT_NOT_RENEWED_OR_TERMINATED_UNDER_48 );
+ }
+ }
+
+ SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
+ TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
+
+ }
+ else
+ {
+ SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,1 ,MAP_SCREEN ,0 ,0 ,0 );
+ if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) )
+ {
+ // Only do this if they want to renew.....
+ if ( WillMercRenew( pSoldier, FALSE ) )
+ {
+ HandleImportantMercQuote( pSoldier, QUOTE_DEPARTING_COMMENT_CONTRACT_NOT_RENEWED_OR_48_OR_MORE );
+ }
+ }
+ else if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) || ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) )
+ {
+ HandleImportantMercQuote( pSoldier, QUOTE_RESPONSE_TO_MIGUEL_SLASH_QUOTE_MERC_OR_RPC_LETGO );
+ }
+
+ SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 );
+ TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 );
+ }
+ }
+
+ if( ( GetWorldTotalMin() - pSoldier->uiTimeOfLastContractUpdate ) < 60 * 3 )
+ {
+ // this will cause him give us lame excuses for a while until he gets over it
+ // 3-6 days (but the first 1-2 days of that are spent "returning" home)
+ gMercProfiles[ pSoldier->ubProfile ].ubDaysOfMoraleHangover = (UINT8) (3 + Random(4));
+
+ // if it's an AIM merc, word of this gets back to AIM... Bad rep.
+ if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
+ {
+ ModifyPlayerReputation(REPUTATION_EARLY_FIRING);
+ }
}
}
-
+ // WANNE: When we want to dismiss the robot, simply dismiss, without any special stuff
+ else
+ {
+ StrategicRemoveMerc(pSoldier);
+ }
}
}
@@ -11047,7 +11073,7 @@ void SetSoldierAssignment( SOLDIERTYPE *pSoldier, INT8 bAssignment, INT32 iParam
if( pMilitiaTrainerSoldier == NULL )
{
- if( SectorInfo[ SECTOR( pSoldier->sSectorX, pSoldier->sSectorY ) ].fMilitiaTrainingPaid == FALSE )
+ if( SectorInfo[ SECTOR( pSoldier->sSectorX, pSoldier->sSectorY ) ].fMobileMilitiaTrainingPaid == FALSE )
{
// show a message to confirm player wants to charge cost
HandleInterfaceMessageForCostOfTrainingMilitia( pSoldier );
diff --git a/Strategic/Auto Resolve.cpp b/Strategic/Auto Resolve.cpp
index 23744657..2436068c 100644
--- a/Strategic/Auto Resolve.cpp
+++ b/Strategic/Auto Resolve.cpp
@@ -2100,7 +2100,7 @@ void RenderAutoResolve()
//Render the total battle time elapsed.
SetFont( FONT10ARIAL );
- swprintf( str, L"%s: %dm %02ds",
+ swprintf( str, L"%s: %dm %02ds",
gpStrategicString[ STR_AR_TIME_ELAPSED ],
gpAR->uiTotalElapsedBattleTimeInMilliseconds/60000,
(gpAR->uiTotalElapsedBattleTimeInMilliseconds%60000)/1000 );
diff --git a/Strategic/Game Clock.cpp b/Strategic/Game Clock.cpp
index 1cf5797a..d72d848d 100644
--- a/Strategic/Game Clock.cpp
+++ b/Strategic/Game Clock.cpp
@@ -1043,8 +1043,11 @@ void CreateMouseRegionForPauseOfClock( INT16 sX, INT16 sY )
{
if( fClockMouseRegionCreated == FALSE )
{
+ INT16 sXVal = sX;
+ INT16 sYVal = sY;
+
// create a mouse region for pausing of game clock
- MSYS_DefineRegion( &gClockMouseRegion, (UINT16)( sX ), (UINT16)( sY ),(UINT16)( sX + CLOCK_REGION_WIDTH ), (UINT16)( sY + CLOCK_REGION_HEIGHT ), MSYS_PRIORITY_HIGHEST,
+ MSYS_DefineRegion( &gClockMouseRegion, (UINT16)( sXVal ), (UINT16)( sYVal ),(UINT16)( sX + CLOCK_REGION_WIDTH ), (UINT16)( sY + CLOCK_REGION_HEIGHT), MSYS_PRIORITY_HIGHEST,
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, PauseOfClockBtnCallback );
fClockMouseRegionCreated = TRUE;
diff --git a/Strategic/Game Event Hook.cpp b/Strategic/Game Event Hook.cpp
index 1fcb6ba5..9d0fa279 100644
--- a/Strategic/Game Event Hook.cpp
+++ b/Strategic/Game Event Hook.cpp
@@ -206,13 +206,14 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent )
DailyUpdateOfMercSite( (UINT16)GetWorldDay() );
break;
case EVENT_DAY3_ADD_EMAIL_FROM_SPECK:
- if ( gGameExternalOptions.fMercDayOne == FALSE && gGameExternalOptions.fAllMercsAvailable == FALSE )
+ // WANNE: This fixes the bug, that Speck did not sent the email on Day 3, when MERC_WEBSITE_ALL_MERCS_AVAILABLE = TRUE!
+ if ( gGameExternalOptions.fMercDayOne == FALSE /* && gGameExternalOptions.fAllMercsAvailable == FALSE */ )
{
- AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1 );
+ AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1 );
}
break;
case EVENT_DAY2_ADD_EMAIL_FROM_IMP:
- AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1 );
+ AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1, -1);
break;
//If a merc gets hired and they dont show up immediately, the merc gets added to the queue and shows up
// uiTimeTillMercArrives minutes later
diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp
index 13dedd15..2fd56087 100644
--- a/Strategic/LuaInitNPCs.cpp
+++ b/Strategic/LuaInitNPCs.cpp
@@ -1399,7 +1399,7 @@ BOOLEAN BOOL;
static int l_StopVideo(lua_State *L)
{
-
+ StopIntroVideo();
Test = 1;
return 0;
}
@@ -5663,13 +5663,16 @@ int i;
UINT16 SextorX;
UINT16 SextorY;
+UINT8 SkyDrive;
+
for (i= 1; i<=n; i++ )
{
if (i == 1 ) SextorX = lua_tointeger(L,i);
if (i == 2 ) SextorY = lua_tointeger(L,i);
+ if (i == 3 ) SkyDrive = lua_tointeger(L,i);
}
- SetUpHelicopterForPlayer( SextorX, SextorY );
+ SetUpHelicopterForPlayer( SextorX, SextorY, SkyDrive );
return 0;
}
@@ -7209,28 +7212,27 @@ return 0;
//AddEmail
static int l_AddEmail (lua_State *L)
{
-UINT8 n = lua_gettop(L);
-int i;
+ UINT8 n = lua_gettop(L);
+ int i;
-
-INT32 iMessageOffset;
-INT32 iMessageLength;
-UINT8 ubSender;
-
-INT32 iCurrentIMPPosition;
+ INT32 iMessageOffset;
+ INT32 iMessageLength;
+ UINT8 ubSender;
+ INT32 iCurrentIMPPosition;
+ INT16 iCurrentShipmentDestinationID = -1;
for (i= 1; i<=n; i++ )
{
if (i == 1 ) iMessageOffset = lua_tointeger(L,i);
if (i == 2 ) iMessageLength = lua_tointeger(L,i);
if (i == 3 ) ubSender = lua_tointeger(L,i);
- //if (i == 4 ) iDate = lua_tointeger(L,i);
if (i == 4 ) iCurrentIMPPosition = lua_tointeger(L,i);
+ if (i == 5) iCurrentShipmentDestinationID = lua_tointeger(L,i);
}
- AddEmail(iMessageOffset,iMessageLength,ubSender, GetWorldTotalMin(), iCurrentIMPPosition);
+ AddEmail(iMessageOffset,iMessageLength,ubSender, GetWorldTotalMin(), iCurrentIMPPosition, iCurrentShipmentDestinationID);
-return 0;
+ return 0;
}
//AddPreReadEmail
@@ -9750,10 +9752,49 @@ static int l_ubMiscFlags2Check (lua_State *L)
if (i == 2 ) set = lua_tointeger(L,i);
}
- Flag = (gMercProfiles[Profile].ubMiscFlags2 & set);
+ if (set == 1)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_DONT_ADD_TO_SECTOR)
+ Flag = 1;
+ }
+ else if (set == 2)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_LEFT_COUNTRY)
+ Flag = 1;
+ }
+ else if (set == 4)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_BANDAGED_TODAY)
+ Flag = 1;
+ }
+ else if (set == 8)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE)
+ Flag = 1;
+ }
+ else if (set == 16)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_NEEDS_TO_SAY_HOSTILE_QUOTE)
+ Flag = 1;
+ }
+ else if (set == 32)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_MARRIED_TO_HICKS)
+ Flag = 1;
+ }
+ else if (set == 64 )
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG2_ASKED_BY_HICKS)
+ Flag = 1;
+ }
+ // Set the return value of the function
+ // --> Flag == 0 -> The specified Flag is not set
+ // --> Flag == 1 -> The specified Flag is set
lua_pushinteger(L, Flag);
+ // Always return 1, this tells LUA that the the function run without a problem.
+ // But THIS is not the return value of the function. The return value is specified in the "lua_pushinteger()" call above!!!
return 1;
}
@@ -9773,7 +9814,48 @@ static int l_ubMiscFlags1Check (lua_State *L)
if (i == 2 ) set = lua_tointeger(L,i);
}
- Flag = (gMercProfiles[Profile].ubMiscFlags & set);
+ if (set == 1)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_RECRUITED)
+ Flag = 1;
+ }
+ else if (set == 2)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_HAVESEENCREATURE)
+ Flag = 1;
+ }
+ else if (set == 4)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_FORCENPCQUOTE)
+ Flag = 1;
+ }
+ else if (set == 8)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_WOUNDEDBYPLAYER)
+ Flag = 1;
+ }
+ else if (set == 16)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_TEMP_NPC_QUOTE_DATA_EXISTS)
+ Flag = 1;
+ }
+ else if (set == 32)
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_SAID_HOSTILE_QUOTE)
+ Flag = 1;
+ }
+ else if (set == 64 )
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_EPCACTIVE)
+ Flag = 1;
+ }
+ else if (set == 128 )
+ {
+ if (gMercProfiles[Profile].ubMiscFlags2 & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS)
+ Flag = 1;
+ }
+
+ //Flag = (gMercProfiles[Profile].ubMiscFlags & set);
lua_pushinteger(L, Flag);
@@ -9856,34 +9938,39 @@ static int l_ubMiscFlags2Set(lua_State *L)
if (i == 2 ) set = lua_tointeger(L,i);
}
- if (set == 0)
+ if (set == 0)
+ {
+ gMercProfiles[Profile].ubMiscFlags2 = 0;
+ }
+ else if (set == 1)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_DONT_ADD_TO_SECTOR);
}
- else if (set == 1)
+ else if (set == 2)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_LEFT_COUNTRY);
}
- else if (set == 2)
+ else if (set == 4)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_BANDAGED_TODAY);
}
- else if (set == 3)
+ else if (set == 8)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE);
}
- else if (set == 4)
+ else if (set == 16)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_NEEDS_TO_SAY_HOSTILE_QUOTE);
}
- else if (set == 5)
+ else if (set == 32)
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_MARRIED_TO_HICKS);
}
- else if (set == 6 )
+ else if (set == 64 )
{
gMercProfiles[Profile].ubMiscFlags2 &= (~PROFILE_MISC_FLAG2_ASKED_BY_HICKS);
}
+
return 0;
}
diff --git a/Strategic/Map Screen Helicopter.cpp b/Strategic/Map Screen Helicopter.cpp
index f3dc8dfb..abf31cdc 100644
--- a/Strategic/Map Screen Helicopter.cpp
+++ b/Strategic/Map Screen Helicopter.cpp
@@ -949,7 +949,7 @@ void UpdateRefuelSiteAvailability( void )
}
-void SetUpHelicopterForPlayer( INT16 sX, INT16 sY )
+void SetUpHelicopterForPlayer( INT16 sX, INT16 sY , UINT8 SkyDrive )
{
if( fSkyRiderSetUp == FALSE )
{
@@ -961,7 +961,7 @@ void SetUpHelicopterForPlayer( INT16 sX, INT16 sY )
Assert( iHelicopterVehicleId != -1 );
SoldierSkyRider.initialize();
- SoldierSkyRider.ubProfile = SKYRIDER;
+ SoldierSkyRider.ubProfile = SkyDrive; //SKYRIDER;
SoldierSkyRider.stats.bLife = 80;
pSkyRider = &( SoldierSkyRider );
@@ -972,7 +972,7 @@ void SetUpHelicopterForPlayer( INT16 sX, INT16 sY )
fSkyRiderSetUp = TRUE;
- gMercProfiles[ SKYRIDER ].fUseProfileInsertionInfo = FALSE;
+ gMercProfiles[ SkyDrive ].fUseProfileInsertionInfo = FALSE; //SKYRIDER
}
return;
diff --git a/Strategic/Map Screen Helicopter.h b/Strategic/Map Screen Helicopter.h
index 834e6dce..2f07c6ff 100644
--- a/Strategic/Map Screen Helicopter.h
+++ b/Strategic/Map Screen Helicopter.h
@@ -191,7 +191,7 @@ BOOLEAN IsRefuelSiteInSector( INT16 sMapX, INT16 sMapY );
void UpdateRefuelSiteAvailability( void );
// setup helicopter for player
-void SetUpHelicopterForPlayer( INT16 sX, INT16 sY );
+void SetUpHelicopterForPlayer( INT16 sX, INT16 sY , UINT8 SkyDrive );
// the intended path of the helicopter
INT32 DistanceOfIntendedHelicopterPath( void );
diff --git a/Strategic/Map Screen Interface Map Inventory.cpp b/Strategic/Map Screen Interface Map Inventory.cpp
index de886a9c..de1f799c 100644
--- a/Strategic/Map Screen Interface Map Inventory.cpp
+++ b/Strategic/Map Screen Interface Map Inventory.cpp
@@ -1039,6 +1039,10 @@ void MapInvenPoolSlots(MOUSE_REGION * pRegion, INT32 iReason )
sObjectSourceGridNo = gMapInformation.sCenterGridNo;
}
+ //CHRISL: Make sure we put the item at the same level as the merc
+ if(gpItemPointerSoldier->exists() == true)
+ pInventoryPoolList[(iCurrentInventoryPoolPage*MAP_INVENTORY_POOL_SLOT_COUNT)+iCounter].ubLevel = gpItemPointerSoldier->pathing.bLevel;
+
// set as reachable and set gridno
pInventoryPoolList[ ( iCurrentInventoryPoolPage * MAP_INVENTORY_POOL_SLOT_COUNT ) + iCounter ].usFlags |= WORLD_ITEM_REACHABLE;
diff --git a/Strategic/Map Screen Interface Map.cpp b/Strategic/Map Screen Interface Map.cpp
index 79b210c8..3f7757a4 100644
--- a/Strategic/Map Screen Interface Map.cpp
+++ b/Strategic/Map Screen Interface Map.cpp
@@ -4723,7 +4723,7 @@ void DisplayPositionOfHelicopter( void )
RemoveVehicleFromList (iHelicopterVehicleId);
InitAVehicle (iHelicopterVehicleId, 13, MAP_ROW_B);
fSkyRiderSetUp = FALSE;
- SetUpHelicopterForPlayer( 13, MAP_ROW_B );
+ SetUpHelicopterForPlayer( 13, MAP_ROW_B , SKYRIDER );
pGroup = GetGroup( pVehicleList[ iHelicopterVehicleId ].ubMovementGroup );
if (!pGroup) {
static bool heliMsg2Given = false;
diff --git a/Strategic/Map Screen Interface TownMine Info.cpp b/Strategic/Map Screen Interface TownMine Info.cpp
index c8909577..90b4c903 100644
--- a/Strategic/Map Screen Interface TownMine Info.cpp
+++ b/Strategic/Map Screen Interface TownMine Info.cpp
@@ -631,7 +631,7 @@ void AddCommonInfoToBox(void)
if (ubMilitiaTotal > 0)
{
// some militia, show total & their breakdown by level
- swprintf( wString, L"%d (%d/%d/%d)", ubMilitiaTotal,
+ swprintf( wString, L"%d (%d/%d/%d)", ubMilitiaTotal,
MilitiaInSectorOfRank(bCurrentTownMineSectorX, bCurrentTownMineSectorY, GREEN_MILITIA),
MilitiaInSectorOfRank(bCurrentTownMineSectorX, bCurrentTownMineSectorY, REGULAR_MILITIA),
MilitiaInSectorOfRank(bCurrentTownMineSectorX, bCurrentTownMineSectorY, ELITE_MILITIA));
diff --git a/Strategic/Map Screen Interface.cpp b/Strategic/Map Screen Interface.cpp
index 0eef660d..ca292f32 100644
--- a/Strategic/Map Screen Interface.cpp
+++ b/Strategic/Map Screen Interface.cpp
@@ -61,6 +61,9 @@
class OBJECTTYPE;
class SOLDIERTYPE;
+// marke strogg more mercs
+extern UINT8 FIRSTmercTOdisplay = 0 ;
+extern UINT8 maxNumberOfMercVisibleInStrategyList = 0; // WANNE: Max merc displayed in the list depends on the resolution
// inventory pool position on screen
#define MAP_INVEN_POOL_X 300
@@ -1065,17 +1068,17 @@ INT16 CharacterIsGettingPathPlotted( INT16 sCharNumber )
}
// is the character a valid one?
- if( gCharactersList[ sCharNumber ].fValid == FALSE )
+ if( gCharactersList[ sCharNumber + FIRSTmercTOdisplay ].fValid == FALSE )
{
return ( FALSE );
}
// if the highlighted line character is also selected
- if ( ( ( giDestHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giDestHighLine ) ) ||
+ if ( ( ( giDestHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giDestHighLine + FIRSTmercTOdisplay ) ) ||
( ( bSelectedDestChar != -1 ) && IsEntryInSelectedListSet ( bSelectedDestChar ) ) )
{
// then ALL selected lines will be affected
- if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber ) )
+ if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber + FIRSTmercTOdisplay ) )
{
return( TRUE );
}
@@ -1083,7 +1086,7 @@ INT16 CharacterIsGettingPathPlotted( INT16 sCharNumber )
else
{
// if he is *the* selected dude
- if( bSelectedDestChar == sCharNumber )
+ if( bSelectedDestChar == sCharNumber + FIRSTmercTOdisplay )
{
return ( TRUE );
}
@@ -1107,16 +1110,18 @@ BOOLEAN IsCharacterSelectedForAssignment( INT16 sCharNumber )
}
// is the character a valid one?
- if( gCharactersList[ sCharNumber ].fValid == FALSE )
+ if( gCharactersList[ sCharNumber + FIRSTmercTOdisplay ].fValid == FALSE )
{
return ( FALSE );
}
// if the highlighted line character is also selected
- if ( ( giAssignHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giAssignHighLine ) )
+ // marke strogg more mercs
+ if ( ( giAssignHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giAssignHighLine + FIRSTmercTOdisplay ) )
{
// then ALL selected lines will be affected
- if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber ) )
+ // marke strogg more mercs
+ if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber + FIRSTmercTOdisplay ) )
{
return( TRUE );
}
@@ -1142,18 +1147,19 @@ BOOLEAN IsCharacterSelectedForSleep( INT16 sCharNumber )
{
return( FALSE );
}
-
+
+ // marke strogg more mercs
// is the character a valid one?
- if( gCharactersList[ sCharNumber ].fValid == FALSE )
+ if( gCharactersList[ sCharNumber + FIRSTmercTOdisplay ].fValid == FALSE )
{
return ( FALSE );
}
// if the highlighted line character is also selected
- if ( ( giSleepHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giSleepHighLine ) )
+ if ( ( giSleepHighLine != -1 ) && IsEntryInSelectedListSet ( ( INT8 ) giSleepHighLine + FIRSTmercTOdisplay ) )
{
// then ALL selected lines will be affected
- if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber ) )
+ if( IsEntryInSelectedListSet( ( INT8 ) sCharNumber + FIRSTmercTOdisplay ) )
{
return( TRUE );
}
@@ -1404,7 +1410,6 @@ void HandleDisplayOfSelectedMercArrows( void )
INT16 sYPosition = 0;
HVOBJECT hHandle;
UINT8 ubCount = 0;
- INT16 usVehicleCount = 0;
// blit an arrow by the name of each merc in a selected list
if( bSelectedInfoChar == -1 )
@@ -1422,37 +1427,32 @@ void HandleDisplayOfSelectedMercArrows( void )
{
return;
}
- // now blit one by the selected merc
- sYPosition = Y_START+( bSelectedInfoChar * ( Y_SIZE + 2 ) ) - 1;
-
-
- if( bSelectedInfoChar >= FIRST_VEHICLE )
+ // marke strogg more merc
+ if ( bSelectedInfoChar - FIRSTmercTOdisplay >= maxNumberOfMercVisibleInStrategyList )
{
- usVehicleCount = bSelectedInfoChar - FIRST_VEHICLE;
- sYPosition = usVehicleY+( usVehicleCount * ( Y_SIZE + 2) ) - 1;;
+ FIRSTmercTOdisplay = bSelectedInfoChar - (maxNumberOfMercVisibleInStrategyList - 1) ;
}
+ // now blit one by the selected merc
+ // marke strogg more mercs
+ sYPosition = Y_START+( ( bSelectedInfoChar - FIRSTmercTOdisplay ) * ( Y_SIZE + 2 ) ) - 1;
GetVideoObject( &hHandle, guiSelectedCharArrow );
BltVideoObject( guiSAVEBUFFER , hHandle, 0,SELECTED_CHAR_ARROW_X, sYPosition , VO_BLT_SRCTRANSPARENCY,NULL );
// now run through the selected list of guys, an arrow for each
- for( ubCount = 0; ubCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; ubCount++ )
- {
- if( gCharactersList[ ubCount ].fValid == TRUE )
+
+ // marke strogg more mercs
+ for( ubCount = 0; ubCount < maxNumberOfMercVisibleInStrategyList; ubCount++ )
+ {
+ // marke strogg more mercs
+ if( gCharactersList[ ubCount + FIRSTmercTOdisplay ].fValid == TRUE )
{
-
// are they in the selected list or int he same mvt group as this guy
- if( ( IsEntryInSelectedListSet( ubCount ) == TRUE ) || ( ( bSelectedDestChar != - 1 ) ? ( ( Menptr[ gCharactersList[ ubCount ].usSolID ].ubGroupID != 0 ) ? ( Menptr[ gCharactersList[ bSelectedDestChar ].usSolID ].ubGroupID == Menptr[ gCharactersList[ ubCount ].usSolID ].ubGroupID ) : FALSE ) : FALSE ) )
+ if( ( IsEntryInSelectedListSet( ubCount + FIRSTmercTOdisplay ) == TRUE ) || ( ( bSelectedDestChar != - 1 ) ? ( ( Menptr[ gCharactersList[ ubCount + FIRSTmercTOdisplay ].usSolID ].ubGroupID != 0 ) ? ( Menptr[ gCharactersList[ bSelectedDestChar ].usSolID ].ubGroupID == Menptr[ gCharactersList[ ubCount + FIRSTmercTOdisplay ].usSolID ].ubGroupID ) : FALSE ) : FALSE ) )
{
sYPosition = Y_START+( ubCount * ( Y_SIZE + 2) ) - 1;
- if( ubCount >= FIRST_VEHICLE )
- {
- usVehicleCount = ubCount - FIRST_VEHICLE;
- sYPosition = usVehicleY+( usVehicleCount * ( Y_SIZE + 2) ) - 1;;
- }
-
GetVideoObject( &hHandle, guiSelectedCharArrow );
BltVideoObject( guiSAVEBUFFER , hHandle, 0,SELECTED_CHAR_ARROW_X, sYPosition , VO_BLT_SRCTRANSPARENCY,NULL );
}
@@ -2272,18 +2272,11 @@ void UpdateMapScreenAssignmentPositions( void )
// do nothing
}
else
- {
- giBoxY = ( Y_START + ( bSelectedAssignChar ) * ( Y_SIZE + 2 ) );
-
-/* ARM: Removed this - refreshes fine without it, apparently
- // make sure the menus don't overlap the map screen bottom panel (but where did 102 come from?)
- if( giBoxY >= ( MAP_BOTTOM_Y - 102 ) )
- giBoxY = MAP_BOTTOM_Y - 102;
-*/
+ {
+ // marke strogg more mercs
+ giBoxY = ( Y_START + ( bSelectedAssignChar - FIRSTmercTOdisplay ) * ( Y_SIZE + 2 ) );
}
-
-
AssignmentPosition.iY = giBoxY;
AttributePosition.iY = TrainPosition.iY = AssignmentPosition.iY + ( GetFontHeight( MAP_SCREEN_FONT ) + 2 )* ASSIGN_MENU_TRAIN;
@@ -2650,6 +2643,57 @@ void GoToNextCharacterInList( void )
}
}
+// WANNE: Jump to first character in list when pressing PageUp
+void GoToFirstCharacterInList( void )
+{
+ INT32 iCounter = 0, iCount = 0;
+
+ if( fShowDescriptionFlag == TRUE )
+ {
+ return;
+ }
+
+ if( ( bSelectedDestChar != -1 ) || ( fPlotForHelicopter == TRUE ) )
+ {
+ AbortMovementPlottingMode( );
+ }
+
+ // now run through the list and find first prev guy
+ for( iCounter = 0; iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
+ {
+ if ( ( gCharactersList[ iCounter ].fValid ) && ( iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS ) && ValidSelectableCharForNextOrPrev( iCounter ) )
+ {
+ ChangeSelectedInfoChar( ( INT8 )iCounter, TRUE );
+ break;
+ }
+ }
+}
+
+// WANNE: Jump to last character in list when pressing PageDown
+void GoToLastCharacterInList( void )
+{
+ INT32 iCounter = 0, iCount = 0;
+
+ if( fShowDescriptionFlag == TRUE )
+ {
+ return;
+ }
+
+ if( ( bSelectedDestChar != -1 ) || ( fPlotForHelicopter == TRUE ) )
+ {
+ AbortMovementPlottingMode( );
+ }
+
+ // now run through the list and find first prev guy
+ for( iCounter = giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1; iCounter > 0; iCounter-- )
+ {
+ if ( ( gCharactersList[ iCounter ].fValid ) && ( iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS ) && ValidSelectableCharForNextOrPrev( iCounter ) )
+ {
+ ChangeSelectedInfoChar( ( INT8 )iCounter, TRUE );
+ break;
+ }
+ }
+}
void GoToPrevCharacterInList( void )
{
@@ -2690,7 +2734,6 @@ void GoToPrevCharacterInList( void )
if( iCount < 0 )
{
- // was FIRST_VEHICLE
iCount = giMAXIMUM_NUMBER_OF_PLAYER_SLOTS;
}
}
@@ -5764,7 +5807,7 @@ BOOLEAN HandleTimeCompressWithTeamJackedInAndGearedToGo( void )
SetUpShutDownMapScreenHelpTextScreenMask( );
// Add e-mail message
- AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
return( TRUE );
@@ -6413,6 +6456,12 @@ BOOLEAN CanSoldierMoveWithVehicleId( SOLDIERTYPE *pSoldier, INT32 iVehicle1Id )
return( FALSE );
}
+ // CHRISL: Certain vehicles now have different valid sectors so we don't want to allow try to path for two different vehicles
+ if ( iVehicle1Id != iVehicle2Id )
+ {
+ return( FALSE );
+ }
+
pVehicle1 = &( pVehicleList[ iVehicle1Id ] );
pVehicle2 = &( pVehicleList[ iVehicle2Id ] );
diff --git a/Strategic/Map Screen Interface.h b/Strategic/Map Screen Interface.h
index 0358f6b5..e7da46a8 100644
--- a/Strategic/Map Screen Interface.h
+++ b/Strategic/Map Screen Interface.h
@@ -22,6 +22,9 @@ typedef struct FASTHELPREGION {
} FASTHELPREGION;
+extern UINT8 FIRSTmercTOdisplay ;
+extern UINT8 maxNumberOfMercVisibleInStrategyList;
+
// String Lengths Defines
#define MAX_NAME_LENGTH 10
#define MAX_LOCATION_SIZE 8
@@ -232,11 +235,6 @@ enum{
#define TACT_UPDATE_MERC_Y_OFFSET 4
#define TACT_UPDATE_MERC_X_OFFSET 4
-
-// WDS - make number of mercenaries, etc. be configurable
-// the first vehicle slot in the list
-#define FIRST_VEHICLE CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS
-
class OLD_MERC_LEAVE_ITEM_101
{
public:
@@ -510,6 +508,10 @@ INT32 GetNumberOfPeopleInCharacterList( void );
void GoToPrevCharacterInList( void );
void GoToNextCharacterInList( void );
+// WANNE: Go to first/last character in list (PageUp/PageDown)
+void GoToFirstCharacterInList( void );
+void GoToLastCharacterInList( void );
+
// this does the whole miner giving player info speil
//void HandleMinerEvent( UINT8 bMinerNumber, INT16 sSectorX, INT16 sSectorY, INT16 sQuoteNumber, BOOLEAN fForceMapscreen );
void HandleMinerEvent( UINT8 ubHeadMinerIndex, INT16 sSectorX, INT16 sSectorY, INT16 sQuoteNumber, BOOLEAN fForceMapscreen );
diff --git a/Strategic/Player Command.cpp b/Strategic/Player Command.cpp
index d941c380..bca4cf2d 100644
--- a/Strategic/Player Command.cpp
+++ b/Strategic/Player Command.cpp
@@ -222,7 +222,7 @@ BOOLEAN SetThisSectorAsPlayerControlled( INT16 sMapX, INT16 sMapY, INT8 bMapZ, B
//If the player has been to Bobbyr when it was down, and we havent already sent email, send him an email
if( LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction == BOBBYR_BEEN_TO_SITE_ONCE && LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction != BOBBYR_ALREADY_SENT_EMAIL )
{
- AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1);
+ AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1);
LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction = BOBBYR_ALREADY_SENT_EMAIL;
}
}
diff --git a/Strategic/PreBattle Interface.cpp b/Strategic/PreBattle Interface.cpp
index 8c60ebce..960d07e7 100644
--- a/Strategic/PreBattle Interface.cpp
+++ b/Strategic/PreBattle Interface.cpp
@@ -234,7 +234,7 @@ void ValidateAndCorrectInBattleCounters( GROUP *pLocGroup )
if( ubInvalidGroups || pSector->ubAdminsInBattle || pSector->ubTroopsInBattle || pSector->ubElitesInBattle || pSector->ubCreaturesInBattle )
{
CHAR16 str[ 512 ];
- swprintf( str, L"Strategic info warning: Sector 'in battle' counters are not clear when they should be. "
+ swprintf( str, L"Strategic info warning: Sector 'in battle' counters are not clear when they should be. "
L"If you can provide information on how a previous battle was resolved here or nearby patrol "
L"(auto resolve, tactical battle, cheat keys, or retreat),"
L"please forward that info (no data files necessary) as well as the following code (very important): "
@@ -276,6 +276,17 @@ void InitPreBattleInterface( GROUP *pBattleGroup, BOOLEAN fPersistantPBI )
if( gfPreBattleInterfaceActive )
return;
+ //CHRISL: If for some reason we're not looking at a valid sector, leave the preBattleInterface.
+ if( pBattleGroup != NULL && (pBattleGroup->ubSectorX < MINIMUM_VALID_X_COORDINATE ||
+ pBattleGroup->ubSectorX > MAXIMUM_VALID_X_COORDINATE ||
+ pBattleGroup->ubSectorY < MINIMUM_VALID_Y_COORDINATE ||
+ pBattleGroup->ubSectorY > MAXIMUM_VALID_Y_COORDINATE ||
+ pBattleGroup->ubSectorZ < MINIMUM_VALID_Z_COORDINATE ||
+ pBattleGroup->ubSectorZ > MAXIMUM_VALID_Z_COORDINATE) )
+ {
+ return;
+ }
+
gfPersistantPBI = fPersistantPBI;
if( gfPersistantPBI )
diff --git a/Strategic/Queen Command.cpp b/Strategic/Queen Command.cpp
index 87e3ecbb..2e073bfa 100644
--- a/Strategic/Queen Command.cpp
+++ b/Strategic/Queen Command.cpp
@@ -246,6 +246,7 @@ UINT8 NumEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
UINT8 NumStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
{
SECTORINFO *pSector;
+
AssertGE( sSectorX, MINIMUM_VALID_X_COORDINATE);
AssertLE( sSectorX, MAXIMUM_VALID_X_COORDINATE );
AssertGE( sSectorY, MINIMUM_VALID_Y_COORDINATE);
@@ -257,9 +258,9 @@ UINT8 NumStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
return( 0 );
}
- Ensure_RepairedGarrisonGroup( &gGarrisonGroup, &giGarrisonArraySize ); /* added NULL fix, 2007-03-03, Sgt. Kolja */
+ Ensure_RepairedGarrisonGroup( &gGarrisonGroup, &giGarrisonArraySize ); /* added NULL fix, 2007-03-03, Sgt. Kolja */
- // don't count roadblocks as stationary garrison, we want to see how many enemies are in them, not question marks
+ // don't count roadblocks as stationary garrison, we want to see how many enemies are in them, not question marks
if ( gGarrisonGroup[ pSector->ubGarrisonID ].ubComposition == ROADBLOCK )
{
// pretend they're not stationary
@@ -1917,11 +1918,10 @@ void EndCaptureSequence( )
void EnemyCapturesPlayerSoldier( SOLDIERTYPE *pSoldier )
{
UINT32 i;
- BOOLEAN fMadeCorpse;
- INT32 iNumEnemiesInSector;
+ BOOLEAN fMadeCorpse;
+ INT32 iNumEnemiesInSector;
-
-// TODO.WANNE: Hardcoded grid number
+ // TODO.WANNE: Hardcoded grid number
static INT32 sAlmaCaptureGridNos[] = { 9208, 9688, 9215 }; //dnl!!!
static INT32 sAlmaCaptureItemsGridNo[] = { 12246, 12406, 13046 }; //dnl!!!
@@ -1929,19 +1929,18 @@ void EnemyCapturesPlayerSoldier( SOLDIERTYPE *pSoldier )
AssertNotNIL(pSoldier);
-
- // ATE: Check first if ! in player captured sequence already
+ // ATE: Check first if ! in player captured sequence already
// CJC Dec 1 2002: fixing multiple captures
if ( ( gStrategicStatus.uiFlags & STRATEGIC_PLAYER_CAPTURED_FOR_RESCUE ) && (gStrategicStatus.uiFlags & STRATEGIC_PLAYER_CAPTURED_FOR_ESCAPE) )
- {
- return;
- }
+ {
+ return;
+ }
- // ATE: If maximum prisoners captured, return!
- if ( gStrategicStatus.ubNumCapturedForRescue > 3 )
- {
- return;
- }
+ // ATE: If maximum prisoners captured, return!
+ if ( gStrategicStatus.ubNumCapturedForRescue > 3 )
+ {
+ return;
+ }
// If this is an EPC , just kill them...
diff --git a/Strategic/Quests.cpp b/Strategic/Quests.cpp
index 2ff42164..6bd55536 100644
--- a/Strategic/Quests.cpp
+++ b/Strategic/Quests.cpp
@@ -783,7 +783,7 @@ BOOLEAN CheckFact( UINT16 usFact, UINT8 ubProfileID )
break;
/*
case FACT_SKYRIDER_CLOSE_TO_CHOPPER:
- SetUpHelicopterForPlayer( 13, MAP_ROW_B );
+ SetUpHelicopterForPlayer( 13, MAP_ROW_B , SKYRIDER );
break;
*/
case FACT_SPIKE_AT_DOOR:
@@ -1121,6 +1121,10 @@ BOOLEAN CheckFact( UINT16 usFact, UINT8 ubProfileID )
gubFact[usFact] = ItemTypeExistsAtLocation( 10472, ROCKET_RIFLE, 0, NULL );
break;
+ case FACT_PABLO_ALIVE:
+ gubFact[usFact] = gMercProfiles[ PABLO ].bMercStatus != MERC_IS_DEAD;
+ break;
+
case FACT_DOREEN_ALIVE:
gubFact[usFact] = gMercProfiles[ DOREEN ].bMercStatus != MERC_IS_DEAD;
break;
diff --git a/Strategic/Strategic AI.cpp b/Strategic/Strategic AI.cpp
index 965ab249..dd7b502a 100644
--- a/Strategic/Strategic AI.cpp
+++ b/Strategic/Strategic AI.cpp
@@ -985,8 +985,8 @@ void ValidatePlayersAreInOneGroupOnly()
pGroup = GetGroup( pSoldier->ubGroupID );
Assert( pGroup );
Assert( pOtherGroup );
- swprintf( str, L"%s in %c%d thinks he/she is in group %d in %c%d but isn't. "
- L"Group %d in %c%d thinks %s is in the group but isn't. %s will be assigned to a unique squad. "
+ swprintf( str, L"%s in %c%d thinks he/she is in group %d in %c%d but isn't. "
+ L"Group %d in %c%d thinks %s is in the group but isn't. %s will be assigned to a unique squad. "
L"Please send screenshot, PRIOR save (corrected by time you read this), and any theories.",
pSoldier->name, pSoldier->sSectorY + 'A' - 1, pSoldier->sSectorX,
pSoldier->ubGroupID, pGroup->ubSectorY + 'A' - 1, pGroup->ubSectorX,
@@ -1029,9 +1029,9 @@ void ValidatePlayersAreInOneGroupOnly()
Assert( pGroup );
Assert( pOtherGroup );
- swprintf( str, L"%s in %c%d has been found in multiple groups. The group he/she is supposed "
- L"to be in is group %d in %c%d, but %s was also found to be in group %d in %c%d. %s was found in %d groups "
- L"total. Please send screenshot, PRIOR save (corrected by time you read this), and any theories.",
+ swprintf( str, L"%s in %c%d has been found in multiple groups. The group he/she is supposed "
+ L"to be in is group %d in %c%d, but %s was also found to be in group %d in %c%d. %s was found in %d groups "
+ L"total. Please send screenshot, PRIOR save (corrected by time you read this), and any theories.",
pSoldier->name, pSoldier->sSectorY + 'A' - 1, pSoldier->sSectorX,
pGroup->ubGroupID, pGroup->ubSectorY + 'A' - 1, pGroup->ubSectorX,
pSoldier->name, pOtherGroup->ubGroupID, pOtherGroup->ubSectorY + 'A' - 1, pOtherGroup->ubSectorX,
@@ -1040,8 +1040,8 @@ void ValidatePlayersAreInOneGroupOnly()
else if( !iGroups )
{ //The merc cannot be found in any group! This should never happen! We will assign the merc into his
//own unique squad as a correction.
- swprintf( str, L"%s in %c%d cannot be found in any group. %s will be assigned to a unique group/squad. "
- L"Please provide details on how you think this may have happened. Send screenshot and PRIOR save. Do not send a save "
+ swprintf( str, L"%s in %c%d cannot be found in any group. %s will be assigned to a unique group/squad. "
+ L"Please provide details on how you think this may have happened. Send screenshot and PRIOR save. Do not send a save "
L"you create after this point as the info will have been corrected by then.",
pSoldier->name, pSoldier->sSectorY + 'A' - 1, pSoldier->sSectorX, pSoldier->name );
}
diff --git a/Strategic/Strategic Event Handler.cpp b/Strategic/Strategic Event Handler.cpp
index abc52831..31c63699 100644
--- a/Strategic/Strategic Event Handler.cpp
+++ b/Strategic/Strategic Event Handler.cpp
@@ -687,7 +687,7 @@ void HandleNPCSystemEvent( UINT32 uiEvent )
{
// KP knows money is gone, hasn't told player, if this event is called then the 2
// days are up... send email
- AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1 );
+ AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1 );
StartQuest( QUEST_KINGPIN_MONEY, 5, MAP_ROW_D );
// add event to send terrorists two days from now
AddFutureDayStrategicEvent( EVENT_SET_BY_NPC_SYSTEM, Random( 120 ), FACT_KINGPIN_KNOWS_MONEY_GONE, 2 );
@@ -786,7 +786,7 @@ void HandleNPCSystemEvent( UINT32 uiEvent )
break;
case NPC_ACTION_SEND_ENRICO_MIGUEL_EMAIL:
- AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1 );
+ AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1 );
break;
case NPC_ACTION_TIMER_FOR_VEHICLE:
diff --git a/Strategic/Strategic Merc Handler.cpp b/Strategic/Strategic Merc Handler.cpp
index a3d60fc7..f5eeca56 100644
--- a/Strategic/Strategic Merc Handler.cpp
+++ b/Strategic/Strategic Merc Handler.cpp
@@ -469,15 +469,29 @@ void MercDailyUpdate()
if (cnt < 170)
{
// TO DO: send E-mail to player telling him the merc has returned from an assignment
- AddEmail( ( UINT8 )( iOffset + ( cnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + cnt ), GetWorldTotalMin(), -1 );
+ AddEmail( ( UINT8 )( iOffset + ( cnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + cnt ), GetWorldTotalMin(), -1, -1 );
}
else
{
- UINT16 iMsgLength = cnt;
- UINT8 sender = cnt - 119; // SenderNameList.xml
+ // Wildfire mercs
+ if (cnt < 178)
+ {
+ UINT16 iMsgLength = cnt;
+ UINT8 sender = cnt - 119; // SenderNameList.xml
- // Fake Barry Unger mail, but with the msgLength of the WF merc ID -> Correct in PreProcessEmail()
- AddEmailWFMercLevelUp( ( UINT8 )( iOffset + 0 * AIM_REPLY_LENGTH_BARRY ), iMsgLength, sender, GetWorldTotalMin(), -1 );
+ // Fake Barry Unger mail, but with the msgLength of the WF merc ID -> Correct in PreProcessEmail()
+ AddEmailWFMercAvailable( ( UINT8 )( iOffset + 0 * AIM_REPLY_LENGTH_BARRY ), iMsgLength, sender, GetWorldTotalMin(), -1 );
+ }
+ // Generic mail
+ else
+ {
+ // TODO.RW: Send generic mail
+ UINT16 iMsgLength = cnt;
+ UINT8 sender = cnt - 119; // SenderNameList.xml
+
+ // Fake Barry Unger mail, but with the msgLength of the WF merc ID -> Correct in PreProcessEmail()
+ AddEmailWFMercAvailable( ( UINT8 )( iOffset + 0 * AIM_REPLY_LENGTH_BARRY ), iMsgLength, sender, GetWorldTotalMin(), -1 );
+ }
}
// WANNE: Should we stop time compression. I don't know.
diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp
index 15cef762..87d23842 100644
--- a/Strategic/Strategic Movement.cpp
+++ b/Strategic/Strategic Movement.cpp
@@ -4485,16 +4485,16 @@ BOOLEAN GroupWillMoveThroughSector( GROUP *pGroup, UINT8 ubSectorX, UINT8 ubSect
dy = wp->y - pGroup->ubSectorY;
if( dx && dy )
{ //Can't move diagonally!
- AssertMsg( 0, String( "GroupWillMoveThroughSector() -- Attempting to process waypoint in a diagonal direction from sector %c%d to sector %c%d for group at sector %c%d -- KM:0",
- pGroup->ubSectorY + 'A', pGroup->ubSectorX, wp->y + 'A' - 1, wp->x, ubOrigY + 'A' - 1, ubOrigX ) );
+ //AssertMsg( 0, String( "GroupWillMoveThroughSector() -- Attempting to process waypoint in a diagonal direction from sector %c%d to sector %c%d for group at sector %c%d -- KM:0",
+ // pGroup->ubSectorY + 'A', pGroup->ubSectorX, wp->y + 'A' - 1, wp->x, ubOrigY + 'A' - 1, ubOrigX ) );
pGroup->ubSectorX = ubOrigX;
pGroup->ubSectorY = ubOrigY;
return TRUE;
}
if( !dx && !dy ) //Can't move to position currently at!
{
- AssertMsg( 0, String( "GroupWillMoveThroughSector() -- Attempting to process same waypoint at %c%d for group at %c%d -- KM:0",
- wp->y + 'A' - 1, wp->x, ubOrigY + 'A' - 1, ubOrigX ) );
+ //AssertMsg( 0, String( "GroupWillMoveThroughSector() -- Attempting to process same waypoint at %c%d for group at %c%d -- KM:0",
+ // wp->y + 'A' - 1, wp->x, ubOrigY + 'A' - 1, ubOrigX ) );
pGroup->ubSectorX = ubOrigX;
pGroup->ubSectorY = ubOrigY;
return TRUE;
@@ -4859,7 +4859,7 @@ BOOLEAN TestForBloodcatAmbush( GROUP *pGroup )
// SANDRO - STOMP traits - Scouting prevents the ambush of bloodcats
BOOLEAN fBloodCatAmbushPrevented = FALSE;
// The player has entered the lair
- if(( PlacementType == BLOODCAT_PLACEMENT_LAIR )&& !gubFact[ FACT_PLAYER_KNOWS_ABOUT_BLOODCAT_LAIR ] )
+ if(( PlacementType == BLOODCAT_PLACEMENT_LAIR )) // Default: Sector I16
{
// We know about the lair
if( gubFact[ FACT_PLAYER_KNOWS_ABOUT_BLOODCAT_LAIR ] )
@@ -4877,7 +4877,6 @@ BOOLEAN TestForBloodcatAmbush( GROUP *pGroup )
fBloodCatAmbushPrevented = TRUE;
gubEnemyEncounterCode = ENTERING_BLOODCAT_LAIR_CODE;
- gubFact[ FACT_PLAYER_KNOWS_ABOUT_BLOODCAT_LAIR ] = TRUE;
}
else
{
@@ -4896,7 +4895,6 @@ BOOLEAN TestForBloodcatAmbush( GROUP *pGroup )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_BLOODCATS_AMBUSH_PREVENTED] );
fBloodCatAmbushPrevented = TRUE;
-
gubEnemyEncounterCode = NO_ENCOUNTER_CODE;
}
else
@@ -5190,47 +5188,41 @@ BOOLEAN WildernessSectorWithAllProfiledNPCsNotSpokenWith( INT16 sSectorX, INT16
for ( ubProfile = 0; ubProfile < NUM_PROFILES; ubProfile++ )
{
- if ( gProfilesRPC[ubProfile].ProfilId == ubProfile || gProfilesNPC[ubProfile].ProfilId == ubProfile || gProfilesVehicle[ubProfile].ProfilId == ubProfile)
- {
- pProfile = &gMercProfiles[ ubProfile ];
-
- // skip stiffs
- if ( ( pProfile->bMercStatus == MERC_IS_DEAD ) || ( pProfile->bLife <= 0 ) )
+ if ( gProfilesRPC[ubProfile].ProfilId == ubProfile || gProfilesNPC[ubProfile].ProfilId == ubProfile || gProfilesVehicle[ubProfile].ProfilId == ubProfile)
{
- continue;
- }
+ pProfile = &gMercProfiles[ ubProfile ];
- // skip vehicles
- //if ( ubProfile >= PROF_HUMMER && ubProfile <= PROF_HELICOPTER )
- if ( gProfilesVehicle[ubProfile].ProfilId == ubProfile )
- {
- continue;
- }
-
- // in this sector?
- if ( pProfile->sSectorX == sSectorX && pProfile->sSectorY == sSectorY && pProfile->bSectorZ == bSectorZ )
- {
- // if we haven't talked to him yet, and he's not currently recruired/escorted by player (!)
- if ( ( pProfile->ubLastDateSpokenTo == 0 ) &&
- !(pProfile->ubMiscFlags & (PROFILE_MISC_FLAG_RECRUITED | PROFILE_MISC_FLAG_EPCACTIVE) ) )
+ // skip stiffs
+ if ( ( pProfile->bMercStatus == MERC_IS_DEAD ) || ( pProfile->bLife <= 0 ) )
{
- // then this is a guy we need to stop for...
- fFoundSomebody = TRUE;
+ continue;
}
- else
+
+ // skip vehicles
+ //if ( ubProfile >= PROF_HUMMER && ubProfile <= PROF_HELICOPTER )
+ if ( gProfilesVehicle[ubProfile].ProfilId == ubProfile )
{
- // already spoke to this guy, don't prompt about this sector again, regardless of status of other NPCs here
- // (although Hamous wanders around, he never shares the same wilderness sector as other important NPCs)
- return( FALSE );
+ continue;
+ }
+
+ // in this sector?
+ if ( pProfile->sSectorX == sSectorX && pProfile->sSectorY == sSectorY && pProfile->bSectorZ == bSectorZ )
+ {
+ // if we haven't talked to him yet, and he's not currently recruired/escorted by player (!)
+ if ( ( pProfile->ubLastDateSpokenTo == 0 ) &&
+ !(pProfile->ubMiscFlags & (PROFILE_MISC_FLAG_RECRUITED | PROFILE_MISC_FLAG_EPCACTIVE) ) )
+ {
+ // then this is a guy we need to stop for...
+ fFoundSomebody = TRUE;
+ }
+ else
+ {
+ // already spoke to this guy, don't prompt about this sector again, regardless of status of other NPCs here
+ // (although Hamous wanders around, he never shares the same wilderness sector as other important NPCs)
+ return( FALSE );
+ }
}
}
-
- }
- else
- {
- return( FALSE );
- }
-
}
return( fFoundSomebody );
diff --git a/Strategic/Strategic Status.cpp b/Strategic/Strategic Status.cpp
index 879d9247..4de53c25 100644
--- a/Strategic/Strategic Status.cpp
+++ b/Strategic/Strategic Status.cpp
@@ -211,7 +211,7 @@ void HandleEnricoEmail(void)
// if creatures have attacked a mine (doesn't care if they're still there or not at the moment)
if (HasAnyMineBeenAttackedByMonsters() && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_CREATURES))
{
- AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_CREATURES;
return; // avoid any other E-mail at the same time
}
@@ -219,21 +219,21 @@ void HandleEnricoEmail(void)
if ((ubCurrentProgress >= SOME_PROGRESS_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_SOME_PROGRESS))
{
- AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_SOME_PROGRESS;
return; // avoid any setback E-mail at the same time
}
if ((ubCurrentProgress >= ABOUT_HALFWAY_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_ABOUT_HALFWAY))
{
- AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_ABOUT_HALFWAY;
return; // avoid any setback E-mail at the same time
}
if ((ubCurrentProgress >= NEARLY_DONE_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_NEARLY_DONE))
{
- AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_NEARLY_DONE;
return; // avoid any setback E-mail at the same time
}
@@ -243,7 +243,7 @@ void HandleEnricoEmail(void)
(((ubHighestProgress - ubCurrentProgress) >= MINOR_SETBACK_THRESHOLD) && (gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_FLAG_SETBACK_OVER))) &&
!(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_MAJOR_SETBACK))
{
- AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_MAJOR_SETBACK;
}
else
@@ -251,7 +251,7 @@ void HandleEnricoEmail(void)
if (((ubHighestProgress - ubCurrentProgress) >= MINOR_SETBACK_THRESHOLD) &&
!(gStrategicStatus.usEnricoEmailFlags & (ENRICO_EMAIL_SENT_MINOR_SETBACK | ENRICO_EMAIL_SENT_MAJOR_SETBACK)))
{
- AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_MINOR_SETBACK;
}
else
@@ -314,15 +314,15 @@ void HandleEnricoEmail(void)
switch( bComplaint )
{
case 3:
- AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS3;
break;
case 2:
- AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS2;
break;
default:
- AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1);
+ AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1);
gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS1;
break;
diff --git a/Strategic/Strategic_VS2005.vcproj b/Strategic/Strategic_VS2005.vcproj
index dbd3caeb..3d3590c9 100644
--- a/Strategic/Strategic_VS2005.vcproj
+++ b/Strategic/Strategic_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
ubNumberOfCivsAtLevel[ ubRank ] >= ubHowMany);
+ //Assert(pSectorInfo->ubNumberOfCivsAtLevel[ ubRank ] >= ubHowMany);
//KM : July 21, 1999 patch fix
if( pSectorInfo->ubNumberOfCivsAtLevel[ ubRank ] < ubHowMany )
diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp
index 92c9abd2..0e63c8a8 100644
--- a/Strategic/mapscreen.cpp
+++ b/Strategic/mapscreen.cpp
@@ -1,4 +1,3 @@
-// WANNE: SCROLL BUTTONS CODE IS OUTCOMMENTED (search for // WANNE: )
#ifdef PRECOMPILEDHEADERS
#include "Strategic All.h"
#include "HelpScreen.h"
@@ -339,12 +338,6 @@ int SOLDIER_PIC_X;
int SOLDIER_PIC_Y;
int SOLDIER_HAND_X;
int SOLDIER_HAND_Y;
-//int TM_INV_WIDTH;
-//int TM_INV_HEIGHT;
-
-// WANNE: The position of the clock in the strategy screen
-//int CLOCK_X;
-//int CLOCK_Y;
// OJW: MP POSITIONS
int MP_BTN_Y;
@@ -382,10 +375,7 @@ bool is_team_box_open = false;
#define RGB_YELLOW ( FROMRGB( 255, 255, 0 ) )
#define RGB_NEAR_BLACK ( FROMRGB( 0, 0, 1 ) )
-
// ENUMS
-
-
// ARM: NOTE that these map "events" are never actually saved in a player's game in any way
enum
{
@@ -399,9 +389,6 @@ enum
#endif
};
-
-
-
// STRUCTURES / TYPEDEFS
@@ -439,10 +426,7 @@ struct popbox
typedef struct popbox PopUpBox;
typedef PopUpBox *PopUpBoxPtr;
-
// TABLES
-
-
RGBCOLOR GlowColorsA[]={
{0,0,0},
{25,0,0},
@@ -456,44 +440,6 @@ RGBCOLOR GlowColorsA[]={
{225,0,0},
{250,0,0},
};
-/* unused
-RGBCOLOR GlowColorsB[]={
- {0,0,0},
- {25,25,0},
- {50,50,0},
- {75,75,0},
- {100,100,0},
- {125,125,0},
- {150,150,0},
- {175,175,0},
- {200,200,0},
- {225,225,0},
- {255,255,0},
-};
-RGBCOLOR GlowColorsC[]={
- {0,0,0},
- {25,0,25},
- {50,0,50},
- {75,0,75},
- {100,0,100},
- {125,0,125},
- {150,0,150},
- {175,0,175},
- {200,0,200},
- {225,0,225},
- {255,0,255},
-};
-*/
-
-
-//SGPPoint gMapSortButtons[ MAX_SORT_METHODS ]={
-// {12,125},
-// {68,125},
-// {124,125},
-// {148,125},
-// {185,125},
-// {223,125},
-//};
SGPPoint gMapSortButtons[ MAX_SORT_METHODS ]={
{5,113},
@@ -504,43 +450,10 @@ SGPPoint gMapSortButtons[ MAX_SORT_METHODS ]={
{216,113},
};
-
// map screen's inventory panel pockets - top right corner coordinates
INV_REGION_DESC gMapScreenInvPocketXY[NUM_INV_SLOTS]; // ARRAY FOR INV PANEL INTERFACE ITEM POSITIONS
INV_REGION_DESC gSCamoXY;
-
-// WANNE:
-// buttons images
-//UINT32 guiMapMercsScrollButtonsImage[ 2 ];
-//UINT32 guiMapMercsScrollButtons[ 2 ];
-//
-//UINT32 guiMapVehicleScrollButtonsImage[ 2 ];
-//UINT32 guiMapVehicleScrollButtons [ 2 ];
-
-
-
-extern UINT16 usVehicleY;
-
-// WANNE:
-// button enums
-//enum{
-// MAP_SCROLL_MERCS_UP =0,
-// MAP_SCROLL_MERCS_DOWN,
-//};
-//
-//enum{
-// MAP_SCROLL_VEHICLE_UP =0,
-// MAP_SCROLL_VEHICLE_DOWN,
-//};
-
-
-// GLOBAL VARIABLES (OURS)
-
-// WANNE:
-//void CreateButtonsForScrolling(void);
-//void DeleteButtonsForScrolling(void);
-
void BtnMessageUpMapScreenCallback( GUI_BUTTON *btn,INT32 reason );
void BeginSellAllCallBack( UINT8 bExitValue );
void BeginDeleteAllCallBack( UINT8 bExitValue );
@@ -629,9 +542,6 @@ INT32 giMapInvDoneButton = -1;
INT32 giMapContractButton = -1;
INT32 giMapContractButtonImage;
-//INT32 giMapInvButton = -1;
-//INT32 giMapInvButtonImage;
-
INT32 giSortStateForMapScreenList = 0;
BOOLEAN giSortOrderAscending = TRUE;
@@ -641,13 +551,6 @@ INT32 giFlashContractBaseTime = 0;
UINT32 guiFlashCursorBaseTime = 0;
INT32 giPotCharPathBaseTime = 0;
-/*
-// next and prev
-INT32 giMapInvPrev;
-INT32 giMapInvNext;
-INT32 giMapInvPrevImage;
-INT32 giMapInvNextImage;
-*/
extern UINT32 guiVObjectSize;
extern UINT32 guiVSurfaceSize;
@@ -671,7 +574,6 @@ UINT32 guiULICONS;
UINT32 guiNewMailIcons;
UINT32 guiLEVELMARKER; // the white rectangle highlighting the current level on the map border
-
// misc mouse regions
MOUSE_REGION gCharInfoFaceRegion;
MOUSE_REGION gCharInfoHandRegion;
@@ -688,17 +590,13 @@ MOUSE_REGION gTeamListLocationRegion[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
MOUSE_REGION gTeamListDestinationRegion[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
MOUSE_REGION gTeamListContractRegion[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
-
OBJECTTYPE gItemPointer;
SOLDIERTYPE *gpItemPointerSoldier;
PathStPtr gpCharacterPreviousMercPath[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
PathStPtr gpHelicopterPreviousMercPath = NULL;
-
// GLOBAL VARIABLES (EXTERNAL)
-
-
extern BOOLEAN fHoveringHelicopter;
extern BOOLEAN fDeletedNode;
extern BOOLEAN gfRenderPBInterface;
@@ -733,7 +631,6 @@ extern UINT32 guiSecItemHiddenVO;
extern UINT32 guiUIMessageTimeDelay;
-
extern PathStPtr pTempCharacterPath;
extern PathStPtr pTempHelicopterPath;
@@ -748,10 +645,8 @@ extern OBJECTTYPE *gpItemDescObject;
extern SOLDIERTYPE *pProcessingSoldier;
-
// faces stuff
extern FACETYPE *gpCurrentTalkingFace;
-//extern BOOLEAN gfFacePanelActive;
// externs for highlighting of ammo/weapons
extern UINT32 guiMouseOverItemTime;
@@ -777,13 +672,7 @@ extern BOOLEAN gfMilitiaPopupCreated;
#endif
-
-
-
-
// PROTOTYPES
-
-
// basic input
void GetMapKeyboardInput( UINT32 *puiNewEvent );
void PollLeftButtonInMapView( UINT32 *puiNewEvent );
@@ -951,7 +840,6 @@ void EnableDisableTeamListRegionsAndHelpText( void );
BOOLEAN AnyMercsLeavingRealSoon();
void HandleContractTimeFlashForMercThatIsAboutLeave( void );
-
// Mouse Region Callbacks
// team list
@@ -1007,24 +895,20 @@ void UpdateBadAssignments( void );
// hwo many on team, if less than 2, disable prev/next merc buttons
void UpdateTheStateOfTheNextPrevMapScreenCharacterButtons( void );
-
// inventory
void CreateDestroyTrashCanRegion( void );
void DoneInventoryMapBtnCallback( GUI_BUTTON *btn,INT32 reason );
-
// handle cursor for invenetory mode..update to object selected, if needed
void HandleMapInventoryCursor( );
void MAPEndItemPointer( );
void MAPBeginItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubHandPos );
-
// create/destroy inventory button as needed
void CreateDestroyMapInvButton();
void PrevInventoryMapBtnCallback( GUI_BUTTON *btn, INT32 reason );
void NextInventoryMapBtnCallback( GUI_BUTTON *btn, INT32 reason );
-
// check if cursor needs to be set to checkmark or to the walking guy?
void UpdateCursorIfInLastSector( void );
@@ -1270,7 +1154,6 @@ BOOLEAN InitializeInvPanelCoordsOld()
INV_BODY_X = 71;
INV_BODY_Y = 116;
- // WANNE 2
NAME_X = 4;
NAME_WIDTH = 55 - NAME_X;
@@ -1285,13 +1168,11 @@ BOOLEAN InitializeInvPanelCoordsOld()
TIME_REMAINING_X = 215;
TIME_REMAINING_WIDTH = 243 - TIME_REMAINING_X;
- // WANNE 2
CLOCK_Y_START = (MAP_BORDER_Y_OFFSET + 298);
DEST_PLOT_X = (MAP_BORDER_X_OFFSET + 463);
DEST_PLOT_Y = (MAP_BORDER_Y_OFFSET + 345);
- // WANNE 2
CLOCK_ETA_X = (MAP_BORDER_X_OFFSET + 484);
CLOCK_HOUR_X_START = (MAP_BORDER_X_OFFSET + 518);
CLOCK_MIN_X_START = (MAP_BORDER_X_OFFSET + 538);
@@ -1403,12 +1284,6 @@ BOOLEAN InitializeInvPanelCoordsOld()
SOLDIER_PIC_Y = 20;
SOLDIER_HAND_X = 6;
SOLDIER_HAND_Y = 81;
- //TM_INV_WIDTH = 58;
- //TM_INV_HEIGHT = 23;
-
- // WANNE 2 (the position of the clock in the strategy screen)
- //CLOCK_X = (SCREEN_WIDTH - 86);
- //CLOCK_Y = (SCREEN_HEIGHT - 21);
//OJW - MP interface changes
InitializeMPCoordinates();
@@ -1549,8 +1424,7 @@ BOOLEAN InitializeInvPanelCoordsNew()
INV_REGION_X = PLAYER_INFO_X;
INV_REGION_Y = PLAYER_INFO_Y;
INV_REGION_WIDTH = 261;
- //INV_REGION_HEIGHT = 359-94;
- INV_REGION_HEIGHT = 490; // WANNE: Bugfix by Headrock!
+ INV_REGION_HEIGHT = 490;
INV_BTN_X = PLAYER_INFO_X + 226;
INV_BTN_Y = PLAYER_INFO_Y + 19;
INV_BDROP_X = PLAYER_INFO_X + 220;
@@ -1591,7 +1465,6 @@ BOOLEAN InitializeInvPanelCoordsNew()
INV_BODY_X = 31;
INV_BODY_Y = 8 + PLAYER_INFO_Y;
- // WANNE 2
NAME_X = 4;
NAME_WIDTH = 55 - NAME_X;
@@ -1606,13 +1479,11 @@ BOOLEAN InitializeInvPanelCoordsNew()
TIME_REMAINING_X = 215;
TIME_REMAINING_WIDTH = 243 - TIME_REMAINING_X;
- // WANNE 2
CLOCK_Y_START = (MAP_BORDER_Y_OFFSET + 298);
DEST_PLOT_X = (MAP_BORDER_X_OFFSET + 463);
DEST_PLOT_Y = (MAP_BORDER_Y_OFFSET + 345);
- // WANNE 2
CLOCK_ETA_X = (MAP_BORDER_X_OFFSET + 484);
CLOCK_HOUR_X_START = (MAP_BORDER_X_OFFSET + 518);
CLOCK_MIN_X_START = (MAP_BORDER_X_OFFSET + 538);
@@ -1724,21 +1595,15 @@ BOOLEAN InitializeInvPanelCoordsNew()
SOLDIER_PIC_Y = 20;
SOLDIER_HAND_X = 6;
SOLDIER_HAND_Y = 81;
- //TM_INV_WIDTH = 58;
- //TM_INV_HEIGHT = 23;
-
- // WANNE 2 (the position of the clock in the strategy screen)
- //CLOCK_X = (SCREEN_WIDTH - 86);
- //CLOCK_Y = (SCREEN_HEIGHT - 21);
gSCamoXY.sX = INV_BODY_X; gSCamoXY.sY = INV_BODY_Y; // X, Y Location of Map screen's Camouflage region
//OJW - MP interface changes
InitializeMPCoordinates();
-
return ( TRUE );
}
+
void InitializeMPCoordinates()
{
//OJW - MP interface changes
@@ -1975,8 +1840,9 @@ void ContractListRegionBoxGlow( UINT16 usCount )
UINT32 uiDestPitchBYTES;
UINT8 *pDestBuf;
INT16 usY = 0;
- INT16 sYStart = 0;
- INT16 usVehicleCount = 0;
+// INT16 sYStart = 0;
+ //INT16 usVehicleCount = 0;
+ INT16 sYAdd = 0;
// if not glowing right now, leave
@@ -1995,7 +1861,7 @@ void ContractListRegionBoxGlow( UINT16 usCount )
// change direction of glow?
if((iColorNum==0)||(iColorNum==10))
{
- fDelta=!fDelta;
+ fDelta=!fDelta;
}
// increment color
@@ -2004,23 +1870,10 @@ void ContractListRegionBoxGlow( UINT16 usCount )
else
iColorNum--;
-
- if( usCount >= FIRST_VEHICLE )
- {
- usVehicleCount = usCount - FIRST_VEHICLE;
- sYStart = usVehicleY;
- usY=(Y_OFFSET*usVehicleCount-1)+(sYStart+(usVehicleCount*Y_SIZE));
- }
- else
- {
- sYStart = Y_START;
- usY=(Y_OFFSET*usCount-1)+(sYStart+(usCount*Y_SIZE));
- }
+ sYAdd = 0;
// y start position of box
- //usY=(Y_OFFSET*usCount-1)+(Y_START+(usCount*Y_SIZE) + sYAdd );
-
- //usY=(Y_OFFSET*usCount-1)+(sYStart+(usCount*Y_SIZE));
+ usY=(Y_OFFSET*usCount-1)+(Y_START+(usCount*Y_SIZE) + sYAdd );
// glow contract box
usColor=Get16BPPColor( FROMRGB( GlowColorsA[iColorNum].ubRed, GlowColorsA[iColorNum].ubGreen, GlowColorsA[iColorNum].ubBlue ) );
@@ -2029,12 +1882,6 @@ void ContractListRegionBoxGlow( UINT16 usCount )
RectangleDraw( TRUE, TIME_REMAINING_X, usY, TIME_REMAINING_X + TIME_REMAINING_WIDTH, usY + GetFontHeight( MAP_SCREEN_FONT ) + 2, usColor, pDestBuf );
InvalidateRegion(TIME_REMAINING_X - 1, usY, TIME_REMAINING_X + TIME_REMAINING_WIDTH + 1, usY + GetFontHeight( MAP_SCREEN_FONT ) + 3 );
UnLockVideoSurface( FRAME_BUFFER );
-
-/*
- // restore background
- if((iColorNum==0)||(iColorNum==1))
- RestoreExternBackgroundRect( CONTRACT_X, CONTRACT_Y, CONTRACT_WIDTH+1, CONTRACT_HEIGHT+1 );
-*/
}
@@ -3559,33 +3406,29 @@ void HighLightAssignLine()
else
iColorNum--;
+ usY = ( Y_OFFSET * giAssignHighLine - 1 ) + ( Y_START + ( giAssignHighLine * Y_SIZE ) );
+
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
-
- for( usCount = 0; usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; usCount++ )
+
+ // marke strogg more mercs
+ for( usCount = 0; usCount < maxNumberOfMercVisibleInStrategyList; usCount++ )
{
if( IsCharacterSelectedForAssignment( usCount ) == TRUE )
{
usX=ASSIGN_X;
- //usY=Y_START+(giHighLine*GetFontHeight((MAP_SCREEN_FONT)));
usY=(Y_OFFSET*usCount-1)+(Y_START+(usCount*Y_SIZE));
- if( usCount >= FIRST_VEHICLE )
- {
- usVehicleCount = usCount - FIRST_VEHICLE;
- usY = (Y_OFFSET*usVehicleCount-1)+(usVehicleY+(usVehicleCount*Y_SIZE));
- }
-
usColor=Get16BPPColor( FROMRGB( GlowColorsA[iColorNum].ubRed, GlowColorsA[iColorNum].ubGreen, GlowColorsA[iColorNum].ubBlue ) );
LineDraw(TRUE, usX, usY, usX, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usColor, pDestBuf);
LineDraw(TRUE, usX+ASSIGN_WIDTH, usY, usX+ASSIGN_WIDTH, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usColor, pDestBuf);
- if( ( usCount == 0 ) || ( usCount != 0 ? !( IsCharacterSelectedForAssignment( ( UINT16 )( usCount - 1 ) ) ) : 0 ) || ( usCount == FIRST_VEHICLE ) )
+ if( ( usCount == 0 ) || ( usCount != 0 ? !( IsCharacterSelectedForAssignment( ( UINT16 )( usCount - 1 ) ) ) : 0 ) )
{
LineDraw( TRUE, usX, usY, usX+ASSIGN_WIDTH, usY, usColor,pDestBuf);
}
- if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( IsCharacterSelectedForAssignment( ( UINT16 )( usCount + 1 ) ) ) : 0) || ( usCount == FIRST_VEHICLE - 1 ) )
+ if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( IsCharacterSelectedForAssignment( ( UINT16 )( usCount + 1 ) ) ) : 0) )
{
LineDraw(TRUE, usX, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usX+ASSIGN_WIDTH, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usColor, pDestBuf);
}
@@ -3609,7 +3452,7 @@ void HighLightDestLine()
UINT16 usCount = 0;
UINT16 usX;
UINT16 usY;
- UINT16 usVehicleCont = 0;
+ //UINT16 usVehicleCont = 0;
if( ( giDestHighLine == -1 ) || fShowInventoryFlag )
@@ -3645,27 +3488,22 @@ void HighLightDestLine()
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
-
- for( usCount = 0; usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; usCount++ )
+
+ // marke strogg more mercs
+ for( usCount = 0; usCount < maxNumberOfMercVisibleInStrategyList; usCount++ )
{
if( CharacterIsGettingPathPlotted( usCount ) == TRUE )
{
usX=DEST_ETA_X-4;
usY=(Y_OFFSET*usCount-1)+(Y_START+(usCount*Y_SIZE));
- if( usCount >= FIRST_VEHICLE )
- {
- usVehicleCont = usCount - FIRST_VEHICLE;
- usY=(Y_OFFSET*usVehicleCont-1)+(usVehicleY+(usVehicleCont*Y_SIZE));
- }
-
usColor=Get16BPPColor( FROMRGB( GlowColorsA[iColorNum].ubRed, GlowColorsA[iColorNum].ubGreen, GlowColorsA[iColorNum].ubBlue ) );
- if( ( usCount == 0 ) || ( usCount != 0 ? !( CharacterIsGettingPathPlotted( ( UINT16 )( usCount - 1 ) ) ) : 0 ) || ( usCount == FIRST_VEHICLE ) )
+ if( ( usCount == 0 ) || ( usCount != 0 ? !( CharacterIsGettingPathPlotted( ( UINT16 )( usCount - 1 ) ) ) : 0 ))
{
LineDraw( TRUE, usX+4, usY, usX+DEST_ETA_WIDTH+4, usY, usColor,pDestBuf);
}
- if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( CharacterIsGettingPathPlotted( ( UINT16 )( usCount + 1 ) ) ) : 0) || ( usCount == FIRST_VEHICLE - 1 ) )
+ if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( CharacterIsGettingPathPlotted( ( UINT16 )( usCount + 1 ) ) ) : 0) )
{
LineDraw(TRUE, usX+4, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usX+DEST_ETA_WIDTH+4, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usColor, pDestBuf);
}
@@ -3695,7 +3533,7 @@ void HighLightSleepLine()
UINT16 usCount = 0;
UINT16 usX, usX2;
UINT16 usY;
- UINT16 usVehicleCount = 0;
+ //UINT16 usVehicleCount = 0;
// is this a valid line?
@@ -3732,8 +3570,8 @@ void HighLightSleepLine()
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
-
- for( usCount = 0; usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; usCount++ )
+// marke strogg more mercs Ok, we have to watch for to use only 18 display lines insedead of MAX_CHARACTER_COUNT
+ for( usCount = 0; usCount < maxNumberOfMercVisibleInStrategyList; usCount++ )
{
if( IsCharacterSelectedForSleep( usCount ) == TRUE )
{
@@ -3742,19 +3580,13 @@ void HighLightSleepLine()
usY=(Y_OFFSET*usCount-1)+(Y_START+(usCount*Y_SIZE));
- if( usCount >= FIRST_VEHICLE )
- {
- usVehicleCount = usCount - FIRST_VEHICLE;
- usY=(Y_OFFSET*usVehicleCount-1)+(usVehicleY+(usVehicleCount*Y_SIZE));
- }
-
usColor=Get16BPPColor( FROMRGB( GlowColorsA[iColorNum].ubRed, GlowColorsA[iColorNum].ubGreen, GlowColorsA[iColorNum].ubBlue ) );
- if( ( usCount == 0 ) || ( usCount != 0 ? !( IsCharacterSelectedForSleep( ( UINT16 )( usCount - 1 ) ) ) : 0 ) || ( usCount == FIRST_VEHICLE ) )
+ if( ( usCount == 0 ) || ( usCount != 0 ? !( IsCharacterSelectedForSleep( ( UINT16 )( usCount - 1 ) ) ) : 0 ) )
{
LineDraw( TRUE, usX+4, usY, usX2, usY, usColor,pDestBuf);
}
- if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( IsCharacterSelectedForSleep( ( UINT16 )( usCount + 1 ) ) ) : 0) || ( usCount == FIRST_VEHICLE - 1 ) )
+ if( ( ( usCount == giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ) || ( usCount != ( giMAXIMUM_NUMBER_OF_PLAYER_SLOTS - 1 ) ? !( IsCharacterSelectedForSleep( ( UINT16 )( usCount + 1 ) ) ) : 0) )
{
LineDraw(TRUE, usX+4, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usX2, usY+GetFontHeight(MAP_SCREEN_FONT)+2, usColor, pDestBuf);
}
@@ -3788,32 +3620,11 @@ void AddCharacter( SOLDIERTYPE *pCharacter )
return;
}
- // adding a vehicle?
- if( pCharacter->flags.uiStatusFlags & SOLDIER_VEHICLE )
+ // go through character list until a blank is reached
+ while( (gCharactersList[usCount].fValid)&&(usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS) )
{
- while( usVehicleLoop < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS )
- {
- if ( gCharactersList[ usVehicleLoop ].fValid )
- {
- if ( Menptr[ gCharactersList[ usVehicleLoop ].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE )
- {
- usVehicleCount++;
- }
- }
- usVehicleLoop++;
- }
-
- usCount = FIRST_VEHICLE + usVehicleCount;
+ usCount++;
}
- else
- {
- // go through character list until a blank is reached
- while( (gCharactersList[usCount].fValid)&&(usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS) )
- {
- usCount++;
- }
- }
-
Assert( usCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS );
if (usCount >= giMAXIMUM_NUMBER_OF_PLAYER_SLOTS )
@@ -3917,15 +3728,19 @@ void DisplayCharacterList()
for (sCount = 0; sCount < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; sCount++)
{
+ if ( sCount == maxNumberOfMercVisibleInStrategyList ) // marke strogg more mercs
+ // skip until at the VEHICLES
+ // later - simply break for now
+ break ; // sCount = 87 ;
// skip invalid characters
- if ( gCharactersList[sCount].fValid == TRUE )
+ if ( gCharactersList[( sCount + FIRSTmercTOdisplay )].fValid == TRUE )
{
if( sCount == ( INT16 ) giHighLine )
{
ubForegroundColor = FONT_WHITE;
}
// check to see if character is still alive
- else if( Menptr[gCharactersList[sCount].usSolID].stats.bLife == 0 )
+ else if( Menptr[gCharactersList[(sCount + FIRSTmercTOdisplay)].usSolID].stats.bLife == 0 )
{
ubForegroundColor = FONT_METALGRAY;
}
@@ -3934,13 +3749,13 @@ void DisplayCharacterList()
ubForegroundColor = FONT_LTBLUE;
}
// in current sector?
- else if( ( Menptr[gCharactersList[sCount].usSolID].sSectorX == sSelMapX ) &&
- ( Menptr[gCharactersList[sCount].usSolID].sSectorY == sSelMapY ) &&
- ( Menptr[gCharactersList[sCount].usSolID].bSectorZ == iCurrentMapSectorZ ) )
+ else if( ( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].sSectorX == sSelMapX ) &&
+ ( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].sSectorY == sSelMapY ) &&
+ ( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].bSectorZ == iCurrentMapSectorZ ) )
{
// mobile ?
- if( ( Menptr[gCharactersList[sCount].usSolID].bAssignment < ON_DUTY ) ||
- ( Menptr[gCharactersList[sCount].usSolID].bAssignment == VEHICLE ) )
+ if( ( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].bAssignment < ON_DUTY ) ||
+ ( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].bAssignment == VEHICLE ) )
ubForegroundColor = FONT_YELLOW;
else
ubForegroundColor = FONT_MAP_DKYELLOW;
@@ -3953,10 +3768,10 @@ void DisplayCharacterList()
SetFontForeground( ubForegroundColor );
- DrawName( Menptr[gCharactersList[sCount].usSolID].name, sCount, MAP_SCREEN_FONT);
- DrawLocation(sCount, sCount, MAP_SCREEN_FONT);
- DrawDestination(sCount, sCount, MAP_SCREEN_FONT);
- DrawAssignment(sCount, sCount, MAP_SCREEN_FONT);
+ DrawName( Menptr[gCharactersList[( sCount + FIRSTmercTOdisplay )].usSolID].name, sCount, MAP_SCREEN_FONT);
+ DrawLocation( sCount + FIRSTmercTOdisplay , sCount, MAP_SCREEN_FONT);
+ DrawDestination( sCount + FIRSTmercTOdisplay, sCount, MAP_SCREEN_FONT);
+ DrawAssignment( sCount + FIRSTmercTOdisplay, sCount, MAP_SCREEN_FONT);
DrawTimeRemaining(sCount, MAP_SCREEN_FONT, ubForegroundColor );
}
}
@@ -4615,17 +4430,6 @@ UINT32 MapScreenHandle(void)
return( MAP_SCREEN );
}
- // WANNE:
- /*if (fShowInventoryFlag == TRUE)
- {
- DeleteButtonsForScrolling();
- }
- else
- {
- CreateButtonsForScrolling();
- }*/
-
-// if ( (fInMapMode == FALSE ) && ( fMapExitDueToMessageBox == FALSE ) )
if ( !fInMapMode )
{
gfFirstMapscreenFrame = TRUE;
@@ -4756,11 +4560,11 @@ UINT32 MapScreenHandle(void)
{
if (iResolution == 0)
{
- FilenameForBPP("INTERFACE\\newgoldpiece3.sti", VObjectDesc.ImageFile );
+ FilenameForBPP("INTERFACE\\newgoldpiece3.sti", VObjectDesc.ImageFile );
}
else if (iResolution == 1)
{
- FilenameForBPP("INTERFACE\\newgoldpiece3_800x600.sti", VObjectDesc.ImageFile );
+ FilenameForBPP("INTERFACE\\newgoldpiece3_800x600.sti", VObjectDesc.ImageFile );
}
else if (iResolution == 2)
{
@@ -5016,17 +4820,21 @@ UINT32 MapScreenHandle(void)
// create mouse region for pause clock
CreateMouseRegionForPauseOfClock( CLOCK_REGION_START_X, CLOCK_REGION_START_Y );
+ // WANNE: The number of merc we can display in the list, depends on the resolution
if (iResolution == 0)
{
- usVehicleY = 319;
+ maxNumberOfMercVisibleInStrategyList = 22;
}
else if (iResolution == 1)
{
- usVehicleY = 414;
+ maxNumberOfMercVisibleInStrategyList = 34;
}
else if (iResolution == 2)
{
- usVehicleY = 549;
+ if (giMAXIMUM_NUMBER_OF_PLAYER_SLOTS <= 51)
+ maxNumberOfMercVisibleInStrategyList = giMAXIMUM_NUMBER_OF_PLAYER_SLOTS;
+ else
+ maxNumberOfMercVisibleInStrategyList = 51;
}
// create mouse regions
@@ -5885,20 +5693,8 @@ void DrawName(STR16 pName, INT16 sRowIndex, INT32 iFont)
INT16 usX=0;
INT16 usY=0;
- // mercs
- if( sRowIndex < FIRST_VEHICLE )
- {
- FindFontCenterCoordinates((short)NAME_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)NAME_WIDTH, (short)Y_SIZE, pName, (long)iFont, &usX, &usY);
- }
- // vehicles
- else
- {
- sRowIndex = sRowIndex - FIRST_VEHICLE;
- //FindFontCenterCoordinates((short)NAME_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE) + 6), (short)NAME_WIDTH, (short)Y_SIZE, pName, (long)iFont, &usX, &usY);
- FindFontCenterCoordinates((short)NAME_X + 1, (short)(usVehicleY+(sRowIndex*Y_SIZE)), (short)NAME_WIDTH, (short)Y_SIZE, pName, (long)iFont, &usX, &usY);
- }
-
- //RestoreExternBackgroundRect(NAME_X, ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), NAME_WIDTH, Y_SIZE);
+ FindFontCenterCoordinates((short)NAME_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)NAME_WIDTH, (short)Y_SIZE, pName, (long)iFont, &usX, &usY);
+
DrawString( pName, (UINT16)usX, ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), iFont);
}
@@ -5912,17 +5708,8 @@ void DrawAssignment(INT16 sCharNumber, INT16 sRowIndex, INT32 iFont)
GetMapscreenMercAssignmentString( MercPtrs[ gCharactersList[ sCharNumber ].usSolID ], sString );
- if( sRowIndex < FIRST_VEHICLE )
- {
- FindFontCenterCoordinates((short)ASSIGN_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)ASSIGN_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
- else
- {
- sRowIndex = sRowIndex - FIRST_VEHICLE;
- //FindFontCenterCoordinates((short)ASSIGN_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE) + 6), (short)ASSIGN_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- FindFontCenterCoordinates((short)ASSIGN_X + 1, (short)(usVehicleY+(sRowIndex*Y_SIZE)), (short)ASSIGN_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
-
+ FindFontCenterCoordinates((short)ASSIGN_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)ASSIGN_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
+
SOLDIERTYPE *pSoldier = MercPtrs[ gCharactersList[ sCharNumber ].usSolID ];
if( fFlashAssignDone == TRUE )
@@ -6038,20 +5825,8 @@ void DrawLocation(INT16 sCharNumber, INT16 sRowIndex, INT32 iFont)
GetMapscreenMercLocationString( MercPtrs[ gCharactersList[ sCharNumber ].usSolID ], sString );
- if( sRowIndex < FIRST_VEHICLE )
- {
- // center
- FindFontCenterCoordinates((short)LOC_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)LOC_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
- else
- {
- //FindFontCenterCoordinates((short)LOC_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE) + 6), (short)LOC_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- sRowIndex = sRowIndex - FIRST_VEHICLE;
- FindFontCenterCoordinates((short)LOC_X + 1, (short)(usVehicleY+(sRowIndex*Y_SIZE)), (short)LOC_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
- // restore background
- //RestoreExternBackgroundRect(LOC_X, ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), LOC_WIDTH, Y_SIZE);
-
+ FindFontCenterCoordinates((short)LOC_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)LOC_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
+
// draw string
DrawString( sString,((UINT16)(usX)), ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), ((UINT32)iFont));
}
@@ -6070,19 +5845,8 @@ void DrawDestination(INT16 sCharNumber, INT16 sRowIndex, INT32 iFont)
return;
}
- if( sRowIndex < FIRST_VEHICLE )
- {
- FindFontCenterCoordinates((short)DEST_ETA_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)DEST_ETA_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
- else
- {
- sRowIndex = sRowIndex - FIRST_VEHICLE;
- //FindFontCenterCoordinates((short)DEST_ETA_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE) + 6 ), (short)DEST_ETA_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- FindFontCenterCoordinates((short)DEST_ETA_X + 1, (short)(usVehicleY+(sRowIndex*Y_SIZE)), (short)DEST_ETA_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
-
- //RestoreExternBackgroundRect(DEST_ETA_X+1, ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), DEST_ETA_WIDTH-1, Y_SIZE);
- // ShowDestinationOfPlottedPath( sString );
+ FindFontCenterCoordinates((short)DEST_ETA_X + 1, (short)(Y_START+(sRowIndex*Y_SIZE)), (short)DEST_ETA_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
+
DrawString( sString,((UINT16)(usX)), ((UINT16)(usY+(Y_OFFSET*sRowIndex+1))), ((UINT32)iFont));
}
@@ -6093,8 +5857,8 @@ void DrawTimeRemaining( INT16 sCharNumber, INT32 iFont, UINT8 ubFontColor )
INT16 usY=0;
CHAR16 sString[32];
-
- GetMapscreenMercDepartureString( MercPtrs[ gCharactersList[ sCharNumber ].usSolID ], sString, &ubFontColor );
+// marke strogg more mercs MUST override pointer into array by number of skipped mercs
+ GetMapscreenMercDepartureString( MercPtrs[ gCharactersList[ sCharNumber + FIRSTmercTOdisplay ].usSolID ], sString, &ubFontColor );
// if merc is highlighted, override the color decided above with bright white
if( sCharNumber == ( INT16 ) giHighLine )
@@ -6105,18 +5869,8 @@ void DrawTimeRemaining( INT16 sCharNumber, INT32 iFont, UINT8 ubFontColor )
SetFont(iFont);
SetFontForeground( ubFontColor );
- if( sCharNumber < FIRST_VEHICLE )
- {
- FindFontCenterCoordinates((short)TIME_REMAINING_X + 1, (short)(Y_START+(sCharNumber*Y_SIZE)), (short)TIME_REMAINING_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
- else
- {
- sCharNumber = sCharNumber - FIRST_VEHICLE;
- //FindFontCenterCoordinates((short)TIME_REMAINING_X + 1, (short)(Y_START+(sCharNumber*Y_SIZE) + 6 ), (short)TIME_REMAINING_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- FindFontCenterCoordinates((short)TIME_REMAINING_X + 1, (short)(usVehicleY+(sCharNumber*Y_SIZE)), (short)TIME_REMAINING_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
- }
-
- //RestoreExternBackgroundRect(TIME_REMAINING_X, ((UINT16)(usY+(Y_OFFSET*sCharNumber+1))), TIME_REMAINING_WIDTH, Y_SIZE);
+ FindFontCenterCoordinates((short)TIME_REMAINING_X + 1, (short)(Y_START+(sCharNumber*Y_SIZE)), (short)TIME_REMAINING_WIDTH, (short)Y_SIZE, sString, (long)iFont, &usX, &usY);
+
DrawString(sString,((UINT16)(usX)), ((UINT16)(usY+(Y_OFFSET*sCharNumber+1))), ((UINT32)iFont));
}
@@ -6929,14 +6683,28 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
break;
case PGUP:
+ // WANNE: Jump to first merc in list
+ fResetMapCoords = TRUE;
+ GoToFirstCharacterInList( );
+ break;
+ case PGDN:
+ // WANNE: Jump to last merc in list
+ fResetMapCoords = TRUE;
+ GoToLastCharacterInList( );
+ break;
+
+ case SHIFT_PGUP:
// up a page
MapScreenMsgScrollUp( MAX_MESSAGES_ON_MAP_BOTTOM );
break;
- case PGDN:
+
+ case SHIFT_PGDN:
// down a page
MapScreenMsgScrollDown( MAX_MESSAGES_ON_MAP_BOTTOM );
break;
+
+
case HOME:
// jump to top of message list
ChangeCurrentMapscreenMessageIndex( 0 );
@@ -7494,7 +7262,7 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
if( fAlt )
{
// set up the helicopter over Omerta (if it's not already set up)
- SetUpHelicopterForPlayer( 9,1 );
+ SetUpHelicopterForPlayer( 9,1 , SKYRIDER );
// raise Drassen loyalty to minimum that will allow Skyrider to fly
if ( gTownLoyalty[ DRASSEN ].fStarted && ( gTownLoyalty[ DRASSEN ].ubRating < LOYALTY_LOW_THRESHOLD ) )
{
@@ -7556,6 +7324,8 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
SOLDIERTYPE *pSoldier = MercPtrs[ gCharactersList[ bSelectedInfoChar ].usSolID ];
BOOLEAN handFit = (CanItemFitInPosition(pSoldier, &pSoldier->inv[HANDPOS], GUNSLINGPOCKPOS, FALSE) || (pSoldier->inv[HANDPOS].exists() == false && pSoldier->inv[SECONDHANDPOS].exists() == false));
BOOLEAN slingFit = (CanItemFitInPosition(pSoldier, &pSoldier->inv[GUNSLINGPOCKPOS], HANDPOS, FALSE) || pSoldier->inv[GUNSLINGPOCKPOS].exists() == false);
+ if(Item[pSoldier->inv[GUNSLINGPOCKPOS].usItem].twohanded && pSoldier->inv[SECONDHANDPOS].exists() == true)
+ handFit = FALSE;
if( handFit == TRUE && slingFit == TRUE)
{
SwapObjs(&pSoldier->inv[HANDPOS], &pSoldier->inv[GUNSLINGPOCKPOS]);
@@ -8034,16 +7804,14 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
// down a line
MapScreenMsgScrollDown( 1 );
break;
-
- case PGUP:
+ case SHIFT_PGUP:
// up a page
MapScreenMsgScrollUp( MAX_MESSAGES_ON_MAP_BOTTOM );
break;
- case PGDN:
+ case SHIFT_PGDN:
// down a page
MapScreenMsgScrollDown( MAX_MESSAGES_ON_MAP_BOTTOM );
break;
-
}
}
}
@@ -8175,9 +7943,6 @@ void EndMapScreen( BOOLEAN fDuringFade )
DeleteMouseRegionsForLevelMarkers( );
- // WANNE:
- //DeleteButtonsForScrolling();
-
if( fShowMapInventoryPool == FALSE )
{
// delete buttons
@@ -9607,7 +9372,7 @@ void RenderAttributeStringsForUpperLeftHandCorner( UINT32 uiBufferToRenderTo )
else
{
// condition
- DrawString(pUpperLeftMapScreenStrings[ 4 ], 96, 80, CHAR_FONT);
+ DrawString(pUpperLeftMapScreenStrings[ 4 ], 87, 80, CHAR_FONT);
}
@@ -9837,17 +9602,14 @@ void BlitBackgroundToSaveBuffer( void )
if( fDisableDueToBattleRoster == FALSE )
{
- // render team
- RenderTeamRegionBackground( );
+ // render team
+ RenderTeamRegionBackground( );
- // render character info
- RenderCharacterInfoBackground( );
+ // render character info
+ RenderCharacterInfoBackground( );
}
else if( gfPreBattleInterfaceActive )
{
- // WANNE:
- //DeleteButtonsForScrolling();
-
ForceButtonUnDirty( giMapContractButton );
ForceButtonUnDirty( giCharInfoButton[ 0 ] );
ForceButtonUnDirty( giCharInfoButton[ 1 ] );
@@ -9863,11 +9625,7 @@ void CreateMouseRegionsForTeamList( void )
{
// will create mouse regions for assignments, path plotting, character info selection
INT16 sCounter = 0;
- //INT16 sYAdd = 0;
-
- INT16 sYStart = 0;
- INT16 sOffsetCounter = 0;
-
+ INT16 sYAdd = 0;
// the info region...is the background for the list itself
// OJW - MP
@@ -9877,70 +9635,33 @@ void CreateMouseRegionsForTeamList( void )
for( sCounter = 0; sCounter < max_rows; sCounter++ )
{
- if( sCounter >= FIRST_VEHICLE )
- {
- //sYAdd = 6;
- sOffsetCounter = sCounter - FIRST_VEHICLE;
- sYStart = usVehicleY;
- }
- else
- {
- sOffsetCounter = sCounter;
- sYStart = Y_START;
- //sYAdd = 0;
- }
-
+ sYAdd = 0;
+
// name region
- MSYS_DefineRegion( &gTeamListNameRegion[ sCounter ] , NAME_X, ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), NAME_X + NAME_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL,
+ MSYS_DefineRegion( &gTeamListNameRegion[ sCounter ] , NAME_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), NAME_X + NAME_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL,
MSYS_NO_CURSOR, TeamListInfoRegionMvtCallBack, TeamListInfoRegionBtnCallBack );
// assignment region
- MSYS_DefineRegion( &gTeamListAssignmentRegion[ sCounter ] ,ASSIGN_X , ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), ASSIGN_X + ASSIGN_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL + 1,
+ MSYS_DefineRegion( &gTeamListAssignmentRegion[ sCounter ] ,ASSIGN_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), ASSIGN_X + ASSIGN_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
MSYS_NO_CURSOR, TeamListAssignmentRegionMvtCallBack, TeamListAssignmentRegionBtnCallBack );
// location region (same function as name regions, so uses the same callbacks)
- MSYS_DefineRegion( &gTeamListLocationRegion[ sCounter ] , LOC_X, ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), LOC_X + LOC_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL + 1,
+ MSYS_DefineRegion( &gTeamListLocationRegion[ sCounter ] , LOC_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), LOC_X + LOC_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
MSYS_NO_CURSOR, TeamListInfoRegionMvtCallBack, TeamListInfoRegionBtnCallBack );
// destination region
- MSYS_DefineRegion( &gTeamListDestinationRegion[ sCounter ] ,DEST_ETA_X , ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), DEST_ETA_X + DEST_ETA_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL + 1,
+ MSYS_DefineRegion( &gTeamListDestinationRegion[ sCounter ] ,DEST_ETA_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), DEST_ETA_X + DEST_ETA_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
MSYS_NO_CURSOR, TeamListDestinationRegionMvtCallBack, TeamListDestinationRegionBtnCallBack );
// contract region
- MSYS_DefineRegion( &gTeamListContractRegion[ sCounter ] ,TIME_REMAINING_X , ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), TIME_REMAINING_X + TIME_REMAINING_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL + 1,
+ MSYS_DefineRegion( &gTeamListContractRegion[ sCounter ] ,TIME_REMAINING_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), TIME_REMAINING_X + TIME_REMAINING_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
MSYS_NO_CURSOR, TeamListContractRegionMvtCallBack, TeamListContractRegionBtnCallBack );
// contract region
- MSYS_DefineRegion( &gTeamListSleepRegion[ sCounter ] ,SLEEP_X, ( INT16 )( sYStart + ( sOffsetCounter ) * ( Y_SIZE + 2 )), SLEEP_X + SLEEP_WIDTH, ( INT16 )( (sYStart + 10) + ( sOffsetCounter + 1 ) * ( Y_SIZE + 2 )), MSYS_PRIORITY_NORMAL + 1,
+ MSYS_DefineRegion( &gTeamListSleepRegion[ sCounter ] ,SLEEP_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), SLEEP_X + SLEEP_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
MSYS_NO_CURSOR, TeamListSleepRegionMvtCallBack, TeamListSleepRegionBtnCallBack );
-
- //// name region
- //MSYS_DefineRegion( &gTeamListNameRegion[ sCounter ] , NAME_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), NAME_X + NAME_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL,
- // MSYS_NO_CURSOR, TeamListInfoRegionMvtCallBack, TeamListInfoRegionBtnCallBack );
-
- //// assignment region
- //MSYS_DefineRegion( &gTeamListAssignmentRegion[ sCounter ] ,ASSIGN_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), ASSIGN_X + ASSIGN_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
- // MSYS_NO_CURSOR, TeamListAssignmentRegionMvtCallBack, TeamListAssignmentRegionBtnCallBack );
-
- //// location region (same function as name regions, so uses the same callbacks)
- //MSYS_DefineRegion( &gTeamListLocationRegion[ sCounter ] , LOC_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), LOC_X + LOC_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
- // MSYS_NO_CURSOR, TeamListInfoRegionMvtCallBack, TeamListInfoRegionBtnCallBack );
-
- //// destination region
- //MSYS_DefineRegion( &gTeamListDestinationRegion[ sCounter ] ,DEST_ETA_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd ), DEST_ETA_X + DEST_ETA_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
- // MSYS_NO_CURSOR, TeamListDestinationRegionMvtCallBack, TeamListDestinationRegionBtnCallBack );
-
- //// contract region
- //MSYS_DefineRegion( &gTeamListContractRegion[ sCounter ] ,TIME_REMAINING_X , ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), TIME_REMAINING_X + TIME_REMAINING_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
- // MSYS_NO_CURSOR, TeamListContractRegionMvtCallBack, TeamListContractRegionBtnCallBack );
-
- //// contract region
- //MSYS_DefineRegion( &gTeamListSleepRegion[ sCounter ] ,SLEEP_X, ( INT16 )( Y_START + ( sCounter ) * ( Y_SIZE + 2 ) + sYAdd), SLEEP_X + SLEEP_WIDTH, ( INT16 )( 145 + ( sCounter + 1 ) * ( Y_SIZE + 2 ) + sYAdd ), MSYS_PRIORITY_NORMAL + 1,
- // MSYS_NO_CURSOR, TeamListSleepRegionMvtCallBack, TeamListSleepRegionBtnCallBack );
-
-
MSYS_SetRegionUserData(&gTeamListNameRegion[sCounter],0,sCounter);
MSYS_SetRegionUserData(&gTeamListAssignmentRegion[sCounter],0,sCounter);
MSYS_SetRegionUserData(&gTeamListSleepRegion[sCounter],0,sCounter);
@@ -10211,7 +9932,7 @@ void TeamListInfoRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
{
return;
}
-
+// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
@@ -10224,17 +9945,17 @@ void TeamListInfoRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE )
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
- if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue , FALSE ))
+ if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue + FIRSTmercTOdisplay, FALSE ))
{
return;
}
- ChangeSelectedInfoChar( ( INT8 ) iValue, TRUE );
+ ChangeSelectedInfoChar( ( INT8 ) iValue+ FIRSTmercTOdisplay, TRUE );
- pSoldier = &Menptr[ gCharactersList[ iValue ].usSolID ];
+ pSoldier = &Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay].usSolID ];
// highlight
giDestHighLine = -1;
@@ -10279,12 +10000,12 @@ void TeamListInfoRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE )
{
- pSoldier = &Menptr[ gCharactersList[ iValue ].usSolID ];
+ pSoldier = &Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay].usSolID ];
// select this character
- ChangeSelectedInfoChar( ( INT8 ) iValue, TRUE );
+ ChangeSelectedInfoChar( ( INT8 ) iValue+ FIRSTmercTOdisplay, TRUE );
RequestToggleMercInventoryPanel();
@@ -10335,7 +10056,8 @@ void TeamListInfoRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_MOVE)
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+// marke strogg more mercs So, the ACTUAL merc is location + skipped FIRSTmercTOdisplay
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
giHighLine = iValue;
}
@@ -10362,7 +10084,7 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
{
return;
}
-
+// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
@@ -10375,18 +10097,18 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE )
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
- if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue , FALSE ))
+ if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue + FIRSTmercTOdisplay, FALSE ))
{
return;
}
// reset list if the clicked character isn't also selected
- ChangeSelectedInfoChar( ( INT8 ) iValue, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue ) == FALSE ) );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue + FIRSTmercTOdisplay) == FALSE ) );
- pSoldier = &Menptr[ gCharactersList[ iValue ].usSolID ];
+ pSoldier = &Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID ];
// if alive (dead guys keep going, use remove menu instead),
// and it's between sectors and it can be reassigned (non-vehicles)
@@ -10397,7 +10119,7 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- bSelectedAssignChar = ( INT8 ) iValue;
+ bSelectedAssignChar = ( INT8 ) iValue + FIRSTmercTOdisplay;
RebuildAssignmentsBox( );
// reset dest character
@@ -10419,7 +10141,7 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
// if this thing can be re-assigned
if( !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
- giAssignHighLine = iValue;
+ giAssignHighLine = iValue + FIRSTmercTOdisplay;
fShowAssignmentMenu = TRUE;
@@ -10447,7 +10169,7 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
- if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue, TRUE ))
+ if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue + FIRSTmercTOdisplay, TRUE ))
{
return;
}
@@ -10462,12 +10184,12 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE )
{
- ChangeSelectedInfoChar( ( INT8 ) iValue, TRUE );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, TRUE );
- pSoldier = &Menptr[ gCharactersList[ iValue ].usSolID ];
+ pSoldier = &Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay].usSolID ];
// highlight
giDestHighLine = -1;
@@ -10545,11 +10267,12 @@ void TeamListAssignmentRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_MOVE)
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+ // marke strogg more mercs So, the ACTUAL merc is location + FIRSTmercTOdisplay
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
giHighLine = iValue;
- if( !( Menptr[ gCharactersList[ iValue ].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE ) )
+ if( !( Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
giAssignHighLine = iValue;
}
@@ -10579,8 +10302,8 @@ void TeamListAssignmentRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
}
else if( iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
- if( ( gCharactersList[ iValue ].fValid == TRUE ) &&
- !( Menptr[ gCharactersList[ iValue ].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE ) )
+ if( ( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE ) &&
+ !( Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
// play click
PlayGlowRegionSound( );
@@ -10599,7 +10322,7 @@ void TeamListDestinationRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
{
return;
}
-
+// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
@@ -10611,35 +10334,35 @@ void TeamListDestinationRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE )
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
- if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue , FALSE ))
+ if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue + FIRSTmercTOdisplay , FALSE ))
{
return;
}
// reset list if the clicked character isn't also selected
- ChangeSelectedInfoChar( ( INT8 ) iValue, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue ) == FALSE ) );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue + FIRSTmercTOdisplay ) == FALSE ) );
// deselect any characters/vehicles that can't accompany the clicked merc
- DeselectSelectedListMercsWhoCantMoveWithThisGuy( &( Menptr[ gCharactersList[ iValue ].usSolID ] ) );
+ DeselectSelectedListMercsWhoCantMoveWithThisGuy( &( Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID ] ) );
// select all characters/vehicles that MUST accompany the clicked merc (same squad/vehicle)
SelectUnselectedMercsWhoMustMoveWithThisGuy( );
// Find out if this guy and everyone travelling with him is allowed to move strategically
// NOTE: errors are reported within...
- if ( CanChangeDestinationForCharSlot( ( INT8 ) iValue, TRUE ) )
+ if ( CanChangeDestinationForCharSlot( ( INT8 ) iValue + FIRSTmercTOdisplay, TRUE ) )
{
// turn off sector inventory, turn on show teams filter, etc.
- MakeMapModesSuitableForDestPlotting( ( INT8 ) iValue );
+ MakeMapModesSuitableForDestPlotting( ( INT8 ) iValue + FIRSTmercTOdisplay );
// check if person is in a vehicle
- if( Menptr[gCharactersList[ iValue ].usSolID].bAssignment == VEHICLE )
+ if( Menptr[gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID].bAssignment == VEHICLE )
{
// if he's in the helicopter
- if( Menptr[gCharactersList[ iValue ].usSolID].iVehicleId == iHelicopterVehicleId )
+ if( Menptr[gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID].iVehicleId == iHelicopterVehicleId )
{
TurnOnAirSpaceMode( );
if( RequestGiveSkyriderNewDestination( ) == FALSE )
@@ -10652,7 +10375,7 @@ void TeamListDestinationRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
// select this character as the one plotting strategic movement
- bSelectedDestChar = ( INT8 )iValue;
+ bSelectedDestChar = ( INT8 )iValue + FIRSTmercTOdisplay;
// remember the current paths for all selected characters so we can restore them if need be
RememberPreviousPathForAllSelectedChars();
@@ -10661,7 +10384,7 @@ void TeamListDestinationRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
//CheckMembersOfMvtGroupAndComplainAboutBleeding( &( Menptr[ gCharactersList[ bSelectedDestChar ].usSolID ] ) );
// highlight
- giDestHighLine = iValue;
+ giDestHighLine = iValue + FIRSTmercTOdisplay;
// can't assign highlight line
giAssignHighLine = -1;
@@ -10698,10 +10421,10 @@ void TeamListDestinationRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
{
- MakeMapModesSuitableForDestPlotting( ( INT8 ) iValue );
+ MakeMapModesSuitableForDestPlotting( ( INT8 ) iValue + FIRSTmercTOdisplay );
// reset list if the clicked character isn't also selected
- ChangeSelectedInfoChar( ( INT8 ) iValue, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue ) == FALSE ) );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue + FIRSTmercTOdisplay ) == FALSE ) );
CancelPathsOfAllSelectedCharacters();
@@ -10725,7 +10448,8 @@ void TeamListDestinationRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_MOVE)
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+ // marke strogg more mercs So, the ACTUAL merc is location + FIRSTmercTOdisplay
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
giHighLine = iValue;
giDestHighLine = iValue;
@@ -10751,7 +10475,7 @@ void TeamListDestinationRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
}
else if( iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
// play click
PlayGlowRegionSound( );
@@ -10771,7 +10495,7 @@ void TeamListSleepRegionBtnCallBack( MOUSE_REGION *pRegion, INT32 iReason )
{
return;
}
-
+// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
@@ -10785,21 +10509,21 @@ void TeamListSleepRegionBtnCallBack( MOUSE_REGION *pRegion, INT32 iReason )
return;
}
- if( ( gCharactersList[ iValue ].fValid == TRUE ) )
+ if( ( gCharactersList[ iValue + FIRSTmercTOdisplay].fValid == TRUE ) )
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
- if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue , FALSE ))
+ if ( HandleCtrlOrShiftInTeamPanel( ( INT8 ) iValue + FIRSTmercTOdisplay , FALSE ))
{
return;
}
// reset list if the clicked character isn't also selected
- ChangeSelectedInfoChar( ( INT8 ) iValue, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue ) == FALSE ) );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, ( BOOLEAN )( IsEntryInSelectedListSet( ( INT8 ) iValue + FIRSTmercTOdisplay ) == FALSE ) );
// if this slot's sleep status can be changed
- if ( CanChangeSleepStatusForCharSlot( (INT8) iValue ) )
+ if ( CanChangeSleepStatusForCharSlot( (INT8) iValue + FIRSTmercTOdisplay ) )
{
- pSoldier = &Menptr[ gCharactersList[ iValue ].usSolID ];
+ pSoldier = &Menptr[ gCharactersList[ iValue + FIRSTmercTOdisplay ].usSolID ];
if( pSoldier->flags.fMercAsleep == TRUE )
{
@@ -10864,11 +10588,12 @@ void TeamListSleepRegionMvtCallBack( MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_MOVE)
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+ // marke strogg more mercs So, the ACTUAL merc is location + FIRSTmercTOdisplay
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
giHighLine = iValue;
- if ( CanChangeSleepStatusForCharSlot( (INT8) iValue ) )
+ if ( CanChangeSleepStatusForCharSlot( (INT8) iValue + FIRSTmercTOdisplay ) )
{
giSleepHighLine = iValue;
}
@@ -10894,7 +10619,7 @@ void TeamListSleepRegionMvtCallBack( MOUSE_REGION *pRegion, INT32 iReason )
}
else if( iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
- if ( CanChangeSleepStatusForCharSlot( (INT8) iValue ) )
+ if ( CanChangeSleepStatusForCharSlot( (INT8) iValue + FIRSTmercTOdisplay ) )
{
// play click
PlayGlowRegionSound( );
@@ -10913,7 +10638,7 @@ void TeamListContractRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
{
return;
}
-
+// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if( gCharactersList[ iValue ].fValid == TRUE )
@@ -10921,7 +10646,7 @@ void TeamListContractRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
// select ONLY this dude
- ChangeSelectedInfoChar( ( INT8 ) iValue, TRUE );
+ ChangeSelectedInfoChar( ( INT8 ) iValue + FIRSTmercTOdisplay, TRUE );
// reset character
giDestHighLine = -1;
@@ -10958,11 +10683,12 @@ void TeamListContractRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_MOVE)
{
- if( gCharactersList[ iValue ].fValid == TRUE )
+ // marke strogg more mercs So, the ACTUAL merc is location + FIRSTmercTOdisplay
+ if( gCharactersList[ iValue + FIRSTmercTOdisplay ].fValid == TRUE )
{
giHighLine = iValue;
- if( CanExtendContractForCharSlot( (INT8) iValue ) )
+ if( CanExtendContractForCharSlot( (INT8) iValue + FIRSTmercTOdisplay ) )
{
giContractHighLine = iValue;
}
@@ -10993,7 +10719,7 @@ void TeamListContractRegionMvtCallBack(MOUSE_REGION *pRegion, INT32 iReason )
}
else if( iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
- if( CanExtendContractForCharSlot( (INT8) iValue ) )
+ if( CanExtendContractForCharSlot( (INT8) iValue + FIRSTmercTOdisplay ) )
{
// play click
PlayGlowRegionSound( );
@@ -11729,8 +11455,8 @@ void EnableDisableTeamListRegionsAndHelpText( void )
for( bCharNum = 0; bCharNum < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; bCharNum++ )
- {
- if( gCharactersList[ bCharNum ].fValid == FALSE )
+ { // marke strogg more mercs limit regions to actual mercs + only do it for 18 slots
+ if( gCharactersList[ bCharNum + FIRSTmercTOdisplay].fValid == FALSE || bCharNum >= maxNumberOfMercVisibleInStrategyList )
{
// disable regions in all team list columns
MSYS_DisableRegion( &gTeamListNameRegion[ bCharNum ] );
@@ -11747,7 +11473,7 @@ void EnableDisableTeamListRegionsAndHelpText( void )
MSYS_EnableRegion( &gTeamListLocationRegion[ bCharNum ] );
// valid character. If it's a vehicle, however
- if ( Menptr[ gCharactersList[ bCharNum ].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE )
+ if ( Menptr[ gCharactersList[ bCharNum + FIRSTmercTOdisplay].usSolID ].flags.uiStatusFlags & SOLDIER_VEHICLE )
{
// Can't change assignment for vehicles
MSYS_DisableRegion( &gTeamListAssignmentRegion[ bCharNum ] );
@@ -11757,8 +11483,8 @@ void EnableDisableTeamListRegionsAndHelpText( void )
MSYS_EnableRegion( &gTeamListAssignmentRegion[ bCharNum ] );
// POW or dead ?
- if ( ( Menptr[ gCharactersList[ bCharNum ].usSolID ].bAssignment == ASSIGNMENT_POW ) ||
- ( Menptr[ gCharactersList[ bCharNum ].usSolID ].stats.bLife == 0 ) )
+ if ( ( Menptr[ gCharactersList[ bCharNum + FIRSTmercTOdisplay].usSolID ].bAssignment == ASSIGNMENT_POW ) ||
+ ( Menptr[ gCharactersList[ bCharNum + FIRSTmercTOdisplay].usSolID ].stats.bLife == 0 ) )
{
// "Remove Merc"
SetRegionFastHelpText( &gTeamListAssignmentRegion[ bCharNum ], pRemoveMercStrings[ 0 ] );
@@ -11775,7 +11501,7 @@ void EnableDisableTeamListRegionsAndHelpText( void )
}
- if ( CanExtendContractForCharSlot( bCharNum ) )
+ if ( CanExtendContractForCharSlot( bCharNum + FIRSTmercTOdisplay ) ) // marke strogg more mercs
{
MSYS_EnableRegion( &gTeamListContractRegion[ bCharNum ] );
}
@@ -11785,7 +11511,7 @@ void EnableDisableTeamListRegionsAndHelpText( void )
}
- if ( CanChangeSleepStatusForCharSlot( bCharNum ) )
+ if ( CanChangeSleepStatusForCharSlot( bCharNum + FIRSTmercTOdisplay ) )
{
MSYS_EnableRegion( &gTeamListSleepRegion[ bCharNum ] );
}
@@ -12716,6 +12442,8 @@ void CreateDestroyTrashCanRegion( void )
ShutdownKeyRingInterface( );
+ ShutdownInventoryInterface();
+
if( fShowDescriptionFlag == TRUE )
{
// kill description
@@ -13304,106 +13032,6 @@ void NextInventoryMapBtnCallback( GUI_BUTTON *btn, INT32 reason )
}
}
-// WANNE:
-//void BtnMercsUpMapScreenCallback( GUI_BUTTON *btn,INT32 reason )
-//{
-// // WANNE: See Map Screen Interface Bottom Line 766 (BtnMessageUpMapScreenCallback)
-// int i = 10;
-//}
-//
-//void BtnMercsDownMapScreenCallback( GUI_BUTTON *btn,INT32 reason )
-//{
-// // WANNE: See Map Screen Interface Bottom Line 766 (BtnMessageUpMapScreenCallback)
-// int i = 10;
-//}
-//
-//void BtnVehicleUpMapScreenCallback( GUI_BUTTON *btn,INT32 reason )
-//{
-// // WANNE: See Map Screen Interface Bottom Line 766 (BtnMessageUpMapScreenCallback)
-// int i = 10;
-//}
-//
-//void BtnVehicleDownMapScreenCallback( GUI_BUTTON *btn,INT32 reason )
-//{
-// // WANNE: See Map Screen Interface Bottom Line 766 (BtnMessageUpMapScreenCallback)
-// int i = 10;
-//}
-
-// WANNE:
-//void DeleteButtonsForScrolling(void)
-//{
-// if (fScrollButtonsInitialized == TRUE)
-// {
-// // mercs scroll buttons
-// RemoveButton( guiMapMercsScrollButtons[ 0 ]);
-// RemoveButton( guiMapMercsScrollButtons[ 1 ]);
-// UnloadButtonImage( guiMapMercsScrollButtonsImage[ 0 ] );
-// UnloadButtonImage( guiMapMercsScrollButtonsImage[ 1 ] );
-//
-// RemoveButton( guiMapVehicleScrollButtons[ 0 ]);
-// RemoveButton( guiMapVehicleScrollButtons[ 1 ]);
-// UnloadButtonImage( guiMapVehicleScrollButtonsImage[ 0 ] );
-// UnloadButtonImage( guiMapVehicleScrollButtonsImage[ 1 ] );
-//
-// fScrollButtonsInitialized = FALSE;
-// }
-//}
-
-// WANNE:
-// Create the scrolling arrows
-//void CreateButtonsForScrolling( void )
-//{
-// if (fScrollButtonsInitialized == FALSE)
-// {
-// INT32 iXPos = 247;
-// INT32 iMercUpY = -1;
-// INT32 iVehicleUpY = -1;
-//
-// if (iResolution == 0)
-// {
-// iMercUpY = 207;
-// iVehicleUpY = 321;
-// }
-// else if (iResolution == 1)
-// {
-// iMercUpY = 256;
-// iVehicleUpY = 429;
-// }
-// else if (iResolution == 2)
-// {
-// iMercUpY = 328;
-// iVehicleUpY = 579;
-// }
-//
-// // merc - scroll up
-// guiMapMercsScrollButtonsImage[ MAP_SCROLL_MERCS_UP ]= LoadButtonImage( "INTERFACE\\map_screen_bottom_arrows.sti" ,11,4,-1,6,-1 );
-// guiMapMercsScrollButtons[ MAP_SCROLL_MERCS_UP ] = QuickCreateButton( guiMapMercsScrollButtonsImage[ MAP_SCROLL_MERCS_UP ], iXPos, iMercUpY,
-// BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
-// (GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnMercsUpMapScreenCallback);
-//
-// // merc - scroll down
-// guiMapMercsScrollButtonsImage[ MAP_SCROLL_MERCS_DOWN ]= LoadButtonImage( "INTERFACE\\map_screen_bottom_arrows.sti" ,12,5,-1,7,-1 );
-// guiMapMercsScrollButtons[ MAP_SCROLL_MERCS_DOWN ] = QuickCreateButton( guiMapMercsScrollButtonsImage[ MAP_SCROLL_MERCS_DOWN ], iXPos, iMercUpY + 17,
-// BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
-// (GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnMercsDownMapScreenCallback);
-//
-// // vehicle - scroll up
-// guiMapVehicleScrollButtonsImage[ MAP_SCROLL_VEHICLE_UP ]= LoadButtonImage( "INTERFACE\\map_screen_bottom_arrows.sti" ,11,4,-1,6,-1 );
-// guiMapVehicleScrollButtons[ MAP_SCROLL_VEHICLE_UP ] = QuickCreateButton( guiMapVehicleScrollButtonsImage[ MAP_SCROLL_VEHICLE_UP ], iXPos, iVehicleUpY,
-// BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
-// (GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnVehicleUpMapScreenCallback);
-//
-// // vehicle - scroll down
-// guiMapVehicleScrollButtonsImage[ MAP_SCROLL_VEHICLE_DOWN ]= LoadButtonImage( "INTERFACE\\map_screen_bottom_arrows.sti" ,12,5,-1,7,-1 );
-// guiMapVehicleScrollButtons[ MAP_SCROLL_VEHICLE_DOWN ] = QuickCreateButton( guiMapVehicleScrollButtonsImage[ MAP_SCROLL_VEHICLE_DOWN ], iXPos, iVehicleUpY + 17,
-// BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
-// (GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnVehicleDownMapScreenCallback);
-//
-// fScrollButtonsInitialized = TRUE;
-// }
-//}
-
-
void CreateDestroyMapCharacterScrollButtons( void )
{
static BOOLEAN fCreated = FALSE;
@@ -13690,7 +13318,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
// do the sort
- for( iCounter = 1; iCounter < FIRST_VEHICLE ; iCounter++ )
+ for( iCounter = 1; iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS ; iCounter++ )
{
// have we gone too far
if( gCharactersList[ iCounter ].fValid == FALSE )
@@ -13702,7 +13330,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
{
case( 0 ):
// by name
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13721,7 +13349,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
case( 1 ):
// by assignment
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13755,7 +13383,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
case( 2 ):
// by sleep status
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13778,7 +13406,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
sEndSectorA = CalcLocationValueForChar( iCounter );
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13809,7 +13437,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
sEndSectorA = GetLastSectorIdInCharactersPath( &Menptr[ gCharactersList[ iCounter ].usSolID ] );
}
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13840,7 +13468,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
iExpiryTime = GetContractExpiryTime( &( Menptr[ gCharactersList[ iCounter ].usSolID ] ) );
//by contract expiry
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE )
{
@@ -13863,7 +13491,7 @@ void SortListOfMercsInTeamPanel( BOOLEAN fRetainSelectedMercs, BOOLEAN fReverse
case( 6 ):
uiID = Menptr[ gCharactersList[ iCounter ].usSolID ].ubID;
//by ubID
- for( iCounterA = 0; iCounterA < FIRST_VEHICLE; iCounterA++ )
+ for( iCounterA = 0; iCounterA < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounterA++ )
{
if( gCharactersList[ iCounterA ].fValid == FALSE)
{
@@ -14074,12 +13702,12 @@ void DisplayIconsForMercsAsleep( void )
}
GetVideoObject(&hHandle, guiSleepIcon );
-
- for( iCounter = 0; iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
+// marke strogg more mercs set max display lines to 18
+ for( iCounter = 0; iCounter < maxNumberOfMercVisibleInStrategyList; iCounter++ )
{
- if( gCharactersList[ iCounter ].fValid == TRUE )
+ if( gCharactersList[ iCounter + FIRSTmercTOdisplay ].fValid == TRUE )
{
- pSoldier = MercPtrs[ gCharactersList[ iCounter ].usSolID ];
+ pSoldier = MercPtrs[ gCharactersList[ iCounter + FIRSTmercTOdisplay ].usSolID ];
if( pSoldier->bActive && pSoldier->flags.fMercAsleep && CanChangeSleepStatusForSoldier( pSoldier ) )
{
//BltVideoObject( guiSAVEBUFFER , hHandle, 0, 125, ( INT16 )( Y_START+(iCounter * ( Y_SIZE + 2 ) ) ) , VO_BLT_SRCTRANSPARENCY,NULL );
@@ -14545,7 +14173,7 @@ BOOLEAN HandleCtrlOrShiftInTeamPanel( INT8 bCharNumber, BOOLEAN fFromRightClickA
if ( pSoldier->bAssignment == VEHICLE )
{
// and a member of that squad or vehicle is selected, or we are a vehicle
- if ( pSoldier->iVehicleId == pSelected->iVehicleId ||
+ if ( (pSelected->bAssignment == VEHICLE && pSoldier->iVehicleId == pSelected->iVehicleId) ||
(pSelected->flags.uiStatusFlags & SOLDIER_VEHICLE && pSoldier->iVehicleId == pSelected->bVehicleID ) ||
(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE && pSelected->iVehicleId == pSoldier->bVehicleID ) )
{
@@ -14698,15 +14326,17 @@ void ChangeSelectedInfoChar( INT8 bCharNumber, BOOLEAN fResetSelectedList )
return;
+ // CHRISL: The result of this block of code is that if we're holding an item, not only does the originally selected merc stay selected,
+ // but the merc who happens to hold the originally selected mercs position in the new sort order will ALSO be selected.
// if holding an item
- if ( ( gMPanelRegion.Cursor == EXTERN_CURSOR ) || gpItemPointer || fMapInventoryItem )
- {
+ //if ( ( gMPanelRegion.Cursor == EXTERN_CURSOR ) || gpItemPointer || fMapInventoryItem )
+ //{
// make sure we can give it to this guy, otherwise don't allow the change
- if ( !MapscreenCanPassItemToCharNum( bCharNumber ) )
- {
- return;
- }
- }
+ // if ( !MapscreenCanPassItemToCharNum( bCharNumber ) )
+ // {
+ // return;
+ // }
+ //}
if ( fResetSelectedList )
@@ -14756,6 +14386,26 @@ void ChangeSelectedInfoChar( INT8 bCharNumber, BOOLEAN fResetSelectedList )
}
}
+ // marke strogg more mercs
+ // we have to adapt FIRSTmercTOdisplay bCharNumber is 0 to 90 any merc
+ if ( bCharNumber >= 0 )
+ {
+ if (bCharNumber < FIRSTmercTOdisplay)
+ {
+ FIRSTmercTOdisplay = bCharNumber;
+ }
+ else if (bCharNumber > FIRSTmercTOdisplay + (maxNumberOfMercVisibleInStrategyList - 1) )
+ {
+ // WANNE: This check fixes the wrong offset when hiring the FIRST merc!
+ if ((maxNumberOfMercVisibleInStrategyList - 1) >= 0)
+ FIRSTmercTOdisplay = bCharNumber - (maxNumberOfMercVisibleInStrategyList - 1);
+ else
+ FIRSTmercTOdisplay = 0;
+ }
+ }
+// now this should do the trick
+// marke strogg end
+
fTeamPanelDirty = TRUE;
}
diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp
index 7d51463f..988b1e73 100644
--- a/Strategic/strategicmap.cpp
+++ b/Strategic/strategicmap.cpp
@@ -2928,13 +2928,16 @@ void UpdateMercInSector( SOLDIERTYPE *pSoldier, INT16 sSectorX, INT16 sSectorY,
// Are we in Omerta!
if ( sSectorX == gWorldSectorX && gWorldSectorX == 9 && sSectorY == gWorldSectorY && gWorldSectorY == 1 && bSectorZ == gbWorldSectorZ && gbWorldSectorZ == 0 )
{
+ // TODO.WANNE: Hardcoded grid number
// Try another location and walk into map
pSoldier->sInsertionGridNo = 4379;//dnl!!!
}
else
{
- pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
- pSoldier->sInsertionGridNo = gMapInformation.sNorthGridNo;
+ //pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ //pSoldier->sInsertionGridNo = gMapInformation.sNorthGridNo;
+ pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
+ pSoldier->sInsertionGridNo = gGameExternalOptions.iInitialMercArrivalLocation;
}
break;
case INSERTION_CODE_CHOPPER:
@@ -2945,6 +2948,7 @@ void UpdateMercInSector( SOLDIERTYPE *pSoldier, INT16 sSectorX, INT16 sSectorY,
return;
break;
default:
+ // TODO.WANNE: Hardcoded grid number
pSoldier->sInsertionGridNo = 12880;//dnl!!!
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String( "Improper insertion code %d given to UpdateMercsInSector", pSoldier->ubStrategicInsertionCode ) );
break;
@@ -3705,8 +3709,16 @@ BEGINNING_LOOP:
{
if ( !OK_CONTROLLABLE_MERC( curr->pSoldier ) )
{
- RemoveCharacterFromSquads( curr->pSoldier );
- goto BEGINNING_LOOP;
+ if(OK_CONTROL_MERC(curr->pSoldier) && curr->pSoldier->bAssignment == VEHICLE && pGroup->fVehicle)
+ {
+ //CHRISL: passengers in a vehicle movement group will not pass the OK_CONTROLLABLE_MERC check because their assignment is not "ON_DUTY".
+ // The above conditions should allow passengers in a vehicle movement group to remain in the group.
+ }
+ else
+ {
+ RemoveCharacterFromSquads( curr->pSoldier );
+ goto BEGINNING_LOOP;
+ }
}
curr = curr->next;
}
diff --git a/Tactical/Animation Control.cpp b/Tactical/Animation Control.cpp
index df989ca3..243fb3f3 100644
--- a/Tactical/Animation Control.cpp
+++ b/Tactical/Animation Control.cpp
@@ -64,7 +64,8 @@ static UINT16 LobGrenadeStanceAnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,4,5
static UINT16 ROLL_L_AnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,501,999,0,0,0,0 };
static UINT16 ROLL_R_AnimationScript[MAX_FRAMES_PER_ANIM] = { 14,13,12,11,10,9,8,7,6,5,4,3,2,1,501,999,0,0,0,0 };
-
+static UINT16 JUMP_WALL_UP_AnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,601,999,0,0,0,0 };
+static UINT16 JUMP_WALL_DOWN_AnimationScript[MAX_FRAMES_PER_ANIM] = { 44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,601,999,0,0,0,0 };
@@ -979,6 +980,13 @@ ANIMCONTROLTYPE gAnimControl[ NUMANIMATIONSTATES ] =
//ROLL PRONE RIGHT
{"ROLL PRONE RIGHT" , 0, 80, (FLOAT)0.8 /*1.1*/, ANIM_MOVING | ANIM_NORESTART | ANIM_RAISE_WEAPON | ANIM_VARIABLE_EFFORT, ANIM_PRONE, ANIM_PRONE, -1},
+ // JUMPUPWALL
+ {"JUMPUPWALL" , 0, 30, (FLOAT)0, ANIM_NONINTERRUPT | ANIM_NORESTART | ANIM_STATIONARY | ANIM_NOSHOW_MARKER | ANIM_MODERATE_EFFORT | ANIM_LOWER_WEAPON, ANIM_STAND, ANIM_CROUCH, -1},
+
+ //JUMPDOWNWALL
+ {"JUMPDOWNWALL" , 0, 30, (FLOAT)0, ANIM_NONINTERRUPT | ANIM_NORESTART | ANIM_STATIONARY | ANIM_NOSHOW_MARKER | ANIM_MODERATE_EFFORT | ANIM_LOWER_WEAPON, ANIM_CROUCH, ANIM_STAND, -1},
+
+ {"JUMP WINDOWS" , 0, 50, (FLOAT)0, ANIM_NOCHANGE_PENDINGCOUNT | ANIM_NORESTART | ANIM_STATIONARY | ANIM_NOSHOW_MARKER | ANIM_MODERATE_EFFORT | ANIM_LOWER_WEAPON | ANIM_NONINTERRUPT, ANIM_STAND, ANIM_CROUCH, -1},
};
@@ -1376,7 +1384,10 @@ void InitAnimationSurfacesPerBodytype( )
gubAnimSurfaceIndex[ REGMALE ][ ROLL_PRONE_L ] = RGMROLL_PR;
gubAnimSurfaceIndex[ REGMALE ][ ROLL_PRONE_R ] = RGMROLL_PR;
-
+ gubAnimSurfaceIndex[ REGMALE ][ JUMPUPWALL ] = RGMWALLJUMP;
+ gubAnimSurfaceIndex[ REGMALE ][ JUMPDOWNWALL ] = RGMWALLJUMP;
+
+ gubAnimSurfaceIndex[ REGMALE ][ JUMPWINDOWS ] = RGMJUMPWINDOWS;
gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ STANDING][0] = RGMWATER_R_STD;
gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ WALKING ][0] = RGMWATER_R_WALK;
@@ -1747,6 +1758,11 @@ void InitAnimationSurfacesPerBodytype( )
//перекат
gubAnimSurfaceIndex[ BIGMALE ][ ROLL_PRONE_L ] = BGMROLL_PR;
gubAnimSurfaceIndex[ BIGMALE ][ ROLL_PRONE_R ] = BGMROLL_PR;
+
+ gubAnimSurfaceIndex[ BIGMALE ][ JUMPUPWALL ] = BGMWALLJUMP;
+ gubAnimSurfaceIndex[ BIGMALE ][ JUMPDOWNWALL ] = BGMWALLJUMP;
+
+ gubAnimSurfaceIndex[ BIGMALE ][ JUMPWINDOWS ] = BGMJUMPWINDOWS;
gubAnimSurfaceItemSubIndex[ BIGMALE ][ STANDING ] = BGMPISTOLBREATH;
@@ -2135,7 +2151,11 @@ void InitAnimationSurfacesPerBodytype( )
//перекат
gubAnimSurfaceIndex[ STOCKYMALE ][ ROLL_PRONE_L ] = RGMROLL_PR;
gubAnimSurfaceIndex[ STOCKYMALE ][ ROLL_PRONE_R ] = RGMROLL_PR;
-
+
+ gubAnimSurfaceIndex[ STOCKYMALE ][ JUMPUPWALL ] = RGMWALLJUMP;
+ gubAnimSurfaceIndex[ STOCKYMALE ][ JUMPDOWNWALL ] = RGMWALLJUMP;
+
+ gubAnimSurfaceIndex[ STOCKYMALE ][ JUMPWINDOWS ] = RGMJUMPWINDOWS;
gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ STANDING ] = RGMPISTOLBREATH;
gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ WALKING ] = RGMNOTHING_WALK;
@@ -2503,7 +2523,10 @@ void InitAnimationSurfacesPerBodytype( )
gubAnimSurfaceIndex[ REGFEMALE ][ ROLL_PRONE_L ] = RGFROLL_PR;
gubAnimSurfaceIndex[ REGFEMALE ][ ROLL_PRONE_R ] = RGFROLL_PR;
-
+ gubAnimSurfaceIndex[ REGFEMALE ][ JUMPUPWALL ] = RGFWALLJUMP;
+ gubAnimSurfaceIndex[ REGFEMALE ][ JUMPDOWNWALL ] = RGFWALLJUMP;
+
+ gubAnimSurfaceIndex[ REGFEMALE ][ JUMPWINDOWS ] = RGFJUMPWINDOWS;
gubAnimSurfaceItemSubIndex[ REGFEMALE ][ STANDING ] = RGFPISTOLBREATH;
gubAnimSurfaceItemSubIndex[ REGFEMALE ][ WALKING ] = RGFNOTHING_WALK;
@@ -3222,6 +3245,15 @@ BOOLEAN LoadAnimationStateInstructions( )
memcpy(gusAnimInst[ ROLL_PRONE_L ],ROLL_L_AnimationScript,sizeof(ROLL_L_AnimationScript));
memcpy(gusAnimInst[ ROLL_PRONE_R ],ROLL_R_AnimationScript,sizeof(ROLL_R_AnimationScript));
+
+ memcpy(gusAnimInst[JUMPUPWALL],fuckTheBoundz[32],sizeof(fuckTheBoundz[32])); // copy CLIMBROOF to JUMPUPWALL
+
+ memcpy(gusAnimInst[JUMPDOWNWALL],fuckTheBoundz[35],sizeof(fuckTheBoundz[35])); // copy CLIMBDOWNROOF to JUMPDOWNWALL
+
+ memcpy(gusAnimInst[JUMPWINDOWS],fuckTheBoundz[HOPFENCE],sizeof(fuckTheBoundz[HOPFENCE])); // copy HOPFENCE to JUMPDOWNWALL
+
+ //memcpy(gusAnimInst[ JUMPUPWALL ],JUMP_WALL_UP_AnimationScript,sizeof(JUMP_WALL_UP_AnimationScript));
+ //memcpy(gusAnimInst[ JUMPDOWNWALL ],JUMP_WALL_DOWN_AnimationScript,sizeof(JUMP_WALL_DOWN_AnimationScript));
return( TRUE );
}
diff --git a/Tactical/Animation Control.h b/Tactical/Animation Control.h
index 8e40ec28..3b2beed6 100644
--- a/Tactical/Animation Control.h
+++ b/Tactical/Animation Control.h
@@ -554,6 +554,12 @@ enum AnimationStates
ROLL_PRONE_R,
ROLL_PRONE_L,
+ //jump wall
+ JUMPUPWALL,
+ JUMPDOWNWALL,
+
+ JUMPWINDOWS,
+
NUMANIMATIONSTATES
};
diff --git a/Tactical/Animation Data.cpp b/Tactical/Animation Data.cpp
index 11767942..c5077eac 100644
--- a/Tactical/Animation Data.cpp
+++ b/Tactical/Animation Data.cpp
@@ -502,7 +502,15 @@ AnimationSurfaceType gAnimSurfaceDatabase[ NUMANIMATIONSURFACETYPES ] =
RGMROLL_PR, "ANIMS\\S_MERC\\S_ROLL_N.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1,
BGMROLL_PR, "ANIMS\\M_MERC\\M_ROLL_N.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1,
RGFROLL_PR, "ANIMS\\F_MERC\\F_ROLL_N.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1,
-
+
+ RGMWALLJUMP, "ANIMS\\S_MERC\\S_CLIMB.STI", S_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+ BGMWALLJUMP, "ANIMS\\M_MERC\\M_CLIMB.STI", S_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+ RGFWALLJUMP, "ANIMS\\F_MERC\\F_CLIMB.STI", S_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+
+ RGMJUMPWINDOWS, "ANIMS\\S_MERC\\S_HOP.STI", NO_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+ BGMJUMPWINDOWS, "ANIMS\\M_MERC\\M_HOP.STI", NO_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+ RGFJUMPWINDOWS, "ANIMS\\F_MERC\\F_HOP.STI", NO_STRUCT, 0, 4, TO_INIT, NULL, NULL, 0, -1,
+
};
diff --git a/Tactical/Animation Data.h b/Tactical/Animation Data.h
index c39c7cff..f5c8225e 100644
--- a/Tactical/Animation Data.h
+++ b/Tactical/Animation Data.h
@@ -530,6 +530,15 @@ BGMWITHSTONE,
RGMROLL_PR,
BGMROLL_PR,
RGFROLL_PR,
+
+ RGMWALLJUMP,
+ BGMWALLJUMP,
+ RGFWALLJUMP,
+
+ //jump windows
+ RGMJUMPWINDOWS,
+ BGMJUMPWINDOWS,
+ RGFJUMPWINDOWS,
NUMANIMATIONSURFACETYPES
diff --git a/Tactical/ArmsDealerInvInit.cpp b/Tactical/ArmsDealerInvInit.cpp
index d43e1709..307d87af 100644
--- a/Tactical/ArmsDealerInvInit.cpp
+++ b/Tactical/ArmsDealerInvInit.cpp
@@ -14,6 +14,7 @@
#include "bobbyr.h"
#include "Random.h"
#include "Shopkeeper Interface.h"
+ #include "connect.h"
#endif
@@ -1184,7 +1185,14 @@ UINT8 DetermineInitialInvItems( INT8 bArmsDealerID, UINT16 usItemIndex, UINT8 ub
ubNumBought = 0;
for (ubCnt = 0; ubCnt < ubChances; ubCnt++)
{
- if (ItemTransactionOccurs( bArmsDealerID, usItemIndex, DEALER_BUYING, fUsed))
+ if (!is_networked)
+ {
+ if (ItemTransactionOccurs( bArmsDealerID, usItemIndex, DEALER_BUYING, fUsed))
+ {
+ ubNumBought++;
+ }
+ }
+ else
{
ubNumBought++;
}
diff --git a/Tactical/Boxing.cpp b/Tactical/Boxing.cpp
index 8a7d7624..7dd7f8e6 100644
--- a/Tactical/Boxing.cpp
+++ b/Tactical/Boxing.cpp
@@ -383,7 +383,7 @@ BOOLEAN PickABoxer( void )
RESETTIMECOUNTER( pBoxer->timeCounters.AICounter, 0 );
gfBoxerFought[ uiLoop ] = TRUE;
// improve stats based on the # of rests these guys have had
- pBoxer->stats.bStrength = __min( 100, pBoxer->stats.bStrength += gubBoxersRests * 5 );
+ pBoxer->stats.bStrength = __min( 100, pBoxer->stats.bStrength + gubBoxersRests * 5 );
pBoxer->stats.bDexterity = __min( 100, pBoxer->stats.bDexterity + gubBoxersRests * 5 );
pBoxer->stats.bAgility = __min( 100, pBoxer->stats.bAgility + gubBoxersRests * 5 );
pBoxer->stats.bLifeMax = __min( 100, pBoxer->stats.bLifeMax + gubBoxersRests * 5 );
diff --git a/Tactical/Campaign.cpp b/Tactical/Campaign.cpp
index 4179e3a7..7074ccc4 100644
--- a/Tactical/Campaign.cpp
+++ b/Tactical/Campaign.cpp
@@ -1866,5 +1866,5 @@ void MERCMercWentUpALevelSendEmail( UINT8 ubMercMercIdValue )
ubEmailOffset = MERC_UP_LEVEL_BIFF + MERC_UP_LEVEL_LENGTH_BIFF * ( ubMercMercIdValue );
}
- AddEmail( ubEmailOffset, iMsgLength, SPECK_FROM_MERC, GetWorldTotalMin(), -1);
+ AddEmail( ubEmailOffset, iMsgLength, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1);
}
diff --git a/Tactical/Dialogue Control.cpp b/Tactical/Dialogue Control.cpp
index 2c500356..d6799b0b 100644
--- a/Tactical/Dialogue Control.cpp
+++ b/Tactical/Dialogue Control.cpp
@@ -1893,30 +1893,33 @@ BOOLEAN DialogueDataFileExistsForProfile( UINT8 ubCharacterNum, UINT16 usQuoteNu
BOOLEAN GetDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, UINT32 iDataSize, STR16 zDialogueText, UINT32 *puiSoundID, CHAR8 *zSoundString )
{
STR8 pFilename;
+ BOOLEAN fTextAvailable = FALSE;
// first things first - grab the text (if player has SUBTITLE PREFERENCE ON)
//if ( gGameSettings.fOptions[ TOPTION_SUBTITLES ] )
{
- if ( DialogueDataFileExistsForProfile( ubCharacterNum, 0, FALSE, &pFilename ) )
- {
- LoadEncryptedDataFromFile( pFilename, zDialogueText, usQuoteNum * iDataSize, iDataSize );
- if(zDialogueText[0] == 0)
+ if ( DialogueDataFileExistsForProfile( ubCharacterNum, 0, FALSE, &pFilename ) )
{
- swprintf( zDialogueText, L"I have no text in the EDT file ( %d ) %S", usQuoteNum, pFilename );
+ LoadEncryptedDataFromFile( pFilename, zDialogueText, usQuoteNum * iDataSize, iDataSize );
+ if(zDialogueText[0] == 0)
+ {
+ swprintf( zDialogueText, L"I have no text in the EDT file ( %d ) %S", usQuoteNum, pFilename );
+
+#ifndef JA2BETAVERSION
+ return( FALSE );
+#endif
+ }
+ else
+ fTextAvailable = TRUE;
+ }
+ else
+ {
+ swprintf( zDialogueText, L"I have no text in the file ( %d ) %S", usQuoteNum , pFilename );
#ifndef JA2BETAVERSION
return( FALSE );
#endif
}
- }
- else
- {
- swprintf( zDialogueText, L"I have no text in the file ( %d ) %S", usQuoteNum , pFilename );
-
-#ifndef JA2BETAVERSION
- return( FALSE );
-#endif
- }
}
@@ -1936,23 +1939,24 @@ BOOLEAN GetDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, UINT32 iDataSize,
CHAR8 sString[512];
sprintf( sString, "ERROR: Missing file for character # %d, quote # %d", ubCharacterNum, usQuoteNum );
- ShowCursor(TRUE);
- ShowCursor(TRUE);
- ShutdownWithErrorBox( sString );
+ ShowCursor(TRUE);
+ ShowCursor(TRUE);
+ ShutdownWithErrorBox( sString );
}
*/
//#endif
+ *puiSoundID = NO_SAMPLE;
+
// get speech if applicable
if ( gGameSettings.fOptions[ TOPTION_SPEECH ] )
{
// Load it into memory!
*puiSoundID = SoundLoadSample( pFilename );
-
}
- return(TRUE);
+ return (*puiSoundID != NO_SAMPLE) || fTextAvailable;
}
diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp
index 72038389..c91adf51 100644
--- a/Tactical/DisplayCover.cpp
+++ b/Tactical/DisplayCover.cpp
@@ -550,6 +550,7 @@ void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
{
UINT16 usRange=0;
CHAR16 zOutputString[512];
+ UINT8 title = (UsingNewCTHSystem() == true ? DC_MSG__NCTH_GUN_RANGE_INFORMATION : DC_MSG__GUN_RANGE_INFORMATION);
if( sTargetGridNo == NOWHERE || sTargetGridNo == 0 )
{
@@ -595,13 +596,13 @@ void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
// HEADROCK HAM 3.6: Calculate Gun Range using formula.
UINT16 usGunRange = GunRange(&pSoldier->inv[HANDPOS], pSoldier ); // SANDRO - added argument
- swprintf( zOutputString, gzDisplayCoverText[DC_MSG__GUN_RANGE_INFORMATION], usRange / 10, usGunRange / 10, uiHitChance );
+ swprintf( zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance );
//Display the msg
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString );
}
else
{
- swprintf( zOutputString, gzDisplayCoverText[DC_MSG__GUN_RANGE_INFORMATION], usRange / 10, 0, 0 );
+ swprintf( zOutputString, gzDisplayCoverText[title], usRange / 10, 0, 0 );
//Display the msg
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString );
diff --git a/Tactical/Faces.cpp b/Tactical/Faces.cpp
index 1d698788..2ba76bc3 100644
--- a/Tactical/Faces.cpp
+++ b/Tactical/Faces.cpp
@@ -66,6 +66,9 @@ UINT8 ubRPCNumSmallFaceValues = 200;
CAMO_FACE gCamoFace[255];
+FACE_GEAR_VALUES zNewFaceGear[MAXITEMS];
+FACE_GEAR_VALUES zNewFaceGearIMP[MAXITEMS];
+
extern BOOLEAN gfSMDisableForItems;
extern INT16 gsCurInterfacePanel;
extern UINT16 gusSMCurrentMerc;
@@ -721,7 +724,73 @@ void SetAutoFaceInActive(INT32 iFaceIndex )
pFace->fDisabled = TRUE;
}
+void SetCamoFace(SOLDIERTYPE * pSoldier)
+{
+ INT8 worn = -1;
+ INT8 applied = -1;
+ INT16 wornCamo[4];
+ INT16 appliedCamo[4];
+ //reset gCamoFace
+ gCamoFace[pSoldier->ubProfile].gCamoface = FALSE;
+ gCamoFace[pSoldier->ubProfile].gUrbanCamoface = FALSE;
+ gCamoFace[pSoldier->ubProfile].gDesertCamoface = FALSE;
+ gCamoFace[pSoldier->ubProfile].gSnowCamoface = FALSE;
+
+ appliedCamo[0] = pSoldier->bCamo;
+ appliedCamo[1] = pSoldier->urbanCamo;
+ appliedCamo[2] = pSoldier->desertCamo;
+ appliedCamo[3] = pSoldier->snowCamo;
+ wornCamo[0] = pSoldier->wornCamo;
+ wornCamo[1] = pSoldier->wornUrbanCamo;
+ wornCamo[2] = pSoldier->wornDesertCamo;
+ wornCamo[3] = pSoldier->wornSnowCamo;
+
+ for(INT8 loop = 0; loop < 4; loop ++)
+ {
+ if(wornCamo[loop] > 50)
+ worn = loop;
+ if(appliedCamo[loop] > 50)
+ applied = loop;
+ }
+
+ if(applied != -1 && worn != -1)
+ {
+ if(appliedCamo[applied] >= wornCamo[worn])
+ {
+ if(applied == 0)
+ gCamoFace[pSoldier->ubProfile].gCamoface = TRUE;
+ if(applied == 1)
+ gCamoFace[pSoldier->ubProfile].gUrbanCamoface = TRUE;
+ if(applied == 2)
+ gCamoFace[pSoldier->ubProfile].gDesertCamoface = TRUE;
+ if(applied == 3)
+ gCamoFace[pSoldier->ubProfile].gSnowCamoface = TRUE;
+ }
+ else
+ {
+ if(worn == 0)
+ gCamoFace[pSoldier->ubProfile].gCamoface = TRUE;
+ if(worn == 1)
+ gCamoFace[pSoldier->ubProfile].gUrbanCamoface = TRUE;
+ if(worn == 2)
+ gCamoFace[pSoldier->ubProfile].gDesertCamoface = TRUE;
+ if(worn == 3)
+ gCamoFace[pSoldier->ubProfile].gSnowCamoface = TRUE;
+ }
+ }
+ else if(applied != -1 || worn != -1)
+ {
+ if(applied == 0 || worn == 0)
+ gCamoFace[pSoldier->ubProfile].gCamoface = TRUE;
+ if(applied == 1 || worn == 1)
+ gCamoFace[pSoldier->ubProfile].gUrbanCamoface = TRUE;
+ if(applied == 2 || worn == 2)
+ gCamoFace[pSoldier->ubProfile].gDesertCamoface = TRUE;
+ if(applied == 3 || worn == 3)
+ gCamoFace[pSoldier->ubProfile].gSnowCamoface = TRUE;
+ }
+}
void SetAllAutoFacesInactive( )
{
@@ -1153,7 +1222,7 @@ BOOLEAN RenderAutoFaceFromSoldier( UINT8 ubSoldierID )
}
//---------------------------------------LEGION-------------------------------
-
+/*
void GetXYForIconPlacement_legion( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY )
{
INT16 sX, sY;
@@ -1174,7 +1243,8 @@ void GetXYForIconPlacement_legion( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX
*psY = sY;
}
-void GetXYForRightIconPlacement_legion_NV( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons )
+
+void GetXYForRightIconPlacement_legion_NV( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons, BOOLEAN isIMP )
{
INT16 sX, sY;
UINT16 usWidth, usHeight;
@@ -1182,7 +1252,11 @@ void GetXYForRightIconPlacement_legion_NV( FACETYPE *pFace, UINT16 ubIndex, INT1
HVOBJECT hVObject;
// Get height, width of icon...
- GetVideoObject( &hVObject, guiPORTRAITICONS_NV );
+ if (isIMP)
+ GetVideoObject( &hVObject, guiPORTRAITICONS_NV_IMP );
+ else
+ GetVideoObject( &hVObject, guiPORTRAITICONS_NV );
+
pTrav = &(hVObject->pETRLEObject[ ubIndex ] );
usHeight = pTrav->usHeight;
usWidth = pTrav->usWidth;
@@ -1193,16 +1267,21 @@ void GetXYForRightIconPlacement_legion_NV( FACETYPE *pFace, UINT16 ubIndex, INT1
*psX = sX;
*psY = sY;
}
-void DoRightIcon_legion_NV( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex )
+
+void DoRightIcon_legion_NV( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex, BOOLEAN isIMP )
{
INT16 sIconX, sIconY;
- GetXYForRightIconPlacement_legion_NV( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons );
- BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_NV, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ GetXYForRightIconPlacement_legion_NV( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, isIMP );
+
+ if (isIMP)
+ BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_NV_IMP, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ else
+ BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_NV, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
}
-void GetXYForRightIconPlacement_legion_GAS_MASK( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons )
+void GetXYForRightIconPlacement_legion_GAS_MASK( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons, BOOLEAN isIMP )
{
INT16 sX, sY;
UINT16 usWidth, usHeight;
@@ -1210,7 +1289,11 @@ void GetXYForRightIconPlacement_legion_GAS_MASK( FACETYPE *pFace, UINT16 ubIndex
HVOBJECT hVObject;
// Get height, width of icon...
- GetVideoObject( &hVObject, guiPORTRAITICONS_GAS_MASK );
+ if (isIMP)
+ GetVideoObject( &hVObject, guiPORTRAITICONS_GAS_MASK_IMP );
+ else
+ GetVideoObject( &hVObject, guiPORTRAITICONS_GAS_MASK );
+
pTrav = &(hVObject->pETRLEObject[ ubIndex ] );
usHeight = pTrav->usHeight;
usWidth = pTrav->usWidth;
@@ -1221,16 +1304,61 @@ void GetXYForRightIconPlacement_legion_GAS_MASK( FACETYPE *pFace, UINT16 ubIndex
*psX = sX;
*psY = sY;
}
-void DoRightIcon_legion_GAS_MASK( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex )
+void DoRightIcon_legion_GAS_MASK( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex, BOOLEAN isIMP )
{
INT16 sIconX, sIconY;
// Find X, y for placement
+ GetXYForRightIconPlacement_legion_GAS_MASK( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, isIMP );
- GetXYForRightIconPlacement_legion_GAS_MASK( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons );
- BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_GAS_MASK, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ if (isIMP)
+ BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_GAS_MASK_IMP, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ else
+ BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS_GAS_MASK, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
}
+*/
+void GetXYForRightIconPlacement_FaceGera( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons , UINT32 uIDFaceGear, BOOLEAN isIMP)
+{
+ INT16 sX, sY;
+ UINT16 usWidth, usHeight;
+ ETRLEObject *pTrav;
+ HVOBJECT hVObject;
+
+ // Get height, width of icon...
+ if (isIMP)
+ GetVideoObject( &hVObject, zNewFaceGearIMP[uIDFaceGear].uiIndex );
+ else
+ GetVideoObject( &hVObject, zNewFaceGear[uIDFaceGear].uiIndex );
+
+ pTrav = &(hVObject->pETRLEObject[ ubIndex ] );
+ usHeight = pTrav->usHeight;
+ usWidth = pTrav->usWidth;
+
+ sX = sFaceX + ( usWidth * bNumIcons ) + 1;
+ sY = sFaceY + pFace->usFaceHeight - usHeight - 1;
+
+ *psX = sX;
+ *psY = sY;
+}
+
+void DoRightIcon_FaceGear( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex , UINT32 uIDFaceGear, BOOLEAN isIMP)
+{
+ INT16 sIconX, sIconY;
+
+ // Find X, y for placement
+
+ if (isIMP)
+ {
+ GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP);
+ BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGearIMP[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+ else
+ {
+ GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP);
+ BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGear[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+}
//----------------------------------------------------------------
@@ -1315,6 +1443,9 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
UINT32 uiFaceItemOne=0;
UINT32 uiFaceItemTwo=0;
UINT8 ubFaceItemsCombined=0;
+
+ UINT32 uiFaceOne=0;
+ UINT32 uiFaceTwo=0;
// If we are using an extern buffer...
if ( fUseExternBuffer )
@@ -1478,10 +1609,21 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
//------------------------------------Legion 2 by jazz--------------------------------
+
+ UINT8 faceProfileId = MercPtrs[ pFace->ubSoldierID ]->ubProfile;
+ BOOLEAN isIMP = FALSE;
+
+ //IMP
+ if ( gProfilesIMP[ MercPtrs[ pFace->ubSoldierID ]->ubProfile ].ProfilId == MercPtrs[ pFace->ubSoldierID ]->ubProfile )
+ {
+ faceProfileId = gMercProfiles[MercPtrs[ pFace->ubSoldierID ]->ubProfile].ubFaceIndex;
+ isIMP = TRUE;
+ }
+
// rewritten by silversurfer
// this section chooses the icons for face gear if the ini setting "SHOW_TACTICAL_FACE_ICONS" is TRUE
// and the merc actually wears something to be shown
- if (gGameExternalOptions.fShowTacticalFaceIcons == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_ICONS ] == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
( MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem + MercPtrs[ pFace->ubSoldierID ]->inv[HEAD2POS].usItem ) > 0 )
{
uiFaceItemOne=MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem;
@@ -1621,20 +1763,77 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
}
}
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_GEAR ] == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
+ ( MercPtrs[ pFace->ubSoldierID ]->inv[HELMETPOS].usItem > 0 ) )
+ {
+
+ uiFaceItemOne=MercPtrs[ pFace->ubSoldierID ]->inv[HELMETPOS].usItem;
+
+ if ( uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 1 ) //back
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceItemOne, isIMP);
+ }
+ }
+
// this section chooses the pictures for gas mask and NV goggles if the ini setting "SHOW_TACTICAL_FACE_GEAR" is TRUE
// and the merc actually wears something to be shown
- if (gGameExternalOptions.fShowTacticalFaceGear == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
- ( MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem + MercPtrs[ pFace->ubSoldierID ]->inv[HEAD2POS].usItem ) > 0 &&
- // dirty hack for IMPs because they don't have pictures for face gear
- ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 ))
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_GEAR ] == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
+ ( MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem + MercPtrs[ pFace->ubSoldierID ]->inv[HEAD2POS].usItem ) > 0 )
{
+
+ /*
+ BOOLEAN isIMP = FALSE;
+ UINT8 faceProfileId = MercPtrs[ pFace->ubSoldierID ]->ubProfile;
+
+ // WANNE: IMP: Special handling for face gear
+ if (MercPtrs[ pFace->ubSoldierID ]->ubProfile >= 51 && MercPtrs[ pFace->ubSoldierID ]->ubProfile <= 56)
+ {
+ // IMP: Imps anhand des FaceIndex rausfinden!!
+ faceProfileId = gMercProfiles[MercPtrs[ pFace->ubSoldierID ]->ubProfile].ubFaceIndex;
+ isIMP = TRUE;
+ }
+ */
+
// WANNE: Removed the limitation
// silversurfer: don't overwrite icons if they shall be shown!
- //if ( !gGameExternalOptions.fShowTacticalFaceIcons )
+ //if ( !gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] )
{
+
uiFaceItemOne=MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem;
uiFaceItemTwo=MercPtrs[ pFace->ubSoldierID ]->inv[HEAD2POS].usItem;
-
+
+ uiFaceOne=MercPtrs[ pFace->ubSoldierID ]->inv[HEAD1POS].usItem;
+ uiFaceTwo=MercPtrs[ pFace->ubSoldierID ]->inv[HEAD2POS].usItem;
+
+ // check first face slot
+ if ( uiFaceItemOne != NONE )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 3 )
+ {
+ uiFaceItemOne = 1;
+ }
+ else if ( zNewFaceGear[uiFaceOne].Type == 4 )
+ {
+ uiFaceItemOne = 2;
+ }
+ else uiFaceItemOne = 0;
+ }
+
+ // check second face slot
+ if ( uiFaceItemTwo != NONE )
+ {
+ if ( zNewFaceGear[uiFaceTwo].Type == 3 )
+ {
+ uiFaceItemTwo = 21;
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 4 )
+ {
+ uiFaceItemTwo = 42;
+ }
+ else uiFaceItemTwo = 0;
+ }
+
+ /*
// check first face slot
if ( uiFaceItemOne != NONE )
{
@@ -1678,7 +1877,8 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
break;
}
}
-
+ */
+
// Now select the correct picture. This uses a matrix from uiFaceOneItem and uiFaceTwoItem (simple addition)
// the numbers on the outer border are used if that is the only item worn in that slot
//
@@ -1698,12 +1898,102 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// silversurfer: we don't want to display icons for gas mask or NV goggles because you can actually see the merc wearing the gear
// in case of gas mask together with NV we display the picture of the item in face slot 1 and the icon of the item
// in face slot 2 (if icons are allowed)
+
+ //Type : 3 - gas mask ; 4 - NV googles
+ // gas mask only
+
+
+ if ( ubFaceItemsCombined == 1 || ubFaceItemsCombined == 21 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ // NV goggles only
+ if ( ubFaceItemsCombined == 2 || ubFaceItemsCombined == 42 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 4 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 4 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ // NV goggles + gas mask
+ if ( ubFaceItemsCombined == 23 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 4 && zNewFaceGear[uiFaceTwo].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ }
+
+ // gas mask + NV goggles
+ if ( ubFaceItemsCombined == 43 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 3 && zNewFaceGear[uiFaceTwo].Type == 4 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ // gas mask + extended ear
+ if ( ubFaceItemsCombined == 24 || ubFaceItemsCombined == 64 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ // gas mask + extended ear
+ if ( ubFaceItemsCombined == 25 || ubFaceItemsCombined == 85 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 3 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ // NV goggles + extended ear
+ if ( ubFaceItemsCombined == 46 || ubFaceItemsCombined == 86 )
+ {
+ if ( zNewFaceGear[uiFaceOne].Type == 4 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceOne, isIMP);
+ }
+ else if ( zNewFaceGear[uiFaceTwo].Type == 4 )
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceTwo, isIMP);
+ }
+ }
+
+ /*
switch( ubFaceItemsCombined )
{
// gas mask only
case 1:
case 21:
- DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
//fDoIcon = FALSE;
@@ -1712,7 +2002,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// NV goggles only
case 2:
case 42:
- DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
//fDoIcon = FALSE;
@@ -1720,32 +2010,33 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
break;
// NV goggles + gas mask
case 23:
- DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
+ DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
- /*if ( gGameExternalOptions.fShowTacticalFaceIcons )
- {
- sIconIndex = 9;
- fDoIcon = TRUE;
- }*/
+ //if ( gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] )
+ //{
+ // sIconIndex = 9;
+ // fDoIcon = TRUE;
+ //}
break;
// gas mask + NV goggles
case 43:
- DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
-
+ DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
+ DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
- /*if ( gGameExternalOptions.fShowTacticalFaceIcons )
- {
- sIconIndex = 10;
- fDoIcon = TRUE;
- }*/
+ //if ( gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] )
+ //{
+ // sIconIndex = 10;
+ // fDoIcon = TRUE;
+ //}
break;
// gas mask + sun goggles
case 24:
case 64:
- DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
//sIconIndex = 15;
@@ -1755,7 +2046,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// gas mask + extended ear
case 25:
case 85:
- DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_GAS_MASK( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
//sIconIndex = 12;
@@ -1765,7 +2056,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// NV goggles + extended ear
case 46:
case 86:
- DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, MercPtrs[ pFace->ubSoldierID ]->ubProfile );
+ DoRightIcon_legion_NV( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, isIMP );
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
//sIconIndex = 12;
@@ -1775,6 +2066,25 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
default:
break;
}
+ */
+ }
+
+
+
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_GEAR ] == TRUE && MercPtrs[ pFace->ubSoldierID ]->stats.bLife > 0 &&
+ ( MercPtrs[ pFace->ubSoldierID ]->inv[HELMETPOS].usItem > 0 )
+ // dirty hack for IMPs because they don't have pictures for face gear
+ /* && ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 ) */ )
+ {
+ uiFaceItemOne=MercPtrs[ pFace->ubSoldierID ]->inv[HELMETPOS].usItem;
+
+ if ( uiFaceItemOne != NONE )
+ {
+ if ( uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 2 ) //front
+ {
+ DoRightIcon_FaceGear( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId ,uiFaceItemOne, isIMP);
+ }
+ }
}
//------------------------------------end of tactical face gear-----------------------------
diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp
index 3d1f9597..4f61cf2b 100644
--- a/Tactical/Handle Items.cpp
+++ b/Tactical/Handle Items.cpp
@@ -455,7 +455,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
// temporarily set burst to true to calculate action points
pSoldier->bDoBurst = TRUE;
- sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, 0 );
+ sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, pSoldier->aiData.bAimTime );
// reset burst mode to false (which is what it was at originally)
pSoldier->bDoBurst = FALSE;
@@ -545,7 +545,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
misfirePenalty = misfirePenaltyConst + (Chance(misfirePenaltyRand)?1:0); //apply the base integral cost and the fractional cost (in the form of probablilite)
pSoldier->bDoAutofire += misfirePenalty;
- sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, 0 );
+ sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, pSoldier->aiData.bAimTime );
}
while(EnoughPoints( pSoldier, sAPCost, 0, FALSE ) && roll < ((pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire)?chanceToMisfire:chanceToMisfireDry));
//note that we could misfire more bullets than we have rounds
@@ -553,7 +553,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
//the max that can be lost this way is 1AP
pSoldier->bDoAutofire -= misfirePenalty;
- sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, 0 );
+ sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, pSoldier->aiData.bAimTime );
if((__min(pSoldier->bDoAutofire,pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft) - startAuto) > 0 && pSoldier->bTeam == OUR_TEAM)
{
@@ -673,6 +673,8 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
}
else
{
+ //CHRISL: Need to reset this as it doesn't automatically get reset when we don't have enough APs to shot
+ pSoldier->flags.fDoSpread = FALSE;
return( ITEM_HANDLE_NOAPS );
}
@@ -851,7 +853,11 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
}
}
- if ( Item[usHandItem].wirecutters && pTargetSoldier == NULL ) // Madd: quick fix to allow wirecutter/knives
+ ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, pSoldier->pathing.bLevel );
+ BOOLEAN fCorpse = FALSE;
+ if(pCorpse != NULL)
+ fCorpse = IsValidDecapitationCorpse( pCorpse );
+ if ( Item[usHandItem].wirecutters && pTargetSoldier == NULL && !pCorpse ) // Madd: quick fix to allow wirecutter/knives
{
// See if we can get there to stab
sActionGridNo = FindAdjacentGridEx( pSoldier, sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
@@ -1842,6 +1848,12 @@ void SoldierGetItemFromWorld( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT32 sGr
}
else
{
+ //CHRISL: Make sure non-ammo item status is a valid 0-100 number
+ if(Item[gWorldItems[pItemPool->iItemIndex].object.usItem].usItemClass != IC_AMMO){
+ gWorldItems[pItemPool->iItemIndex].object[0]->data.objectStatus = __max(0,gWorldItems[pItemPool->iItemIndex].object[0]->data.objectStatus);
+ gWorldItems[pItemPool->iItemIndex].object[0]->data.objectStatus = __min(100,gWorldItems[pItemPool->iItemIndex].object[0]->data.objectStatus);
+ }
+
// Make copy of item
gTempObject = gWorldItems[ pItemPool->iItemIndex ].object;
@@ -1933,6 +1945,12 @@ void SoldierGetItemFromWorld( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT32 sGr
}
else
{
+ //CHRISL: Make sure non-ammo item status is a valid 0-100 number
+ if(Item[gWorldItems[iItemIndex].object.usItem].usItemClass != IC_AMMO){
+ gWorldItems[iItemIndex].object[0]->data.objectStatus = __max(0,gWorldItems[iItemIndex].object[0]->data.objectStatus);
+ gWorldItems[iItemIndex].object[0]->data.objectStatus = __min(100,gWorldItems[iItemIndex].object[0]->data.objectStatus);
+ }
+
/*
// handle theft.. will return true if theft has failed ( if soldier was caught )
if( pSoldier->bTeam == OUR_TEAM )
diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp
index ed827448..1871c736 100644
--- a/Tactical/Handle UI.cpp
+++ b/Tactical/Handle UI.cpp
@@ -517,28 +517,6 @@ void GetMercOknoDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoUp
}
}
}
-
-void GetMercFenceDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoUp )
-{
- INT8 bNewDirection;
- SOLDIERTYPE *pSoldier;
-
- *pfGoDown = FALSE;
- *pfGoUp = FALSE;
-
- if ( !GetSoldier( &pSoldier, ubSoldierID ) )
- {
- return;
- }
-
- if ( pSoldier->pathing.bLevel == 0 )
- {
- if ( FindHeigherLevelFence( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) )
- {
- *pfGoUp = TRUE;
- }
- }
-}
//----------------------------------------------------------------------------------
@@ -2062,7 +2040,7 @@ UINT32 UIHandleCMoveMerc( UI_EVENT *pUIEvent )
if(!(gTacticalStatus.uiFlags & INCOMBAT) && pSoldier->flags.ZipperFlag)
{
pSoldier->flags.ZipperFlag=FALSE;
- RenderBackpackButtons(0);
+ RenderBackpackButtons(ACTIVATE_BUTTON);
}
}
// FOR REALTIME - DO MOVEMENT BASED ON STANCE!
@@ -5101,7 +5079,7 @@ UINT32 UIHandleTOnTerrain( UI_EVENT *pUIEvent )
gUIDisplayActionPointsOffY = 3;
// Set # of APs
- gsCurrentActionPoints = 6;
+ gsCurrentActionPoints = APBPConstants[AP_TALK];
// Determine if we can afford!
if ( !EnoughPoints( pSoldier, gsCurrentActionPoints, 0, FALSE ) )
diff --git a/Tactical/Handle UI.h b/Tactical/Handle UI.h
index 672158a9..f71f5c46 100644
--- a/Tactical/Handle UI.h
+++ b/Tactical/Handle UI.h
@@ -369,9 +369,5 @@ void GetGridNoScreenXY( INT32 sGridNo, INT16 *pScreenX, INT16 *pScreenY );
//Legion by Jazz
void GetMercOknoDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoUp );
-void GetMercFenceDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoUp );
-
-// HEADROCK HAM 4: Tells the targeting cursor whether we're adding bullets to autofire, or adding aim click levels.
-extern BOOLEAN fAutofireBulletsMode;
#endif
\ No newline at end of file
diff --git a/Tactical/Interface Dialogue.cpp b/Tactical/Interface Dialogue.cpp
index b52bc05e..d9f950ca 100644
--- a/Tactical/Interface Dialogue.cpp
+++ b/Tactical/Interface Dialogue.cpp
@@ -2986,6 +2986,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
case NPC_ACTION_START_BLOODCAT_QUEST:
StartQuest( QUEST_BLOODCATS, gWorldSectorX, gWorldSectorY );
+ SetFactTrue( FACT_PLAYER_KNOWS_ABOUT_BLOODCAT_LAIR);
break;
case NPC_ACTION_START_MINE:
diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp
index ba05102d..365a9844 100644
--- a/Tactical/Interface Enhanced.cpp
+++ b/Tactical/Interface Enhanced.cpp
@@ -103,6 +103,7 @@ MOUSE_REGION gUDBFasthelpRegions[NUM_UDB_FASTHELP_REGIONS];
extern INV_DESC_STATS gMoneyStats[];
extern INV_DESC_STATS gLBEStats[];
extern INV_ATTACHXY gItemDescAttachmentsXY[];
+extern SOLDIERTYPE *gpItemDescSoldier;
// HEADROCK HAM 4: Declare here so other functions may use it.
void DrawSecondaryStats( OBJECTTYPE * gpItemDescObject );
void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject );
@@ -369,22 +370,28 @@ void InitEDBCoords(OBJECTTYPE * pObject)
// NOTE a skip of Y here - these belong to the "tertiary" column, which is below the "secondary" column, separated by an index and header.
// Right Column, row 7
- gItemDescGenRegions[19][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[19][0].sTop = 261 + UDBOffsetY; gItemDescGenRegions[19][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[19][0].sBottom = 273 + UDBOffsetY;
- gItemDescGenRegions[19][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[19][1].sTop = 261 + UDBOffsetY; gItemDescGenRegions[19][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[19][1].sBottom = 273 + UDBOffsetY;
- gItemDescGenRegions[19][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[19][2].sTop = 261 + UDBOffsetY; gItemDescGenRegions[19][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[19][2].sBottom = 273 + UDBOffsetY;
- gItemDescGenRegions[19][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[19][3].sTop = 261 + UDBOffsetY; gItemDescGenRegions[19][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[19][3].sBottom = 273 + UDBOffsetY;
+ gItemDescGenRegions[19][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[19][0].sTop = 256 + UDBOffsetY; gItemDescGenRegions[19][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[19][0].sBottom = 268 + UDBOffsetY;
+ gItemDescGenRegions[19][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[19][1].sTop = 256 + UDBOffsetY; gItemDescGenRegions[19][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[19][1].sBottom = 268 + UDBOffsetY;
+ gItemDescGenRegions[19][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[19][2].sTop = 256 + UDBOffsetY; gItemDescGenRegions[19][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[19][2].sBottom = 268 + UDBOffsetY;
+ gItemDescGenRegions[19][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[19][3].sTop = 256 + UDBOffsetY; gItemDescGenRegions[19][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[19][3].sBottom = 268 + UDBOffsetY;
// Right Column, row 8
- gItemDescGenRegions[20][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[20][0].sTop = 274 + UDBOffsetY; gItemDescGenRegions[20][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[20][0].sBottom = 286 + UDBOffsetY;
- gItemDescGenRegions[20][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[20][1].sTop = 274 + UDBOffsetY; gItemDescGenRegions[20][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[20][1].sBottom = 286 + UDBOffsetY;
- gItemDescGenRegions[20][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[20][2].sTop = 274 + UDBOffsetY; gItemDescGenRegions[20][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[20][2].sBottom = 286 + UDBOffsetY;
- gItemDescGenRegions[20][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[20][3].sTop = 274 + UDBOffsetY; gItemDescGenRegions[20][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[20][3].sBottom = 286 + UDBOffsetY;
+ gItemDescGenRegions[20][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[20][0].sTop = 269 + UDBOffsetY; gItemDescGenRegions[20][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[20][0].sBottom = 281 + UDBOffsetY;
+ gItemDescGenRegions[20][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[20][1].sTop = 269 + UDBOffsetY; gItemDescGenRegions[20][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[20][1].sBottom = 281 + UDBOffsetY;
+ gItemDescGenRegions[20][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[20][2].sTop = 269 + UDBOffsetY; gItemDescGenRegions[20][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[20][2].sBottom = 281 + UDBOffsetY;
+ gItemDescGenRegions[20][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[20][3].sTop = 269 + UDBOffsetY; gItemDescGenRegions[20][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[20][3].sBottom = 281 + UDBOffsetY;
// Right Column, row 9
- gItemDescGenRegions[21][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[21][0].sTop = 287 + UDBOffsetY; gItemDescGenRegions[21][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[21][0].sBottom = 299 + UDBOffsetY;
- gItemDescGenRegions[21][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[21][1].sTop = 287 + UDBOffsetY; gItemDescGenRegions[21][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[21][1].sBottom = 299 + UDBOffsetY;
- gItemDescGenRegions[21][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[21][2].sTop = 287 + UDBOffsetY; gItemDescGenRegions[21][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[21][2].sBottom = 299 + UDBOffsetY;
- gItemDescGenRegions[21][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[21][3].sTop = 287 + UDBOffsetY; gItemDescGenRegions[21][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[21][3].sBottom = 299 + UDBOffsetY;
+ gItemDescGenRegions[21][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[21][0].sTop = 282 + UDBOffsetY; gItemDescGenRegions[21][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[21][0].sBottom = 294 + UDBOffsetY;
+ gItemDescGenRegions[21][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[21][1].sTop = 282 + UDBOffsetY; gItemDescGenRegions[21][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[21][1].sBottom = 294 + UDBOffsetY;
+ gItemDescGenRegions[21][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[21][2].sTop = 282 + UDBOffsetY; gItemDescGenRegions[21][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[21][2].sBottom = 294 + UDBOffsetY;
+ gItemDescGenRegions[21][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[21][3].sTop = 282 + UDBOffsetY; gItemDescGenRegions[21][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[21][3].sBottom = 294 + UDBOffsetY;
+
+ // Right Column, row 10
+ gItemDescGenRegions[22][0].sLeft = 130 + UDBOffsetX; gItemDescGenRegions[22][0].sTop = 295 + UDBOffsetY; gItemDescGenRegions[22][0].sRight = 179 + UDBOffsetX; gItemDescGenRegions[22][0].sBottom = 307 + UDBOffsetY;
+ gItemDescGenRegions[22][1].sLeft = 181 + UDBOffsetX; gItemDescGenRegions[22][1].sTop = 295 + UDBOffsetY; gItemDescGenRegions[22][1].sRight = 202 + UDBOffsetX; gItemDescGenRegions[22][1].sBottom = 307 + UDBOffsetY;
+ gItemDescGenRegions[22][2].sLeft = 204 + UDBOffsetX; gItemDescGenRegions[22][2].sTop = 295 + UDBOffsetY; gItemDescGenRegions[22][2].sRight = 223 + UDBOffsetX; gItemDescGenRegions[22][2].sBottom = 307 + UDBOffsetY;
+ gItemDescGenRegions[22][3].sLeft = 225 + UDBOffsetX; gItemDescGenRegions[22][3].sTop = 295 + UDBOffsetY; gItemDescGenRegions[22][3].sRight = 245 + UDBOffsetX; gItemDescGenRegions[22][3].sBottom = 307 + UDBOffsetY;
///////////////////////////////////////////////////////////////////////////////////
// HEADROCK HAM 4: UDB General Page - Secondary Data locations
@@ -574,21 +581,18 @@ void InitEDBCoords(OBJECTTYPE * pObject)
// definition tables.
if (UseNASDesc( pObject ))
{
- // No LBE/MONEY coordinates, since NAS doesn't run with either such item.
- /*
gItemDescLBEBackground[0].sLeft = 320 + gsInvDescX; gItemDescLBEBackground[0].sTop = 8 + gsInvDescY;
- gItemDescLBEBackground[1].sLeft = 3 + gsInvDescX; gItemDescLBEBackground[1].sTop = 137 + gsInvDescY;
+ gItemDescLBEBackground[1].sLeft = 320 + gsInvDescX; gItemDescLBEBackground[1].sTop = 8 + gsInvDescY;
gItemDescLBEBackground[2].sLeft = 320 + gsInvDescX; gItemDescLBEBackground[2].sTop = 8 + gsInvDescY;
gItemDescLBEBackground[3].sLeft = 320 + gsInvDescX; gItemDescLBEBackground[3].sTop = 8 + gsInvDescY;
////////////////// MONEY TEXT COORDINATES
- gMoneyStats[0].sX = 204 + gsInvDescX; gMoneyStats[0].sY = 14 + gsInvDescY; // Money
- gMoneyStats[1].sX = 212 + gsInvDescX; gMoneyStats[1].sY = 24 + gsInvDescY; // Remaining
- gMoneyStats[2].sX = 204 + gsInvDescX; gMoneyStats[2].sY = 41 + gsInvDescY; // Money
- gMoneyStats[3].sX = 212 + gsInvDescX; gMoneyStats[3].sY = 51 + gsInvDescY; // Removing
- gMoneyStats[4].sX = 282 + gsInvDescX; gMoneyStats[4].sY = 24 + gsInvDescY; // AMT remaining
- gMoneyStats[5].sX = 282 + gsInvDescX; gMoneyStats[5].sY = 51 + gsInvDescY; // AMT removing
- */
+ gMoneyStats[0].sX = 266 + gsInvDescX; gMoneyStats[0].sY = 14 + gsInvDescY; // Money
+ gMoneyStats[1].sX = 274 + gsInvDescX; gMoneyStats[1].sY = 24 + gsInvDescY; // Remaining
+ gMoneyStats[2].sX = 266 + gsInvDescX; gMoneyStats[2].sY = 41 + gsInvDescY; // Money
+ gMoneyStats[3].sX = 274 + gsInvDescX; gMoneyStats[3].sY = 51 + gsInvDescY; // Removing
+ gMoneyStats[4].sX = 344 + gsInvDescX; gMoneyStats[4].sY = 24 + gsInvDescY; // AMT remaining
+ gMoneyStats[5].sX = 344 + gsInvDescX; gMoneyStats[5].sY = 51 + gsInvDescY; // AMT removing
//////////////////////////////////////////////////////////////////////
// ODB has exactly four separate regions. Each has 8 sub-regions, which can be
@@ -868,7 +872,68 @@ void InitLBECoords()
}
else
{
- if(UsingEDBSystem() > 0)
+ if(UsingEDBSystem() > 0 && UsingNewAttachmentSystem() == true) // UDB & NAS
+ {
+ gLBEStats[0].sX = 658; gLBEStats[0].sY = 9; gLBEStats[0].sValDx = 0; //Thigh 1
+ gLBEStats[1].sX = 694; gLBEStats[1].sY = 9; gLBEStats[1].sValDx = 0; //Thigh 2
+ gLBEStats[2].sX = 658; gLBEStats[2].sY = 33; gLBEStats[2].sValDx = 0; //Thigh 3
+ gLBEStats[3].sX = 694; gLBEStats[3].sY = 33; gLBEStats[3].sValDx = 0; //Thigh 4
+ gLBEStats[4].sX = 669; gLBEStats[4].sY = 57; gLBEStats[4].sValDx = 0; //Thigh 5
+ gLBEStats[5].sX = 0; gLBEStats[5].sY = 0; gLBEStats[5].sValDx = 0; //Thigh 6
+ gLBEStats[6].sX = 0; gLBEStats[6].sY = 0; gLBEStats[6].sValDx = 0; //Thigh 7
+ gLBEStats[7].sX = 0; gLBEStats[7].sY = 0; gLBEStats[7].sValDx = 0; //Thigh 8
+ gLBEStats[8].sX = 0; gLBEStats[8].sY = 0; gLBEStats[8].sValDx = 0; //Thigh 9
+ gLBEStats[9].sX = 0; gLBEStats[9].sY = 0; gLBEStats[9].sValDx = 0; //Thigh 10
+ gLBEStats[10].sX = 0; gLBEStats[10].sY = 0; gLBEStats[10].sValDx = 0; //Thigh 11
+ gLBEStats[11].sX = 0; gLBEStats[11].sY = 0; gLBEStats[11].sValDx = 0; //Thigh 12
+ gLBEStats[12].sX = 658; gLBEStats[12].sY = 9; gLBEStats[12].sValDx = 0; //Vest 1
+ gLBEStats[13].sX = 694; gLBEStats[13].sY = 9; gLBEStats[13].sValDx = 0; //Vest 2
+ gLBEStats[14].sX = 730; gLBEStats[14].sY = 9; gLBEStats[14].sValDx = 0; //Vest 3
+ gLBEStats[15].sX = 766; gLBEStats[15].sY = 9; gLBEStats[15].sValDx = 0; //Vest 4
+ gLBEStats[17].sX = 658; gLBEStats[17].sY = 33; gLBEStats[17].sValDx = 0; //Vest 6
+ gLBEStats[18].sX = 694; gLBEStats[18].sY = 33; gLBEStats[18].sValDx = 0; //Vest 7
+ gLBEStats[19].sX = 730; gLBEStats[19].sY = 33; gLBEStats[19].sValDx = 0; //Vest 8
+ gLBEStats[20].sX = 766; gLBEStats[20].sY = 33; gLBEStats[20].sValDx = 0; //Vest 9
+ if(iResolution == 2)
+ {
+ gLBEStats[16].sX = 802; gLBEStats[16].sY = 9; gLBEStats[16].sValDx = 0; //Vest 5
+ gLBEStats[21].sX = 802; gLBEStats[21].sY = 33; gLBEStats[21].sValDx = 0; //Vest 10
+ gLBEStats[22].sX = 838; gLBEStats[22].sY = 9; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 838; gLBEStats[23].sY = 33; gLBEStats[23].sValDx = 0; //Vest 12
+ }
+ else
+ {
+ gLBEStats[16].sX = 688; gLBEStats[16].sY = 57; gLBEStats[16].sValDx = 0; //Vest 5
+ gLBEStats[21].sX = 688; gLBEStats[21].sY = 81; gLBEStats[21].sValDx = 0; //Vest 10
+ gLBEStats[22].sX = 724; gLBEStats[22].sY = 57; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 724; gLBEStats[23].sY = 81; gLBEStats[23].sValDx = 0; //Vest 12
+ }
+ gLBEStats[24].sX = 658; gLBEStats[24].sY = 9; gLBEStats[24].sValDx = 0; //CPack 1
+ gLBEStats[25].sX = 694; gLBEStats[25].sY = 9; gLBEStats[25].sValDx = 0; //CPack 2
+ gLBEStats[26].sX = 658; gLBEStats[26].sY = 33; gLBEStats[26].sValDx = 0; //CPack 3
+ gLBEStats[27].sX = 694; gLBEStats[27].sY = 33; gLBEStats[27].sValDx = 0; //CPack 4
+ gLBEStats[28].sX = 730; gLBEStats[28].sY = 9; gLBEStats[28].sValDx = 0; //CPack 5
+ gLBEStats[29].sX = 730; gLBEStats[29].sY = 33; gLBEStats[29].sValDx = 0; //CPack 6
+ gLBEStats[30].sX = 730; gLBEStats[30].sY = 57; gLBEStats[30].sValDx = 0; //CPack 7
+ gLBEStats[31].sX = 0; gLBEStats[31].sY = 0; gLBEStats[31].sValDx = 0; //CPack 8
+ gLBEStats[32].sX = 0; gLBEStats[32].sY = 0; gLBEStats[32].sValDx = 0; //CPack 9
+ gLBEStats[33].sX = 0; gLBEStats[33].sY = 0; gLBEStats[33].sValDx = 0; //CPack 10
+ gLBEStats[34].sX = 0; gLBEStats[34].sY = 0; gLBEStats[34].sValDx = 0; //CPack 11
+ gLBEStats[35].sX = 0; gLBEStats[35].sY = 0; gLBEStats[35].sValDx = 0; //CPack 12
+ gLBEStats[36].sX = 658; gLBEStats[36].sY = 9; gLBEStats[36].sValDx = 0; //BPack 1
+ gLBEStats[37].sX = 658; gLBEStats[37].sY = 33; gLBEStats[37].sValDx = 0; //BPack 2
+ gLBEStats[38].sX = 658; gLBEStats[38].sY = 57; gLBEStats[38].sValDx = 0; //BPack 3
+ gLBEStats[39].sX = 658; gLBEStats[39].sY = 81; gLBEStats[39].sValDx = 0; //BPack 4
+ gLBEStats[40].sX = 694; gLBEStats[40].sY = 9; gLBEStats[40].sValDx = 0; //BPack 5
+ gLBEStats[41].sX = 694; gLBEStats[41].sY = 33; gLBEStats[41].sValDx = 0; //BPack 6
+ gLBEStats[42].sX = 694; gLBEStats[42].sY = 57; gLBEStats[42].sValDx = 0; //BPack 7
+ gLBEStats[43].sX = 694; gLBEStats[43].sY = 81; gLBEStats[43].sValDx = 0; //BPack 8
+ gLBEStats[44].sX = 730; gLBEStats[44].sY = 9; gLBEStats[44].sValDx = 0; //BPack 9
+ gLBEStats[45].sX = 730; gLBEStats[45].sY = 33; gLBEStats[45].sValDx = 0; //BPack 10
+ gLBEStats[46].sX = 730; gLBEStats[46].sY = 57; gLBEStats[46].sValDx = 0; //BPack 11
+ gLBEStats[47].sX = 730; gLBEStats[47].sY = 81; gLBEStats[47].sValDx = 0; //BPack 12
+ }
+ else if(UsingEDBSystem() > 0 && UsingNewAttachmentSystem() == false) // UDB & OAS
{
gLBEStats[0].sX = 597; gLBEStats[0].sY = 9; gLBEStats[0].sValDx = 0; //Thigh 1
gLBEStats[1].sX = 633; gLBEStats[1].sY = 9; gLBEStats[1].sValDx = 0; //Thigh 2
@@ -892,15 +957,23 @@ void InitLBECoords()
gLBEStats[19].sX = 669; gLBEStats[19].sY = 33; gLBEStats[19].sValDx = 0; //Vest 8
gLBEStats[20].sX = 705; gLBEStats[20].sY = 33; gLBEStats[20].sValDx = 0; //Vest 9
gLBEStats[21].sX = 741; gLBEStats[21].sY = 33; gLBEStats[21].sValDx = 0; //Vest 10
- gLBEStats[22].sX = 663; gLBEStats[22].sY = 57; gLBEStats[22].sValDx = 0; //Vest 11
- gLBEStats[23].sX = 663; gLBEStats[23].sY = 81; gLBEStats[23].sValDx = 0; //Vest 12
- gLBEStats[24].sX = 597; gLBEStats[24].sY = 10; gLBEStats[24].sValDx = 0; //CPack 1
- gLBEStats[25].sX = 633; gLBEStats[25].sY = 10; gLBEStats[25].sValDx = 0; //CPack 2
- gLBEStats[26].sX = 597; gLBEStats[26].sY = 34; gLBEStats[26].sValDx = 0; //CPack 3
- gLBEStats[27].sX = 633; gLBEStats[27].sY = 34; gLBEStats[27].sValDx = 0; //CPack 4
- gLBEStats[28].sX = 669; gLBEStats[28].sY = 10; gLBEStats[28].sValDx = 0; //CPack 5
- gLBEStats[29].sX = 669; gLBEStats[29].sY = 34; gLBEStats[29].sValDx = 0; //CPack 6
- gLBEStats[30].sX = 669; gLBEStats[30].sY = 58; gLBEStats[30].sValDx = 0; //CPack 7
+ if(iResolution == 2)
+ {
+ gLBEStats[22].sX = 777; gLBEStats[22].sY = 9; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 777; gLBEStats[23].sY = 33; gLBEStats[23].sValDx = 0; //Vest 12
+ }
+ else
+ {
+ gLBEStats[22].sX = 663; gLBEStats[22].sY = 57; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 663; gLBEStats[23].sY = 81; gLBEStats[23].sValDx = 0; //Vest 12
+ }
+ gLBEStats[24].sX = 597; gLBEStats[24].sY = 9; gLBEStats[24].sValDx = 0; //CPack 1
+ gLBEStats[25].sX = 633; gLBEStats[25].sY = 9; gLBEStats[25].sValDx = 0; //CPack 2
+ gLBEStats[26].sX = 597; gLBEStats[26].sY = 33; gLBEStats[26].sValDx = 0; //CPack 3
+ gLBEStats[27].sX = 633; gLBEStats[27].sY = 33; gLBEStats[27].sValDx = 0; //CPack 4
+ gLBEStats[28].sX = 669; gLBEStats[28].sY = 9; gLBEStats[28].sValDx = 0; //CPack 5
+ gLBEStats[29].sX = 669; gLBEStats[29].sY = 33; gLBEStats[29].sValDx = 0; //CPack 6
+ gLBEStats[30].sX = 669; gLBEStats[30].sY = 57; gLBEStats[30].sValDx = 0; //CPack 7
gLBEStats[31].sX = 0; gLBEStats[31].sY = 0; gLBEStats[31].sValDx = 0; //CPack 8
gLBEStats[32].sX = 0; gLBEStats[32].sY = 0; gLBEStats[32].sValDx = 0; //CPack 9
gLBEStats[33].sX = 0; gLBEStats[33].sY = 0; gLBEStats[33].sValDx = 0; //CPack 10
@@ -919,13 +992,13 @@ void InitLBECoords()
gLBEStats[46].sX = 669; gLBEStats[46].sY = 57; gLBEStats[46].sValDx = 0; //BPack 11
gLBEStats[47].sX = 669; gLBEStats[47].sY = 81; gLBEStats[47].sValDx = 0; //BPack 12
}
- else
+ else if(UsingEDBSystem() == 0 && UsingNewAttachmentSystem() == true) // ODB & NAS
{
- gLBEStats[0].sX = 442; gLBEStats[0].sY = 10; gLBEStats[0].sValDx = 0; //Thigh 1
- gLBEStats[1].sX = 478; gLBEStats[1].sY = 10; gLBEStats[1].sValDx = 0; //Thigh 2
- gLBEStats[2].sX = 442; gLBEStats[2].sY = 34; gLBEStats[2].sValDx = 0; //Thigh 3
- gLBEStats[3].sX = 478; gLBEStats[3].sY = 34; gLBEStats[3].sValDx = 0; //Thigh 4
- gLBEStats[4].sX = 453; gLBEStats[4].sY = 58; gLBEStats[4].sValDx = 0; //Thigh 5
+ gLBEStats[0].sX = 556; gLBEStats[0].sY = 9; gLBEStats[0].sValDx = 0; //Thigh 1
+ gLBEStats[1].sX = 592; gLBEStats[1].sY = 9; gLBEStats[1].sValDx = 0; //Thigh 2
+ gLBEStats[2].sX = 556; gLBEStats[2].sY = 33; gLBEStats[2].sValDx = 0; //Thigh 3
+ gLBEStats[3].sX = 592; gLBEStats[3].sY = 33; gLBEStats[3].sValDx = 0; //Thigh 4
+ gLBEStats[4].sX = 567; gLBEStats[4].sY = 57; gLBEStats[4].sValDx = 0; //Thigh 5
gLBEStats[5].sX = 0; gLBEStats[5].sY = 0; gLBEStats[5].sValDx = 0; //Thigh 6
gLBEStats[6].sX = 0; gLBEStats[6].sY = 0; gLBEStats[6].sValDx = 0; //Thigh 7
gLBEStats[7].sX = 0; gLBEStats[7].sY = 0; gLBEStats[7].sValDx = 0; //Thigh 8
@@ -933,42 +1006,93 @@ void InitLBECoords()
gLBEStats[9].sX = 0; gLBEStats[9].sY = 0; gLBEStats[9].sValDx = 0; //Thigh 10
gLBEStats[10].sX = 0; gLBEStats[10].sY = 0; gLBEStats[10].sValDx = 0; //Thigh 11
gLBEStats[11].sX = 0; gLBEStats[11].sY = 0; gLBEStats[11].sValDx = 0; //Thigh 12
- gLBEStats[12].sX = 125; gLBEStats[12].sY = 139; gLBEStats[12].sValDx = 0; //Vest 1
- gLBEStats[13].sX = 161; gLBEStats[13].sY = 139; gLBEStats[13].sValDx = 0; //Vest 2
- gLBEStats[14].sX = 197; gLBEStats[14].sY = 139; gLBEStats[14].sValDx = 0; //Vest 3
- gLBEStats[15].sX = 233; gLBEStats[15].sY = 139; gLBEStats[15].sValDx = 0; //Vest 4
- gLBEStats[16].sX = 269; gLBEStats[16].sY = 139; gLBEStats[16].sValDx = 0; //Vest 5
- gLBEStats[17].sX = 125; gLBEStats[17].sY = 163; gLBEStats[17].sValDx = 0; //Vest 6
- gLBEStats[18].sX = 161; gLBEStats[18].sY = 163; gLBEStats[18].sValDx = 0; //Vest 7
- gLBEStats[19].sX = 197; gLBEStats[19].sY = 163; gLBEStats[19].sValDx = 0; //Vest 8
- gLBEStats[20].sX = 233; gLBEStats[20].sY = 163; gLBEStats[20].sValDx = 0; //Vest 9
- gLBEStats[21].sX = 269; gLBEStats[21].sY = 163; gLBEStats[21].sValDx = 0; //Vest 10
- gLBEStats[22].sX = 305; gLBEStats[22].sY = 139; gLBEStats[22].sValDx = 0; //Vest 11
- gLBEStats[23].sX = 305; gLBEStats[23].sY = 163; gLBEStats[23].sValDx = 0; //Vest 12
- gLBEStats[24].sX = 442; gLBEStats[24].sY = 10; gLBEStats[24].sValDx = 0; //CPack 1
- gLBEStats[25].sX = 478; gLBEStats[25].sY = 10; gLBEStats[25].sValDx = 0; //CPack 2
- gLBEStats[26].sX = 442; gLBEStats[26].sY = 34; gLBEStats[26].sValDx = 0; //CPack 3
- gLBEStats[27].sX = 478; gLBEStats[27].sY = 34; gLBEStats[27].sValDx = 0; //CPack 4
- gLBEStats[28].sX = 514; gLBEStats[28].sY = 10; gLBEStats[28].sValDx = 0; //CPack 5
- gLBEStats[29].sX = 514; gLBEStats[29].sY = 34; gLBEStats[29].sValDx = 0; //CPack 6
- gLBEStats[30].sX = 514; gLBEStats[30].sY = 58; gLBEStats[30].sValDx = 0; //CPack 7
+ gLBEStats[12].sX = 556; gLBEStats[12].sY = 9; gLBEStats[12].sValDx = 0; //Vest 1
+ gLBEStats[13].sX = 592; gLBEStats[13].sY = 9; gLBEStats[13].sValDx = 0; //Vest 2
+ gLBEStats[14].sX = 628; gLBEStats[14].sY = 9; gLBEStats[14].sValDx = 0; //Vest 3
+ gLBEStats[15].sX = 664; gLBEStats[15].sY = 9; gLBEStats[15].sValDx = 0; //Vest 4
+ gLBEStats[16].sX = 700; gLBEStats[16].sY = 9; gLBEStats[16].sValDx = 0; //Vest 5
+ gLBEStats[17].sX = 556; gLBEStats[17].sY = 33; gLBEStats[17].sValDx = 0; //Vest 6
+ gLBEStats[18].sX = 592; gLBEStats[18].sY = 33; gLBEStats[18].sValDx = 0; //Vest 7
+ gLBEStats[19].sX = 628; gLBEStats[19].sY = 33; gLBEStats[19].sValDx = 0; //Vest 8
+ gLBEStats[20].sX = 664; gLBEStats[20].sY = 33; gLBEStats[20].sValDx = 0; //Vest 9
+ gLBEStats[21].sX = 700; gLBEStats[21].sY = 33; gLBEStats[21].sValDx = 0; //Vest 10
+ gLBEStats[22].sX = 736; gLBEStats[22].sY = 9; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 736; gLBEStats[23].sY = 33; gLBEStats[23].sValDx = 0; //Vest 12
+ gLBEStats[24].sX = 556; gLBEStats[24].sY = 9; gLBEStats[24].sValDx = 0; //CPack 1
+ gLBEStats[25].sX = 592; gLBEStats[25].sY = 9; gLBEStats[25].sValDx = 0; //CPack 2
+ gLBEStats[26].sX = 556; gLBEStats[26].sY = 33; gLBEStats[26].sValDx = 0; //CPack 3
+ gLBEStats[27].sX = 592; gLBEStats[27].sY = 33; gLBEStats[27].sValDx = 0; //CPack 4
+ gLBEStats[28].sX = 628; gLBEStats[28].sY = 9; gLBEStats[28].sValDx = 0; //CPack 5
+ gLBEStats[29].sX = 628; gLBEStats[29].sY = 33; gLBEStats[29].sValDx = 0; //CPack 6
+ gLBEStats[30].sX = 628; gLBEStats[30].sY = 57; gLBEStats[30].sValDx = 0; //CPack 7
gLBEStats[31].sX = 0; gLBEStats[31].sY = 0; gLBEStats[31].sValDx = 0; //CPack 8
gLBEStats[32].sX = 0; gLBEStats[32].sY = 0; gLBEStats[32].sValDx = 0; //CPack 9
gLBEStats[33].sX = 0; gLBEStats[33].sY = 0; gLBEStats[33].sValDx = 0; //CPack 10
gLBEStats[34].sX = 0; gLBEStats[34].sY = 0; gLBEStats[34].sValDx = 0; //CPack 11
gLBEStats[35].sX = 0; gLBEStats[35].sY = 0; gLBEStats[35].sValDx = 0; //CPack 12
- gLBEStats[36].sX = 442; gLBEStats[36].sY = 10; gLBEStats[36].sValDx = 0; //BPack 1
- gLBEStats[37].sX = 442; gLBEStats[37].sY = 34; gLBEStats[37].sValDx = 0; //BPack 2
- gLBEStats[38].sX = 442; gLBEStats[38].sY = 58; gLBEStats[38].sValDx = 0; //BPack 3
- gLBEStats[39].sX = 442; gLBEStats[39].sY = 82; gLBEStats[39].sValDx = 0; //BPack 4
- gLBEStats[40].sX = 478; gLBEStats[40].sY = 10; gLBEStats[40].sValDx = 0; //BPack 5
- gLBEStats[41].sX = 478; gLBEStats[41].sY = 34; gLBEStats[41].sValDx = 0; //BPack 6
- gLBEStats[42].sX = 478; gLBEStats[42].sY = 58; gLBEStats[42].sValDx = 0; //BPack 7
- gLBEStats[43].sX = 478; gLBEStats[43].sY = 82; gLBEStats[43].sValDx = 0; //BPack 8
- gLBEStats[44].sX = 514; gLBEStats[44].sY = 10; gLBEStats[44].sValDx = 0; //BPack 9
- gLBEStats[45].sX = 514; gLBEStats[45].sY = 34; gLBEStats[45].sValDx = 0; //BPack 10
- gLBEStats[46].sX = 514; gLBEStats[46].sY = 58; gLBEStats[46].sValDx = 0; //BPack 11
- gLBEStats[47].sX = 514; gLBEStats[47].sY = 82; gLBEStats[47].sValDx = 0; //BPack 12
+ gLBEStats[36].sX = 556; gLBEStats[36].sY = 9; gLBEStats[36].sValDx = 0; //BPack 1
+ gLBEStats[37].sX = 556; gLBEStats[37].sY = 33; gLBEStats[37].sValDx = 0; //BPack 2
+ gLBEStats[38].sX = 556; gLBEStats[38].sY = 57; gLBEStats[38].sValDx = 0; //BPack 3
+ gLBEStats[39].sX = 556; gLBEStats[39].sY = 81; gLBEStats[39].sValDx = 0; //BPack 4
+ gLBEStats[40].sX = 592; gLBEStats[40].sY = 9; gLBEStats[40].sValDx = 0; //BPack 5
+ gLBEStats[41].sX = 592; gLBEStats[41].sY = 33; gLBEStats[41].sValDx = 0; //BPack 6
+ gLBEStats[42].sX = 592; gLBEStats[42].sY = 57; gLBEStats[42].sValDx = 0; //BPack 7
+ gLBEStats[43].sX = 592; gLBEStats[43].sY = 81; gLBEStats[43].sValDx = 0; //BPack 8
+ gLBEStats[44].sX = 628; gLBEStats[44].sY = 9; gLBEStats[44].sValDx = 0; //BPack 9
+ gLBEStats[45].sX = 628; gLBEStats[45].sY = 33; gLBEStats[45].sValDx = 0; //BPack 10
+ gLBEStats[46].sX = 628; gLBEStats[46].sY = 57; gLBEStats[46].sValDx = 0; //BPack 11
+ gLBEStats[47].sX = 628; gLBEStats[47].sY = 81; gLBEStats[47].sValDx = 0; //BPack 12
+ }
+ else if(UsingEDBSystem() == 0 && UsingNewAttachmentSystem() == false) // ODB & OAS
+ {
+ gLBEStats[0].sX = 446; gLBEStats[0].sY = 9; gLBEStats[0].sValDx = 0; //Thigh 1
+ gLBEStats[1].sX = 482; gLBEStats[1].sY = 9; gLBEStats[1].sValDx = 0; //Thigh 2
+ gLBEStats[2].sX = 446; gLBEStats[2].sY = 33; gLBEStats[2].sValDx = 0; //Thigh 3
+ gLBEStats[3].sX = 482; gLBEStats[3].sY = 33; gLBEStats[3].sValDx = 0; //Thigh 4
+ gLBEStats[4].sX = 457; gLBEStats[4].sY = 57; gLBEStats[4].sValDx = 0; //Thigh 5
+ gLBEStats[5].sX = 0; gLBEStats[5].sY = 0; gLBEStats[5].sValDx = 0; //Thigh 6
+ gLBEStats[6].sX = 0; gLBEStats[6].sY = 0; gLBEStats[6].sValDx = 0; //Thigh 7
+ gLBEStats[7].sX = 0; gLBEStats[7].sY = 0; gLBEStats[7].sValDx = 0; //Thigh 8
+ gLBEStats[8].sX = 0; gLBEStats[8].sY = 0; gLBEStats[8].sValDx = 0; //Thigh 9
+ gLBEStats[9].sX = 0; gLBEStats[9].sY = 0; gLBEStats[9].sValDx = 0; //Thigh 10
+ gLBEStats[10].sX = 0; gLBEStats[10].sY = 0; gLBEStats[10].sValDx = 0; //Thigh 11
+ gLBEStats[11].sX = 0; gLBEStats[11].sY = 0; gLBEStats[11].sValDx = 0; //Thigh 12
+ gLBEStats[12].sX = 445; gLBEStats[12].sY = 9; gLBEStats[12].sValDx = 0; //Vest 1
+ gLBEStats[13].sX = 481; gLBEStats[13].sY = 9; gLBEStats[13].sValDx = 0; //Vest 2
+ gLBEStats[14].sX = 517; gLBEStats[14].sY = 9; gLBEStats[14].sValDx = 0; //Vest 3
+ gLBEStats[15].sX = 553; gLBEStats[15].sY = 9; gLBEStats[15].sValDx = 0; //Vest 4
+ gLBEStats[16].sX = 589; gLBEStats[16].sY = 9; gLBEStats[16].sValDx = 0; //Vest 5
+ gLBEStats[17].sX = 445; gLBEStats[17].sY = 33; gLBEStats[17].sValDx = 0; //Vest 6
+ gLBEStats[18].sX = 481; gLBEStats[18].sY = 33; gLBEStats[18].sValDx = 0; //Vest 7
+ gLBEStats[19].sX = 517; gLBEStats[19].sY = 33; gLBEStats[19].sValDx = 0; //Vest 8
+ gLBEStats[20].sX = 553; gLBEStats[20].sY = 33; gLBEStats[20].sValDx = 0; //Vest 9
+ gLBEStats[21].sX = 589; gLBEStats[21].sY = 33; gLBEStats[21].sValDx = 0; //Vest 10
+ gLBEStats[22].sX = 625; gLBEStats[22].sY = 9; gLBEStats[22].sValDx = 0; //Vest 11
+ gLBEStats[23].sX = 625; gLBEStats[23].sY = 33; gLBEStats[23].sValDx = 0; //Vest 12
+ gLBEStats[24].sX = 446; gLBEStats[24].sY = 9; gLBEStats[24].sValDx = 0; //CPack 1
+ gLBEStats[25].sX = 482; gLBEStats[25].sY = 9; gLBEStats[25].sValDx = 0; //CPack 2
+ gLBEStats[26].sX = 446; gLBEStats[26].sY = 33; gLBEStats[26].sValDx = 0; //CPack 3
+ gLBEStats[27].sX = 482; gLBEStats[27].sY = 33; gLBEStats[27].sValDx = 0; //CPack 4
+ gLBEStats[28].sX = 518; gLBEStats[28].sY = 9; gLBEStats[28].sValDx = 0; //CPack 5
+ gLBEStats[29].sX = 518; gLBEStats[29].sY = 33; gLBEStats[29].sValDx = 0; //CPack 6
+ gLBEStats[30].sX = 518; gLBEStats[30].sY = 57; gLBEStats[30].sValDx = 0; //CPack 7
+ gLBEStats[31].sX = 0; gLBEStats[31].sY = 0; gLBEStats[31].sValDx = 0; //CPack 8
+ gLBEStats[32].sX = 0; gLBEStats[32].sY = 0; gLBEStats[32].sValDx = 0; //CPack 9
+ gLBEStats[33].sX = 0; gLBEStats[33].sY = 0; gLBEStats[33].sValDx = 0; //CPack 10
+ gLBEStats[34].sX = 0; gLBEStats[34].sY = 0; gLBEStats[34].sValDx = 0; //CPack 11
+ gLBEStats[35].sX = 0; gLBEStats[35].sY = 0; gLBEStats[35].sValDx = 0; //CPack 12
+ gLBEStats[36].sX = 446; gLBEStats[36].sY = 9; gLBEStats[36].sValDx = 0; //BPack 1
+ gLBEStats[37].sX = 446; gLBEStats[37].sY = 33; gLBEStats[37].sValDx = 0; //BPack 2
+ gLBEStats[38].sX = 446; gLBEStats[38].sY = 57; gLBEStats[38].sValDx = 0; //BPack 3
+ gLBEStats[39].sX = 446; gLBEStats[39].sY = 81; gLBEStats[39].sValDx = 0; //BPack 4
+ gLBEStats[40].sX = 482; gLBEStats[40].sY = 9; gLBEStats[40].sValDx = 0; //BPack 5
+ gLBEStats[41].sX = 482; gLBEStats[41].sY = 33; gLBEStats[41].sValDx = 0; //BPack 6
+ gLBEStats[42].sX = 482; gLBEStats[42].sY = 57; gLBEStats[42].sValDx = 0; //BPack 7
+ gLBEStats[43].sX = 482; gLBEStats[43].sY = 81; gLBEStats[43].sValDx = 0; //BPack 8
+ gLBEStats[44].sX = 518; gLBEStats[44].sY = 9; gLBEStats[44].sValDx = 0; //BPack 9
+ gLBEStats[45].sX = 518; gLBEStats[45].sY = 33; gLBEStats[45].sValDx = 0; //BPack 10
+ gLBEStats[46].sX = 518; gLBEStats[46].sY = 57; gLBEStats[46].sValDx = 0; //BPack 11
+ gLBEStats[47].sX = 518; gLBEStats[47].sY = 81; gLBEStats[47].sValDx = 0; //BPack 12
}
}
}
@@ -1360,7 +1484,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
}
///////////////// BURST/AUTOFIRE DATA - ICONS
- for (cnt = 19; cnt < 22; cnt++)
+ for (cnt = 19; cnt < 23; cnt++)
{
MSYS_DefineRegion( &gUDBFasthelpRegions[ iRegionsCreated ],
(INT16)(gItemDescGenRegions[cnt][0].sLeft),
@@ -1495,8 +1619,10 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + 19 ] );
}
}
- else /////////////////// BIPOD
+ else /////////////////// BIPOD & BURST PENALTY
{
+ if( GetBurstPenalty(gpItemDescObject) > 0 )
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + 18 ] );
if( GetBipodBonus(gpItemDescObject) > 0 )
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + 19 ] );
}
@@ -1506,6 +1632,10 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
{
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + 20 ] );
}
+
+ /////////////////// AUTOFIRE PENALTY
+ if( UsingNewCTHSystem() == false && GetAutoPenalty(gpItemDescObject) > 0 )
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + 21 ] );
}
}
@@ -2365,6 +2495,59 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
cnt++;
}
+ ///////////////////// AIM BONUS MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ if ( GetAimBonus( gpItemDescObject, 100, 1 ) != 0 )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ if( UsingNewCTHSystem() == false )
+ {
+ swprintf( pStr, L"%s", szUDBAdvStatsTooltipText[ 46 ]);
+ }
+ else if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_WEAPON|IC_PUNCH))
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 46 ], szUDBAdvStatsExplanationsTooltipTextForWeapons[ 46 ]);
+ }
+ else
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 46 ], szUDBAdvStatsExplanationsTooltipText[ 46 ]);
+ }
+ SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr );
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] );
+ }
+ cnt++;
+ }
+ }
+
+ ///////////////////// TO-HIT MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ if ( GetToHitBonus( gpItemDescObject, 100, 1, FALSE ) != 0
+ || GetToHitBonus( gpItemDescObject, 100, 1, TRUE ) != 0 )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ if( UsingNewCTHSystem() == false )
+ {
+ swprintf( pStr, L"%s", szUDBAdvStatsTooltipText[ 47 ]);
+ }
+ else if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_WEAPON|IC_PUNCH))
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 47 ], szUDBAdvStatsExplanationsTooltipTextForWeapons[ 47 ]);
+ }
+ else
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 47 ], szUDBAdvStatsExplanationsTooltipText[ 47 ]);
+ }
+ SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr );
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] );
+ }
+ cnt++;
+ }
+ }
+
///////////////////// CTH CAP MODIFIER
if (GetPercentCapModifier( gpItemDescObject, ANIM_STAND ) != 0
|| GetPercentCapModifier( gpItemDescObject, ANIM_CROUCH ) != 0
@@ -2627,7 +2810,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
|| GetCounterForceMaxModifier( gpItemDescObject, ANIM_CROUCH ) != 0
|| GetCounterForceMaxModifier( gpItemDescObject, ANIM_PRONE ) != 0 ) )
{
- if( UsingNewCTHSystem() == true )
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
@@ -3247,6 +3430,54 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
cnt++;
}
+ ///////////////////// MAX COUNTER FORCE
+ if ((CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ) != 0
+ || CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH ) != 0
+ || CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE ) != 0 ) )
+ {
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_WEAPON|IC_PUNCH))
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 44 ], szUDBAdvStatsExplanationsTooltipTextForWeapons[ 44 ]);
+ }
+ else
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 44 ], szUDBAdvStatsExplanationsTooltipText[ 44 ]);
+ }
+ SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr );
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] );
+ }
+ cnt++;
+ }
+ }
+
+ ///////////////////// COUNTER FORCE FREQUENCY
+ if ((GetCounterForceMaxModifier( gpItemDescObject, ANIM_STAND ) != 0
+ || GetCounterForceMaxModifier( gpItemDescObject, ANIM_CROUCH ) != 0
+ || GetCounterForceMaxModifier( gpItemDescObject, ANIM_PRONE ) != 0 ) )
+ {
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_WEAPON|IC_PUNCH))
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 45 ], szUDBAdvStatsExplanationsTooltipTextForWeapons[ 45 ]);
+ }
+ else
+ {
+ swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 45 ], szUDBAdvStatsExplanationsTooltipText[ 45 ]);
+ }
+ SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr );
+ MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] );
+ }
+ cnt++;
+ }
+ }
+
gubDescBoxTotalAdvLines = (UINT8)cnt;
}
}
@@ -3473,8 +3704,12 @@ void DrawWeaponStats( OBJECTTYPE * gpItemDescObject )
}
}
- else ///////////////// BIPOD
+ else ///////////////// BIPOD & BURST PENALTY
{
+ if( GetBurstPenalty(gpItemDescObject) > 0 )
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoWeaponIcon, 30, gItemDescGenRegions[19][0].sLeft+sOffsetX, gItemDescGenRegions[19][0].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
if( GetBipodBonus(gpItemDescObject) > 0)
{
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoWeaponIcon, 16, gItemDescGenRegions[20][0].sLeft+sOffsetX, gItemDescGenRegions[20][0].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
@@ -3487,6 +3722,12 @@ void DrawWeaponStats( OBJECTTYPE * gpItemDescObject )
{
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoWeaponIcon, 7, gItemDescGenRegions[21][0].sLeft+sOffsetX, gItemDescGenRegions[21][0].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
}
+
+ ///////////////// AUTOFIRE PENALTY
+ if( UsingNewCTHSystem() == false && GetAutoPenalty(gpItemDescObject) > 0 )
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoWeaponIcon, 29, gItemDescGenRegions[22][0].sLeft+sOffsetX, gItemDescGenRegions[22][0].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
}
else if(gubDescBoxPage == 2)
{
@@ -3797,6 +4038,33 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject )
cnt++;
}
+ ///////////////////// AIM BONUS MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ if ( GetAimBonus( gpItemDescObject, 100, 1 ) != 0 )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 1, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+ cnt++;
+ }
+ }
+
+ ///////////////////// TO-HIT MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ if ( GetToHitBonus( gpItemDescObject, 100, 1, FALSE ) != 0
+ || GetToHitBonus( gpItemDescObject, 100, 1, TRUE ) != 0 )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 6, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+ cnt++;
+ }
+ }
+
///////////////////// CTH CAP MODIFIER
if (GetPercentCapModifier( gpItemDescObject, ANIM_STAND ) != 0
|| GetPercentCapModifier( gpItemDescObject, ANIM_CROUCH ) != 0
@@ -3947,7 +4215,7 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject )
|| GetCounterForceMaxModifier( gpItemDescObject, ANIM_CROUCH ) != 0
|| GetCounterForceMaxModifier( gpItemDescObject, ANIM_PRONE ) != 0 )
{
- if( UsingNewCTHSystem() == true )
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
@@ -4227,6 +4495,34 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject )
}
cnt++;
}
+
+ ///////////////////// MAX COUNTER FORCE
+ if (CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ) != 0
+ || CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH ) != 0
+ || CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE ) != 0 )
+ {
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 17, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+ cnt++;
+ }
+ }
+
+ ///////////////////// COUNTER FORCE FREQUENCY
+ if (CalcCounterForceFrequency( gpItemDescSoldier, gpItemDescObject ) != 0 )
+ {
+ if( UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 19, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
+ }
+ cnt++;
+ }
+ }
}
void DrawMiscStats( OBJECTTYPE * gpItemDescObject )
@@ -4747,10 +5043,11 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject )
sHeight = gItemDescGenRegions[ubNumLine][1].sBottom - sTop;
// Get Final Aiming Levels
- UINT16 iFinalAimLevelsValue = GetAllowedAimingLevelsForItem( gpItemDescObject, ANIM_STAND );
+ UINT16 iFinalAimLevelsValue = GetAllowedAimingLevelsForItem( gpItemDescSoldier, gpItemDescObject, ANIM_STAND );
// Get modifier
INT16 iAimLevelsModifier = GetAimLevelsModifier( gpItemDescObject, ANIM_STAND );
+ iAimLevelsModifier += GetAimLevelsTraitModifier( gpItemDescSoldier, gpItemDescObject );
// Get Base Value
UINT16 iAimLevelsValue = iFinalAimLevelsValue - iAimLevelsModifier;
@@ -5712,7 +6009,7 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject )
INT8 iFinalRecoilY = 0;
// Get final Recoil
- GetRecoil( gpItemDescObject, &iFinalRecoilX, &iFinalRecoilY, 2 );
+ GetRecoil( gpItemDescSoldier, gpItemDescObject, &iFinalRecoilX, &iFinalRecoilY, 3 );
// Get base Recoil
INT8 iRecoilX = Weapon[ gpItemDescObject->usItem ].bRecoilX;
@@ -5836,8 +6133,94 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject )
SetFontForeground( 6 );
}
}
- else ///////////////// BIPOD
+ else ///////////////// BIPOD & BURST PENALTY
{
+ if( GetBurstPenalty(gpItemDescObject) > 0 )
+ {
+ // Set line to draw into
+ ubNumLine = 19;
+ // Set Y coordinates
+ sTop = gItemDescGenRegions[ubNumLine][1].sTop;
+ sHeight = gItemDescGenRegions[ubNumLine][1].sBottom - sTop;
+
+ // Get base Burst Penalty value
+ INT16 iBurstValue = Weapon[gpItemDescObject->usItem].ubBurstPenalty * (gGameExternalOptions.bAimedBurstEnabled?gGameExternalOptions.uAimedBurstPenalty:1);
+
+ // Get final Burst Penalty value
+ INT16 iFinalBurstValue;
+ if(gGameExternalOptions.ubFlatAFTHBtoPrecentMultiplier)
+ {
+ iFinalBurstValue = GetBurstToHitBonus(gpItemDescObject) * gGameExternalOptions.ubFlatAFTHBtoPrecentMultiplier;
+ iFinalBurstValue = max(0, (iBurstValue * (100 - iFinalBurstValue))/100 );
+ }
+ else
+ {
+ iFinalBurstValue = GetBurstPenalty(gpItemDescObject);
+ if(gGameExternalOptions.bAimedBurstEnabled)
+ iFinalBurstValue += Weapon[gpItemDescObject->usItem].ubBurstPenalty * gGameExternalOptions.uAimedBurstPenalty;
+ }
+
+ // Get Burst Penalty modifier
+ INT16 iBurstModifier = iFinalBurstValue - iBurstValue;
+
+ // Print base value
+ SetFontForeground( 5 );
+ sLeft = gItemDescGenRegions[ubNumLine][1].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][1].sRight - sLeft;
+ if (iBurstValue < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"=%d", abs(iBurstValue) );
+ }
+ else if ( iBurstValue > 0 )
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"-%d", abs(iBurstValue) );
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ }
+
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+
+ // Print modifier
+ SetFontForeground( 5 );
+ if (iBurstModifier < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ }
+ else if ( iBurstModifier > 0 )
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ }
+ // Add positive/negative sign
+ if ( iBurstModifier > 0 )
+ {
+ swprintf( pStr, L"-%d", abs(iBurstModifier) );
+ }
+ else if ( iBurstModifier < 0 )
+ {
+ swprintf( pStr, L"+%d", abs(iBurstModifier) );
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ }
+ sLeft = gItemDescGenRegions[ubNumLine][2].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][2].sRight - sLeft;
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+
+ // Print final value
+ SetFontForeground( FONT_MCOLOR_WHITE );
+ sLeft = gItemDescGenRegions[ubNumLine][3].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][3].sRight - sLeft;
+ swprintf( pStr, L"%d", iFinalBurstValue );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+ }
if( GetBipodBonus(gpItemDescObject) > 0)
{
// Set line to draw into
@@ -5958,6 +6341,95 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject )
SetFontForeground( 6 );
}
+
+ /////////////////// AUTOFIRE PENALTY
+ if( UsingNewCTHSystem() == false && GetAutoPenalty(gpItemDescObject) > 0 )
+ {
+ // Set line to draw into
+ ubNumLine = 22;
+ // Set Y coordinates
+ sTop = gItemDescGenRegions[ubNumLine][1].sTop;
+ sHeight = gItemDescGenRegions[ubNumLine][1].sBottom - sTop;
+
+ // Get base Auto Penalty value
+ INT16 iAutoValue = Weapon[gpItemDescObject->usItem].AutoPenalty * (gGameExternalOptions.bAimedBurstEnabled?gGameExternalOptions.uAimedBurstPenalty:1);
+
+ // Get final Auto Penalty value
+ INT16 iFinalAutoValue;
+ if(gGameExternalOptions.ubFlatAFTHBtoPrecentMultiplier)
+ {
+ iFinalAutoValue = GetAutoToHitBonus(gpItemDescObject) * gGameExternalOptions.ubFlatAFTHBtoPrecentMultiplier;
+ iFinalAutoValue = max(0, (iAutoValue * (100 - iFinalAutoValue))/100 );
+ }
+ else
+ {
+ iFinalAutoValue = GetAutoPenalty(gpItemDescObject);
+ if(gGameExternalOptions.bAimedBurstEnabled)
+ iFinalAutoValue += Weapon[gpItemDescObject->usItem].ubBurstPenalty * gGameExternalOptions.uAimedBurstPenalty;
+ }
+
+ // Get Auto Penalty modifier
+ INT16 iAutoModifier = iFinalAutoValue - iAutoValue;
+
+ // Print base value
+ SetFontForeground( 5 );
+ sLeft = gItemDescGenRegions[ubNumLine][1].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][1].sRight - sLeft;
+ if (iAutoValue < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"+%d", abs(iAutoValue) );
+ }
+ else if ( iAutoValue > 0 )
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"-%d", abs(iAutoValue) );
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ }
+
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+
+ // Print modifier
+ SetFontForeground( 5 );
+ if (iAutoModifier < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ }
+ else if ( iAutoModifier > 0 )
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ }
+ // Add positive/negative sign
+ if ( iAutoModifier > 0 )
+ {
+ swprintf( pStr, L"-%d", abs(iAutoModifier) );
+ }
+ else if ( iAutoModifier < 0 )
+ {
+ swprintf( pStr, L"+%d", abs(iAutoModifier) );
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ }
+ sLeft = gItemDescGenRegions[ubNumLine][2].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][2].sRight - sLeft;
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+
+ // Print final value
+ SetFontForeground( FONT_MCOLOR_WHITE );
+ sLeft = gItemDescGenRegions[ubNumLine][3].sLeft;
+ sWidth = gItemDescGenRegions[ubNumLine][3].sRight - sLeft;
+ swprintf( pStr, L"%d", iFinalAutoValue );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ mprintf( usX, usY, pStr );
+ }
+
}
if (gubDescBoxPage == 2)
{
@@ -7109,6 +7581,122 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
cnt++;
}
+ ///////////////////// AIM BONUS MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ iModifier[0] = GetAimBonus( gpItemDescObject, 100, 1 );
+ iModifier[1] = 0;
+ iModifier[2] = 0;
+ if (iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0)
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ // Set Y coordinates
+ sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop;
+ sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop;
+
+ // Print Values
+ for (UINT8 cnt2 = 0; cnt2 < 3; cnt2++)
+ {
+ if (UsingNewCTHSystem() == false && cnt2 > 0)
+ break;
+ SetFontForeground( 5 );
+ sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
+ sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
+ if (iModifier[cnt2] > 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"+%d", iModifier[cnt2] );
+ wcscat( pStr, L"%" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ #ifdef CHINESE
+ wcscat( pStr, ChineseSpecString1 );
+ #else
+ wcscat( pStr, L"%" );
+ #endif
+ }
+ else if (iModifier[cnt2] < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"%d", iModifier[cnt2] );
+ wcscat( pStr, L"%" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ #ifdef CHINESE
+ wcscat( pStr, ChineseSpecString1 );
+ #else
+ wcscat( pStr, L"%" );
+ #endif
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ mprintf( usX, usY, pStr );
+ }
+ }
+ cnt++;
+ }
+ }
+
+ ///////////////////// TO-HIT MODIFIER
+ if(UsingNewCTHSystem() == false)
+ {
+ iModifier[0] = GetToHitBonus( gpItemDescObject, 100, 1, FALSE );
+ iModifier[1] = 0;
+ iModifier[2] = GetToHitBonus( gpItemDescObject, 100, 1, TRUE );
+ if (iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0)
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ // Set Y coordinates
+ sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop;
+ sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop;
+
+ // Print Values
+ for (UINT8 cnt2 = 0; cnt2 < 3; cnt2++)
+ {
+ if (UsingNewCTHSystem() == false && cnt2 > 0)
+ break;
+ SetFontForeground( 5 );
+ sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
+ sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
+ if (iModifier[cnt2] > 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"+%d", iModifier[cnt2] );
+ wcscat( pStr, L"%" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ #ifdef CHINESE
+ wcscat( pStr, ChineseSpecString1 );
+ #else
+ wcscat( pStr, L"%" );
+ #endif
+ }
+ else if (iModifier[cnt2] < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"%d", iModifier[cnt2] );
+ wcscat( pStr, L"%" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ #ifdef CHINESE
+ wcscat( pStr, ChineseSpecString1 );
+ #else
+ wcscat( pStr, L"%" );
+ #endif
+ }
+ else
+ {
+ //swprintf( pStr, L"--" );
+ //FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ mprintf( usX, usY, pStr );
+ }
+ }
+ cnt++;
+ }
+ }
+
///////////////////// CTH CAP MODIFIER
iModifier[0] = GetPercentCapModifier( gpItemDescObject, ANIM_STAND );
iModifier[1] = GetPercentCapModifier( gpItemDescObject, ANIM_CROUCH );
@@ -7616,7 +8204,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
iModifier[0] = GetCounterForceMaxModifier( gpItemDescObject, ANIM_STAND );
iModifier[1] = GetCounterForceMaxModifier( gpItemDescObject, ANIM_CROUCH );
iModifier[2] = GetCounterForceMaxModifier( gpItemDescObject, ANIM_PRONE );
- if ((iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0) && UsingNewCTHSystem() == true )
+ if ((iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0) && UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
@@ -7793,13 +8381,13 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
if (iModifier[cnt2] > 0)
{
- SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
swprintf( pStr, L"+%d", iModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
else if (iModifier[cnt2] < 0)
{
- SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
swprintf( pStr, L"%d", iModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
@@ -8941,6 +9529,88 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
}
cnt++;
}
+
+ ///////////////////// MAX COUNTER FORCE
+ iFloatModifier[0] = CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_STAND );
+ iFloatModifier[1] = CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH );
+ iFloatModifier[2] = CalcCounterForceMax( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE );
+ if ((iFloatModifier[0] != 0 || iFloatModifier[1] != 0 || iFloatModifier[2] != 0) && UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ // Set Y coordinates
+ sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop;
+ sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop;
+
+ // Print Values
+ for (UINT8 cnt2 = 0; cnt2 < 3; cnt2++)
+ {
+ SetFontForeground( 5 );
+ sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
+ sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
+ if (iFloatModifier[cnt2] > 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"%3.1f", iFloatModifier[cnt2] );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ else if (iFloatModifier[cnt2] < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"%3.1f", iFloatModifier[cnt2] );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ mprintf( usX, usY, pStr );
+ }
+ }
+ cnt++;
+ }
+
+ ///////////////////// COUNTER FORCE FREQUENCY
+ iModifier[0] = CalcCounterForceFrequency( gpItemDescSoldier, gpItemDescObject );
+ iModifier[1] = iModifier[0];
+ iModifier[2] = iModifier[0];
+ if ((iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0) && UsingNewCTHSystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_GUN )
+ {
+ if (cnt >= sFirstLine && cnt < sLastLine)
+ {
+ // Set Y coordinates
+ sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop;
+ sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop;
+
+ // Print Values
+ for (UINT8 cnt2 = 0; cnt2 < 3; cnt2++)
+ {
+ SetFontForeground( 5 );
+ sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
+ sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
+ if (iModifier[cnt2] > 0)
+ {
+ SetFontForeground( ITEMDESC_FONTPOSITIVE );
+ swprintf( pStr, L"%d", iModifier[cnt2] );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ else if (iModifier[cnt2] < 0)
+ {
+ SetFontForeground( ITEMDESC_FONTNEGATIVE );
+ swprintf( pStr, L"%d", iModifier[cnt2] );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ else
+ {
+ swprintf( pStr, L"--" );
+ FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
+ }
+ mprintf( usX, usY, pStr );
+ }
+ }
+ cnt++;
+ }
}
void DrawMiscValues( OBJECTTYPE * gpItemDescObject )
diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp
index 1bb20252..fff1c91a 100644
--- a/Tactical/Interface Items.cpp
+++ b/Tactical/Interface Items.cpp
@@ -200,7 +200,8 @@ extern int MAP_KEYRING_Y;
//#define MAP_KEYRING_X 217
//#define MAP_KEYRING_Y 271
#define KEYRING_WIDTH 30
-#define KEYRING_HEIGHT 24
+#define KEYRING_HEIGHT 22
+
#define TACTICAL_INVENTORY_KEYRING_GRAPHIC_OFFSET_X 215
//enum used for the money buttons
enum
@@ -240,6 +241,8 @@ BOOLEAN gfBadThrowItemCTGH;
BOOLEAN gfDontChargeAPsToPickup = FALSE;
BOOLEAN gbItemPointerLocateGood = FALSE;
INT32 iItemPosition = 0;
+//CHRISL: Global variable to store stack item for message box system
+UINT8 gbMessageBoxSubObject = 0;
// ITEM DESCRIPTION BOX STUFF
UINT32 guiItemDescBox;
@@ -808,7 +811,9 @@ void GenerateConsString( STR16 zItemCons, OBJECTTYPE * pObject, UINT32 uiPixLimi
BOOLEAN UseNASDesc(OBJECTTYPE *pObject){
if(pObject->exists() == FALSE)
return FALSE;
- return (Item[pObject->usItem].usItemClass != IC_LBEGEAR && Item[pObject->usItem].usItemClass != IC_MONEY && UsingNewAttachmentSystem()==true);
+ if(guiCurrentScreen == MAP_SCREEN && Item[pObject->usItem].usItemClass == IC_LBEGEAR && UsingNewAttachmentSystem()==true)
+ return FALSE; // the map screen can't support NAS and LBEGEAR.
+ return (/*Item[pObject->usItem].usItemClass != IC_LBEGEAR && Item[pObject->usItem].usItemClass != IC_MONEY && */UsingNewAttachmentSystem()==true);
}
//WarmSteel - This function is used to move groups of items with NAS along the Y axe
@@ -895,6 +900,22 @@ void InitInvData(INV_REGIONS &InvData, BOOLEAN fBigPocket, INT16 sBarDx, INT16 s
InvData.sX = sX;
InvData.sY = sY;
}
+
+void ResetInvData()
+{
+ for ( INT32 cnt = 0; cnt < NUM_INV_SLOTS; cnt++ )
+ {
+ // set inventory pocket coordinates from the table passed in
+ gSMInvData[ cnt ].sX = 0;
+ gSMInvData[ cnt ].sY =0;
+ gSMInvData[ cnt ].sWidth =0;
+ gSMInvData[ cnt ].sHeight =0;
+ gSMInvData[ cnt ].sBarDx =0;
+ gSMInvData[ cnt ].sBarDy =0;
+ gSMInvData[ cnt ].fBigPocket =0;
+ }
+}
+
void InitInventoryOld()
{
BODYPOSFINAL = GUNSLINGPOCKPOS;//RESET in initInventory
@@ -903,6 +924,8 @@ void InitInventoryOld()
MEDPOCKFINAL = SMALLPOCK1POS;//RESET in initInventory
SMALLPOCKFINAL = SMALLPOCK9POS;//RESET in initInventory
+ ResetInvData();
+
InitInvData(gSMInvData[HELMETPOS], FALSE, INV_BAR_DX, INV_BAR_DY, HEAD_INV_SLOT_WIDTH, HEAD_INV_SLOT_HEIGHT, 0, 0); // HELMETPOS
InitInvData(gSMInvData[VESTPOS], FALSE, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, 0, 0); // VESTPOS
@@ -932,6 +955,8 @@ void InitInventoryNew()
MEDPOCKFINAL = SMALLPOCK1POS;//RESET in initInventory
SMALLPOCKFINAL = NUM_INV_SLOTS;//RESET in initInventory
+ ResetInvData();
+
if(iResolution == 0){
InitInvData(gSMInvData[0], FALSE, INV_BAR_DX, INV_BAR_DY, HEAD_INV_SLOT_WIDTH, HEAD_INV_SLOT_HEIGHT, 0, 0); // HELMETPOS
InitInvData(gSMInvData[1], FALSE, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, 0, 0); // VESTPOS
@@ -1105,18 +1130,42 @@ BOOLEAN InitInvSlotInterface( INV_REGION_DESC *pRegionDesc , INV_REGION_DESC *pC
// HEADROCK: Readjusted this, for the TACTICAL Enhanced Description Box
if ( guiCurrentScreen == MAP_SCREEN )
{
- gMoneyButtonLoc.x = 174;
- gMoneyButtonLoc.y = 115;
+ if(UsingNewAttachmentSystem() == true)
+ {
+ gMoneyButtonLoc.x = 186;
+ gMoneyButtonLoc.y = 170;
+ }
+ else
+ {
+ gMoneyButtonLoc.x = 174;
+ gMoneyButtonLoc.y = 115;
+ }
}
else if ( UsingEDBSystem() > 0 )
{
- gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (343 + INTERFACE_START_X) : (244 + INTERFACE_START_X);
- gMoneyButtonLoc.y = ( 11 + INV_INTERFACE_START_Y );
+ if(UsingNewAttachmentSystem() == true)
+ {
+ gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (401 + INTERFACE_START_X) : (302 + INTERFACE_START_X);
+ gMoneyButtonLoc.y = ( 64 + INV_INTERFACE_START_Y );
+ }
+ else
+ {
+ gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (343 + INTERFACE_START_X) : (244 + INTERFACE_START_X);
+ gMoneyButtonLoc.y = ( 11 + INV_INTERFACE_START_Y );
+ }
}
else
{
- gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (343 + INTERFACE_START_X) : (388 + INTERFACE_START_X);
- gMoneyButtonLoc.y = ( 11 + INV_INTERFACE_START_Y );
+ if(UsingNewAttachmentSystem() == true)
+ {
+ gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (401 + INTERFACE_START_X) : (302 + INTERFACE_START_X);
+ gMoneyButtonLoc.y = ( 64 + INV_INTERFACE_START_Y );
+ }
+ else
+ {
+ gMoneyButtonLoc.x = ((UsingNewInventorySystem() == false)) ? (343 + INTERFACE_START_X) : (244 + INTERFACE_START_X);
+ gMoneyButtonLoc.y = ( 11 + INV_INTERFACE_START_Y );
+ }
}
// Load all four body type images
@@ -1233,6 +1282,15 @@ void ShutdownKeyRingInterface( void )
return;
}
+void ShutdownInventoryInterface( void )
+{
+ // Add regions for inventory slots
+ for ( INT32 cnt = 0; cnt < NUM_INV_SLOTS; cnt++ )
+ {
+ MSYS_RemoveRegion(&gSMInvRegion[ cnt ]);
+ }
+}
+
void DisableInvRegions( BOOLEAN fDisable )
{
INT32 cnt;
@@ -1255,7 +1313,7 @@ void DisableInvRegions( BOOLEAN fDisable )
MSYS_DisableRegion( &gSM_SELMERCMoneyRegion );
EnableKeyRing( FALSE );
- RenderBackpackButtons(3); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
else
{
@@ -1263,7 +1321,7 @@ void DisableInvRegions( BOOLEAN fDisable )
MSYS_EnableRegion( &gSM_SELMERCMoneyRegion );
EnableKeyRing( TRUE );
- RenderBackpackButtons(2); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ENABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
}
@@ -1576,7 +1634,7 @@ void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLe
// CHRISL: Display pocket capacity if we're holding something in the cursor
if (!gfSMDisableForItems && (UsingNewInventorySystem() == true) && gpItemPointer != NULL)
{
- int itemSlotLimit = ItemSlotLimit(gpItemPointer, sPocket, pSoldier);
+ UINT8 itemSlotLimit = ItemSlotLimit(gpItemPointer, sPocket, pSoldier);
RenderPocketItemCapacity( guiSAVEBUFFER, itemSlotLimit, sPocket, pSoldier, &pSoldier->inv[sPocket], sX, sY );
if(itemSlotLimit == 0 && !CanItemFitInPosition(pSoldier, gpItemPointer, (INT8)sPocket, FALSE)) {
fHatchItOut = TRUE;
@@ -1587,7 +1645,8 @@ void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLe
if(gpItemPointer != NULL)
{
if(!gfSMDisableForItems && !CanItemFitInPosition(pSoldier, gpItemPointer, (INT8)sPocket, FALSE)){
- if(!ValidAttachment(gpItemPointer->usItem, pObject )){
+ if((UsingNewAttachmentSystem()==false && !ValidAttachment(gpItemPointer->usItem, pObject )) ||
+ (UsingNewAttachmentSystem()==true && !ValidItemAttachmentSlot(pObject, gpItemPointer->usItem, FALSE, FALSE))){
fHatchItOut = TRUE;
}
else{
@@ -1852,8 +1911,10 @@ BOOLEAN HandleCompatibleAmmoUIForMapScreen( SOLDIERTYPE *pSoldier, INT32 bInvPos
continue;
}
- if ( ValidAttachment( pObject->usItem, pTestObject ) ||
- ValidAttachment( pTestObject->usItem, pObject ) ||
+ if ( (UsingNewAttachmentSystem()==false && ValidAttachment( pObject->usItem, pTestObject )) ||
+ (UsingNewAttachmentSystem()==false && ValidAttachment( pTestObject->usItem, pObject )) ||
+ (UsingNewAttachmentSystem()==true && ValidItemAttachmentSlot(pTestObject, pObject->usItem, FALSE, FALSE, 0, cnt)) ||
+ (UsingNewAttachmentSystem()==true && ValidItemAttachmentSlot(pObject, pTestObject->usItem, FALSE, FALSE, 0, cnt)) ||
ValidLaunchable( pTestObject->usItem, pObject->usItem ) ||
ValidLaunchable( pObject->usItem, pTestObject->usItem ) )
{
@@ -2085,8 +2146,10 @@ BOOLEAN InternalHandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, OBJECTTYPE *pTest
continue;
}
- if ( ValidAttachment( pObject->usItem, pTestObject ) ||
- ValidAttachment( pTestObject->usItem, pObject ) ||
+ if ( (UsingNewAttachmentSystem()==false && ValidAttachment( pObject->usItem, pTestObject )) ||
+ (UsingNewAttachmentSystem()==false && ValidAttachment( pTestObject->usItem, pObject )) ||
+ (UsingNewAttachmentSystem()==true && ValidItemAttachmentSlot(pTestObject, pObject->usItem, FALSE, FALSE, 0, cnt)) ||
+ (UsingNewAttachmentSystem()==true && ValidItemAttachmentSlot(pObject, pTestObject->usItem, FALSE, FALSE, 0, cnt)) ||
ValidLaunchable( pTestObject->usItem, pObject->usItem ) ||
ValidLaunchable( pObject->usItem, pTestObject->usItem ) )
{
@@ -2403,7 +2466,7 @@ void InitItemInterface( )
}
// CHRISL: Function to display pocket inventory quantity based on object in cursor
-void RenderPocketItemCapacity( UINT32 uiWhichBuffer, UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY )
+void RenderPocketItemCapacity( UINT32 uiWhichBuffer, INT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY )
{
static CHAR16 pStr[ 100 ];
@@ -2443,7 +2506,8 @@ void RenderPocketItemCapacity( UINT32 uiWhichBuffer, UINT8 pCapacity, INT16 bPos
SetFontForeground( FONT_YELLOW );
swprintf( pStr, L"L" );
}
- else if(ValidAttachment(gpItemPointer->usItem, &(pSoldier->inv[bPos]) ))
+ else if((UsingNewAttachmentSystem()==false && ValidAttachment(gpItemPointer->usItem, &(pSoldier->inv[bPos]) )) ||
+ (UsingNewAttachmentSystem()==true && ValidItemAttachmentSlot(&(pSoldier->inv[bPos]), gpItemPointer->usItem, FALSE, FALSE)))
{
SetFontForeground( FONT_YELLOW );
swprintf( pStr, L"A" );
@@ -2941,29 +3005,22 @@ void InitItemDescriptionBoxStartCoords( BOOLEAN fIsEnhanced, BOOLEAN fUsingNAS )
{
UINT8 mode = UsingEDBSystem();
if(fUsingNAS){
- if (guiCurrentItemDescriptionScreen != SHOPKEEPER_SCREEN)
+ if( UsingNewInventorySystem() == true ) // NIV
{
ITEMDESC_START_X = 115;
ITEMDESC_START_Y = (1 + INV_INTERFACE_START_Y);
ITEMDESC_HEIGHT = 195;
- ITEMDESC_WIDTH = 335; // OIV only
- }
- else if( UsingNewInventorySystem() == true ) // ODB/NIV
- {
- ITEMDESC_START_X = 200;//259;
- ITEMDESC_START_Y = (1 + INV_INTERFACE_START_Y);
- ITEMDESC_HEIGHT = guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN ? 193 : 195;
- ITEMDESC_WIDTH = 430; // OIV only
- }
- else // ODB/OIV
+ ITEMDESC_WIDTH = 335;
+}
+ else // OIV
{
ITEMDESC_HEIGHT = 193;
- ITEMDESC_WIDTH = 430; // OIV only
- ITEMDESC_START_X = 214;//214
+ ITEMDESC_WIDTH = 430;
+ ITEMDESC_START_X = 214;
ITEMDESC_START_Y = (1-(ITEMDESC_HEIGHT-INV_INTERFACE_HEIGHT) + INV_INTERFACE_START_Y);
}
- if(UsingNewInventorySystem() == true && guiCurrentScreen == GAME_SCREEN)
+ if(UsingNewInventorySystem() == true && (guiCurrentScreen == GAME_SCREEN || guiCurrentScreen == SHOPKEEPER_SCREEN))
{
if(iResolution == 0)
ITEMDESC_WIDTH = 526;
@@ -2987,7 +3044,7 @@ void InitItemDescriptionBoxStartCoords( BOOLEAN fIsEnhanced, BOOLEAN fUsingNAS )
} else {
if( UsingNewInventorySystem() == true ) // ODB/NIV
{
- if (guiCurrentItemDescriptionScreen != SHOPKEEPER_SCREEN)
+ //if (guiCurrentItemDescriptionScreen != SHOPKEEPER_SCREEN)
{
// HEADROCK HAM 4:
ITEMDESC_START_X = 115;
@@ -2995,13 +3052,13 @@ void InitItemDescriptionBoxStartCoords( BOOLEAN fIsEnhanced, BOOLEAN fUsingNAS )
ITEMDESC_HEIGHT = 195;
ITEMDESC_WIDTH = 335; // OIV only
}
- else
- {
- ITEMDESC_START_X = 259;
- ITEMDESC_START_Y = (1 + INV_INTERFACE_START_Y);
- ITEMDESC_HEIGHT = guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN ? 133 : 195;
- ITEMDESC_WIDTH = 320; // OIV only
- }
+ //else
+ //{
+ // ITEMDESC_START_X = 259;
+ // ITEMDESC_START_Y = (1 + INV_INTERFACE_START_Y);
+ // ITEMDESC_HEIGHT = guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN ? 133 : 195;
+ // ITEMDESC_WIDTH = 320; // OIV only
+ //}
}
else // ODB/OIV
{
@@ -3011,7 +3068,7 @@ void InitItemDescriptionBoxStartCoords( BOOLEAN fIsEnhanced, BOOLEAN fUsingNAS )
ITEMDESC_WIDTH = 320; // OIV only
}
- if(UsingNewInventorySystem() == true && guiCurrentScreen == GAME_SCREEN)
+ if(UsingNewInventorySystem() == true && guiCurrentScreen == GAME_SCREEN || guiCurrentScreen == SHOPKEEPER_SCREEN)
{
if(iResolution == 0)
ITEMDESC_WIDTH = 526;
@@ -3073,7 +3130,7 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
InitItemDescriptionBoxStartCoords( gGameExternalOptions.iEnhancedDescriptionBox, UseNASDesc( pObject ) );
// Set X, Y
- if(guiCurrentScreen == GAME_SCREEN)
+ if(guiCurrentScreen == GAME_SCREEN || (sX == 0 && sY == 0))
{
gsInvDescX = ITEMDESC_START_X; //sX;
gsInvDescY = ITEMDESC_START_Y; //sY;
@@ -3124,6 +3181,8 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
}
else if(guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN)
{
+// MSYS_DefineRegion( &gInvDesc, (UINT16)SM_ITEMDESC_START_X, (UINT16)SM_ITEMDESC_START_Y ,(UINT16)(SM_ITEMDESC_START_X + ITEMDESC_WIDTH), (UINT16)(SM_ITEMDESC_START_Y + ITEMDESC_HEIGHT), MSYS_PRIORITY_HIGHEST,
+// MSYS_NO_CURSOR, MSYS_NO_CALLBACK, ItemDescCallback );
MSYS_DefineRegion( &gInvDesc, (UINT16)gsInvDescX, (UINT16)gsInvDescY ,(UINT16)(gsInvDescX + ITEMDESC_WIDTH), (UINT16)(gsInvDescY + ITEMDESC_HEIGHT), MSYS_PRIORITY_HIGHEST,
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, ItemDescCallback );
MSYS_AddRegion( &gInvDesc);
@@ -3260,11 +3319,7 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
// Load graphic
// HEADROCK: Select STI based on Description Box used:
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
- // HEADROCK HAM 4: No more need for two files. Just use one.
- //if(UsingEDBSystem() > 0)
- strcpy( VObjectDesc.ImageFile, "INTERFACE\\infobox_interface_edb.sti" );
- //else
- // strcpy( VObjectDesc.ImageFile, "INTERFACE\\infobox_interface.sti" );
+ strcpy( VObjectDesc.ImageFile, "INTERFACE\\infobox_interface.sti" );
CHECKF( AddVideoObject( &VObjectDesc, &guiItemDescBox) );
if(ubPosition != 255 && UsingNewInventorySystem() == true)
@@ -3278,21 +3333,9 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
// HEADROCK: Select STI based on Description Box used:
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
- // HEADROCK HAM 4: No more need for two files. Just use the EDB one.
- //if(UsingEDBSystem() > 0)
- strcpy( VObjectDesc.ImageFile, "INTERFACE\\iteminfoc_edb.STI" );
- //else
- // strcpy( VObjectDesc.ImageFile, "INTERFACE\\iteminfoc.STI" );
+ strcpy( VObjectDesc.ImageFile, "INTERFACE\\iteminfoc.STI" );
CHECKF( AddVideoObject( &VObjectDesc, &guiMapItemDescBox) );
- if(UsingNewInventorySystem())
- {
- // HEADROCK HAM 4: LBE backgrounds for desc box
- VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
- strcpy( VObjectDesc.ImageFile, "INTERFACE\\INFOBOX_LBE.STI" );
- CHECKF( AddVideoObject( &VObjectDesc, &guiItemInfoLBEBackground) );
- }
-
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
strcpy( VObjectDesc.ImageFile, "INTERFACE\\bullet.STI" );
CHECKF( AddVideoObject( &VObjectDesc, &guiBullet) );
@@ -3558,7 +3601,7 @@ void UpdateAttachmentTooltips(OBJECTTYPE *pObject, UINT8 ubStatusIndex)
// Contains entire string of attachment names
CHAR16 attachStr[2500];
// Contains current attachment string
- CHAR16 attachStr2[100];
+ CHAR16 attachStr2[200];
// Contains temporary attachment list before added to string constant from text.h
CHAR16 attachStr3[2500];
UINT16 usAttachment;
@@ -3754,12 +3797,33 @@ BOOLEAN ReloadItemDesc( )
return( TRUE );
}
+void RenderBulletIcon(OBJECTTYPE *pObject, UINT32 ubStatusIndex)
+{
+ CHAR16 pStr[10];
+ CHAR8 ubString[48];
+
+ if(pObject->exists() == false)
+ return;
+
+ if(!gfInItemDescBox)
+ return;
+
+ if ( GetMagSize(pObject) <= 99 )
+ swprintf( pStr, L"%d/%d", (*pObject)[ubStatusIndex]->data.gun.ubGunShotsLeft, GetMagSize(pObject));
+ else
+ swprintf( pStr, L"%d", (*pObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
+
+ FilenameForBPP("INTERFACE\\infobox.sti", ubString);
+
+ UnloadButtonImage(giItemDescAmmoButtonImages);
+ giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
+ //swprintf( pStr, L"0" );
+ SpecifyButtonText( giItemDescAmmoButton, pStr );
+}
void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
{
static BOOLEAN fRightDown = FALSE;
- CHAR16 pStr[10];
- CHAR8 ubString[48];
UINT32 ubStatusIndex = MSYS_GetBtnUserData( btn, 1 );
/* region gets disabled in SKI for shopkeeper boxes. It now works normally for merc's inventory boxes!
@@ -3828,7 +3892,8 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
if(AutoPlaceObject(gpItemDescSoldier, &gTempObject, TRUE) == FALSE)
{
// couldn't find a place on the merc, so drop into the sector
- if(fShowMapInventoryPool) //sector inventory panel is open
+ AutoPlaceObjectToWorld(gpItemDescSoldier, &gTempObject);
+ /*if(fShowMapInventoryPool) //sector inventory panel is open
{
AutoPlaceObjectInInventoryStash(&gTempObject, gpItemDescSoldier->sGridNo);
fMapPanelDirty = TRUE;
@@ -3836,7 +3901,7 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
else //sector inventory panel is closed
{
AddItemToPool(gpItemDescSoldier->sGridNo, &gTempObject, 1, gpItemDescSoldier->pathing.bLevel, WORLD_ITEM_REACHABLE, 0);
- }
+ }*/
}
}
}
@@ -3845,17 +3910,7 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
fInterfacePanelDirty = DIRTYLEVEL2;
gpItemPointerSoldier = gpItemDescSoldier;
- if ( GetMagSize(gpItemDescObject) <= 99 )
- swprintf( pStr, L"%d/%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft, GetMagSize(gpItemDescObject));
- else
- swprintf( pStr, L"%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
-
- FilenameForBPP("INTERFACE\\infobox.sti", ubString);
-
- UnloadButtonImage(giItemDescAmmoButtonImages);
- giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
- //swprintf( pStr, L"0" );
- SpecifyButtonText( giItemDescAmmoButton, pStr );
+ RenderBulletIcon(gpItemDescObject, ubStatusIndex);
// Set mouse
if(gpItemPointer->exists() == true)
@@ -3924,17 +3979,7 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
//fItemDescDelete = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
- if ( GetMagSize(gpItemDescObject) <= 99 )
- swprintf( pStr, L"%d/%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft, GetMagSize(gpItemDescObject));
- else
- swprintf( pStr, L"%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
-
- FilenameForBPP("INTERFACE\\infobox.sti", ubString);
-
- UnloadButtonImage(giItemDescAmmoButtonImages);
- giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
- //swprintf( pStr, L"0" );
- SpecifyButtonText( giItemDescAmmoButton, pStr );
+ RenderBulletIcon(gpItemDescObject, ubStatusIndex);
fItemDescDelete = TRUE;
@@ -3999,8 +4044,9 @@ void PermanantAttachmentMessageBoxCallBack( UINT8 ubExitValue )
{
if ( ubExitValue == MSG_BOX_RETURN_YES )
{
- DoAttachment(0, iItemPosition);
+ DoAttachment(gbMessageBoxSubObject, iItemPosition);
}
+ gbMessageBoxSubObject = 0;
// else do nothing
}
@@ -4038,6 +4084,7 @@ void ItemDescAttachmentsCallback( MOUSE_REGION * pRegion, INT32 iReason )
if ( (Item[ gpItemPointer->usItem ].inseparable ) && ValidAttachment( gpItemPointer->usItem, gpItemDescObject ) )
{
iItemPosition = uiItemPos;
+ gbMessageBoxSubObject = (UINT8)ubStatusIndex;
DoScreenIndependantMessageBox( Message[ STR_PERMANENT_ATTACHMENT ], ( UINT8 )MSG_BOX_FLAG_YESNO, PermanantAttachmentMessageBoxCallBack );
return;
}
@@ -4505,7 +4552,9 @@ void RenderItemDescriptionBox( )
sCenX = ITEMDESC_ITEM_X + (INT16)( abs( ITEMDESC_ITEM_WIDTH - (double)usWidth ) / 2 ) - sOffsetX;
sCenY = ITEMDESC_ITEM_Y + (INT16)( abs( ITEMDESC_ITEM_HEIGHT - (double)usHeight ) / 2 )- sOffsetY;
- RenderBackpackButtons(1); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DEACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
+ if(guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN && gGameSettings.fOptions[TOPTION_ENHANCED_DESC_BOX])
+ EnableDisableShopkeeperButtons(guiCurrentItemDescriptionScreen, DEACTIVATE_BUTTON);
if( guiCurrentItemDescriptionScreen == MAP_SCREEN )
BltVideoObjectFromIndex( guiSAVEBUFFER, guiMapItemDescBox, showBox, gsInvDescX, gsInvDescY, VO_BLT_SRCTRANSPARENCY, NULL );
@@ -4558,10 +4607,10 @@ void RenderItemDescriptionBox( )
// CHRISL: This block will display hatching for inactive LBE pockets
// Display LBENODE attached items
- if(UsingNewInventorySystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_LBEGEAR)
- {
- RenderLBENODEItems( gpItemDescObject, gubItemDescStatusIndex );
- }
+// if(UsingNewInventorySystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_LBEGEAR)
+// {
+// RenderLBENODEItems( gpItemDescObject, gubItemDescStatusIndex );
+// }
// HEADROCK HAM 4: First, display LBE Background
if(UsingNewInventorySystem() == true && Item[gpItemDescObject->usItem].usItemClass == IC_LBEGEAR && showLBE >= 0)
@@ -4575,7 +4624,7 @@ void RenderItemDescriptionBox( )
showLBEImage += 8;
// Draw LBE background image
- BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoLBEBackground, showLBEImage, gItemDescLBEBackground[showLBE].sLeft, gItemDescLBEBackground[showLBE].sTop, VO_BLT_SRCTRANSPARENCY, NULL );
+// BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoLBEBackground, showLBEImage, gItemDescLBEBackground[showLBE].sLeft, gItemDescLBEBackground[showLBE].sTop, VO_BLT_SRCTRANSPARENCY, NULL );
// Render LBE items
RenderLBENODEItems( gpItemDescObject, gubItemDescStatusIndex );
}
@@ -5342,7 +5391,7 @@ void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject )
InitInvData(LBEInvPocketXY[1], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[1].sX, usY + gLBEStats[1].sY);
InitInvData(LBEInvPocketXY[2], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[2].sX, usY + gLBEStats[2].sY);
InitInvData(LBEInvPocketXY[3], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[3].sX, usY + gLBEStats[3].sY);
- InitInvData(LBEInvPocketXY[4], FALSE, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[4].sX, usY + gLBEStats[4].sY);
+ InitInvData(LBEInvPocketXY[4], 2 , INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[4].sX, usY + gLBEStats[4].sY);
InitInvData(LBEInvPocketXY[5], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[5].sX, usY + gLBEStats[5].sY);
InitInvData(LBEInvPocketXY[6], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[6].sX, usY + gLBEStats[6].sY);
InitInvData(LBEInvPocketXY[7], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[7].sX, usY + gLBEStats[7].sY);
@@ -5363,8 +5412,8 @@ void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject )
InitInvData(LBEInvPocketXY[7], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[19].sX, usY + gLBEStats[19].sY);
InitInvData(LBEInvPocketXY[8], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[20].sX, usY + gLBEStats[20].sY);
InitInvData(LBEInvPocketXY[9], FALSE, INV_BAR_DX, INV_BAR_DY, SM_INV_SLOT_WIDTH, SM_INV_SLOT_HEIGHT, usX + gLBEStats[21].sX, usY + gLBEStats[21].sY);
- InitInvData(LBEInvPocketXY[10], FALSE, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[22].sX, usY + gLBEStats[22].sY);
- InitInvData(LBEInvPocketXY[11], FALSE, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[23].sX, usY + gLBEStats[23].sY);
+ InitInvData(LBEInvPocketXY[10], 2, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[22].sX, usY + gLBEStats[22].sY);
+ InitInvData(LBEInvPocketXY[11], 2, INV_BAR_DX, INV_BAR_DY, VEST_INV_SLOT_WIDTH, VEST_INV_SLOT_HEIGHT, usX + gLBEStats[23].sX, usY + gLBEStats[23].sY);
break;
case COMBAT_PACK:
GetLBESlots(CPACKPOCKPOS, pocketKey);
@@ -5404,6 +5453,8 @@ void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject )
{
sX = LBEInvPocketXY[cnt].sX;
sY = LBEInvPocketXY[cnt].sY;
+ if(sX != 0 && sY != 0)
+ BltVideoObjectFromIndex( guiSAVEBUFFER, guiAttachmentSlot, LBEInvPocketXY[cnt].fBigPocket, sX-7, sY-1, VO_BLT_SRCTRANSPARENCY, NULL );
lbePocket = LoadBearingEquipment[Item[pObj->usItem].ubClassIndex].lbePocketIndex[icPocket[pocketKey[cnt]]];
pObject = NULL;
if(wornItem == true)
@@ -5532,13 +5583,15 @@ void DeleteItemDescriptionBox( )
//Remove
DeleteVideoObjectFromIndex( guiItemDescBox );
- if(UsingNewInventorySystem() == true && guiItemDescBoxBackground != 0)
+ if(UsingNewInventorySystem() == true && guiItemDescBoxBackground != 0 && !gfInKeyRingPopup)
DeleteVideoObjectFromIndex( guiItemDescBoxBackground );
if(UsingNewInventorySystem() == true && guiItemInfoLBEBackground != 0)
DeleteVideoObjectFromIndex( guiItemInfoLBEBackground );
DeleteVideoObjectFromIndex( guiMapItemDescBox );
DeleteVideoObjectFromIndex( guiAttachmentSlot );
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
+ if(guiCurrentItemDescriptionScreen == SHOPKEEPER_SCREEN && gGameSettings.fOptions[TOPTION_ENHANCED_DESC_BOX])
+ EnableDisableShopkeeperButtons(guiCurrentItemDescriptionScreen, ACTIVATE_BUTTON);
DeleteVideoObjectFromIndex( guiBullet );
DeleteEnhancedDescBox( guiCurrentItemDescriptionScreen );
// Delete item graphic
@@ -6827,7 +6880,7 @@ BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX
static CHAR16 pStr[ 512 ];
- RenderBackpackButtons(1); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DEACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if( guiCurrentScreen == MAP_SCREEN )
{
sItemWidth = MAP_INV_ITEM_ROW_WIDTH;
@@ -7150,7 +7203,7 @@ BOOLEAN InitKeyRingPopup( SOLDIERTYPE *pSoldier, INT16 sInvX, INT16 sInvY, INT16
INT16 sOffSetY = 0, sOffSetX = 0;
INT16 sKeyRingItemWidth = 0;
- RenderBackpackButtons(1); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DEACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if( guiCurrentScreen == MAP_SCREEN )
{
gsKeyRingPopupInvX = 0;
@@ -7602,6 +7655,7 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
UINT32 uiItemPos;
UINT32 iItemCap;
INT32 ubID;
+ CHAR16 sString[ 128 ];
uiItemPos = MSYS_GetRegionUserData( pRegion, 0 );
iItemCap = MSYS_GetRegionUserData( pRegion, 1 );
@@ -7615,6 +7669,22 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN)
{
+ if( ( Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].sSectorX != sSelMapX ) ||
+ ( Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].sSectorY != sSelMapY ) ||
+ ( Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].bSectorZ != iCurrentMapSectorZ ) ||
+ ( Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].flags.fBetweenSectors ) )
+ {
+ if ( gpItemPointer == NULL )
+ {
+ swprintf( sString, pMapInventoryErrorString[ 2 ], Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].name );
+ }
+ else
+ {
+ swprintf( sString, pMapInventoryErrorString[ 5 ], Menptr[ gCharactersList[ bSelectedInfoChar ].usSolID ].name );
+ }
+ DoMapMessageBox( MSG_BOX_BASIC_STYLE, sString, MAP_SCREEN, MSG_BOX_FLAG_OK, NULL );
+ return;
+ }
//If something in our hand, see if it's ammo and if we are trying to reload a gun
if ( gpItemPointer != NULL )
{
@@ -9384,7 +9454,7 @@ void GetHelpTextForItem( STR16 pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldier
case IC_AMMO:
{
// The next is for ammunition which gets the measurement 'rnds'
- swprintf( pStr, L"%s [%d rnds]\n%s %1.1f %s",
+ swprintf( pStr, New113Message[MSG113_AMMO_SPEC_STRING],
ItemNames[ usItem ], //Item long name
(*pObject)[subObject]->data.ubShotsLeft, //Shots left
gWeaponStatsDesc[ 12 ], //Weight String
diff --git a/Tactical/Interface Items.h b/Tactical/Interface Items.h
index 9173c533..221c45c0 100644
--- a/Tactical/Interface Items.h
+++ b/Tactical/Interface Items.h
@@ -208,11 +208,12 @@ BOOLEAN HandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, INT8 bInvPos, BOOLEAN fOn
// - if == 1 will only dirty the name space and then set counter to 0
// Last parameter used mainly for when mouse is over item
+void RenderBulletIcon(OBJECTTYPE *pObject, UINT32 ubStatusIndex = 0);
void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObject, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, UINT8 fDirtyLevel, UINT8 *pubHighlightCounter, UINT8 ubStatusIndex, BOOLEAN fOutline, INT16 sOutlineColor, UINT8 iter = 0 );
// CHRISL: Add a new function that will be used to render a pocket silhouette
void INVRenderSilhouette( UINT32 uiBugger, INT16 PocketIndex, INT16 SilIndex, INT16 sX, INT16 sY, INT16 sWideth, INT16 sHeight);
// CHRISL: New function to handle display of inventory quantities based on item current in cursor
-void RenderPocketItemCapacity( UINT32 uiWhichBuffer, UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY );
+void RenderPocketItemCapacity( UINT32 uiWhichBuffer, INT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY );
// CHRISL: New function to display items stored in an LBENODE
void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject );
// CHRISL: New function to setup GSMInvData based on game options
@@ -257,6 +258,8 @@ void DeleteKeyRingPopup( );
void ShutdownKeyRingInterface( void );
+void ShutdownInventoryInterface( void );
+
BOOLEAN InKeyRingPopup( void );
void BeginKeyRingItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubKeyRingPosition );
diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp
index 4efed5ae..ac462d0c 100644
--- a/Tactical/Interface Panels.cpp
+++ b/Tactical/Interface Panels.cpp
@@ -511,8 +511,8 @@ INT8 gbZipperButPos[2][2] =
};
//Legion by Jazz
-void BtnOknoCallback(GUI_BUTTON *btn,INT32 reason);
-void BtnFenceCallback(GUI_BUTTON *btn,INT32 reason);
+//void BtnOknoCallback(GUI_BUTTON *btn,INT32 reason);
+//void BtnFenceCallback(GUI_BUTTON *btn,INT32 reason);
// Mouse button and region callbacks
//void BtnPositionCallback( GUI_BUTTON *btn, INT32 reason );
@@ -877,7 +877,7 @@ void UpdateSMPanel( )
giSMStealthButton = QuickCreateButton( giSMStealthImages, SM_STEALTHMODE_X, SM_STEALTHMODE_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1,
DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnStealthModeCallback );
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
SetButtonFastHelpText( giSMStealthButton, TacticalStr[ TOGGLE_STEALTH_MODE_POPUPTEXT ] );
@@ -889,7 +889,7 @@ void UpdateSMPanel( )
{
DisableButton( giSMStealthButton );
}
- RenderBackpackButtons(3); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
}
@@ -953,49 +953,10 @@ void UpdateSMPanel( )
}
}
-
DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //DisableButton( iSMPanelButtons[ HOP_BUTTON ] ); //Legion by Jazz
- //}
-
GetMercClimbDirection( gpSMCurrentMerc->ubID, &fNearLowerLevel, &fNearHeigherLevel );
-
-//--------------------- Legion-----------------
-/*
-if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- {
-
- if ( gpSMCurrentMerc->pathing.bLevel == 0 )
- {
- GetMercOknoDirection( gpSMCurrentMerc->ubID, &fNearLowerLevelOkno, &fNearHeigherLevelOkno ); //Legion by JAzz
- if ( fNearLowerLevelOkno || fNearHeigherLevelOkno )
- {
- if ( fNearLowerLevelOkno )
- {
- if ( EnoughPoints( gpSMCurrentMerc, GetAPsToJumpThroughWindows( gpSMCurrentMerc, TRUE ), 0, FALSE ) )
- {
- EnableButton( iSMPanelButtons[ HOP_BUTTON ] );
- }
- }
-
- if ( fNearHeigherLevelOkno )
- {
- if ( EnoughPoints( gpSMCurrentMerc, GetAPsToJumpThroughWindows( gpSMCurrentMerc, FALSE ), 0, FALSE ) )
- {
- EnableButton( iSMPanelButtons[ HOP_BUTTON ] );
- }
- }
- }
- }
- }
-*/
- //---------
-
if ( fNearLowerLevel || fNearHeigherLevel )
{
if ( fNearLowerLevel )
@@ -1014,31 +975,24 @@ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
}
}
}
-
- //----------------------------Legion by Jazz------------------------------
- //DisableButton
- /*
- if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
- {
- if ( FindOknoDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) && gpSMCurrentMerc->pathing.bLevel == 0 )
- {
- EnableButton( iSMPanelButtons[ HOP_BUTTON ] );
- }
- }
- */
- if (gGameExternalOptions.fCanClimbOnWalls == TRUE)
- {
- if ( FindFenceDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
- {
- EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
- }
- }
- //------------------------------------------
+ if (gGameExternalOptions.fCanClimbOnWalls == TRUE)
+ {
+ if ( FindWallJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
+ {
+ if ( EnoughPoints( gpSMCurrentMerc, GetAPsToJumpWall( gpSMCurrentMerc, FALSE ), 0, FALSE ) )
+ {
+ EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
+ }
+ }
+ }
if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
{
- EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
+ if ( EnoughPoints( gpSMCurrentMerc, GetAPsToJumpFence( gpSMCurrentMerc, FALSE ), 0, FALSE ) )
+ {
+ EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
+ }
}
if ( (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || (gTacticalStatus.uiFlags & REALTIME ) || !(gTacticalStatus.uiFlags & INCOMBAT ) )
@@ -1114,11 +1068,6 @@ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
// If not selected ( or dead ), disable/gray some buttons
if ( gusSelectedSoldier != gpSMCurrentMerc->ubID || ( gpSMCurrentMerc->stats.bLife < OKLIFE ) || (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || gfSMDisableForItems )
{
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //DisableButton( iSMPanelButtons[ HOP_BUTTON ] ); //Legion by Jazz
- //}
DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] );
DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] );
@@ -1130,7 +1079,7 @@ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
{
DisableButton( giSMStealthButton );
}
- RenderBackpackButtons(3); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
else
{
@@ -1154,7 +1103,7 @@ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
EnableButton( giSMStealthButton );
}
if(!gfInItemDescBox)
- RenderBackpackButtons(2); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ENABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
// CJC Dec 4 2002: or if item pickup menu is up
@@ -1225,6 +1174,9 @@ void RenderBackpackButtons(int bpAction)
// Only run if the Tactical Inventory Panel is open
if(gsCurInterfacePanel != SM_PANEL)
return;
+ // Don't run if keyring is open
+ if(gfInKeyRingPopup)
+ return;
// If Merc hasn't been set, default to first merc
if(gpSMCurrentMerc==NULL)
gpSMCurrentMerc = MercPtrs[ 0 ];
@@ -1232,7 +1184,7 @@ void RenderBackpackButtons(int bpAction)
// Deal with buttons depending on which screen is currently active
switch (bpAction)
{
- case 0:
+ case ACTIVATE_BUTTON:
// Activate buttons
if(giSMZipperButton != -1)
RemoveButton( giSMZipperButton );
@@ -1267,38 +1219,38 @@ void RenderBackpackButtons(int bpAction)
//SetButtonFastHelpText( giSMZipperButton, TacticalStr[ ] );
//SetButtonFastHelpText( giSMDropPackButton, TacticalStr[ ] );
break;
- case 1:
+ case DEACTIVATE_BUTTON:
// Deactivate buttons
if(giSMZipperButton != -1)
RemoveButton( giSMZipperButton );
if(giSMDropPackButton != -1)
RemoveButton( giSMDropPackButton );
- RenderBackpackButtons(4);
+ RenderBackpackButtons(UNLOAD_BUTTON);
giSMDropPackImages = -1;
giSMDropPackButton = -1;
giSMZipperImages = -1;
giSMZipperButton = -1;
break;
- case 2:
+ case ENABLE_BUTTON:
// Enable buttons
if(giSMDropPackButton == -1 || giSMZipperButton == -1)
{
- RenderBackpackButtons(1);
- RenderBackpackButtons(0);
+ RenderBackpackButtons(DEACTIVATE_BUTTON);
+ RenderBackpackButtons(ACTIVATE_BUTTON);
}
if(giSMDropPackButton != -1)
EnableButton( giSMDropPackButton );
if(giSMZipperButton != -1)
EnableButton( giSMZipperButton );
break;
- case 3:
+ case DISABLE_BUTTON:
// Disable buttons
if(giSMDropPackButton != -1)
DisableButton( giSMDropPackButton );
if(giSMZipperButton != -1)
DisableButton( giSMZipperButton );
break;
- case 4:
+ case UNLOAD_BUTTON:
if(giSMZipperImages != -1)
UnloadButtonImage( giSMZipperImages );
if(giSMDropPackImages != -1)
@@ -1368,11 +1320,6 @@ void EnableSMPanelButtons( BOOLEAN fEnable , BOOLEAN fFromItemPickup )
// only enable the following if NOT in shopkeeper's interface
if ( !(guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) )
{
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //EnableButton( iSMPanelButtons[ HOP_BUTTON ] ); //Legion by JAzz
- //}
EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
EnableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] );
EnableButton( iSMPanelButtons[ STANCEUP_BUTTON ] );
@@ -1384,7 +1331,7 @@ void EnableSMPanelButtons( BOOLEAN fEnable , BOOLEAN fFromItemPickup )
{
EnableButton( giSMStealthButton );
}
- RenderBackpackButtons(2); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ENABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if ( gfDisableTacticalPanelButtons )
{
@@ -1416,11 +1363,6 @@ void EnableSMPanelButtons( BOOLEAN fEnable , BOOLEAN fFromItemPickup )
}
else
{
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //DisableButton( iSMPanelButtons[ HOP_BUTTON ] ); //Legion by Jazz
- //}
DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] );
DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] );
@@ -1432,7 +1374,7 @@ void EnableSMPanelButtons( BOOLEAN fEnable , BOOLEAN fFromItemPickup )
{
DisableButton( giSMStealthButton );
}
- RenderBackpackButtons(3); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if ( !fFromItemPickup )
{
@@ -1662,7 +1604,7 @@ BOOLEAN InitializeSMPanelCoordsOld()
LOCATION_NAME_Y = ( 65 + INTERFACE_START_Y );
// Keyring
- KEYRING_X = 487;
+ KEYRING_X = 494; //487;
KEYRING_Y = (105 + INV_INTERFACE_START_Y);
// so we got everything "dynamic" now we just return TRUE
@@ -1952,9 +1894,9 @@ BOOLEAN InitializeSMPanelCoordsNew()
}
// WANNE 2
- SM_DONE_X = (SCREEN_WIDTH - 152);
+ SM_DONE_X = (SCREEN_WIDTH - 146); // 152
SM_DONE_Y = ( 118 + INV_INTERFACE_START_Y );
- SM_MAPSCREEN_X = (SCREEN_WIDTH - 152);
+ SM_MAPSCREEN_X = (SCREEN_WIDTH - 146); // 152
SM_MAPSCREEN_Y = ( 140 + INV_INTERFACE_START_Y );
SM_POSITIONB_X = ( 106 + INTERFACE_START_X );
@@ -2030,13 +1972,13 @@ BOOLEAN InitializeSMPanelCoordsNew()
// ow and te clock and location i will put it here
INTERFACE_CLOCK_X = (SCREEN_WIDTH - 86);
- INTERFACE_CLOCK_Y = ( 116 + INV_INTERFACE_START_Y );
+ INTERFACE_CLOCK_Y = ( 117 + INV_INTERFACE_START_Y );
LOCATION_NAME_X = (SCREEN_WIDTH - 92);
- LOCATION_NAME_Y = ( 87 + INTERFACE_START_Y );
+ LOCATION_NAME_Y = ( 89 + INTERFACE_START_Y );
//Keyring
- KEYRING_X = 209;
- KEYRING_Y = (4 + INV_INTERFACE_START_Y);
+ KEYRING_X = 217; // 209
+ KEYRING_Y = (5 + INV_INTERFACE_START_Y);
// so we got everything "dynamic" now we just return TRUE
return ( TRUE );
@@ -2196,12 +2138,6 @@ BOOLEAN CreateSMPanelButtons( )
FilenameForBPP("INTERFACE\\inventory_buttons.sti", ubString);
- //Legion by Jazz
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- // FilenameForBPP("INTERFACE\\inventory_buttons_WINDOW_2.sti", ubString2); //LEGION
- //}
//-----------------------
// Load button Graphics
iSMPanelImages[ STANCEUP_IMAGES ] = LoadButtonImage(ubString,-1,0,-1,10,-1 );
@@ -2217,18 +2153,6 @@ BOOLEAN CreateSMPanelButtons( )
iSMPanelImages[ TALK_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,6,-1,16,-1 );
iSMPanelImages[ MUTE_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,5,-1,15,-1 );
- //Legion by Jazz
- //DisableButton
- /*
- if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- {
- iSMPanelImages[ OPTIONS_IMAGES ] = LoadButtonImage(ubString2,-1,0,-1,1,-1 ); //legion
- }
- else
- {
- iSMPanelImages[ OPTIONS_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,24,-1,25,-1 );
- }
- */
iSMPanelImages[ OPTIONS_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,24,-1,25,-1 );
iBurstButtonImages[ WM_NORMAL ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 7, -1, -1, -1 );
@@ -2238,13 +2162,6 @@ BOOLEAN CreateSMPanelButtons( )
iBurstButtonImages[ WM_ATTACHED_GL_BURST ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 );
iBurstButtonImages[ WM_ATTACHED_GL_AUTO ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 );
- //Legion by JAzz
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- // iSMPanelImages[ HOP_IMAGES ] = LoadButtonImage(ubString2,-1,2,-1,3,-1 );
- //}
-
FilenameForBPP("INTERFACE\\invadd-ons.sti", ubString);
// Load button Graphics
iSMPanelImages[ STANCE_IMAGES ] = LoadButtonImage(ubString,0,0,-1,2,-1 );
@@ -2263,30 +2180,7 @@ BOOLEAN CreateSMPanelButtons( )
// SET BUTTONS TO -1
memset( iSMPanelButtons, -1, sizeof( iSMPanelButtons ) );
-
-
- //Legion by Jazz
- //DisableButton
- /*if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- {
-
- if (UsingNewInventorySystem() == true)
- {
- iSMPanelButtons[ HOP_BUTTON ] = QuickCreateButton( iSMPanelImages[ HOP_IMAGES ], SM_BURSTMODEB_X-30, SM_BURSTMODEB_Y,
- BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1,
- DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnOknoCallback );
- }
- else
- {
- iSMPanelButtons[ HOP_BUTTON ] = QuickCreateButton( iSMPanelImages[ HOP_IMAGES ], SM_BURSTMODEB_X-98, SM_BURSTMODEB_Y+35,
- BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1,
- DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnOknoCallback );
- }
- }
- */
- //-----------------------
-
-
+
iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] = QuickCreateButton( iSMPanelImages[ MAPSCREEN_IMAGES ], SM_MAPSCREEN_X, SM_MAPSCREEN_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1,
DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnMapScreenCallback );
@@ -2477,13 +2371,13 @@ void RemoveSMPanelButtons( )
RemoveButton( giSMStealthButton );
}
- RenderBackpackButtons(1); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DEACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if ( giSMStealthImages != -1 )
{
UnloadButtonImage( giSMStealthImages );
}
- RenderBackpackButtons(4); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(UNLOAD_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
UnloadButtonImage( iBurstButtonImages[ WM_NORMAL ] );
UnloadButtonImage( iBurstButtonImages[ WM_BURST ] );
@@ -2525,6 +2419,8 @@ BOOLEAN ShutdownSMPanel( )
// shutdown keyring interface
ShutdownKeyRingInterface( );
+ ShutdownInventoryInterface();
+
MSYS_RemoveRegion( &gSMPanelRegion );
MSYS_RemoveRegion( &gSM_SELMERCPanelRegion );
MSYS_RemoveRegion( &gSM_SELMERCBarsRegion );
@@ -3079,6 +2975,10 @@ void RenderSMPanel( BOOLEAN *pfDirty )
RenderClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y );
CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y );
}
+ else
+ {
+ RemoveMouseRegionForPauseOfClock();
+ }
// CHRISL: Change function call to include X,Y coordinates.
RenderTownIDString( LOCATION_NAME_X, LOCATION_NAME_Y );
@@ -3268,78 +3168,57 @@ void SMInvClickCamoCallback( MOUSE_REGION * pRegion, INT32 iReason )
{
if (gGameExternalOptions.fShowCamouflageFaces == TRUE )
{
- if ( gpSMCurrentMerc->bCamo > 0 )
- {
- gCamoFace[gpSMCurrentMerc->ubProfile].gCamoface = TRUE;
+ SetCamoFace( gpSMCurrentMerc );
DeleteSoldierFace( gpSMCurrentMerc );// remove face
gpSMCurrentMerc->iFaceIndex = InitSoldierFace( gpSMCurrentMerc );// create new face
}
- if ( gpSMCurrentMerc->urbanCamo > 0 )
- {
- gCamoFace[gpSMCurrentMerc->ubProfile].gUrbanCamoface = TRUE;
- DeleteSoldierFace( gpSMCurrentMerc );// remove face
- gpSMCurrentMerc->iFaceIndex = InitSoldierFace( gpSMCurrentMerc );// create new face
- }
- if ( gpSMCurrentMerc->desertCamo > 0)
- {
- gCamoFace[gpSMCurrentMerc->ubProfile].gDesertCamoface = TRUE;
- DeleteSoldierFace( gpSMCurrentMerc );// remove face
- gpSMCurrentMerc->iFaceIndex = InitSoldierFace( gpSMCurrentMerc );// create new face
- }
- if ( gpSMCurrentMerc->snowCamo > 0)
- {
- gCamoFace[gpSMCurrentMerc->ubProfile].gSnowCamoface = TRUE;
- DeleteSoldierFace( gpSMCurrentMerc );// remove face
- gpSMCurrentMerc->iFaceIndex = InitSoldierFace( gpSMCurrentMerc );// create new face
- }
- }
- // Dirty
- fInterfacePanelDirty = DIRTYLEVEL2;
+ // Dirty
+ fInterfacePanelDirty = DIRTYLEVEL2;
- // Check if it's the same now!
- if ( gpItemPointer->exists() == false )
- {
- gbCompatibleApplyItem = FALSE;
- EndItemPointer( );
+ // Check if it's the same now!
+ if ( gpItemPointer->exists() == false )
+ {
+ gbCompatibleApplyItem = FALSE;
+ EndItemPointer( );
+ }
+
+ // Say OK acknowledge....
+ gpSMCurrentMerc->DoMercBattleSound( BATTLE_SOUND_COOL1 );
}
-
- // Say OK acknowledge....
- gpSMCurrentMerc->DoMercBattleSound( BATTLE_SOUND_COOL1 );
- }
}
else if ( ApplyCanteen( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) )
{
// Dirty
- if ( fGoodAPs )
- {
- fInterfacePanelDirty = DIRTYLEVEL2;
-
- // Check if it's the same now!
- if ( gpItemPointer->exists() == false )
+ if ( fGoodAPs )
{
- gbCompatibleApplyItem = FALSE;
- EndItemPointer( );
+ fInterfacePanelDirty = DIRTYLEVEL2;
+
+ // Check if it's the same now!
+ if ( gpItemPointer->exists() == false )
+ {
+ gbCompatibleApplyItem = FALSE;
+ EndItemPointer( );
+ }
}
- }
}
else if ( ApplyElixir( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) )
{
- if ( fGoodAPs )
- {
- // Dirty
- fInterfacePanelDirty = DIRTYLEVEL2;
-
- // Check if it's the same now!
- if ( gpItemPointer->exists() == false )
+ if ( fGoodAPs )
{
- gbCompatibleApplyItem = FALSE;
- EndItemPointer( );
- }
+ // Dirty
+ fInterfacePanelDirty = DIRTYLEVEL2;
- // Say OK acknowledge....
- gpSMCurrentMerc->DoMercBattleSound( BATTLE_SOUND_COOL1 );
- }
+ // Check if it's the same now!
+ if ( gpItemPointer->exists() == false )
+ {
+ gbCompatibleApplyItem = FALSE;
+ EndItemPointer( );
+ }
+
+ // Say OK acknowledge....
+ gpSMCurrentMerc->DoMercBattleSound( BATTLE_SOUND_COOL1 );
+ }
}
else if ( ApplyDrugs( gpSMCurrentMerc, gpItemPointer ) )
{
@@ -3586,7 +3465,7 @@ void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
break;
}
}
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
}
@@ -3724,7 +3603,7 @@ void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
return;
if(gpSMCurrentMerc->flags.DropPackFlag)
gpSMCurrentMerc->flags.DropPackFlag = FALSE;
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
}
}
@@ -3740,7 +3619,7 @@ void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
// try to place the item in the cursor into this inventory slot
if ( UIHandleItemPlacement( (UINT8) uiHandPos, usOldItemIndex, usNewItemIndex, fDeductPoints ) )
{
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
// it worked! if we're in the SKI...
if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE )
{
@@ -4445,9 +4324,9 @@ void BtnClimbCallback(GUI_BUTTON *btn,INT32 reason)
if (gGameExternalOptions.fCanClimbOnWalls == TRUE)
{
- if ( FindFenceDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
+ if ( FindWallJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
{
- gpSMCurrentMerc->BeginSoldierFence( );
+ gpSMCurrentMerc->BeginSoldierClimbWall( );
}
}
@@ -4457,7 +4336,6 @@ void BtnClimbCallback(GUI_BUTTON *btn,INT32 reason)
{
gpSMCurrentMerc->BeginSoldierClimbFence( );
}
-
}
else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
{
@@ -7192,11 +7070,6 @@ void KeyRingSlotInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
void DisableSMPpanelButtonsWhenInShopKeeperInterface( BOOLEAN fDontDrawButtons )
{
//Go through the buttons that will be under the ShopKeepers ATM panel and disable them
- //DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //DisableButton( iSMPanelButtons[ HOP_BUTTON ] ); //Legion by Jazz
- //}
DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] );
DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] );
DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
@@ -7216,10 +7089,6 @@ void DisableSMPpanelButtonsWhenInShopKeeperInterface( BOOLEAN fDontDrawButtons )
DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] );
//DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //DisableButton( iSMPanelButtons[ HOP_BUTTON ] ); //legion by Jazz
- //}
DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] );
DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] );
DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] );
@@ -7231,20 +7100,15 @@ void DisableSMPpanelButtonsWhenInShopKeeperInterface( BOOLEAN fDontDrawButtons )
DisableButton( iSMPanelButtons[ MUTE_BUTTON ] );
DisableButton( giSMStealthButton );
- RenderBackpackButtons(3); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if( fDontDrawButtons )
{
//ATM:
-
//Go through the buttons that will be under the ShopKeepers ATM panel and disable them
//DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //ButtonList[ iSMPanelButtons[ HOP_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; //Legion by Jazz
- //}
ButtonList[ iSMPanelButtons[ STANCEUP_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY;
ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY;
ButtonList[ iSMPanelButtons[ CLIMB_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY;
@@ -7271,10 +7135,6 @@ void DisableSMPpanelButtonsWhenInShopKeeperInterface( BOOLEAN fDontDrawButtons )
ButtonList[ iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ]->uiFlags &= ~BUTTON_ENABLED;
//DisableButton
- //if (gGameExternalOptions.fCanJumpThroughWindows == TRUE)
- //{
- //ButtonList[ iSMPanelButtons[ HOP_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; //legion by Jazz
- //}
ButtonList[ iSMPanelButtons[ STANCEUP_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY;
ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY;
ButtonList[ iSMPanelButtons[ CLIMB_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY;
@@ -7457,75 +7317,6 @@ void GoToMapScreenFromTactical( void )
gfEnteringMapScreen = TRUE;
}
-//-------------Legion by Jazz-----------------------------------
-void BtnOknoCallback(GUI_BUTTON *btn,INT32 reason)
-{
- INT8 bDirection;
-
- if (!(btn->uiFlags & BUTTON_ENABLED))
- return;
-
-
- if ( gpSMCurrentMerc->pathing.bLevel == 1 )
- {
- return;
- }
-
-
- if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
- {
- btn->uiFlags |= BUTTON_CLICKED_ON;
- }
- else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
- {
- btn->uiFlags &= (~BUTTON_CLICKED_ON );
-
- if ( FindWindowJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
- {
- gpSMCurrentMerc->BeginSoldierClimbWindow( );
- }
-
- }
- else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
- {
- btn->uiFlags &= (~BUTTON_CLICKED_ON );
- }
-
-}
-
-void BtnFenceCallback(GUI_BUTTON *btn,INT32 reason)
-{
- BOOLEAN fNearHeigherLevelFence;
- BOOLEAN fNearLowerLevelFence;
- INT8 bDirection;
-
- if (!(btn->uiFlags & BUTTON_ENABLED))
- return;
-
- if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
- {
- btn->uiFlags |= BUTTON_CLICKED_ON;
- }
- else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
- {
- btn->uiFlags &= (~BUTTON_CLICKED_ON );
-
- GetMercFenceDirection( gpSMCurrentMerc->ubID, &fNearLowerLevelFence, &fNearHeigherLevelFence );
-
-
- if ( FindFenceDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) )
- {
- gpSMCurrentMerc->BeginSoldierFence( );
- }
-
- }
- else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
- {
- btn->uiFlags &= (~BUTTON_CLICKED_ON );
- }
-
-}
-
//----LEGION 2---------
BOOLEAN HandleKlerykPistolet( SOLDIERTYPE *pSoldier, UINT32 uiHandPos, UINT16 usReplaceItem )
{
diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp
index b5cc6988..c3d0ba37 100644
--- a/Tactical/Interface.cpp
+++ b/Tactical/Interface.cpp
@@ -115,8 +115,12 @@ UINT8 gubProgCurEnemy = 0;
UINT32 guiPORTRAITICONS;
-UINT32 guiPORTRAITICONS_NV; //legion
-UINT32 guiPORTRAITICONS_GAS_MASK; //legion
+//UINT32 guiPORTRAITICONS_NV; //legion
+//UINT32 guiPORTRAITICONS_GAS_MASK; //legion
+
+// WANNE: Additional face gear file for IMPs
+//UINT32 guiPORTRAITICONS_NV_IMP;
+//UINT32 guiPORTRAITICONS_GAS_MASK_IMP;
typedef struct
{
@@ -275,6 +279,10 @@ BOOLEAN InitializeTacticalInterface( )
{
VSURFACE_DESC vs_desc;
VOBJECT_DESC VObjectDesc;
+
+ UINT32 iCounter2;
+
+ char fileName[500];
// CHRISL: Setup default interface coords based on inventory system in use
if((UsingNewInventorySystem() == true))
@@ -414,7 +422,7 @@ BOOLEAN InitializeTacticalInterface( )
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
//legion 2 jazz
- if (gGameExternalOptions.fShowTacticalFaceIcons == TRUE)
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_ICONS ] == TRUE)
{
//additional face icons (legion 2)
if (gGameExternalOptions.bTacticalFaceIconStyle == 0)
@@ -457,15 +465,56 @@ BOOLEAN InitializeTacticalInterface( )
//legion
- if (gGameExternalOptions.fShowTacticalFaceGear == TRUE)
+ if (gGameSettings.fOptions[ TOPTION_SHOW_TACTICAL_FACE_GEAR ] == TRUE)
{
- FilenameForBPP("INTERFACE\\portraiticons_NV.sti", VObjectDesc.ImageFile);
+ /*
+ FilenameForBPP("INTERFACE\\portraiticons_NV.sti", VObjectDesc.ImageFile);
if( !AddVideoObject( &VObjectDesc, &guiPORTRAITICONS_NV ) )
AssertMsg(0, "Missing INTERFACE\\portraiticons_NV.sti" );
-
- FilenameForBPP("INTERFACE\\portraiticons_GAS_MASK.sti", VObjectDesc.ImageFile);
+
+ FilenameForBPP("INTERFACE\\portraiticons_NV_IMP.sti", VObjectDesc.ImageFile);
+ if( !AddVideoObject( &VObjectDesc, &guiPORTRAITICONS_NV_IMP ) )
+ AssertMsg(0, "Missing INTERFACE\\portraiticons_NV_IMP.sti" );
+
+ FilenameForBPP("INTERFACE\\portraiticons_GAS_MASK.sti", VObjectDesc.ImageFile);
if( !AddVideoObject( &VObjectDesc, &guiPORTRAITICONS_GAS_MASK ) )
- AssertMsg(0, "Missing INTERFACE\\portraiticons_GAS_MASK.sti" );
+ AssertMsg(0, "Missing INTERFACE\\portraiticons_GAS_MASK.sti" );
+
+ FilenameForBPP("INTERFACE\\portraiticons_GAS_MASK_IMP.sti", VObjectDesc.ImageFile);
+ if( !AddVideoObject( &VObjectDesc, &guiPORTRAITICONS_GAS_MASK_IMP ) )
+ AssertMsg(0, "Missing INTERFACE\\portraiticons_GAS_MASK_IMP.sti" );
+ */
+ for( iCounter2 = 1; iCounter2 < MAXITEMS; iCounter2++ )
+ {
+ VObjectDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE;
+
+ #define SCSTI ".STI"
+
+ if ( zNewFaceGear[iCounter2].Type > 0 )
+ {
+ strcpy(fileName, zNewFaceGear[iCounter2].szFile);
+ strcat(fileName, SCSTI);
+ strcpy(VObjectDesc.ImageFile, fileName);
+ CHECKF(AddVideoObject(&VObjectDesc,&zNewFaceGear[iCounter2].uiIndex));
+
+ }
+ }
+
+ for( iCounter2 = 1; iCounter2 < MAXITEMS; iCounter2++ )
+ {
+ VObjectDesc.fCreateFlags = VSURFACE_CREATE_FROMFILE;
+
+ #define SCSTI_IMP "_IMP.STI"
+
+ if ( zNewFaceGear[iCounter2].Type > 0 )
+ {
+ //IMP
+ strcpy(fileName, zNewFaceGear[iCounter2].szFile);
+ strcat(fileName, SCSTI_IMP);
+ strcpy(VObjectDesc.ImageFile, fileName);
+ CHECKF(AddVideoObject(&VObjectDesc,&zNewFaceGearIMP[iCounter2].uiIndex));
+ }
+ }
}
// LOAD RADIO
@@ -2202,17 +2251,10 @@ BOOLEAN DrawCTHIndicator()
// Select the color of the indicator circles
UINT16 usCApertureBar;
- if (pSoldier->bDoAutofire && fAutofireBulletsMode)
- {
- // When autofire bullets mode is selected, the CTH display goes greyish. This indicates to the player
- // that the aiming levels have been set, and further right-clicks will only add bullets to the volley.
- usCApertureBar = Get16BPPColor( FROMRGB( 180, 180, 180 ) );
- }
- else
- {
- // Indicator changes color from red to yellow to green, based on how well the gun is aimed.
- usCApertureBar = Get16BPPColor( FROMRGB( ColorsRed[gCTHDisplay.MuzzleSwayPercentage/10], ColorsGreen[gCTHDisplay.MuzzleSwayPercentage/10], 0 ) ); // Crosshair color shifts from red (longshot) to green (Accurate shot)
- }
+
+ // CHRISL: Instead of shigting the color based on MuzzleSwayPercent, let's move this line and base it on the final iAperture value
+ // Indicator changes color from red to yellow to green, based on how well the gun is aimed.
+ //usCApertureBar = Get16BPPColor( FROMRGB( ColorsRed[gCTHDisplay.MuzzleSwayPercentage/10], ColorsGreen[gCTHDisplay.MuzzleSwayPercentage/10], 0 ) ); // Crosshair color shifts from red (longshot) to green (Accurate shot)
UINT16 usCApertureBorder = Get16BPPColor( FROMRGB( 10, 10, 10 ) ); // Boundaries in dark color.
@@ -2268,7 +2310,12 @@ BOOLEAN DrawCTHIndicator()
iAperture = ((100 - actualPct) * iAperture) / 100;
/////////////////////////////////////////////
- // Factor in Gun Accuracy. Note that I may remove this at a later time.
+ // Factor in Weapon "Effective Range".
+ UINT16 sEffRange = Weapon[Item[pSoldier->inv[pSoldier->ubAttackingHand].usItem].ubClassIndex].usRange + GetRangeBonus(&(pSoldier->inv[ pSoldier->ubAttackingHand ]));
+ FLOAT iRangeRatio = __max(1.0f, (FLOAT)(d2DDistance / sEffRange));
+
+ /////////////////////////////////////////////
+ // Factor in Gun Accuracy.
INT16 sAccuracy = GetGunAccuracy( &(pSoldier->inv[ pSoldier->ubAttackingHand ]) );
@@ -2276,6 +2323,8 @@ BOOLEAN DrawCTHIndicator()
sAccuracy = __min(100, sAccuracy);
FLOAT iBulletDev = (gGameCTHConstants.MAX_BULLET_DEV * (100-sAccuracy)) / 100;
+ if( gGameCTHConstants.RANGE_EFFECTS_DEV == TRUE )
+ iBulletDev *= iRangeRatio;
iBulletDev *= iDistanceRatio;
// Since bullet dev is only affected by distance, we add it last as a flat modifier.
@@ -2283,6 +2332,28 @@ BOOLEAN DrawCTHIndicator()
iMaxAperture += iBulletDev;
iAperture += iBulletDev;
+ // CHRISL: Moved here so we can base the cursor color on the iAperture value
+ UINT8 iColorCode = 0;
+ if(iAperture < 3.0)
+ iColorCode = 9;
+ else if(iAperture < 6.0)
+ iColorCode = 8;
+ else if(iAperture < 9.0)
+ iColorCode = 7;
+ else if(iAperture < 12.0)
+ iColorCode = 6;
+ else if(iAperture < 16.0)
+ iColorCode = 5;
+ else if(iAperture < 20.0)
+ iColorCode = 4;
+ else if(iAperture < 25.0)
+ iColorCode = 3;
+ else if(iAperture < 30.0)
+ iColorCode = 2;
+ else if(iAperture < 40.0)
+ iColorCode = 1;
+ usCApertureBar = Get16BPPColor( FROMRGB( ColorsRed[iColorCode], ColorsGreen[iColorCode], 0 ) ); // Crosshair color shifts from red (longshot) to green (Accurate shot)
+
///////////////////////////////////////////////////////////////////////////////////////////////////
// HEADROCK HAM 4: Calculate Screen Positions
//
@@ -2446,6 +2517,53 @@ BOOLEAN DrawCTHIndicator()
MagRect.right = sCenter + (usTotalWidth / 2);
}
+#ifdef JA2BETAVERSION
+ /////////////// SHOT APERTURE SIZE
+ {
+ // Create a pointer to the Frame Buffer which we are going to draw directly into.
+ SetFont( TINYFONT1 );
+ SetFontBackground( FONT_MCOLOR_BLACK );
+ SetFontForeground( FONT_MCOLOR_WHITE );
+
+ // Find coordinates, using the full string ("XX AP")
+ swprintf( pStr, L"%3.2f", iAperture );
+ FindFontCenterCoordinates( (INT16)APRect.left, (INT16)APRect.top-5, (INT16)APRect.right-(INT16)APRect.left, 5, pStr, TINYFONT1, &curX, &curY);
+ // Find width of this string.
+ UINT16 usTotalWidth = StringPixLength ( pStr, TINYFONT1 );
+
+ // Draw to screen
+ gprintfdirty( curX, curY, pStr );
+ mprintf( curX, curY, pStr);
+
+ // Redefine area size based on total width plus a margin of 2 pixels.
+ usTotalWidth = usTotalWidth + 6;
+ INT16 sCenter = (INT16)((APRect.right + APRect.left) / 2);
+ APRect.left = sCenter - (usTotalWidth / 2);
+ APRect.right = sCenter + (usTotalWidth / 2);
+ }
+
+ /////////////// DISTANCE APERTURE SIZE
+ {
+ SetFont( TINYFONT1 );
+
+ // Find coordinates, using full string ("X.X x")
+ swprintf( pStr, L"%3.2f", iMaxAperture );
+ FindFontCenterCoordinates( (INT16)MagRect.left, (INT16)MagRect.top-5, (INT16)MagRect.right-(INT16)MagRect.left, 5, pStr, TINYFONT1, &curX, &curY);
+ // Find width of this string.
+ UINT16 usTotalWidth = StringPixLength ( pStr, TINYFONT1 );
+
+ // Draw to screen
+ gprintfdirty( curX, curY, pStr );
+ mprintf( curX, curY, pStr);
+
+ // Redefine area size based on total width plus a margin of 2 pixels.
+ usTotalWidth = usTotalWidth + 6;
+ INT16 sCenter = (INT16)((MagRect.right + MagRect.left) / 2);
+ MagRect.left = sCenter - (usTotalWidth / 2);
+ MagRect.right = sCenter + (usTotalWidth / 2);
+ }
+#endif
+
//////////////////// BURST/AUTO LABEL AND BULLETS
if (pSoldier->bDoBurst)
{
@@ -2826,96 +2944,99 @@ BOOLEAN DrawCTHIndicator()
INT32 Circ = 0;
Circ = (INT32)((iMaxAperture * RADIANS_IN_CIRCLE) * dVerticalBias);
- // Draw outer circle
- for (INT32 iCurPoint = 0; iCurPoint < Circ; iCurPoint++)
+ if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
{
- curX = (INT16)(iMaxAperture * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)((iMaxAperture * dVerticalBias) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- INT16 firstX = curX;
- INT16 firstY = curY;
+ // Draw outer circle
+ for (INT32 iCurPoint = 0; iCurPoint < Circ; iCurPoint++)
+ {
+ curX = (INT16)(iMaxAperture * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)((iMaxAperture * dVerticalBias) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ INT16 firstX = curX;
+ INT16 firstY = curY;
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBar );
- // Draw a border circle which is 1 point wider
- curX = (INT16)((iMaxAperture+1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)(((iMaxAperture * dVerticalBias)+1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ // Draw a border circle which is 1 point wider
+ curX = (INT16)((iMaxAperture+1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)(((iMaxAperture * dVerticalBias)+1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- if (curX != firstX || curY != firstY)
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
+ if (curX != firstX || curY != firstY)
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
- // Draw a border circle which is 1 point narrower
- curX = (INT16)((iMaxAperture-1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)(((iMaxAperture * dVerticalBias)-1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ // Draw a border circle which is 1 point narrower
+ curX = (INT16)((iMaxAperture-1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)(((iMaxAperture * dVerticalBias)-1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- if (curX != firstX || curY != firstY)
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
- }
+ if (curX != firstX || curY != firstY)
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
+ }
- Circ = (INT32)((iAperture * RADIANS_IN_CIRCLE) * dVerticalBias);
- // Draw inner circle
- for (INT32 iCurPoint = 0; iCurPoint < Circ; iCurPoint++)
- {
- curX = (INT16)(iAperture * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)((iAperture * dVerticalBias) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- INT16 firstX = curX;
- INT16 firstY = curY;
+ Circ = (INT32)((iAperture * RADIANS_IN_CIRCLE) * dVerticalBias);
+ // Draw inner circle
+ for (INT32 iCurPoint = 0; iCurPoint < Circ; iCurPoint++)
+ {
+ curX = (INT16)(iAperture * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)((iAperture * dVerticalBias) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ INT16 firstX = curX;
+ INT16 firstY = curY;
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBar );
- // Draw a border circle which is 1 point wider
- curX = (INT16)((iAperture+1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)(((iAperture * dVerticalBias)+1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ // Draw a border circle which is 1 point wider
+ curX = (INT16)((iAperture+1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)(((iAperture * dVerticalBias)+1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- if (curX != firstX || curY != firstY)
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
+ if (curX != firstX || curY != firstY)
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
- // Draw a border circle which is 1 point narrower
- curX = (INT16)((iAperture-1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- curY = (INT16)(((iAperture * dVerticalBias)-1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ // Draw a border circle which is 1 point narrower
+ curX = (INT16)((iAperture-1) * cos((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
+ curY = (INT16)(((iAperture * dVerticalBias)-1) * sin((iCurPoint * RADIANS_IN_CIRCLE)/Circ));
- if (curX != firstX || curY != firstY)
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
- }
+ if (curX != firstX || curY != firstY)
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+curX, sStartScreenY+curY+(INT16)zOffset, usCApertureBorder );
+ }
- // Aperture Crosshairs
- for (INT16 cnt = (INT16)(iAperture); cnt <= (INT16)(iAperture + uiApertureBarLength); cnt++)
- {
- // Horizontal Aperture Crosshairs
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, sStartScreenY+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, sStartScreenY+(INT16)zOffset, usCApertureBar );
+ // Aperture Crosshairs
+ for (INT16 cnt = (INT16)(iAperture); cnt <= (INT16)(iAperture + uiApertureBarLength); cnt++)
+ {
+ // Horizontal Aperture Crosshairs
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, sStartScreenY+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, sStartScreenY+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY+1)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY+1)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY+1)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY+1)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY-1)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY-1)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY-1)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY-1)+(INT16)zOffset, usCApertureBar );
- // Darker borders
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY+2)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY+2)+(INT16)zOffset, usCApertureBorder );
+ // Darker borders
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY+2)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY+2)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY-2)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY-2)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+cnt, (sStartScreenY-2)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-cnt, (sStartScreenY-2)+(INT16)zOffset, usCApertureBorder );
- }
- for (INT16 cnt = (INT16)(iAperture * dVerticalBias); cnt <= (INT16)((iAperture * dVerticalBias) + uiApertureBarLength); cnt++)
- {
- // Vertical Aperture Crosshairs
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
+ }
+ for (INT16 cnt = (INT16)(iAperture * dVerticalBias); cnt <= (INT16)((iAperture * dVerticalBias) + uiApertureBarLength); cnt++)
+ {
+ // Vertical Aperture Crosshairs
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+1, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+1, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+1, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+1, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-1, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-1, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-1, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBar );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-1, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBar );
- // Darker borders
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+2, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+2, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBorder );
+ // Darker borders
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+2, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX+2, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-2, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBorder );
- DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-2, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-2, (sStartScreenY+cnt)+(INT16)zOffset, usCApertureBorder );
+ DrawCTHPixelToBuffer( ptrBuf, uiPitch, sLeft, sTop, sRight, sBottom, sStartScreenX-2, (sStartScreenY-cnt)+(INT16)zOffset, usCApertureBorder );
+ }
}
// Unlock the Frame Buffer.
diff --git a/Tactical/Interface.h b/Tactical/Interface.h
index 9d242e89..cb91abcb 100644
--- a/Tactical/Interface.h
+++ b/Tactical/Interface.h
@@ -32,6 +32,12 @@ enum
NUM_ICONS
};
+#define ACTIVATE_BUTTON 0
+#define DEACTIVATE_BUTTON 1
+#define ENABLE_BUTTON 2
+#define DISABLE_BUTTON 3
+#define UNLOAD_BUTTON 4
+
#define MAX_ENEMY_NAMES_CHARS 128
typedef struct
@@ -164,8 +170,12 @@ extern UINT32 guiITEMPOINTERHATCHES;
//legion
-extern UINT32 guiPORTRAITICONS_NV; //legion: NV-Face Graphic
-extern UINT32 guiPORTRAITICONS_GAS_MASK; //legion: GASMASK-Face Graphic
+//extern UINT32 guiPORTRAITICONS_NV; //legion: NV-Face Graphic
+//extern UINT32 guiPORTRAITICONS_GAS_MASK; //legion: GASMASK-Face Graphic
+
+// WANNE: Face gear for IMPs in additional file
+//extern UINT32 guiPORTRAITICONS_NV_IMP;
+//extern UINT32 guiPORTRAITICONS_GAS_MASK_IMP;
extern MOUSE_REGION gViewportRegion;
extern MOUSE_REGION gRadarRegion;
diff --git a/Tactical/Item Types.cpp b/Tactical/Item Types.cpp
index b692a824..9a6ea063 100644
--- a/Tactical/Item Types.cpp
+++ b/Tactical/Item Types.cpp
@@ -20,7 +20,7 @@ int gLastLBEUniqueID = 0;
extern UINT32 guiCurrentItemDescriptionScreen;
extern BOOLEAN fShowMapInventoryPool;
-extern BOOLEAN AutoPlaceObjectInInventoryStash( OBJECTTYPE *pItemPtr, INT32 sGridNo );
+//extern BOOLEAN AutoPlaceObjectInInventoryStash( OBJECTTYPE *pItemPtr, INT32 sGridNo );
bool IsSlotAnLBESlot(int slot)
{
@@ -205,7 +205,7 @@ BOOLEAN MoveItemsToActivePockets( SOLDIERTYPE *pSoldier, std::vector& LBES
//DBrot: changed to bitwise comparison
UINT32 newPack = LoadBearingEquipment[Item[pObj->usItem].ubClassIndex].lbeCombo;
UINT32 chkPack = LoadBearingEquipment[Item[pSoldier->inv[i].usItem].ubClassIndex].lbeCombo;
- if(newPack == 0 || (newPack & chkPack == 0))
+ if(newPack == 0 || (newPack & chkPack) == 0)
continue;
}
if(CanItemFitInPosition(pSoldier, &(pSoldier->inv[LBESlots[x]]), i, FALSE))
@@ -227,7 +227,8 @@ BOOLEAN MoveItemsToActivePockets( SOLDIERTYPE *pSoldier, std::vector& LBES
{
if(pSoldier->inv[LBESlots[i]].exists() == false) // No item in pocket
continue;
- if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool)
+ AutoPlaceObjectToWorld(pSoldier, &pSoldier->inv[LBESlots[i]]);
+ /*if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool)
{
AutoPlaceObjectInInventoryStash(&pSoldier->inv[LBESlots[i]], pSoldier->sGridNo);
}
@@ -235,7 +236,7 @@ BOOLEAN MoveItemsToActivePockets( SOLDIERTYPE *pSoldier, std::vector& LBES
{
AddItemToPool( pSoldier->sGridNo, &pSoldier->inv[LBESlots[i]], 1, pSoldier->pathing.bLevel, 0 , -1 );
NotifySoldiersToLookforItems( );
- }
+ }*/
DeleteObj(&pSoldier->inv[LBESlots[i]]);
}
diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp
index 618ad9c4..22220dab 100644
--- a/Tactical/Items.cpp
+++ b/Tactical/Items.cpp
@@ -21,6 +21,7 @@
#include "interface panels.h"
#include "explosion control.h"
#include "Keys.h"
+ #include "faces.h"
#include "wcheck.h"
#include "soldier profile.h"
@@ -70,6 +71,7 @@ extern BOOLEAN fShowMapInventoryPool;
extern UINT32 guiCurrentItemDescriptionScreen;
extern BOOLEAN AutoPlaceObjectInInventoryStash( OBJECTTYPE *pItemPtr, INT32 sGridNo );
+UINT16 OldWayOfCalculatingScopeBonus(SOLDIERTYPE *pSoldier);
// weight units are 100g each
////////////////////////////////////////////////////////////////////////////
@@ -1368,6 +1370,20 @@ bool FitsInSmallPocket(OBJECTTYPE* pObj)
return Item[pObj->usItem].ubPerPocket != 0;
}
+bool IsBackpackSlot(INT8 bSlot)
+{
+ std::vector pocketKey;
+ GetLBESlots(BPACKPOCKPOS, pocketKey);
+
+ for(UINT32 loop = 0; loop < pocketKey.size(); loop++)
+ {
+ if(pocketKey[loop] == bSlot)
+ return true;
+ }
+
+ return false;
+}
+
// CHRISL: New definition for this function so that we can look at soldiers LBE pockets.
UINT8 ItemSlotLimit( OBJECTTYPE * pObject, INT16 bSlot, SOLDIERTYPE *pSoldier, BOOLEAN cntAttach )
{
@@ -1406,8 +1422,10 @@ UINT8 ItemSlotLimit( OBJECTTYPE * pObject, INT16 bSlot, SOLDIERTYPE *pSoldier, B
//if it is stack size limit we want it to be a big slot or a vehicle slot
if (UsingNewInventorySystem() == false)
return (max(1, ubSlotLimit));
- else
+ else if(pSoldier != NULL && (pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE))
return (max(1, LBEPocketType[VEHICLE_POCKET_TYPE].ItemCapacityPerSize[__min(34,Item[pObject->usItem].ItemSize)]));
+ else
+ return (max(1, min(255,LBEPocketType[VEHICLE_POCKET_TYPE].ItemCapacityPerSize[__min(34,Item[pObject->usItem].ItemSize)]*4)));
}
if (UsingNewInventorySystem() == false) {
@@ -1618,6 +1636,10 @@ INT8 FindObj( SOLDIERTYPE * pSoldier, UINT16 usItem, INT8 bLower, INT8 bUpper )
for (bLoop = bLower; bLoop < bUpper; bLoop++)
{
+ //CHRISL: If in NIV, in combat and backpack is closed, don't look inside
+ if(UsingNewAttachmentSystem() == true && (gTacticalStatus.uiFlags & INCOMBAT) && IsBackpackSlot(bLoop) == true && pSoldier->flags.ZipperFlag == FALSE)
+ continue;
+
//CHRISL: If we check exists() then we can't search for an empty pocket with this function, which is done.
if (pSoldier->inv[bLoop].usItem == usItem/* && pSoldier->inv[bLoop].exists() == true*/)
{
@@ -2230,7 +2252,7 @@ BOOLEAN ValidItemAttachmentSlot( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN
usSimilarItem = pAttachment->usItem;
} else {
//CHRISL: This should allow attachment swapping even if our attachments can't normally be on the weapon at the same time.
- if(slotCount != -1 && pAttachment->exists() && FindAttachmentSlot(pObj, pAttachment->usItem, subObject) == slotCount)
+ if(slotCount != -1 && pAttachment->exists() && usSimilarItem == pAttachment->usItem && FindAttachmentSlot(pObj, pAttachment->usItem, subObject) == slotCount)
fSimilarItems = FALSE;
//If we have an item to return the existing attachment to.
@@ -3496,6 +3518,10 @@ INT8 FindAmmo( SOLDIERTYPE * pSoldier, UINT8 ubCalibre, UINT16 ubMagSize, UINT8
for (bLoop = HANDPOS; bLoop < (INT8)pSoldier->inv.size(); bLoop++)
{
+ //CHRISL: If in NIV, in combat and backpack is closed, don't look inside
+ if(UsingNewAttachmentSystem() == true && (gTacticalStatus.uiFlags & INCOMBAT) && IsBackpackSlot(bLoop) == true && pSoldier->flags.ZipperFlag == FALSE)
+ continue;
+
if (pSoldier->inv[bLoop].exists() == true) {
if (bLoop == bExcludeSlot)
{
@@ -3782,7 +3808,7 @@ INT8 GetAttachmentComboMerge( OBJECTTYPE * pObj, UINT8 subObject )
// found everything required?
/* 2007-05-27, Sgt_Kolja: Not-found-condition moved from above, otherwise we can only have ONE attachmentCombo per basic item */
//WarmSteel - Added check to see if the resulting item is valid.
- if ( pAttachment->exists() && ItemIsLegal(AttachmentComboMerge[bIndex].usResult) )
+ if ( pAttachment->exists() && ItemIsLegal(AttachmentComboMerge[bIndex].usResult, TRUE) )
{
return( bIndex );
}
@@ -4021,6 +4047,10 @@ BOOLEAN OBJECTTYPE::AttachObjectOAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac
}
}
+ if(Item[this->usItem].usItemClass == IC_GUN && oldMagSize != GetMagSize(this, subObject)){
+ fInterfacePanelDirty = DIRTYLEVEL2;
+ RenderBulletIcon(this, subObject);
+ }
// Check for attachment merge combos here
//CHRISL: Only do this if we're looking at a single item. Don't try a combo merge when dealing with a stack
@@ -4563,6 +4593,11 @@ BOOLEAN OBJECTTYPE::AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac
}
}
+ if(Item[this->usItem].usItemClass == IC_GUN && oldMagSize != GetMagSize(this, subObject)){
+ fInterfacePanelDirty = DIRTYLEVEL2;
+ RenderBulletIcon(this, subObject);
+ }
+
//WarmSteel - If we have just attached a UGL, remove it's grenade and put it on the gun itself
//CHRISL: This section of code is also needed it we add any attachment that changes the valid attachments our item can use, so we should run it whenever we
// add an attachment in NAS
@@ -4919,7 +4954,7 @@ UINT32 SetAttachmentSlotsFlag(OBJECTTYPE* pObj){
if (Launchable[uiLoop][1] == pObj->usItem ){
fItem = Launchable[uiLoop][0];
}
- if(fItem){ // We've found a valid attachment. Set the nasAttachmentSlots flag appropriately
+ if(fItem && ItemIsLegal(fItem, TRUE)){ // We've found a valid attachment. Set the nasAttachmentSlots flag appropriately
uiSlotFlag |= Item[fItem].nasAttachmentClass;
}
uiLoop++;
@@ -5167,14 +5202,16 @@ void RemoveProhibitedAttachments(SOLDIERTYPE* pSoldier, OBJECTTYPE* pObj, UINT16
} else { // put it on the ground
INT8 pathing = (pSoldier?pSoldier->pathing.bLevel:0);
INT32 sGridNo = (pSoldier?pSoldier->sGridNo:0);
- if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool){
+ AutoPlaceObjectToWorld(pSoldier, &(*iter), TRUE);
+ iter = tempAttachList.erase(iter);
+ /*if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool){
AutoPlaceObjectInInventoryStash(&(*iter), sGridNo);
//AddItemToPool( sGridNo, &(*iter), 1, pathing, WORLD_ITEM_REACHABLE, 0 );
iter = tempAttachList.erase(iter);
} else {
AddItemToPool( sGridNo, &(*iter), 1, pathing, WORLD_ITEM_REACHABLE, 0 );
iter = tempAttachList.erase(iter);
- }
+ }*/
}
} else {
++iter;
@@ -5857,7 +5894,13 @@ BOOLEAN PlaceObject( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj )
else
{
//Try to place stack on ground
- if(guiCurrentScreen == MAP_SCREEN && fShowMapInventoryPool == TRUE)
+ if( AutoPlaceObjectToWorld(pSoldier, &tempStack) )
+ {
+ clipCreated = true;
+ if(guiCurrentScreen == GAME_SCREEN)
+ NotifySoldiersToLookforItems( );
+ }
+ /*if(guiCurrentScreen == MAP_SCREEN && fShowMapInventoryPool == TRUE)
{
if(AutoPlaceObjectInInventoryStash(&tempStack, pSoldier->sGridNo))
clipCreated = true;
@@ -5869,7 +5912,7 @@ BOOLEAN PlaceObject( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj )
NotifySoldiersToLookforItems( );
clipCreated = true;
}
- }
+ }*/
}
}
if(clipCreated == true)
@@ -5971,7 +6014,11 @@ BOOLEAN PlaceObject( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj )
}
pInSlot->MoveThisObjectTo(gTempObject, -1, pSoldier, bPos);
pObj->MoveThisObjectTo(*pInSlot, -1, pSoldier, bPos);
- gTempObject.MoveThisObjectTo(*pObj, -1);
+ //CHRISL: We need to make sure there are no items left in pObj or we'll lose them
+ if(pObj->ubNumberOfObjects == 0)
+ gTempObject.MoveThisObjectTo(*pObj, -1);
+ else
+ AutoPlaceObjectAnywhere(pSoldier, &gTempObject, FALSE);
}
else if (ubSlotLimit < pObj->ubNumberOfObjects)
@@ -6221,6 +6268,41 @@ bool PlaceInAnySmallPocket(SOLDIERTYPE* pSoldier, OBJECTTYPE* pObj, bool fNewIte
return false;
}
+BOOLEAN AutoPlaceObjectAnywhere(SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNewItem, INT8 bExcludeSlot)
+{
+ // This function will attempt to place an object into the soldier's inventory first. If that doesn't work, it'll add the object to sector inventory
+ if(pObj->exists() == false)
+ return FALSE;
+
+ if( AutoPlaceObject(pSoldier, pObj, fNewItem, bExcludeSlot) )
+ return TRUE;
+ else
+ return (AutoPlaceObjectToWorld(pSoldier, pObj, TRUE) );
+
+ return FALSE;
+}
+
+BOOLEAN AutoPlaceObjectToWorld(SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, INT8 bVisible)
+{
+ if(pObj->exists() == false)
+ return FALSE;
+
+ INT32 sGridNo = pSoldier?pSoldier->sGridNo:0;
+ INT8 bLevel = pSoldier?pSoldier->pathing.bLevel:0;
+
+ if( guiCurrentScreen == MAP_SCREEN && fShowMapInventoryPool )
+ {
+ fMapPanelDirty = TRUE;
+ return( AutoPlaceObjectInInventoryStash(pObj, sGridNo) );
+ }
+ else
+ {
+ AddItemToPool(sGridNo, pObj, bVisible, bLevel, WORLD_ITEM_REACHABLE, 0);
+ return TRUE;
+ }
+
+ return FALSE;
+}
// CHRISL: Function needed for LBENODE
BOOLEAN AutoPlaceObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNewItem, INT8 bExcludeSlot )
@@ -6410,7 +6492,7 @@ BOOLEAN AutoPlaceObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNew
PlaceObject( pSoldier, BPACKPOCKPOS, pObj, fNewItem );
pSoldier->flags.DropPackFlag = FALSE;
pSoldier->flags.ZipperFlag = FALSE;
- RenderBackpackButtons(0); /* CHRISL: Needed for new inventory backpack buttons */
+ RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */
if(pObj->exists() == false)
return( TRUE );
}
@@ -7327,13 +7409,18 @@ BOOLEAN OBJECTTYPE::RemoveAttachment( OBJECTTYPE* pAttachment, OBJECTTYPE * pNew
EjectAmmoAndPlace(pSoldier, this, subObject);
}
//CHRISL: We should update the usGunAmmoItem if we've changed the ammo capacity
- if((*this)[subObject]->data.gun.ubGunShotsLeft != GetMagSize(this, subObject) && (*this)[subObject]->data.gun.usGunAmmoItem != NONE){
+ if((*this)[subObject]->data.gun.usGunAmmoItem != NONE){
UINT16 usNewAmmoItem;
usNewAmmoItem = FindReplacementMagazine(Weapon[this->usItem].ubCalibre ,GetMagSize(this, subObject),Magazine[Item[(*this)[subObject]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType);
(*this)[subObject]->data.gun.usGunAmmoItem = usNewAmmoItem;
}
}
+ if(Item[this->usItem].usItemClass == IC_GUN && oldMagSize != GetMagSize(this, subObject)){
+ fInterfacePanelDirty = DIRTYLEVEL2;
+ RenderBulletIcon(this, subObject);
+ }
+
//CHRISL: We need to know if the removed attachment could have altered the base items potential attachments
BOOLEAN removeAttachments = TRUE, cleanAttachments = FALSE;
INT8 loopCount = 0;
@@ -7363,14 +7450,16 @@ BOOLEAN OBJECTTYPE::RemoveAttachment( OBJECTTYPE* pAttachment, OBJECTTYPE * pNew
} else { // put it on the ground
INT8 pathing = (pSoldier?pSoldier->pathing.bLevel:0);
INT32 sGridNo = (pSoldier?pSoldier->sGridNo:0);
- if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool){
+ if( AutoPlaceObjectToWorld(pSoldier, &remObj) )
+ iter = (*this)[subObject]->RemoveAttachmentAtIter(iter);
+ /*if(guiCurrentItemDescriptionScreen == MAP_SCREEN && fShowMapInventoryPool){
if(AutoPlaceObjectInInventoryStash(&remObj, sGridNo)){
iter = (*this)[subObject]->RemoveAttachmentAtIter(iter);
}
} else {
AddItemToPool( sGridNo, &remObj, 1, pathing, WORLD_ITEM_REACHABLE, 0 );
iter = (*this)[subObject]->RemoveAttachmentAtIter(iter);
- }
+ }*/
}
}
}
@@ -7489,6 +7578,10 @@ BOOLEAN PlaceObjectInSoldierProfile( UINT8 ubProfile, OBJECTTYPE *pObject )
for (attachmentList::iterator iter = (*pObject)[0]->attachments.begin(); iter != (*pObject)[0]->attachments.end();) {
//CHRISL: Because MADLAB needs to remove all attachments, even inseparable ones, we need to temporarily
// make all attachments removable.
+ if(!iter->exists()){
+ ++iter;
+ continue;
+ }
BOOLEAN old_inseparable = FALSE;
UINT32 old_item = iter->usItem;
// drop it in Madlab's tile
@@ -8765,7 +8858,7 @@ INT16 BonusOnOff( INT16 bonus, INT16 status )
// HEADROCK HAM 4: Scopes now determined not by an aim bonus but by a magnification factor.
BOOLEAN NCTHIsScoped( OBJECTTYPE * pObj )
{
- if (pObj->exists() == true) {
+ if (pObj->exists() == true && UsingNewCTHSystem() == true) {
if ( Item[pObj->usItem].scopemagfactor > 1.0 || Item[(*pObj)[0]->data.gun.usGunAmmoItem].scopemagfactor > 1.0 )
return TRUE;
@@ -9023,7 +9116,7 @@ INT32 GetFlatBaseModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].flatbasemodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9043,7 +9136,7 @@ INT32 GetPercentBaseModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].percentbasemodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9064,7 +9157,7 @@ INT32 GetFlatAimModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].flataimmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9084,7 +9177,7 @@ INT32 GetPercentAimModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].percentaimmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9105,7 +9198,7 @@ INT32 GetPercentCapModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].percentcapmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9126,7 +9219,7 @@ INT32 GetPercentHandlingModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].percenthandlingmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9147,7 +9240,7 @@ INT32 GetDropCompensationModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].percentdropcompensationmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9169,7 +9262,7 @@ INT32 GetCounterForceMaxModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].maxcounterforcemodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9180,6 +9273,12 @@ INT32 GetCounterForceMaxModifier( OBJECTTYPE *pObj, UINT8 ubStance )
}
}
}
+
+ if(ubRef == 1)
+ iModifier += (INT32)gGameCTHConstants.RECOIL_MAX_COUNTER_CROUCH;
+ else if (ubRef == 2)
+ iModifier += (INT32)gGameCTHConstants.RECOIL_MAX_COUNTER_PRONE;
+
iModifier = __max(-100,iModifier);
return (iModifier);
}
@@ -9191,7 +9290,7 @@ INT32 GetCounterForceAccuracyModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].counterforceaccuracymodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9212,7 +9311,7 @@ INT32 GetCounterForceFrequencyModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].counterforcefrequencymodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9232,7 +9331,7 @@ INT32 GetTargetTrackingModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].targettrackingmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9253,7 +9352,7 @@ INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance )
UINT8 ubRef = GetStanceModifierRef( ubStance );
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
iModifier += Item[pObj->usItem].aimlevelsmodifier[ubRef];
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -9268,6 +9367,26 @@ INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance )
return (iModifier);
}
+INT32 GetAimLevelsTraitModifier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj )
+{
+ INT8 ubSkillModifier = 0;
+
+ if( gGameOptions.fNewTraitSystem )
+ {
+ if ( Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_PISTOL || Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_M_PISTOL )
+ ubSkillModifier -= NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT );
+ else
+ ubSkillModifier -= NUM_SKILL_TRAITS( pSoldier, SNIPER_NT );
+ }
+ else
+ {
+ ubSkillModifier -= NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT );
+ }
+
+ return (INT32)ubSkillModifier;
+
+}
+
INT16 GetBurstToHitBonus( OBJECTTYPE * pObj, BOOLEAN fProneStance )
{
INT16 bonus=0;
@@ -9298,15 +9417,13 @@ INT16 GetBurstToHitBonus( OBJECTTYPE * pObj, BOOLEAN fProneStance )
return( bonus );
}
-void GetRecoil( OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet )
+void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet )
{
*bRecoilX = 0;
*bRecoilY = 0;
-//CHRISL: TODO: STOMP: The AUTO_WEAPS_OT and AUTO_WEAPONS_NT traits should probably modify recoil in some fashion to show that an experience shooter is
-// going to be better at compensating for recoil. Alternatively, perhaps the modifiers should go wherever recoil compensation is handled. Or even both
-// places should receive a modifier.
- if (ubNumBullet < 2)
+ //if (ubNumBullet < 2)
+ if (ubNumBullet < Weapon[pObj->usItem].ubRecoilDelay)
{
// The first bullet in a volley never has recoil - it hasn't "set in" yet. Only the second+ bullets
// will have any recoil.
@@ -9315,26 +9432,8 @@ void GetRecoil( OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBul
return;
}
- // Determine current gun recoil based on recoil array from the gun's properties.
- // We use either the value relevant to this bullet, or the last valid value encountered.
- // This allows a gun's recoil to vary during the firing. For instance, the second bullet might have
- // 0 vertical recoil, the third might have 1, then the fourth might have 5. Subsequent bullets will
- // all have 5 recoil since that's the end of the array.
-
- // Run X number of times, either to the end of the array or the number of bullets fired.
- for (UINT8 X = 1; X <= __min(3,ubNumBullet); X++)
- {
- // If this value is valid (-127 is considered invalid), record it.
- //if (Weapon[pObj->usItem].bRecoilX != -127)
- if (Weapon[pObj->usItem].ubRecoilDelay >= X)
- {
- *bRecoilX = Weapon[pObj->usItem].bRecoilX;
- //}
- //if (Weapon[pObj->usItem].bRecoilY != -127)
- //{
- *bRecoilY = Weapon[pObj->usItem].bRecoilY;
- }
- }
+ *bRecoilX = Weapon[pObj->usItem].bRecoilX;
+ *bRecoilY = Weapon[pObj->usItem].bRecoilY;
// Apply a percentage-based modifier. This can increase or decrease BOTH axes. At most, it can eliminate
// recoil on the gun.
@@ -9355,8 +9454,6 @@ void GetRecoil( OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBul
*bRecoilX = __max(0, *bRecoilX + bRecoilAdjustX);
*bRecoilY = __max(0, *bRecoilY + bRecoilAdjustY);
-
-
return;
}
@@ -9370,7 +9467,7 @@ void GetFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRec
INT8 bRecoilAdjustX = 0;
INT8 bRecoilAdjustY = 0;
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
// Inherent item modifiers
bRecoilAdjustX += BonusReduceMore( Item[pObj->usItem].RecoilModifierX, (*pObj)[0]->data.objectStatus );
@@ -9404,7 +9501,7 @@ INT16 GetPercentRecoilModifier( OBJECTTYPE *pObj )
{
INT16 sRecoilAdjust = 0;
- if (pObj->exists() == true)
+ if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
// Inherent item modifiers
sRecoilAdjust += BonusReduceMore( Item[pObj->usItem].PercentRecoilModifier, (*pObj)[0]->data.objectStatus );
@@ -9676,6 +9773,12 @@ INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier )
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->visionrangebonus > 0)
+ {
+ continue;
+ }
+
if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true) )
{
bonus += BonusReduceMore( pItem->visionrangebonus, (*pObj)[0]->data.objectStatus );
@@ -9746,6 +9849,12 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->nightvisionrangebonus > 0)
+ {
+ continue;
+ }
+
if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) )
{
bonus += BonusReduceMore(
@@ -9805,6 +9914,12 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->cavevisionrangebonus > 0)
+ {
+ continue;
+ }
+
if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) )
{
bonus += BonusReduceMore(
@@ -9866,6 +9981,12 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->dayvisionrangebonus > 0)
+ {
+ continue;
+ }
+
if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) )
{
bonus += BonusReduceMore( idiv( pItem->dayvisionrangebonus
@@ -9930,6 +10051,12 @@ INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->brightlightvisionrangebonus > 0)
+ {
+ continue;
+ }
+
if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) )
{
bonus += BonusReduceMore( idiv( pItem->brightlightvisionrangebonus
@@ -10029,6 +10156,12 @@ UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier )
continue;
}
+ //CHRISL: Binoculars can only be used in the primary hand
+ if(i == SECONDHANDPOS && pItem->usItemClass & IC_MISC && pItem->percenttunnelvision > 0)
+ {
+ continue;
+ }
+
if ( !IsWeapon(usItem) )
{
bonus = __max( bonus, pItem->percenttunnelvision );
@@ -10857,6 +10990,10 @@ void ApplyEquipmentBonuses(SOLDIERTYPE * pSoldier)
//if ( pSoldier->bInSector)
// pSoldier->CreateSoldierPalettes( );
+ SetCamoFace( pSoldier );
+ DeleteSoldierFace( pSoldier );// remove face
+ pSoldier->iFaceIndex = InitSoldierFace( pSoldier );// create new face
+
fInterfacePanelDirty = DIRTYLEVEL2;
}
@@ -10872,7 +11009,7 @@ UINT16 GetFirstExplosiveOfType(UINT16 expType)
}
// WDS - Smart goggle switching
-OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory )
+OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, INT8 * bSlot, BOOLEAN * isAttach, BOOLEAN searchAllInventory )
{
INT8 bLoop;
INT16 bonusToBeat = 0;
@@ -10886,16 +11023,21 @@ OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInvent
( Item[pSoldier->inv[bLoop].usItem].dayvisionrangebonus + Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus ) > bonusToBeat &&
Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE ) {
pGoggles = &(pSoldier->inv[bLoop]);
+ *bSlot = bLoop;
+ *isAttach = FALSE;
bonusToBeat = Item[pSoldier->inv[bLoop].usItem].dayvisionrangebonus + Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus;
}
if (searchAllInventory) {
- OBJECTTYPE* pObj = &(pSoldier->inv[bLoop]);
- for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
- if ( Item[ iter->usItem ].dayvisionrangebonus > 0 &&
- ( Item[ iter->usItem ].dayvisionrangebonus + Item[ iter->usItem ].brightlightvisionrangebonus ) > bonusToBeat &&
- Item[ iter->usItem ].usItemClass == IC_FACE && iter->exists() ) {
- pGoggles = &(*iter);
- bonusToBeat = Item[ iter->usItem ].dayvisionrangebonus + Item[ iter->usItem ].brightlightvisionrangebonus;
+ for (UINT8 loop = 0; loop < pSoldier->inv[bLoop].ubNumberOfObjects; loop ++){
+ for (attachmentList::iterator iter = pSoldier->inv[bLoop][loop]->attachments.begin(); iter != pSoldier->inv[bLoop][loop]->attachments.end(); ++iter) {
+ if ( iter->exists() && Item[ iter->usItem ].dayvisionrangebonus > 0 &&
+ ( Item[ iter->usItem ].dayvisionrangebonus + Item[ iter->usItem ].brightlightvisionrangebonus ) > bonusToBeat &&
+ Item[ iter->usItem ].usItemClass == IC_FACE ) {
+ pGoggles = &(*iter);
+ *bSlot = bLoop;
+ *isAttach = TRUE;
+ bonusToBeat = Item[ iter->usItem ].dayvisionrangebonus + Item[ iter->usItem ].brightlightvisionrangebonus;
+ }
}
}
}
@@ -10904,7 +11046,7 @@ OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInvent
return( pGoggles );
}
-OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory )
+OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, INT8 * bSlot, BOOLEAN * isAttach, BOOLEAN searchAllInventory )
{
INT8 bLoop;
INT16 bonusToBeat = 0;
@@ -10917,14 +11059,19 @@ OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInve
if ( pSoldier->inv[bLoop].exists() == true ) {
if (Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE ) {
pGoggles = &(pSoldier->inv[bLoop]);
+ *bSlot = bLoop;
+ *isAttach = FALSE;
bonusToBeat = Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus;
}
if (searchAllInventory) {
- OBJECTTYPE* pObj = &(pSoldier->inv[bLoop]);
- for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
- if ( Item[ iter->usItem ].nightvisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE && iter->exists() ) {
- pGoggles = &(*iter);
- bonusToBeat = Item[ iter->usItem ].nightvisionrangebonus;
+ for (UINT8 loop = 0; loop < pSoldier->inv[bLoop].ubNumberOfObjects; loop ++){
+ for (attachmentList::iterator iter = pSoldier->inv[bLoop][loop]->attachments.begin(); iter != pSoldier->inv[bLoop][loop]->attachments.end(); ++iter) {
+ if ( iter->exists() && Item[ iter->usItem ].nightvisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE ) {
+ pGoggles = &(*iter);
+ *bSlot = bLoop;
+ *isAttach = TRUE;
+ bonusToBeat = Item[ iter->usItem ].nightvisionrangebonus;
+ }
}
}
}
@@ -10938,14 +11085,19 @@ OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInve
if ( pSoldier->inv[bLoop].exists() == true ) {
if (Item[pSoldier->inv[bLoop].usItem].cavevisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE ) {
pGoggles = &(pSoldier->inv[bLoop]);
+ *bSlot = bLoop;
+ *isAttach = FALSE;
bonusToBeat = Item[pSoldier->inv[bLoop].usItem].cavevisionrangebonus;
}
if (searchAllInventory) {
- OBJECTTYPE* pObj = &(pSoldier->inv[bLoop]);
- for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
- if ( Item[ iter->usItem ].cavevisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE && iter->exists() ) {
- pGoggles = &(*iter);
- bonusToBeat = Item[ iter->usItem ].cavevisionrangebonus;
+ for (UINT8 loop = 0; loop < pSoldier->inv[bLoop].ubNumberOfObjects; loop ++){
+ for (attachmentList::iterator iter = pSoldier->inv[bLoop][loop]->attachments.begin(); iter != pSoldier->inv[bLoop][loop]->attachments.end(); ++iter) {
+ if ( Item[ iter->usItem ].cavevisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE && iter->exists() ) {
+ pGoggles = &(*iter);
+ *bSlot = bLoop;
+ *isAttach = TRUE;
+ bonusToBeat = Item[ iter->usItem ].cavevisionrangebonus;
+ }
}
}
}
@@ -10960,7 +11112,7 @@ FLOAT GetHighestScopeMagnificationFactor( OBJECTTYPE * pObj )
{
FLOAT BestFactor = 1.0;
- if ( pObj->exists() == true ) {
+ if ( pObj->exists() == true && UsingNewCTHSystem() == true ) {
BestFactor = Item[pObj->usItem].scopemagfactor;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -10991,14 +11143,44 @@ INT16 GetMinRangeForAimBonus( OBJECTTYPE * pObj )
return( bonus );
}
-FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE * pObj, UINT32 uiRange )
+FLOAT GetScopeMagnificationFactor( OBJECTTYPE * pObj, FLOAT uiRange )
{
FLOAT BestFactor = 1.0;
+ FLOAT CurrentFactor = 0.0;
FLOAT TargetMagFactor = __max(1.0f,(FLOAT)uiRange / (FLOAT)gGameCTHConstants.NORMAL_SHOOTING_DISTANCE);
+ FLOAT rangeModifier = gGameCTHConstants.SCOPE_RANGE_MULTIPLIER;
+
+ TargetMagFactor = TargetMagFactor / rangeModifier;
+
+ if(pObj->exists() == true && UsingNewCTHSystem() == true)
+ {
+ BestFactor = __max(1.0f, Item[pObj->usItem].scopemagfactor);
+
+ for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
+ {
+ if(iter->exists() == true)
+ {
+ if(BestFactor == 1.0f)
+ BestFactor = __max(BestFactor, Item[iter->usItem].scopemagfactor);
+ else if(Item[iter->usItem].scopemagfactor >= TargetMagFactor)
+ BestFactor = Item[iter->usItem].scopemagfactor;
+ }
+ }
+ }
+
+ return __max(1.0f, BestFactor);
+}
+
+FLOAT GetBestScopeMagnificationFactor( SOLDIERTYPE *pSoldier, OBJECTTYPE * pObj, FLOAT uiRange )
+{
+ FLOAT BestFactor = 1.0;
+ FLOAT TargetMagFactor = __max(1.0f,uiRange / (FLOAT)gGameCTHConstants.NORMAL_SHOOTING_DISTANCE);
FLOAT CurrentFactor = 0.0;
FLOAT ActualCurrentFactor = 0.0;
INT32 iCurrentTotalPenalty = 0;
- INT32 iBestTotalPenalty = 100;
+ INT32 iBestTotalPenalty = 0;
+ FLOAT rangeModifier = GetScopeRangeMultiplier(pSoldier, pObj, uiRange);
+ FLOAT iProjectionFactor = CalcProjectionFactor(pSoldier, pObj, uiRange, 1);
if (TargetMagFactor <= 1.0f)
{
@@ -11006,7 +11188,7 @@ FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE * pObj, UINT32 uiRange )
return 1.0f;
}
- if ( pObj->exists() == true )
+ if ( pObj->exists() == true && UsingNewCTHSystem() == true )
{
// Real Scope Magnification Factor from the item
CurrentFactor = __max(1.0f, Item[pObj->usItem].scopemagfactor);
@@ -11014,36 +11196,23 @@ FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE * pObj, UINT32 uiRange )
if (CurrentFactor > 1.0f)
{
// Actual Scope Mag Factor is what we get at the distance the target's at.
- ActualCurrentFactor = __min(CurrentFactor, TargetMagFactor);
+ ActualCurrentFactor = __min(CurrentFactor, (TargetMagFactor/rangeModifier));
- if (TargetMagFactor >= CurrentFactor)
+ if (ActualCurrentFactor >= CurrentFactor)
{
// This scope gives no penalty. Record this as the best factor found so far.
BestFactor = CurrentFactor;
- // Record the penalty (or rather, the bonus) this scope gives.
- iBestTotalPenalty = (INT32)((-1) * ((CurrentFactor * 100) - 100));
+ iBestTotalPenalty = 0;
}
else
{
- // This scopes gives a penalty for shooting under its range. Let's figure out whether
- // the scope's mag factor is worth the penalty it gives.
- FLOAT dScopePenaltyRatio = (CurrentFactor / TargetMagFactor)-1.0f;
- INT32 iScopePenalty = abs((INT32)(dScopePenaltyRatio * gGameCTHConstants.AIM_TOO_CLOSE_SCOPE) * (CurrentFactor / 2));
+ // This scopes gives a penalty for shooting under its range.
+ FLOAT dScopePenaltyRatio = (CurrentFactor * rangeModifier / TargetMagFactor);
+ INT32 iScopePenalty = (INT32)((dScopePenaltyRatio * gGameCTHConstants.AIM_TOO_CLOSE_SCOPE) * (CurrentFactor / 2));
- // How much bonus does this scope mag factor give us at this range?
- INT32 iScopeBonus = (INT32)((ActualCurrentFactor * 100) - 100);
-
- // Do we get any benefit from using this scope?
- if (iScopeBonus - iScopePenalty >= 0)
- {
- // This scope gives at least some benefit, so let's record how much.
- BestFactor = CurrentFactor;
- iBestTotalPenalty = iScopePenalty - iScopeBonus;
- }
- else
- {
- // This scope gives more penalty than it's worth. Ignore it!
- }
+ // There's no previous scope to compare with so record this as the best factor for now.
+ BestFactor = CurrentFactor;
+ iBestTotalPenalty = iScopePenalty;
}
}
@@ -11058,55 +11227,30 @@ FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE * pObj, UINT32 uiRange )
CurrentFactor = __max(1.0f, Item[iter->usItem].scopemagfactor);
// Actual Scope Mag Factor is what we get at the distance the target's at.
- ActualCurrentFactor = __min(CurrentFactor, TargetMagFactor);
+ ActualCurrentFactor = __min(CurrentFactor, (TargetMagFactor/rangeModifier));
- if (TargetMagFactor >= CurrentFactor)
+ if (ActualCurrentFactor >= CurrentFactor)
{
// This scope gives no penalty. Is it any better than the ones we've already processed?
- iCurrentTotalPenalty = (INT32)((-1) * ((CurrentFactor * 100) - 100));
- if (iCurrentTotalPenalty < iBestTotalPenalty)
+ if (iBestTotalPenalty >= 0 && CurrentFactor > BestFactor)
{
// This is the best scope we've found so far. Record it.
BestFactor = CurrentFactor;
- // Record the penalty (or rather, the bonus) this scope gives.
- iBestTotalPenalty = iCurrentTotalPenalty;
- }
- else
- {
- // Ignore this scope, it can't match any others found on this gun, at this range.
- continue;
+ iBestTotalPenalty = 0;
}
}
else
{
// This scope will give a penalty if used. Is it worth using compared to other scopes found?
- FLOAT dScopePenaltyRatio = (CurrentFactor / TargetMagFactor)-1.0f;
- INT32 iScopePenalty = abs((INT32)(dScopePenaltyRatio * gGameCTHConstants.AIM_TOO_CLOSE_SCOPE * (CurrentFactor/2)));
+ FLOAT dScopePenaltyRatio = (CurrentFactor * rangeModifier / TargetMagFactor);
+ INT32 iScopePenalty = (INT32)((dScopePenaltyRatio * gGameCTHConstants.AIM_TOO_CLOSE_SCOPE) * (CurrentFactor / 2));
- // How much bonus does this scope mag factor give us at this range?
- INT32 iScopeBonus = (INT32)((ActualCurrentFactor * 100) - 100);
-
- // Do we get any benefit from using this scope?
- if (iScopeBonus - iScopePenalty >= 0)
+ // Is this scope any better than the ones we've already processed?
+ if (iScopePenalty < iBestTotalPenalty)
{
- // Is this scope any better than the ones we've already processed?
- iCurrentTotalPenalty = iScopePenalty - iScopeBonus;
- if (iCurrentTotalPenalty < iBestTotalPenalty)
- {
- // This is the best scope we've found so far. Record it.
- BestFactor = CurrentFactor;
- // Record the penalty (or rather, the bonus) this scope gives.
- iBestTotalPenalty = iCurrentTotalPenalty;
- }
- else
- {
- // We've found better scopes before. Ignore it.
- continue;
- }
- }
- else
- {
- // This scope gives more penalty than it's worth. Ignore it!
+ // This is the best scope we've found so far. Record it.
+ BestFactor = CurrentFactor;
+ iBestTotalPenalty = iScopePenalty;
}
}
}
@@ -11114,6 +11258,10 @@ FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE * pObj, UINT32 uiRange )
}
+ // Now that we have selected the best available scope, don't use it if we get a penalty and have a functional laser
+ if(iBestTotalPenalty < 0 && iProjectionFactor > 1.0f)
+ BestFactor = 1.0f;
+
return( __max(1.0f, BestFactor) );
}
@@ -11122,7 +11270,7 @@ FLOAT GetProjectionFactor( OBJECTTYPE * pObj )
{
FLOAT BestFactor = 1.0;
- if ( pObj->exists() == true ) {
+ if ( pObj->exists() == true && UsingNewCTHSystem() == true ) {
BestFactor = __max((FLOAT)Item[pObj->usItem].projectionfactor, 1.0f);
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
@@ -11137,17 +11285,36 @@ FLOAT GetProjectionFactor( OBJECTTYPE * pObj )
return( BestFactor );
}
+FLOAT GetScopeRangeMultiplier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, FLOAT d2DDistance )
+{
+ FLOAT iScopeFactor = 0;
+ FLOAT rangeModifier = gGameCTHConstants.SCOPE_RANGE_MULTIPLIER;
+
+ iScopeFactor = GetScopeMagnificationFactor( pObj, d2DDistance );
+ if( gGameOptions.fNewTraitSystem )
+ {
+ if(iScopeFactor > 5.0f)
+ rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ) * 0.05f);
+ else
+ rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) * 0.05f);
+ }
+ else
+ rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT ) * 0.05f);
+
+ return rangeModifier;
+}
+
UINT8 AllowedAimingLevelsNCTH( SOLDIERTYPE *pSoldier, INT32 sGridNo )
{
UINT8 aimLevels = 4;
- FLOAT iScopeMagFactor = 0.0, rangeMultiplier = gGameCTHConstants.SCOPE_RANGE_MULTIPLIER;
+ FLOAT iScopeMagFactor = 0.0, rangeMultiplier = 0.0;
BOOLEAN allowed = TRUE;
- INT8 ubSkillModifier;
UINT16 weaponRange;
UINT8 weaponType;
BOOLEAN fTwoHanded, fUsingBipod;
UINT32 uiRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo );
+ rangeMultiplier = GetScopeRangeMultiplier(pSoldier, &pSoldier->inv[pSoldier->ubAttackingHand], (FLOAT)uiRange);
// HEADROCK HAM 4: This function has been radically altered AGAIN for the NCTH project.
// Weapons can now have a tag that defines how many aim clicks they should have. Under the NCTH
@@ -11202,32 +11369,7 @@ UINT8 AllowedAimingLevelsNCTH( SOLDIERTYPE *pSoldier, INT32 sGridNo )
// HEADROCK HAM 4: This modifier from the weapon and its attachments replaces the generic bipod bonus.
aimLevels += GetAimLevelsModifier( &pSoldier->inv[pSoldier->ubAttackingHand], gAnimControl[ pSoldier->usAnimState ].ubHeight );
- // HEADROCK HAM 4: Sniper skill reduces aiming levels by one per skill level. This actually makes guns FASTER
- // to aim, since aiming-bonus per click is based on the number of allowed levels.
- iScopeMagFactor = GetBestScopeMagnificationFactor(&pSoldier->inv[pSoldier->ubAttackingHand], uiRange);
-
- if( gGameOptions.fNewTraitSystem )
- {
- if(iScopeMagFactor > .5)
- rangeMultiplier -= (NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ) * 0.05f);
- else
- rangeMultiplier -= (NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) * 0.05f);
- if ( weaponType == GUN_PISTOL || weaponType == GUN_M_PISTOL )
- ubSkillModifier = NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT );
- else
- ubSkillModifier = NUM_SKILL_TRAITS( pSoldier, SNIPER_NT );
- aimLevels -= ubSkillModifier;
- }
- else
- {
- rangeMultiplier -= (NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT ) * 0.05f);
- ubSkillModifier = NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT );
- if (iScopeMagFactor > 1.0f && (iScopeMagFactor * gGameCTHConstants.NORMAL_SHOOTING_DISTANCE * rangeMultiplier) <= uiRange)
- {
- // Make sure final level isn't going to be below 1...
- aimLevels -= ubSkillModifier;
- }
- }
+ aimLevels += GetAimLevelsTraitModifier( pSoldier, &pSoldier->inv[pSoldier->ubAttackingHand]);
aimLevels = __max(1, aimLevels);
aimLevels = __min(8, aimLevels);
@@ -11369,13 +11511,17 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo)
fUsingBipod = TRUE;
}
+
// don't break compatibility, let the users choose
- sScopeBonus = gGameExternalOptions.fAimLevelsDependOnDistance ?
- //WarmSteel - Using scope aimbonus instead, as it is used elsewhere like this too.
- //Also, you won't get extra aimclicks anymore if you're too close to use your scope.
- //I've externalized the scope types.
- GetBaseScopeAimBonus( &pSoldier->inv[pSoldier->ubAttackingHand], uiRange )
- : GetMinRangeForAimBonus( &pSoldier->inv[pSoldier->ubAttackingHand]);
+ if (gGameExternalOptions.iAimLevelsCompatibilityOption != 0)
+ sScopeBonus = OldWayOfCalculatingScopeBonus(pSoldier);
+ else
+ sScopeBonus = gGameExternalOptions.fAimLevelsDependOnDistance ?
+ //WarmSteel - Using scope aimbonus instead, as it is used elsewhere like this too.
+ //Also, you won't get extra aimclicks anymore if you're too close to use your scope.
+ //I've externalized the scope types.
+ GetBaseScopeAimBonus( &pSoldier->inv[pSoldier->ubAttackingHand], uiRange )
+ : GetMinRangeForAimBonus( &pSoldier->inv[pSoldier->ubAttackingHand]);
if ( sScopeBonus >= gGameExternalOptions.sVeryHighPowerScope )
{
@@ -11422,11 +11568,13 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo)
// The result is that if fAimLevelsDependOnDistance is false, all scopes are going to grant +4 aim clicks which is definitely not what
// we want to happen. What we do want is simply to know whether we should send the range or use an extreme range value to guarantee that
// the scope is factored.
- // don't break compatibility, let the users choose
// sScopeBonus = gGameExternalOptions.fAimLevelsDependOnDistance ?
// GetBaseScopeAimBonus( pAttackingWeapon, iRange )
// : GetMinRangeForAimBonus( pAttackingWeapon );
- sScopeBonus = gGameExternalOptions.fAimLevelsDependOnDistance ? GetBaseScopeAimBonus( pAttackingWeapon, uiRange ) : GetBaseScopeAimBonus( pAttackingWeapon, 25000 );
+ if (gGameExternalOptions.iAimLevelsCompatibilityOption != 0)
+ sScopeBonus = OldWayOfCalculatingScopeBonus(pSoldier);
+ else
+ sScopeBonus = gGameExternalOptions.fAimLevelsDependOnDistance ? GetBaseScopeAimBonus( pAttackingWeapon, uiRange ) : GetBaseScopeAimBonus( pAttackingWeapon, 25000 );
if ( sScopeBonus >= gGameExternalOptions.sVeryHighPowerScope )
{
@@ -11453,10 +11601,14 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo)
}
}
+ //CHRISL: Make sure we always limit to the proper number of aim clicks
+ aimLevels = __max(1, aimLevels);
+ aimLevels = __min(8, aimLevels);
+
return aimLevels;
}
-UINT8 GetAllowedAimingLevelsForItem( OBJECTTYPE *pObj, UINT8 ubStance )
+UINT8 GetAllowedAimingLevelsForItem( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, UINT8 ubStance )
{
if ( !(Item[pObj->usItem].usItemClass & (IC_GUN|IC_LAUNCHER|IC_THROWING_KNIFE)) )
{
@@ -11472,43 +11624,53 @@ UINT8 GetAllowedAimingLevelsForItem( OBJECTTYPE *pObj, UINT8 ubStance )
UINT16 weaponRange;
UINT8 weaponType;
BOOLEAN fTwoHanded, fUsingBipod;
+
+ aimLevels = 0;
// Read weapon data
fTwoHanded = Item[pObj->usItem].twohanded;
weaponRange = Weapon[Item[pObj->usItem].ubClassIndex].usRange + GetRangeBonus(pObj);
weaponType = Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType;
fUsingBipod = FALSE;
+ if(UsingNewCTHSystem() == true)
+ aimLevels = Weapon[Item[pObj->usItem].ubClassIndex].ubAimLevels;
- // Define basic (no attachments), and absolute maximums
- if (weaponType == GUN_PISTOL || weaponType == GUN_M_PISTOL || fTwoHanded == 0)
+ // Only use default values if we don't find a weapon specific value.
+ if(aimLevels == 0)
{
- aimLevels = 2;
- }
- else if (weaponType == GUN_SHOTGUN || weaponType == GUN_LMG || weaponType == GUN_SMG)
- {
- aimLevels = 3;
- }
- else if ((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE ) && weaponRange <= 500)
- {
- aimLevels = 4;
- }
- else if (((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE) && weaponRange > 500) ||
- (weaponType == GUN_SN_RIFLE && weaponRange <= 500))
- {
- aimLevels = 6;
- }
- else if (weaponType == GUN_SN_RIFLE && weaponRange > 500)
- {
- aimLevels = 8;
- }
- else
- {
- return 4;
+ // Define basic (no attachments), and absolute maximums
+ if (weaponType == GUN_PISTOL || weaponType == GUN_M_PISTOL || fTwoHanded == 0)
+ {
+ aimLevels = 2;
+ }
+ else if (weaponType == GUN_SHOTGUN || weaponType == GUN_LMG || weaponType == GUN_SMG)
+ {
+ aimLevels = 3;
+ }
+ else if ((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE ) && weaponRange <= 500)
+ {
+ aimLevels = 4;
+ }
+ else if (((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE) && weaponRange > 500) ||
+ (weaponType == GUN_SN_RIFLE && weaponRange <= 500))
+ {
+ aimLevels = 6;
+ }
+ else if (weaponType == GUN_SN_RIFLE && weaponRange > 500)
+ {
+ aimLevels = 8;
+ }
+ else
+ {
+ return 4;
+ }
}
// HEADROCK HAM 4: This modifier from the weapon and its attachments replaces the generic bipod bonus.
aimLevels += GetAimLevelsModifier( pObj, ubStance );
+ aimLevels += GetAimLevelsTraitModifier( pSoldier, pObj );
+
aimLevels = __max(1, aimLevels);
aimLevels = __min(8, aimLevels);
@@ -11873,7 +12035,7 @@ INT32 GetGunAccuracy( OBJECTTYPE *pObj )
INT32 GetAccuracyModifier( OBJECTTYPE *pObj )
{
INT32 bonus = 0;
- if ( pObj->exists() == true )
+ if ( pObj->exists() == true && UsingNewCTHSystem() == true )
{
bonus += Item[ pObj->usItem ].percentaccuracymodifier;
@@ -11893,6 +12055,7 @@ INT32 GetAccuracyModifier( OBJECTTYPE *pObj )
}
// HEADROCK HAM 3.6: This is meant to squash an exploit where a backpack can be moved to your hand to avoid AP penalties.
+// CHRISL: Carrying an empty backpack in a none BACKPACKPOS location shoudln't be an issue.
INT8 FindBackpackOnSoldier( SOLDIERTYPE * pSoldier )
{
INT8 bLoop;
@@ -11901,10 +12064,16 @@ INT8 FindBackpackOnSoldier( SOLDIERTYPE * pSoldier )
{
if (pSoldier->inv[bLoop].exists())
{
+ if( bLoop == BPACKPOCKPOS )
+ return( bLoop );
if (Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_LBEGEAR &&
LoadBearingEquipment[Item[pSoldier->inv[bLoop].usItem].ubClassIndex].lbeClass == BACKPACK)
{
- return( bLoop );
+ for (INT8 bLoop2 = 0; bLoop2 < pSoldier->inv[bLoop].ubNumberOfObjects; bLoop2++)
+ {
+ if(pSoldier->inv[bLoop].IsActiveLBE(bLoop2) == true)
+ return( bLoop );
+ }
}
}
}
@@ -12152,4 +12321,11 @@ BOOLEAN UseTotalMedicalKitPoints( SOLDIERTYPE * pSoldier, UINT16 usPointsToConsu
return( TRUE );
}
-
+static UINT16 OldWayOfCalculatingScopeBonus(SOLDIERTYPE *pSoldier)
+{
+ // Yes, this may look stupid, maybe it IS stupid, but this is purely an option
+ // to use code that was checked in before.
+ // Please, do not trash it again.
+ return max(0, GetMinRangeForAimBonus(& pSoldier->inv[pSoldier->ubAttackingHand])
+ * gGameExternalOptions.iAimLevelsCompatibilityOption / gGameExternalOptions.ubStraightSightRange);
+}
diff --git a/Tactical/Items.h b/Tactical/Items.h
index cdc8f304..0d8260e3 100644
--- a/Tactical/Items.h
+++ b/Tactical/Items.h
@@ -64,6 +64,7 @@ UINT16 RandomMagazine( UINT16 usItem, UINT8 ubPercentStandard, UINT8 maxCoolness
UINT16 RandomMagazine( OBJECTTYPE * pGun, UINT8 ubPercentStandard, UINT8 maxCoolness );
extern BOOLEAN ReloadGun( SOLDIERTYPE * pSoldier, OBJECTTYPE * pGun, OBJECTTYPE * pAmmo, UINT32 subObject = 0 );
+bool IsBackpackSlot(INT8 bSlot);
// CHRISL: Add new inventory version of ItemSlotLimit function
UINT8 ItemSlotLimit( OBJECTTYPE * pObject, INT16 bSlot, SOLDIERTYPE *pSoldier = NULL, BOOLEAN cntAttach = TRUE);
@@ -85,6 +86,9 @@ BOOLEAN ArmBomb( OBJECTTYPE * pObj, INT8 bSetting );
// "in the cursor", which should have memory allocated for it already
BOOLEAN PlaceObject( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj );
+BOOLEAN AutoPlaceObjectAnywhere(SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNewItem, INT8 bExcludeSlot = NO_SLOT);
+BOOLEAN AutoPlaceObjectToWorld(SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, INT8 bVisible = TRUE);
+
// Send fNewItem to true to set off new item glow in inv panel
BOOLEAN AutoPlaceObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNewItem, INT8 bExcludeSlot = NO_SLOT );
@@ -272,6 +276,7 @@ INT32 GetCounterForceAccuracyModifier( OBJECTTYPE *pObj, UINT8 ubStance );
INT32 GetCounterForceFrequencyModifier( OBJECTTYPE *pObj, UINT8 ubStance );
INT32 GetTargetTrackingModifier( OBJECTTYPE *pObj, UINT8 ubStance );
INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance );
+INT32 GetAimLevelsTraitModifier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj );
// Returns the character's stance as 0/1/2.
INT8 GetStanceModifierRef( INT8 ubStance );
@@ -290,7 +295,7 @@ BOOLEAN HasFastBurst( OBJECTTYPE * pObj );
INT16 GetMagSizeBonus( OBJECTTYPE * pObj, UINT8 subObject = 0 );
// HEADROCK HAM 4: This function now calculates and returns the weapon's recoil as X/Y offsets.
-void GetRecoil( OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet );
+void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet );
void GetFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY );
INT16 GetPercentRecoilModifier( OBJECTTYPE *pObj );
// HEADROCK HAM 4: This function returns whether the last bullet in a burst/autofire volley was a tracer.
@@ -382,19 +387,21 @@ INT16 GetAPBonus( OBJECTTYPE * pObj );
UINT16 GetFirstExplosiveOfType(UINT16 expType);
-OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory = FALSE );
-OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory = FALSE );
+OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, INT8 * bSlot, BOOLEAN * isAttach, BOOLEAN searchAllInventory = FALSE );
+OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, INT8 * bSlot, BOOLEAN * isAttach, BOOLEAN searchAllInventory = FALSE );
UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo);
// HEADROCK HAM 4: New functions to determine Scope and Laser factors on a weapon.
FLOAT GetHighestScopeMagnificationFactor( OBJECTTYPE *pObj );
-FLOAT GetBestScopeMagnificationFactor( OBJECTTYPE *pObj, UINT32 uiRange );
+FLOAT GetScopeMagnificationFactor( OBJECTTYPE *pObj, FLOAT uiRange );
+FLOAT GetBestScopeMagnificationFactor( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, FLOAT uiRange );
FLOAT GetProjectionFactor( OBJECTTYPE *pObj );
+FLOAT GetScopeRangeMultiplier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, FLOAT d2DDistance );
INT32 GetGunAccuracy( OBJECTTYPE *pObj );
INT32 GetAccuracyModifier( OBJECTTYPE *pObj );
// HEADROCK HAM 4: Added range factor
UINT8 AllowedAimingLevelsNCTH( SOLDIERTYPE *pSoldier, INT32 sGridNo);
-UINT8 GetAllowedAimingLevelsForItem( OBJECTTYPE *pObj, UINT8 ubStance );
+UINT8 GetAllowedAimingLevelsForItem( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, UINT8 ubStance );
INT16 GetWornUrbanCamo( SOLDIERTYPE * pSoldier );
INT16 GetUrbanCamoBonus( OBJECTTYPE * pObj );
diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp
index 21438b1f..12ca0322 100644
--- a/Tactical/LOS.cpp
+++ b/Tactical/LOS.cpp
@@ -3562,7 +3562,7 @@ UINT8 CalcChanceToGetThrough( BULLET * pBullet )
// HEADROCK HAM 4: Using new gravity constant from INI. See also a second change below.
if ((UsingNewCTHSystem() == false && pBullet->iLoop > pBullet->iRange * 2) ||
- (UsingNewCTHSystem() == true && pBullet->iLoop > pBullet->iRange * gGameCTHConstants.GRAVITY_COEFFICIENT))
+ (UsingNewCTHSystem() == true && pBullet->iLoop > (INT32)(pBullet->iRange * gGameCTHConstants.RANGE_COEFFICIENT)))
{
// beyond max effective range, bullet starts to drop!
// since we're doing an increment based on distance, not time, the
@@ -4229,6 +4229,11 @@ INT8 FireBulletGivenTargetNCTH( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY,
//if ( ubLoop == 0 )
if( ubShots == 1 )
{
+ // CHRISL: If we don't set the ddHorizAngle, at the very least, shooting by corners is impossible. Unfortunately, I don't know what other
+ // impacts these two lines will have. Headrock didn't include them when he originally wrote NCTH but they are in a similar location in the
+ // OCTH code. Hopefully no issues will result from this change.
+ ddHorizAngle = ddOrigHorizAngle;
+ ddVerticAngle = ddOrigVerticAngle;
// HEADROCK HAM 4: Firing increments no longer required here (NCTH)
// calculate by hand (well, without angles) to match LOS
pBullet->qIncrX = FloatToFixed( dDeltaX / (FLOAT)iDistance );
@@ -5871,8 +5876,7 @@ void MoveBullet( INT32 iBullet )
FLOAT dDistanceMoved = PythSpacesAway( pBullet->pFirer->sGridNo, pBullet->sGridNo ) * 10.0f;
// HEADROCK HAM 4: Now using an INI=set Gravity Constant.
- // HEADROCK HAM 4: TODO: Should this also be changed to use the Gravity Coefficient?
- if ( (dDistanceMoved > pBullet->iRange) )
+ if ( (dDistanceMoved > (FLOAT)pBullet->iRange*gGameCTHConstants.RANGE_COEFFICIENT) )
{
// beyond max effective range, bullet starts to drop!
// since we're doing an increment based on distance, not time, the
@@ -6502,6 +6506,7 @@ BOOLEAN CalculateLOSNormal( STRUCTURE *pStructure, INT8 bLOSX, INT8 bLOSY, INT8
void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT *dEndX, FLOAT *dEndY, FLOAT *dEndZ, OBJECTTYPE *pWeapon, UINT32 uiMuzzleSway, INT16 *sApertureRatio )
{
+ SOLDIERTYPE *pTarget = SimpleFindSoldier( iTargetGridNo, pShooter->bTargetLevel );
///////////////////////////////////////////
// Calculate shooter's coordinates
@@ -6651,12 +6656,14 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
// Note that the Target Tracking formula only adjusts the muzzle along the X-Axis, I.E. moving the
// shot behind the target, never up or down.
- SOLDIERTYPE *pTarget = SimpleFindSoldier( iTargetGridNo, pShooter->bTargetLevel );
if (pTarget)
{
CalcTargetMovementOffset( pShooter, pTarget, pWeapon, &dMuzzleOffsetX, ddOrigHorizAngle, (INT32)iAperture );
}
+ pShooter->dInitialMuzzleOffsetX = dMuzzleOffsetX;
+ pShooter->dInitialMuzzleOffsetY = dMuzzleOffsetY;
+
/////////////////////////////////////////////
// First shot in a burst/auto volley
@@ -6733,7 +6740,7 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
UINT16 uiRange = GunRange(pWeapon, pShooter);
// Is the target beyond the gun's range?
- if (d2DDistance > (FLOAT)uiRange)
+ if (d2DDistance > ((FLOAT)uiRange*gGameCTHConstants.RANGE_COEFFICIENT))
{
//////////////////////////////////////////////////////////////////////////////////////////
// STEP 5: Bullet Drop Compensation
@@ -6765,7 +6772,7 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
// within that circle, and sends the bullet that way. Over greater distances, this can amount to
// several penalties, thus making accurate weapons essential for any long-range shot.
- CalcBulletDeviation( pShooter, &dShotOffsetX, &dShotOffsetY, pWeapon, (UINT32)d2DDistance );
+ FLOAT iBulletDev = CalcBulletDeviation( pShooter, &dShotOffsetX, &dShotOffsetY, pWeapon, (UINT32)d2DDistance );
/////////////////////////////////////////////////////////////////////////////////////////////
// STEP 7: Limit Shot Angle
@@ -6776,6 +6783,7 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
// result of too many modifiers by the previous functions. In addition, the INI value also
// affects accuracy of ALL shots in the game, and is enforced here a second time.
+ LimitImpactPointByFacing( pShooter, pTarget, &dShotOffsetX, &dShotOffsetY, dEndX, dEndY );
LimitImpactPointToMaxAperture( &dShotOffsetX, &dShotOffsetY, iDistanceAperture );
@@ -6802,9 +6810,9 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
swprintf(szUpDown, L"down");
}
- if (pShooter->bDoBurst == 1)
+ if (pShooter->bDoBurst == 0 || pShooter->bDoBurst == 1)
{
- ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, L"%d. Shot aperture %2.1f, goes %2.1f %s and %2.1f %s", pShooter->bDoBurst, iAperture, dShotOffsetX, szLeftRight, dShotOffsetY, szUpDown );
+ ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, L"%d. Shot aperture %2.1f, Accuracy %2.1f, goes %2.1f %s and %2.1f %s", pShooter->bDoBurst, iAperture, iBulletDev, dShotOffsetX, szLeftRight, dShotOffsetY, szUpDown );
}
else
{
@@ -6846,43 +6854,42 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
*dEndY += dSecondDeltaY;
*dEndZ = __max(-127, *dEndZ + (dShotOffsetY * 11.3f)); // Y, which represented up/down offset, is actually the Z axis in 3d game terms...
- // These values are returned to the calling function, in this case UseGun(). That function then fires the bullet
+ // These values are returned to the calling function, in this case UseGunNCTH(). That function then fires the bullet
// directly at the intended coordinates.
}
+FLOAT CalcProjectionFactor( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT d2DDistance, UINT8 ubAimTime )
+{
+ FLOAT iProjectionFactor = 1.0f;
+ FLOAT iTargetMagFactor = d2DDistance / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE;
+
+ if (ubAimTime > 0)
+ {
+ iProjectionFactor = GetProjectionFactor( pWeapon );
+ if (floor(iTargetMagFactor*10) > floor(iProjectionFactor*10.001))
+ {
+ iProjectionFactor -= (iTargetMagFactor - iProjectionFactor);
+ iProjectionFactor = __max(iProjectionFactor, 1.0f);
+ }
+ }
+
+ return iProjectionFactor;
+}
+
FLOAT CalcMagFactor( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT d2DDistance, UINT8 ubAimTime )
{
FLOAT iFinalMagFactor = 0;
FLOAT iScopeFactor = 0;
FLOAT iProjectionFactor = 0;
+ FLOAT iTargetMagFactor = d2DDistance / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE;
+ FLOAT rangeModifier = GetScopeRangeMultiplier(pShooter, pWeapon, d2DDistance);
if (ubAimTime > 0)
{
- iScopeFactor = GetBestScopeMagnificationFactor( pWeapon, (UINT32)d2DDistance );
- iProjectionFactor = GetProjectionFactor( pWeapon );
-
- // Now calculate the optimal magnification that would be required for the target's current distance.
- FLOAT iTargetMagFactor = d2DDistance / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE;
-
- if (iTargetMagFactor > iProjectionFactor)
- {
- // Projection items, like lasers or red dot sights, work up to their "best" range without error.
- // If the target is closer than that best range, the projection factor remains the same, helping
- // all shots at the target be more accurate.
- // However, if the target is further away, the projection begins to lose its effectiveness, becoming
- // less useful until it loses all value.
- iProjectionFactor -= (iTargetMagFactor - iProjectionFactor);
- iProjectionFactor = __max(iProjectionFactor, 1.0f);
- }
- if (iTargetMagFactor < iScopeFactor)
- {
- // Scopes give their best Mag Factor at a certain distance and beyond that distance. If the target is
- // closer however, it's the target's distance that determines the scope's mag factor. This makes scopes
- // quite less useful at ranges closer than they are intended for.
- iScopeFactor = iTargetMagFactor;
- }
- // The final factor is the largest of the two.
+ iScopeFactor = GetBestScopeMagnificationFactor( pShooter, pWeapon, d2DDistance );
+ iScopeFactor = __min(iScopeFactor, __max(1.0f, iTargetMagFactor/rangeModifier));
+ iProjectionFactor = CalcProjectionFactor(pShooter, pWeapon, d2DDistance, ubAimTime);
iFinalMagFactor = __max(iScopeFactor, iProjectionFactor);
}
else
@@ -6985,6 +6992,15 @@ void CalcTargetMovementOffset( SOLDIERTYPE *pShooter, SOLDIERTYPE *pTarget, OBJE
INT16 sDistanceMoved = (INT16)sqrt((double) (sDeltaX * sDeltaX) + (sDeltaY * sDeltaY));
sDistanceMoved /= CELL_X_SIZE; // convert to Tiles.
+ //CHRISL: The above all assumes that the target is actually still possibly moving at the same rate
+ // he was moving at before the end of his turn. But what happens if a target moves, stops and
+ // changes stance? We use usAnimState to figure out what stance we're currently in by looking at
+ // out current animation state. And I think usUIMovementMode tells us what animation state we
+ // last moved in. So if these two values are different, we should be able to assume that the target
+ // has stopped moving.
+ if (pTarget->usAnimState != pTarget->usUIMovementMode)
+ sDistanceMoved = 0;
+
if (sDistanceMoved == 0)
{
//Target hasn't moved. Simply abort the formula, as there will be no movement penalty anyway.
@@ -7129,7 +7145,7 @@ void CalcRangeCompensationOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetY,
// and how fast it is spinning along its axis will all determine how far it can go before this happens.
//
// The JA2 Bullet Mechanism already simulates this effect, by decreasing a bullet's vertical angle repeatedly
- // once it crosses its "maximum range" (as defined by the weapon's Range property). The bullet falls to the
+ // once it crosses its "maximum range" (as defined by twice the weapon's Range property). The bullet falls to the
// ground with increasing rapidity, until it collides with the ground.
//
// NCTH uses this principle in reverse - allowing shooters to compensate for this effect and thereby increase
@@ -7149,7 +7165,7 @@ void CalcRangeCompensationOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetY,
// Avoid division by 0.
return;
}
- if (usGunRange >= iRangeToTarget)
+ if ((usGunRange*gGameCTHConstants.RANGE_COEFFICIENT) >= iRangeToTarget)
{
return;
}
@@ -7164,7 +7180,7 @@ void CalcRangeCompensationOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetY,
// We now take the Range to Target and the Maximum Range for the bullet, and find the distance between them.
// This is how much distance the bullet has to cover while dropping out of the sky. In other words, we need to
// make the bullet fly this much longer than it would normally have.
- INT32 iRangeDiff = (iRangeToTarget-usGunRange) / 10;
+ INT32 iRangeDiff = (iRangeToTarget-(UINT32)(usGunRange*gGameCTHConstants.RANGE_COEFFICIENT)) / 10;
// To know how much we need to raise our muzzle, what we do is calculate how far below the target the bullet would
// hit, assuming no muzzle adjustment, and pretending there's no ground to collide with. The result is equal to
@@ -7271,7 +7287,7 @@ void CalcMuzzleSway( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzl
*dMuzzleOffsetY += (dDeltaY * bUpDown) * dVerticalBias;
}
-void CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange )
+FLOAT CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange )
{
//////////////////////////////////////////////////////////////////////////////////////////////////
// HEADROCK HAM 4: New Shooting Mechanism, Bullet Deviation
@@ -7301,6 +7317,15 @@ void CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dSh
// We start by reading the gun's Accuracy value. We'll use that as the basis for everything else.
INT16 sAccuracy = GetGunAccuracy( pWeapon );
+ UINT16 sEffRange = Weapon[Item[pShooter->inv[pShooter->ubAttackingHand].usItem].ubClassIndex].usRange + GetRangeBonus(&(pShooter->inv[ pShooter->ubAttackingHand ]));
+
+ // WANNE: I got a CTD in a multiplayer test game, because sEffRange was 0 (division to zero).
+ // I don't know why this happend?
+ FLOAT iRangeRatio = 1.0f;
+ if (sEffRange > 0)
+ {
+ iRangeRatio = __max(1.0f, (FLOAT)(uiRange / sEffRange));
+ }
// This value can be anywhere between 0 and 100. Let's make sure.
sAccuracy = __max(0, sAccuracy);
@@ -7313,12 +7338,15 @@ void CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dSh
// deviation circle (100% radius), while a gun with accuracy 100 produces a minimal sized
// circle (actually, a dot with 0% radius).
FLOAT iBulletDev = (gGameCTHConstants.MAX_BULLET_DEV * (100-sAccuracy)) / 100;
+ if (gGameCTHConstants.RANGE_EFFECTS_DEV == TRUE)
+ iBulletDev *= iRangeRatio;
+ iBulletDev /= 2; // This compensates for the difference between CellXY and ScreenXY
// If the radius is 0, this gun's bullets are flawless, and will never deviate from where
// they were fired.
if (iBulletDev == 0)
{
- return;
+ return (iBulletDev);
}
// So now, iBulletDev is a maximum deviation for any bullet coming out of this weapon.
@@ -7348,6 +7376,96 @@ void CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dSh
*dShotOffsetX += dDeltaX * bLeftRight;
*dShotOffsetY += dDeltaY * bUpDown;
+ return (iBulletDev);
+}
+
+void LimitImpactPointByFacing( SOLDIERTYPE *pShooter, SOLDIERTYPE *pTarget, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, FLOAT *dEndX, FLOAT *dEndY )
+{
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ //
+ // CHRISL HAM 4: New Shooting Mechanism, Angle Limits by Facing
+ //
+ // One drawback of the new shooting mechanism is that it depends on the the JSD files being accurate. These
+ // files determine how an obstruction (like an enemy soldier) takes up space in a 3D tile. This is done by
+ // splitting a tile into 125 "cubes", stacked 5 x 5 x 5. Each "cube" is 2 units wide, 2 units deep and about
+ // 6 units tall. A standing merc in the JSD files is represented by a "plus sign" shaped construct that is
+ // 3 "cubes" tall, 3 "cubes" wide and 1 "cube" deep. A crouching soldier is 2 x 3 x 2 and a prone soldier is
+ // 1 x 3 x 5. This means if we're shooting at a standind target from the side, we effectively have 1/3 the
+ // chance to hit as we would a target that was facing us. Unfortunately, the graphical cursor can't display
+ // this information so it will appear as though you have the same chance of hitting regardless of the targets
+ // facing.
+ //
+ // As a result of the above, this function determines the targets facing compared to the shooters, and will
+ // reduce the Shot Offsets if the target isn't facing directly towards or away from the shooter. This isn't
+ // the most accurate solution but it's the best solution I can come up with at this time. The alternative is
+ // to let shots that appear to have no chance of missing (shooting aperture within the targets displayed body)
+ // actually miss an average of 2 in every 3 shots.
+ //
+ // I'm going to assume for the moment that the 1/3rd chance only occurs when a target is facing directly perpendicular
+ // to your facing. I don't know for sure if this is true or not, but it's the assumption I'm going to make.
+ //
+ ////////////////////////////////////////////////////////////////////////////////////////////
+
+ UINT8 iShooterFacing = pShooter->ubDirection;
+ UINT8 iTargetFacing = pShooter->ubDirection;
+ FLOAT iDivisor = gGameCTHConstants.SIDE_FACING_DIVISOR;
+
+ if(pTarget)
+ iTargetFacing = pTarget->ubDirection;
+
+ switch (iTargetFacing)
+ {
+ case 0:
+ if(iShooterFacing == 2 || iShooterFacing == 6){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 1:
+ if(iShooterFacing == 3 || iShooterFacing == 7){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 2:
+ if(iShooterFacing == 0 || iShooterFacing == 4){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 3:
+ if(iShooterFacing == 1 || iShooterFacing == 5){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 4:
+ if(iShooterFacing == 2 || iShooterFacing == 6){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 5:
+ if(iShooterFacing == 3 || iShooterFacing == 7){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 6:
+ if(iShooterFacing == 0 || iShooterFacing == 4){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ case 7:
+ if(iShooterFacing == 1 || iShooterFacing == 5){
+ *dShotOffsetX /= iDivisor;
+ *dShotOffsetY /= iDivisor;
+ }
+ break;
+ default:
+ break;
+ }
}
void LimitImpactPointToMaxAperture( FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, FLOAT dDistanceAperture )
@@ -7391,6 +7509,169 @@ void LimitImpactPointToMaxAperture( FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, FL
}
}
+UINT32 CalcCounterForceFrequency(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon)
+{
+ INT8 traitLoop;
+
+ FLOAT iCounterForceFrequency = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI * EffectiveAgility(pShooter);
+ iCounterForceFrequency += gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
+
+ // Average
+ FLOAT iDivisor = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI +
+ gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL;
+ iCounterForceFrequency /= iDivisor;
+
+ // Bridge the gap to 100 with the help of the AUTO-WEAPONS skill
+ if(gGameOptions.fNewTraitSystem)
+ traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPONS_NT );
+ else
+ traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPS_OT );
+ for (INT32 x = 0; x < traitLoop; x++)
+ {
+ INT8 bDifference = (INT8)(100-iCounterForceFrequency);
+ bDifference = (INT8)(bDifference / gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR);
+ iCounterForceFrequency += bDifference;
+ }
+
+ // Percent Modifier from weapon and its attachments
+ iCounterForceFrequency += (iCounterForceFrequency * GetCounterForceFrequencyModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubEndHeight )) / 100;
+
+ // Limit to 1-100.
+ iCounterForceFrequency = __min(100, iCounterForceFrequency);
+ iCounterForceFrequency = __max(1, iCounterForceFrequency);
+
+ // Invert value. Now 100 is bad, 1 is good.
+ iCounterForceFrequency = 100 - iCounterForceFrequency;
+
+ // Calculate frequency
+ UINT32 uiBulletsPer5AP = max(1,GetAutofireShotsPerFiveAPs( pWeapon ));
+ UINT32 uiCounterForceFrequency = __max(1, (UINT32)ceil((uiBulletsPer5AP * iCounterForceFrequency) / 100));
+
+ //CHRISL: For the time being, this is going to override the CFF function
+ uiBulletsPer5AP = GetAutofireShotsPerFiveAPs( pWeapon );
+ if(uiBulletsPer5AP < 1)
+ uiBulletsPer5AP = 3;
+ uiCounterForceFrequency = (UINT32)ceil((FLOAT)uiBulletsPer5AP / 2.0f);
+
+ return uiCounterForceFrequency;
+}
+
+FLOAT CalcCounterForceMax(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT8 uiStance)
+{
+ if(uiStance == 0)
+ uiStance = gAnimControl[ pShooter->usAnimState ].ubHeight;
+
+ FLOAT iCounterForceMax = gGameCTHConstants.RECOIL_MAX_COUNTER_STR * EffectiveStrength(pShooter);
+ iCounterForceMax += gGameCTHConstants.RECOIL_MAX_COUNTER_AGI * EffectiveAgility(pShooter);
+ iCounterForceMax += gGameCTHConstants.RECOIL_MAX_COUNTER_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
+
+ FLOAT iDivisor = gGameCTHConstants.RECOIL_MAX_COUNTER_STR +
+ gGameCTHConstants.RECOIL_MAX_COUNTER_AGI +
+ gGameCTHConstants.RECOIL_MAX_COUNTER_EXP_LEVEL;
+ iCounterForceMax /= iDivisor;
+
+ // Add the effects from the weapon and its attachments (foregrip, for instance). This is applied as a percentage.
+ INT32 iModifier = GetCounterForceMaxModifier( pWeapon, uiStance );
+ iCounterForceMax += (iCounterForceMax * iModifier) / 100;
+
+ // Limit to 0-100.
+ //iCounterForceMax = __max(__min(iCounterForceMax, 100), 0);
+
+ // Use the result as a percentage of the maximum possible applicable force, as defined in the INI.
+ iCounterForceMax = (FLOAT)((iCounterForceMax * gGameCTHConstants.RECOIL_MAX_COUNTER_FORCE) / 100);
+
+ return iCounterForceMax;
+}
+
+UINT32 CalcCounterForceAccuracy(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT32 uiRange, BOOLEAN fTracer, bool fAnticipate)
+{
+ INT8 traitLoop;
+
+ FLOAT iCounterForceAccuracy = gGameCTHConstants.RECOIL_COUNTER_ACCURACY_DEX * EffectiveDexterity(pShooter);
+ iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_WIS * EffectiveWisdom(pShooter);
+ iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AGI * EffectiveAgility(pShooter);
+ iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
+
+ FLOAT iDivisor = gGameCTHConstants.RECOIL_COUNTER_ACCURACY_DEX +
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_WIS +
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AGI +
+ gGameCTHConstants.RECOIL_COUNTER_ACCURACY_EXP_LEVEL;
+ iCounterForceAccuracy /= iDivisor;
+
+ // Add the effects from the weapon and its attachments. A foregrip or bipod are very useful for this.
+ // Attachment bonuses are applied as a percentage to the accuracy of the shooter.
+ INT32 iModifier = GetCounterForceAccuracyModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubHeight );
+ UINT32 uiCounterForceAccuracy = (UINT32)(iCounterForceAccuracy + ((iCounterForceAccuracy * iModifier) / 100));
+
+ // Now add the effect of the AutoWeapons skill. It "bridges" a portion of the gap between shooter's actual accuracy
+ // and 100% accuracy. For instance, if the divisor is set to 2 in the INI, the first skill level will close 50% of
+ // the gap, the second skill level closes another 25%.
+ if(gGameOptions.fNewTraitSystem)
+ traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPONS_NT );
+ else
+ traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPS_OT );
+ for (INT32 x = 0; x < traitLoop; x++)
+ {
+ INT8 bDifference = 100-uiCounterForceAccuracy;
+ bDifference = (INT8)(bDifference / gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AUTO_WEAPONS_DIVISOR);
+ uiCounterForceAccuracy += bDifference;
+ }
+
+ ////////////////////////////////////////////////////////////////////
+ // Sight-range effects
+ // If we can't see the target, but buddies can see it, CF-Accuracy drops by 50%
+ // If we can't see the target and neither can buddies, CF-Accuracy drops by 75%
+
+ UINT8 ubTargetID = WhoIsThere2( pShooter->sTargetGridNo, pShooter->bTargetLevel ); // Target ubID
+ INT16 sDistVis = pShooter->GetMaxDistanceVisible(pShooter->sTargetGridNo, pShooter->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE;
+ gbForceWeaponNotReady = true;
+ INT16 sDistVisNoScope = pShooter->GetMaxDistanceVisible(pShooter->sTargetGridNo, pShooter->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE;
+ gbForceWeaponNotReady = false;
+ FLOAT scopeRangeMod = (float)sDistVis / (float)sDistVisNoScope;
+
+ INT32 iSightRange = 0;
+ if (ubTargetID != NOBODY)
+ iSightRange = SoldierToSoldierLineOfSightTest( pShooter, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pShooter->bAimShotLocation, false );
+ if (iSightRange == 0) { // didn't do a bodypart-based test or can't see specific body part aimed at
+ iSightRange = SoldierTo3DLocationLineOfSightTest( pShooter, pShooter->sTargetGridNo, pShooter->bTargetLevel, pShooter->bTargetCubeLevel, TRUE, NO_DISTANCE_LIMIT, false );
+ }
+ if (iSightRange == 0) { // Can't see the target but we still need to know what the sight range would be if we could so we can deal with cover penalties
+ iSightRange = SoldierToSoldierLineOfSightTest( pShooter, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pShooter->bAimShotLocation, false, true );
+ }
+
+ // Modify iSightRange for scope use
+ iSightRange = (INT32)(iSightRange / scopeRangeMod);
+
+ if (pShooter->aiData.bOppList[ubTargetID] != SEEN_CURRENTLY && gbPublicOpplist[pShooter->bTeam][ubTargetID] == SEEN_CURRENTLY)
+ iSightRange *= 2;
+ else if(pShooter->aiData.bOppList[ubTargetID] != SEEN_CURRENTLY && gbPublicOpplist[pShooter->bTeam][ubTargetID] != SEEN_CURRENTLY)
+ iSightRange *= 4;
+
+ // CHRISL: Divide physical range by sight range. Not the other way around. We wan't CFA to go down if someone appears to be further
+ // then they are because of terrain or the fact that we can't see them.
+ uiCounterForceAccuracy = (UINT32)(uiCounterForceAccuracy * (FLOAT)((FLOAT)uiRange / iSightRange));
+
+ // Was last bullet a tracer?
+ if (fTracer)
+ {
+ // Augment by a certain amount, mitigated by range
+ uiCounterForceAccuracy += (UINT32)gGameCTHConstants.RECOIL_COUNTER_ACCURACY_TRACER_BONUS;
+ }
+
+ if(fAnticipate)
+ {
+ uiCounterForceAccuracy -= (UINT32)(uiCounterForceAccuracy * gGameCTHConstants.RECOIL_COUNTER_ACCURACY_ANTICIPATION / 100);
+ }
+
+ // Limit to 0 to 100.
+ uiCounterForceAccuracy = __max(__min(uiCounterForceAccuracy, 100), 0);
+
+ // Invert. 0=good, 100-bad.
+ uiCounterForceAccuracy = 100-uiCounterForceAccuracy;
+
+ return uiCounterForceAccuracy;
+}
+
void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, UINT32 uiRange )
{
//////////////////////////////////////////////////////////////////////////////////////
@@ -7422,6 +7703,39 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
// this soldier to actually consider using pre-recoil offset at all. This depends entirely
// on wisdom and experience.
+ // We can also anticipate the recoil of the weapon, which we should set here.
+
+ INT8 bGunRecoilX;
+ INT8 bGunRecoilY;
+ FLOAT dDistanceRatio = (FLOAT)(uiRange / gGameCTHConstants.NORMAL_RECOIL_DISTANCE);
+ FLOAT iCounterForceMax = CalcCounterForceMax(pShooter, pWeapon);
+ UINT32 uiCounterForceAccuracy = CalcCounterForceAccuracy(pShooter, pWeapon, uiRange, FALSE, true);
+ UINT32 uiCounterForceFrequency = CalcCounterForceFrequency(pShooter, pWeapon);
+
+ iCounterForceMax = iCounterForceMax * (100-uiCounterForceAccuracy) / 100;
+ GetRecoil( pShooter, pWeapon, &bGunRecoilX, &bGunRecoilY, 1 );
+ FLOAT iGunTotalRecoil = (FLOAT)bGunRecoilX + (FLOAT)bGunRecoilY;
+ FLOAT iIdealCounterForceX = 0.0;
+ FLOAT iIdealCounterForceY = 0.0;
+
+ if(iGunTotalRecoil != 0)
+ {
+ iIdealCounterForceX = __min( iCounterForceMax, (FLOAT)bGunRecoilX );
+ iIdealCounterForceY = __min( iCounterForceMax, (FLOAT)bGunRecoilY );
+ FLOAT iTotalCounterForce = sqrt((abs(iIdealCounterForceX)*abs(iIdealCounterForceX)) + (abs(iIdealCounterForceY)*abs(iIdealCounterForceY)));
+ if (iTotalCounterForce > iCounterForceMax)
+ {
+ FLOAT iRatio = iTotalCounterForce / iCounterForceMax;
+ if (iRatio != 0)
+ {
+ iIdealCounterForceX /= iRatio;
+ iIdealCounterForceY /= iRatio;
+ }
+ }
+ pShooter->dPrevCounterForceX = -iIdealCounterForceX;
+ pShooter->dPrevCounterForceY = -iIdealCounterForceY;
+ }
+
INT8 traitLoop;
FLOAT iCombinedSkill = gGameCTHConstants.PRE_RECOIL_WIS * EffectiveWisdom(pShooter);
iCombinedSkill += gGameCTHConstants.PRE_RECOIL_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
@@ -7459,41 +7773,6 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
// shooter gets his chance to begin applying counter-force. He'll need to pre-compensate for this
// many bullets.
- FLOAT iCounterForceFrequency = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI * EffectiveAgility(pShooter);
- iCounterForceFrequency += gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
-
- // Average
- iDivisor = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI +
- gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL;
- iCounterForceFrequency /= iDivisor;
-
-//CHRISL: TODO: STOMP need to include AUTO_WEAPS_OT here as well.
- // Bridge the gap to 100 with the help of the AUTO-WEAPONS skill
- if(gGameOptions.fNewTraitSystem)
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPONS_NT );
- else
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPS_OT );
- for (INT32 x = 0; x < traitLoop; x++)
- {
- INT8 bDifference = (INT8)(100-iCounterForceFrequency);
- bDifference = (INT8)(bDifference / gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR);
- iCounterForceFrequency += bDifference;
- }
-
- // Percent Modifier from weapon and its attachments
- iCounterForceFrequency += (iCounterForceFrequency * GetCounterForceFrequencyModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubEndHeight )) / 100;
-
- // Limit to 0-100.
- iCounterForceFrequency = __min(100, iCounterForceFrequency);
- iCounterForceFrequency = __max(0, iCounterForceFrequency);
-
- // Invert value. Now 100 is bad, 0 is good.
- iCounterForceFrequency = 100 - iCounterForceFrequency;
-
- // Calculate frequency
- UINT32 uiBulletsPer5AP = GetAutofireShotsPerFiveAPs( pWeapon );
- UINT32 uiCounterForceFrequency = __max(1, (UINT32)(iCounterForceFrequency * uiBulletsPer5AP) / 100);
-
// Also, it might be possible that we don't intend to fire that many bullets at all. So we want to figure out
// how many bullets are about to be fired, and adjust accordingly.
UINT32 uiIntendedBullets;
@@ -7512,17 +7791,15 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
uiIntendedBullets = __min( uiIntendedBullets, uiCounterForceFrequency );
// Now, let's figure out how much recoil this gun will put out during those first X bullets.
- INT8 bGunRecoilX;
- INT8 bGunRecoilY;
- INT32 iTotalGunRecoilX = 0;
- INT32 iTotalGunRecoilY = 0;
+ FLOAT iTotalGunRecoilX = 0;
+ FLOAT iTotalGunRecoilY = 0;
// For each bullet, add up its recoil.
for (UINT32 count=1; count <= uiIntendedBullets; count++)
{
- GetRecoil( pWeapon, &bGunRecoilX, &bGunRecoilY, count );
- iTotalGunRecoilX += bGunRecoilX;
- iTotalGunRecoilY += bGunRecoilY;
+ GetRecoil( pShooter, pWeapon, &bGunRecoilX, &bGunRecoilY, count );
+ iTotalGunRecoilX += (bGunRecoilX + pShooter->dPrevCounterForceX);
+ iTotalGunRecoilY += (bGunRecoilY + pShooter->dPrevCounterForceY);
}
if (iTotalGunRecoilX == 0 && iTotalGunRecoilY == 0)
@@ -7545,17 +7822,16 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
INT8 bLeftRight = PreRandom(2)?(1):(-1);
// Apply random factor
- dPreRecoilX = (iTotalGunRecoilX * -1) + (dPreRecoilX * bLeftRight);
- dPreRecoilY = (iTotalGunRecoilY * -1) + (dPreRecoilY * bUpDown);
+ dPreRecoilX = iTotalGunRecoilX + (dPreRecoilX * bLeftRight);
+ dPreRecoilY = iTotalGunRecoilY + (dPreRecoilY * bUpDown);
// Apply distance ratio. The further away we are, the more compensation we need.
- FLOAT dDistanceRatio = (FLOAT)(uiRange / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE);
dPreRecoilX *= dDistanceRatio;
dPreRecoilY *= dDistanceRatio;
// Finally, adjust our muzzle direction.
- *dMuzzleOffsetX += dPreRecoilX;
- *dMuzzleOffsetY += dPreRecoilY;
+ *dMuzzleOffsetX -= dPreRecoilX;
+ *dMuzzleOffsetY -= dPreRecoilY;
}
@@ -7578,15 +7854,18 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// shooters might be overwhelmed and start firing towards the sky.
// Get X/Y recoil parameters from the gun.
- INT8 traitLoop;
INT8 bGunRecoilX;
INT8 bGunRecoilY;
- GetRecoil( pWeapon, &bGunRecoilX, &bGunRecoilY, pShooter->bDoBurst );
+ GetRecoil( pShooter, pWeapon, &bGunRecoilX, &bGunRecoilY, pShooter->bDoBurst-1 );
+
+ // If no recoil, then we shouldn't be here anyway.
+ if(bGunRecoilX == 0 && bGunRecoilY == 0)
+ return;
FLOAT iGunTotalRecoil = sqrt((FLOAT)(bGunRecoilX*bGunRecoilX) + (FLOAT)(bGunRecoilY*bGunRecoilY));
- FLOAT iDistanceRatio = (FLOAT)((FLOAT)uiRange / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE);
+ FLOAT iDistanceRatio = (FLOAT)uiRange / (FLOAT)gGameCTHConstants.NORMAL_RECOIL_DISTANCE;
// These variables will hold the amount of X/Y force our shooter exerts to try to fight recoil.
FLOAT iAppliedCounterForceX;
@@ -7601,30 +7880,7 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// Skilled shooters get this chance more often.
// Tracer fire also helps. Once a tracer bullet is fired, we get one free chance to alter our counter-force.
- FLOAT iCounterForceFrequency = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI * EffectiveAgility(pShooter);
- iCounterForceFrequency += gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
-
- FLOAT iDivisor = gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AGI +
- gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_EXP_LEVEL;
- iCounterForceFrequency /= iDivisor;
-
-//CHRISL: TODO: STOMP need to include AUTO_WEAPS_OT here as well.
- if(gGameOptions.fNewTraitSystem)
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPONS_NT );
- else
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPS_OT );
- for (INT32 x = 0; x < traitLoop; x++)
- {
- INT8 bDifference = (INT8)(100-iCounterForceFrequency);
- bDifference = (INT8)(bDifference / gGameCTHConstants.RECOIL_COUNTER_FREQUENCY_AUTO_WEAPONS_DIVISOR);
- iCounterForceFrequency += bDifference;
- }
-
- UINT32 uiBulletsPer5AP = GetAutofireShotsPerFiveAPs( pWeapon );
- UINT32 uiCounterForceFrequency = (UINT32)((iCounterForceFrequency * uiBulletsPer5AP) / 100);
-
- // Flat Modifier from weapon and its attachments
- uiCounterForceFrequency = __max(1, uiCounterForceFrequency + ((uiCounterForceFrequency * GetCounterForceFrequencyModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubEndHeight )) / 100));
+ UINT32 uiCounterForceFrequency = CalcCounterForceFrequency(pShooter, pWeapon);
BOOLEAN fAdjustmentAllowed = FALSE;
if ((pShooter->bDoBurst-1)%uiCounterForceFrequency == 0)
@@ -7653,9 +7909,30 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// Our shooter wants to apply just as much counter-force as necessary to keep the next offset as close to 0 on both
// axes.
+ // Instead of assuming we're on a uiCounterForceFrequency round, we need to verify exactly where we are in the uiCounterForceFrequency
+ // sequence.
+ INT32 uiIntendedBullets;
+ if ( pShooter->bDoAutofire > 0 )
+ {
+ // Autofire. The number of bullets to be fired equals to the value of bDoAutofire
+ uiIntendedBullets = pShooter->bDoAutofire;
+ }
+ else
+ {
+ // Burst. Get the number of shots-per-burst from the weapon.
+ uiIntendedBullets = Weapon[ pWeapon->usItem ].ubShotsPerBurst + GetBurstSizeBonus(pWeapon);
+ }
+ INT8 iRound = (pShooter->bDoBurst-1) % uiCounterForceFrequency;
+ if(iRound == 0)
+ iRound = uiCounterForceFrequency;
+ if((pShooter->bDoBurst - 1 + iRound) > uiIntendedBullets)
+ iRound = uiIntendedBullets - (pShooter->bDoBurst - 1);
+
// Add the two together to figure out where the next bullet is going to fly in relation to the target.
- FLOAT dNextOffsetX = (FLOAT)(*dMuzzleOffsetX + ((bGunRecoilX * iDistanceRatio) * uiCounterForceFrequency) );
- FLOAT dNextOffsetY = (FLOAT)(*dMuzzleOffsetY + ((bGunRecoilY * iDistanceRatio) * uiCounterForceFrequency) );
+ FLOAT dNextOffsetX = (FLOAT)(*dMuzzleOffsetX + (bGunRecoilX * iDistanceRatio) );
+ FLOAT dNextOffsetY = (FLOAT)(*dMuzzleOffsetY + (bGunRecoilY * iDistanceRatio) );
+ //FLOAT dNextOffsetX = (FLOAT)(*dMuzzleOffsetX + ((bGunRecoilX * iDistanceRatio) * uiCounterForceFrequency) );
+ //FLOAT dNextOffsetY = (FLOAT)(*dMuzzleOffsetY + ((bGunRecoilY * iDistanceRatio) * uiCounterForceFrequency) );
////////////////////////////////////////////////////////////////////////////
// Calculating recoil counter-force.
@@ -7678,113 +7955,43 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// maximum counter-force that can be applied. By default, it is based primarily on the strength of the shooter,
// although agility is also helpful.
- FLOAT iCounterForceMax = gGameCTHConstants.RECOIL_MAX_COUNTER_STR * EffectiveStrength(pShooter);
- iCounterForceMax += gGameCTHConstants.RECOIL_MAX_COUNTER_AGI * EffectiveAgility(pShooter);
- iCounterForceMax += gGameCTHConstants.RECOIL_MAX_COUNTER_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
-
- iDivisor = gGameCTHConstants.RECOIL_MAX_COUNTER_STR +
- gGameCTHConstants.RECOIL_MAX_COUNTER_AGI +
- gGameCTHConstants.RECOIL_MAX_COUNTER_EXP_LEVEL;
- iCounterForceMax /= iDivisor;
-
- // Add the effects from the weapon and its attachments (foregrip, for instance). This is applied as a percentage.
- INT32 iModifier = GetCounterForceMaxModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubHeight );
- iCounterForceMax += (iCounterForceMax * iModifier) / 100;
-
- // Limit to 0-100.
- iCounterForceMax = __max(__min(iCounterForceMax, 100), 0);
-
- // Use the result as a percentage of the maximum possible applicable force, as defined in the INI.
- iCounterForceMax = (FLOAT)((iCounterForceMax * gGameCTHConstants.RECOIL_MAX_COUNTER_FORCE) / 100);
+ FLOAT iCounterForceMax = CalcCounterForceMax(pShooter, pWeapon);
// iCounterForceMax is now the absolute limit.
- // STEP 2: Now let's determine how much counter-force would be ideal. If the gun isn't kicking too powerfully,
- // and/or not too much recoil has built up from previous bullets, the shooter should potentially be able to compensate
- // for ALL of it. However, in some cases, the shooter simply can't exert enough force to counter ALL recoil.
-
- // Calculate Ideal X and limit to max force
- FLOAT iIdealCounterForceX = 0.0;
- iIdealCounterForceX = __min( iCounterForceMax, abs((dNextOffsetX / iDistanceRatio) / uiCounterForceFrequency ));
-
- // Calculate Ideal Y and limit to max force
- FLOAT iIdealCounterForceY = 0.0;
- iIdealCounterForceY = __min( iCounterForceMax, abs((dNextOffsetY / iDistanceRatio) / uiCounterForceFrequency ));
-
- // STEP 3: Now we need to determine how accurate the shooter is when applying counter-force. He won't always apply
+ // STEP 2: Now we need to determine how accurate the shooter is when applying counter-force. He won't always apply
// as much as necessary, and may sometimes apply too much. The ability to apply exactly (or close to exactly) the
// amount of force required is based on various skills, especially agility and dexterity. Wisdom and experience also
// help, and the AUTO_WEAPONS skill is invaluable. In addition, tracers (when actually fired) will boost the
// ability to compensate correctly by a certain amount.
- FLOAT iCounterForceAccuracy = gGameCTHConstants.RECOIL_COUNTER_ACCURACY_DEX * EffectiveDexterity(pShooter);
- iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_WIS * EffectiveWisdom(pShooter);
- iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AGI * EffectiveAgility(pShooter);
- iCounterForceAccuracy += gGameCTHConstants.RECOIL_COUNTER_ACCURACY_EXP_LEVEL * EffectiveExpLevel(pShooter) * 10;
+ UINT32 uiCounterForceAccuracy = CalcCounterForceAccuracy(pShooter, pWeapon, uiRange, fTracer);
- iDivisor = gGameCTHConstants.RECOIL_COUNTER_ACCURACY_DEX +
- gGameCTHConstants.RECOIL_COUNTER_ACCURACY_WIS +
- gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AGI +
- gGameCTHConstants.RECOIL_COUNTER_ACCURACY_EXP_LEVEL;
- iCounterForceAccuracy /= iDivisor;
+ // STEP 3: Now let's determine how much counter-force would be ideal. If the gun isn't kicking too powerfully,
+ // and/or not too much recoil has built up from previous bullets, the shooter should potentially be able to compensate
+ // for ALL of it. However, in some cases, the shooter simply can't exert enough force to counter ALL recoil.
+ // ChrisL: Here we need a little change. As the above comment states, we do want to try and compensate for ALL recoil which makes sense.
+ // And it also makes sense that we try and compensate for any recoil we previously under-compensated for. But what we're actually doing
+ // is trying to compensate for all recoil AND bring our offsets back to 0x0 which makes autofire incredibly accurate regardless of what
+ // our shots initial accuracy was. So instead of trying to compensate down to 0x0, we'll instead try to compensate back to whatever our
+ // initial offsets were. However, since autofire should be a bit more accurate then single shot (since we're able to "walk" rounds to the
+ // target) we need to adjust the initial offsets a little, the more rounds we fire.
+
+ INT8 iImprovement = __min(100,(INT8)((pShooter->bDoBurst-1) / uiCounterForceFrequency) * (fTracer?gGameCTHConstants.RECOIL_COUNTER_INCREMENT_TRACER:gGameCTHConstants.RECOIL_COUNTER_INCREMENT));
- // Add the effects from the weapon and its attachments. A foregrip or bipod are very useful for this.
- // Attachment bonuses are applied as a percentage to the accuracy of the shooter.
- iModifier = GetCounterForceAccuracyModifier( pWeapon, gAnimControl[ pShooter->usAnimState ].ubHeight );
- UINT32 uiCounterForceAccuracy = (UINT32)(iCounterForceAccuracy + ((iCounterForceAccuracy * iModifier) / 100));
+ // Calculate Ideal X and limit to max force
+ //FLOAT iIdealCounterForceX = -(bGunRecoilX + (*dMuzzleOffsetX / iDistanceRatio / iRound) );
+ FLOAT iInitialOffsetX = pShooter->dInitialMuzzleOffsetX;
+ FLOAT iBestImprovementX = iInitialOffsetX * (((FLOAT)(100-uiCounterForceAccuracy)/gGameCTHConstants.RECOIL_COUNTER_ACCURACY_COMPENSATION)/100.0f);
+ FLOAT iTargetOffsetX = iInitialOffsetX - (iBestImprovementX * iImprovement / 100);
+ FLOAT iIdealCounterForceX = -(bGunRecoilX + ((*dMuzzleOffsetX - iTargetOffsetX) / iDistanceRatio / iRound));
- // Now add the effect of the AutoWeapons skill. It "bridges" a portion of the gap between shooter's actual accuracy
- // and 100% accuracy. For instance, if the divisor is set to 2 in the INI, the first skill level will close 50% of
- // the gap, the second skill level closes another 25%.
- if(gGameOptions.fNewTraitSystem)
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPONS_NT );
- else
- traitLoop = NUM_SKILL_TRAITS( pShooter, AUTO_WEAPS_OT );
- for (INT32 x = 0; x < traitLoop; x++)
- {
- INT8 bDifference = 100-uiCounterForceAccuracy;
- bDifference = (INT8)(bDifference / gGameCTHConstants.RECOIL_COUNTER_ACCURACY_AUTO_WEAPONS_DIVISOR);
- uiCounterForceAccuracy += bDifference;
- }
-
- ////////////////////////////////////////////////////////////////////
- // Sight-range effects
- // If we can't see the target, but buddies can see it, CF-Accuracy drops by 50%
- // If we can't see the target and neither can buddies, CF-Accuracy drops by 75%
-
- UINT8 ubTargetID = WhoIsThere2( pShooter->sTargetGridNo, pShooter->bTargetLevel ); // Target ubID
- INT32 iSightRange = -1;
- if (ubTargetID != NOBODY)
- {
- iSightRange = SoldierToSoldierLineOfSightTest( pShooter, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pShooter->bAimShotLocation, false );
- if (pShooter->aiData.bOppList[ubTargetID] != SEEN_CURRENTLY && gbPublicOpplist[pShooter->bTeam][ubTargetID] == SEEN_CURRENTLY)
- {
- iSightRange /= 2;
- }
- else if(pShooter->aiData.bOppList[ubTargetID] != SEEN_CURRENTLY && gbPublicOpplist[pShooter->bTeam][ubTargetID] != SEEN_CURRENTLY)
- {
- iSightRange /= 4;
- }
- }
- if (iSightRange == -1) // didn't do a bodypart-based test
- {
- iSightRange = SoldierTo3DLocationLineOfSightTest( pShooter, pShooter->sTargetGridNo, pShooter->bTargetLevel, pShooter->bTargetCubeLevel, TRUE, NO_DISTANCE_LIMIT, false );
- iSightRange /= 4;
- }
- uiCounterForceAccuracy = (UINT32)(uiCounterForceAccuracy * (FLOAT)((FLOAT)iSightRange / uiRange));
-
- // Was last bullet a tracer?
- if (fTracer)
- {
- // Augment by a certain amount, mitigated by range
- uiCounterForceAccuracy += (UINT32)gGameCTHConstants.RECOIL_COUNTER_ACCURACY_TRACER_BONUS;
- }
-
- // Limit to 0 to 100.
- uiCounterForceAccuracy = __max(__min(uiCounterForceAccuracy, 100), 0);
-
- // Invert. 0=good, 100-bad.
- uiCounterForceAccuracy = 100-uiCounterForceAccuracy;
+ // Calculate Ideal Y and limit to max force
+ //FLOAT iIdealCounterForceY = -(bGunRecoilY + (*dMuzzleOffsetY / iDistanceRatio / iRound) );
+ FLOAT iInitialOffsetY = pShooter->dInitialMuzzleOffsetY;
+ FLOAT iBestImprovementY = iInitialOffsetY * (((FLOAT)(100-uiCounterForceAccuracy)/gGameCTHConstants.RECOIL_COUNTER_ACCURACY_COMPENSATION)/100.0f);
+ FLOAT iTargetOffsetY = iInitialOffsetY - (iBestImprovementY * iImprovement / 100);
+ FLOAT iIdealCounterForceY = -(bGunRecoilY + ((*dMuzzleOffsetY - iTargetOffsetY) / iDistanceRatio / iRound));
// STEP 4: Find out whether the shooter is over-compensating or under-compensating, and by how much. Higher
// force-accuracy will decrease this deviation, generating a resulting counter-force that's closer to the ideal.
@@ -7795,67 +8002,71 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// Randomize a deviation value.
INT32 uiCounterForceDeviationX = PreRandom(uiCounterForceAccuracy);
// Use as a percentage to the ideal counter force.
- FLOAT iCounterForceDeviationX = (FLOAT)((uiCounterForceDeviationX * iIdealCounterForceX) / 100.0);
+ FLOAT iCounterForceDeviationX = (FLOAT)abs((uiCounterForceDeviationX * iIdealCounterForceX) / 100.0);
// Make sure there's always a little randomness - no one is THAT accurate unless the gun is producing really minimal
// amounts of recoil (or none).
- iCounterForceDeviationX = __max(iCounterForceDeviationX, iGunTotalRecoil * gGameCTHConstants.RECOIL_COUNTER_ACCURACY_MIN_ERROR);
+ iCounterForceDeviationX = __max(iCounterForceDeviationX, abs(iIdealCounterForceX * gGameCTHConstants.RECOIL_COUNTER_ACCURACY_MIN_ERROR));
// Determine whether we're under- or over-compensating.
- INT8 bUpDownX = PreRandom(2)?(1):(-1);
+ // A merc's current offset and skill (in the form of CFA) should give the merc some level of control when determining whether we
+ // over or under compensate. If a merc can "see" that he's been undercompensating too much, he's much more likely to overcompensate
+ // and vice versa
+ INT8 bUpDownX;
+ if(*dMuzzleOffsetX != 0 && PreRandom(100) <= (100-uiCounterForceAccuracy))
+ { //merc realizes he's over/under compensated too much
+ // Current offset is high so merc is more likely to overcompensate
+ if(*dMuzzleOffsetX > 0)
+ bUpDownX = PreRandom(3)?(-1):(1);
+ // Current offset is low so merc is more likely to undercompensate
+ else if(*dMuzzleOffsetX < 0)
+ bUpDownX = PreRandom(3)?(1):(-1);
+ }
+ else
+ { //merc doesn't realize he's over/under compensating
+ bUpDownX = PreRandom(2)?(1):(-1);
+ }
iCounterForceDeviationX *= bUpDownX;
// So now we have the ideal amount, and the randomal deviation from that amount. Let's add them up.
iAppliedCounterForceX = iIdealCounterForceX + iCounterForceDeviationX;
- // Limit to the maximum applied force. Our shooter cannot exert more force than his personal maximum.
- iAppliedCounterForceX = __min(iAppliedCounterForceX, iCounterForceMax);
-
//////////////////////////
// CALCULATE FOR Y
// Randomize a deviation value.
INT32 uiCounterForceDeviationY = PreRandom(uiCounterForceAccuracy);
// Use as a percentage to the ideal counter force.
- FLOAT iCounterForceDeviationY = (FLOAT)((uiCounterForceDeviationY * iIdealCounterForceY) / 100.0);
+ FLOAT iCounterForceDeviationY = (FLOAT)abs((uiCounterForceDeviationY * iIdealCounterForceY) / 100.0);
// Make sure there's always a little randomness - no one is THAT accurate unless the gun is producing really minimal
// amounts of recoil (or none).
- iCounterForceDeviationY = __max(iCounterForceDeviationY, __min(1, iGunTotalRecoil));
+ iCounterForceDeviationY = __max(iCounterForceDeviationY, abs(iIdealCounterForceY * gGameCTHConstants.RECOIL_COUNTER_ACCURACY_MIN_ERROR));
// Determine whether we're under- or over-compensating.
- INT8 bUpDownY = PreRandom(2)?(1):(-1);
+ // A merc's current offset and skill (in the form of CFA) should give the merc some level of control when determining whether we
+ // over or under compensate. If a merc can "see" that he's been undercompensating too much, he's much more likely to overcompensate
+ // and vice versa
+ INT8 bUpDownY;
+ if(*dMuzzleOffsetY != 0 && PreRandom(100) <= (100-uiCounterForceAccuracy))
+ { //merc realizes he's over/under compensated too much
+ // Current offset is high so merc is more likely to overcompensate
+ if(*dMuzzleOffsetY > 0)
+ bUpDownY = PreRandom(3)?(-1):(1);
+ // Current offset is low so merc is more likely to undercompensate
+ else if(*dMuzzleOffsetY < 0)
+ bUpDownY = PreRandom(3)?(1):(-1);
+ }
+ else
+ { //merc doesn't realize he's over/under compensating
+ bUpDownY = PreRandom(2)?(1):(-1);
+ }
iCounterForceDeviationY *= bUpDownY;
// So now we have the ideal amount, and the randomal deviation from that amount. Let's add them up.
iAppliedCounterForceY = iIdealCounterForceY + iCounterForceDeviationY;
- // Limit to the maximum applied force. Our shooter cannot exert more force than his personal maximum.
- iAppliedCounterForceY = __min(iAppliedCounterForceY, iCounterForceMax);
-
- /////////////////////////////
- // Transfer unused force from one axis to the other.
- if (iAppliedCounterForceX < iCounterForceMax &&
- iAppliedCounterForceX > iIdealCounterForceX &&
- iAppliedCounterForceY < iIdealCounterForceY )
- {
- // X is using more counter force than it actually needs. Y is not using as much force as it needs.
- // Find out how much remainder force we can transfer to Y, and do so.
- FLOAT iRemainder = iAppliedCounterForceX - iIdealCounterForceX;
- iAppliedCounterForceX -= iRemainder;
- iAppliedCounterForceY = __min(iCounterForceMax, __min(iIdealCounterForceY, iAppliedCounterForceY + iRemainder));
- }
- else if (iAppliedCounterForceY < iCounterForceMax &&
- iAppliedCounterForceY > iIdealCounterForceY &&
- iAppliedCounterForceX < iIdealCounterForceX )
- {
- // Y is using more counter force than it actually needs. X is not using as much force as it needs.
- // Find out how much remainder force we can transfer to X, and do so.
- FLOAT iRemainder = iAppliedCounterForceY - iIdealCounterForceY;
- iIdealCounterForceY -= iRemainder;
- iAppliedCounterForceX = __min(iCounterForceMax, __min(iIdealCounterForceX, iAppliedCounterForceX + iRemainder));
- }
-
/////////////////////////////
// Use pythagorean to scale this to the max force allowed.
+ // We want to use pythagorean here so that we calculate the total "vector length" of recoil and compare that to CFM
FLOAT iTotalAppliedCounterForce = sqrt((iAppliedCounterForceX*iAppliedCounterForceX) + (iAppliedCounterForceY*iAppliedCounterForceY));
if (iTotalAppliedCounterForce > iCounterForceMax)
{
@@ -7866,16 +8077,7 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
iAppliedCounterForceY /= iRatio;
}
}
-
- // Make sure it's the correct direction compared to where the gun is pulling.
- if (dNextOffsetX > 0)
- {
- iAppliedCounterForceX *= (-1);
- }
- if (dNextOffsetY > 0)
- {
- iAppliedCounterForceY *= (-1);
- }
+ // This works because sqrt((iACFX^2)+(iACFY^2)) should result in being less then or equal to CFM
// Record how much counter force was applied this time. It will be used for the next few shots until the
// shooter can recalculate.
diff --git a/Tactical/LOS.h b/Tactical/LOS.h
index 1393f262..ce7de844 100644
--- a/Tactical/LOS.h
+++ b/Tactical/LOS.h
@@ -215,12 +215,17 @@ extern INT32 GetSpreadPattern( OBJECTTYPE * pObj );
// which completely redesigns the way we calculate and handle CTH for the purposes of firing weapons.
void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT *dEndX, FLOAT *dEndY, FLOAT *dEndZ, OBJECTTYPE *pWeapon, UINT32 uiMuzzleSway, INT16 *sApertureRatio );
FLOAT CalcMagFactor( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT d2DDistance, UINT8 ubAimTime );
+FLOAT CalcProjectionFactor( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT d2DDistance, UINT8 ubAimTime );
FLOAT CalcBasicAperture();
void CalcTargetMovementOffset( SOLDIERTYPE *pShooter, SOLDIERTYPE *pTarget, OBJECTTYPE *pWeapon, FLOAT *dMuzzleOffsetX, DOUBLE ddShootingAngle, INT32 iAperture );
void CalcRangeCompensationOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetY, INT32 iRangeToTarget, OBJECTTYPE *pWeapon );
void CalcMuzzleSway( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, FLOAT iAperture );
-void CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange );
+FLOAT CalcBulletDeviation( SOLDIERTYPE *pShooter, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange );
+void LimitImpactPointByFacing( SOLDIERTYPE *pShooter, SOLDIERTYPE *pTarget, FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, FLOAT *dEndX, FLOAT *dEndY );
void LimitImpactPointToMaxAperture( FLOAT *dShotOffsetX, FLOAT *dShotOffsetY, FLOAT dDistanceAperture );
+UINT32 CalcCounterForceFrequency(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon);
+FLOAT CalcCounterForceMax(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT8 uiStance = 0);
+UINT32 CalcCounterForceAccuracy(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT32 uiRange, BOOLEAN fTracer, bool fAnticipate = false);
void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, UINT32 uiRange );
void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange );
diff --git a/Tactical/Merc Entering.cpp b/Tactical/Merc Entering.cpp
index de9cddbd..4f75dded 100644
--- a/Tactical/Merc Entering.cpp
+++ b/Tactical/Merc Entering.cpp
@@ -479,7 +479,9 @@ void HandleHeliDrop( )
for ( cnt = gbCurDrop; cnt < gbNumHeliSeatsOccupied; cnt++ )
{
// Add merc to sector
- MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ //MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
+ MercPtrs[ gusHeliSeats[ cnt ] ]->usStrategicInsertionData = gGameExternalOptions.iInitialMercArrivalLocation;
// HEADROCK HAM 3.5: Externalized!
UpdateMercInSector( MercPtrs[ gusHeliSeats[ cnt ] ], gGameExternalOptions.ubDefaultArrivalSectorX, gGameExternalOptions.ubDefaultArrivalSectorY, startingZ );
@@ -615,7 +617,9 @@ void HandleHeliDrop( )
MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->EVENT_InitNewSoldierAnim( HELIDROP, 0 , FALSE );
// Change insertion code
- MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ //MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
+ MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->usStrategicInsertionData = gGameExternalOptions.iInitialMercArrivalLocation;
// HEADROCK HAM 3.5: Externalized!
UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], gGameExternalOptions.ubDefaultArrivalSectorX, gGameExternalOptions.ubDefaultArrivalSectorY, startingZ );
diff --git a/Tactical/Merc Hiring.cpp b/Tactical/Merc Hiring.cpp
index 7f7e6133..0af485d8 100644
--- a/Tactical/Merc Hiring.cpp
+++ b/Tactical/Merc Hiring.cpp
@@ -385,7 +385,9 @@ void MercArrivesCallback( UINT8 ubSoldierID )
else
{
// OK, otherwise, set them in north area, so once we load again, they are here.
- pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ //pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
+ pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
+ pSoldier->usStrategicInsertionData = gGameExternalOptions.iInitialMercArrivalLocation;
}
if ( pSoldier->ubStrategicInsertionCode != INSERTION_CODE_CHOPPER )
diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp
index 2f71cbb7..51f4fd3c 100644
--- a/Tactical/Overhead.cpp
+++ b/Tactical/Overhead.cpp
@@ -2870,7 +2870,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
pSoldier->EVENT_StopMerc( pSoldier->sGridNo, pSoldier->ubDirection );
SetFactTrue( FACT_SKYRIDER_CLOSE_TO_CHOPPER );
TriggerNPCRecord( SKYRIDER, 15 );
- SetUpHelicopterForPlayer( 13, MAP_ROW_B );
+ SetUpHelicopterForPlayer( 13, MAP_ROW_B, SKYRIDER );
}
break;
diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp
index cb515d4a..d2cc5177 100644
--- a/Tactical/Points.cpp
+++ b/Tactical/Points.cpp
@@ -1217,6 +1217,14 @@ INT16 CalcAPsToBurstNoModifier( INT16 bBaseActionPoints, OBJECTTYPE * pObj )
INT16 CalcAPsToAutofire( INT16 bBaseActionPoints, OBJECTTYPE * pObj, UINT8 bDoAutofire )
{
+ //CHRISL: We send the actual number of rounds being fired in the bDoAutofire paramter. But that implies that it would take longer to fire the first round
+ // in an autofire sequence then it would take to fire a single round during a single fire sequence. That doesn't make any sense. It should only cost
+ // additional APs to fire rounds beyond the first in an autofire sequence. But rather then mess with all the locations that call this function, I'm going
+ // to simply adjust the parameter once we get to the function.
+ if(bDoAutofire > 1)
+ bDoAutofire -= 1;
+ else
+ return 0;
// INT8 bAttachPos;
INT32 aps=APBPConstants[AP_MAXIMUM] + 1;
if ( GetAutofireShotsPerFiveAPs (pObj) )
@@ -1340,7 +1348,7 @@ INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTur
// If the weapon has a scope, and the target is within eligible range for scope use
if ( (UsingNewCTHSystem() == false && IsScoped(&pSoldier->inv[HANDPOS]) && GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo ) >= GetMinRangeForAimBonus(&pSoldier->inv[HANDPOS]))
- || (UsingNewCTHSystem() == true && GetBestScopeMagnificationFactor(&pSoldier->inv[HANDPOS], GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo ) > 1.0 )) )
+ || (UsingNewCTHSystem() == true && GetBestScopeMagnificationFactor(pSoldier, &pSoldier->inv[HANDPOS], (FLOAT)GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo ) > 1.0 )) )
{
// Add an individual cost for EACH click, as necessary.
@@ -1359,7 +1367,7 @@ INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTur
if (bAimTime > 6)
sAPCost += APBPConstants[AP_SEVENTH_CLICK_AIM_SCOPE];
if (bAimTime > 7)
- sAPCost += APBPConstants[AP_EIGHTTH_CLICK_AIM_SCOPE];
+ sAPCost += APBPConstants[AP_EIGHTH_CLICK_AIM_SCOPE];
}
// Weapon has no scope or not within requried range. Apply regular AP costs.
@@ -2844,31 +2852,58 @@ INT16 GetAPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown )
return(iAPsToClimb);
}
-INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown )
+INT16 GetAPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown )
{
- //return( GetAPsToChangeStance( pSoldier, ANIM_STAND ) + APBPConstants[AP_JUMPWINDOW] );
-
- // SANDRO - STOMP traits - added a feature to reduce APs needed to jump through window for Martial Arts trait
- UINT16 iAPsToJump = 0;
-
- if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem )
- iAPsToJump = max( 1, (INT16)(( APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait
- else
- iAPsToJump = APBPConstants[AP_JUMPWINDOW];
+ // SANDRO - STOMP traits - added a feature to reduce APs needed to climb on or off roof for Martial Arts trait
+ UINT16 iAPsToClimb = 0;
if ( !fClimbDown )
{
+ if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem )
+ iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_JUMPWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait
+ else
+ iAPsToClimb = APBPConstants[AP_JUMPWALL];
+
// OK, add aps to goto stand stance...
- iAPsToJump += GetAPsToChangeStance( pSoldier, ANIM_STAND );
+ iAPsToClimb += GetAPsToChangeStance( pSoldier, ANIM_STAND );
}
else
{
+ if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem )
+ iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_JUMPOFFWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait
+ else
+ iAPsToClimb = APBPConstants[AP_JUMPOFFWALL];
+
// Add aps to goto crouch
- iAPsToJump += GetAPsToChangeStance( pSoldier, ANIM_CROUCH );
+ iAPsToClimb += GetAPsToChangeStance( pSoldier, ANIM_CROUCH );
}
- return( iAPsToJump );
-
+ // A check if we don't go to zero somehow - SANDRO
+ if( iAPsToClimb < 1 )
+ iAPsToClimb = 1;
+
+ // return our value
+ return(iAPsToClimb);
+}
+
+INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack )
+{
+ // STOMP traits - Martial Arts reduce APs spent for jumping obstacles
+ if ( !fWithBackpack )
+ {
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ))
+ return( max( 1, (INT16)((APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait
+ else
+ return( APBPConstants[AP_JUMPWINDOW] );
+
+ }
+ else
+ {
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ))
+ return( max( 1, (INT16)((APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait
+ else
+ return( APBPConstants[AP_JUMPWINDOW] );
+ }
}
INT16 GetBPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown )
@@ -2913,6 +2948,26 @@ INT16 GetAPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack )
}
}
+INT16 GetBPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown )
+{
+ // SANDRO - STOMP traits - Athletics reduce breath points spent for moving
+ if ( !fClimbDown )
+ {
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT ))
+ return( APBPConstants[BP_JUMPWALL] * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100 );
+ else
+ return( APBPConstants[BP_JUMPWALL] );
+
+ }
+ else
+ {
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT ))
+ return( APBPConstants[BP_JUMPOFFWALL] * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100 );
+ else
+ return( APBPConstants[BP_JUMPOFFWALL] );
+ }
+}
+
// SANDRO - added function to calculate BPs for jumping over fence
INT16 GetBPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack )
{
@@ -2934,6 +2989,28 @@ INT16 GetBPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack )
}
}
+// SANDRO - added function to calculate BPs for jumping over fence
+INT16 GetBPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack )
+{
+ // STOMP traits - Athletics reduce breath points spent for moving
+ if ( !fWithBackpack )
+ {
+ // WANNE: Yes, we use the jumpfence BPs, it is simpler for now :)
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT ))
+ return( APBPConstants[BP_JUMPFENCE] * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100 );
+ else
+ return( APBPConstants[BP_JUMPFENCE] );
+
+ }
+ else
+ {
+ if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT ))
+ return( APBPConstants[BP_JUMPFENCEBPACK] * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100 );
+ else
+ return( APBPConstants[BP_JUMPFENCEBPACK] );
+ }
+}
+
INT16 GetAPsToCutFence( SOLDIERTYPE *pSoldier )
{
// OK, it's normally just cost, but add some if different stance...
@@ -3246,7 +3323,7 @@ INT32 CalcAPCostForAiming( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAim
// If the weapon has a scope, and the target is within eligible range for scope use
if ( (UsingNewCTHSystem() == false && IsScoped(&pSoldier->inv[HANDPOS]) && GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo ) >= GetMinRangeForAimBonus(&pSoldier->inv[HANDPOS]))
- || (UsingNewCTHSystem() == true && GetBestScopeMagnificationFactor(&pSoldier->inv[HANDPOS], GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo ) > 1.0 )))
+ || (UsingNewCTHSystem() == true && GetBestScopeMagnificationFactor(pSoldier, &pSoldier->inv[HANDPOS], (FLOAT)GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo ) > 1.0 )))
{
// Add an individual cost for EACH click, as necessary.
@@ -3265,7 +3342,7 @@ INT32 CalcAPCostForAiming( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAim
if (bAimTime > 6)
sAPCost += APBPConstants[AP_SEVENTH_CLICK_AIM_SCOPE];
if (bAimTime > 7)
- sAPCost += APBPConstants[AP_EIGHTTH_CLICK_AIM_SCOPE];
+ sAPCost += APBPConstants[AP_EIGHTH_CLICK_AIM_SCOPE];
}
// Weapon has no scope or not within requried range. Apply regular AP costs.
diff --git a/Tactical/Points.h b/Tactical/Points.h
index d220569b..9cc24e5b 100644
--- a/Tactical/Points.h
+++ b/Tactical/Points.h
@@ -270,7 +270,7 @@
#define DEFAULT_APS 20
#define DEFAULT_AIMSKILL 80
-*/
+*/
//Just so the compiler will be able to use it in init.cpp, I'm a careful person. Gotthard 1/18/07
extern INT16 APBPConstants[TOTAL_APBP_VALUES];
@@ -330,7 +330,9 @@ INT16 GetAPsToReadyWeapon( SOLDIERTYPE *pSoldier, UINT16 usAnimState );
INT16 GetAPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown );
INT16 GetBPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown );
-INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown ); //Jump
+INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ); //Jump
+INT16 GetBPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ); //Jump
+
// SANDRO - changed these 2
INT16 GetAPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack );
INT16 GetBPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack );
@@ -376,4 +378,7 @@ INT16 GetAPsToUntrapDoor( SOLDIERTYPE *pSoldier );
INT16 GetBasicAPsToPickupItem( SOLDIERTYPE *pSoldier );
INT16 GetAPsToDisarmMine( SOLDIERTYPE *pSoldier );
+INT16 GetAPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown );
+INT16 GetBPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown );
+
#endif
diff --git a/Tactical/Real Time Input.cpp b/Tactical/Real Time Input.cpp
index 87e7ed27..80d0ba97 100644
--- a/Tactical/Real Time Input.cpp
+++ b/Tactical/Real Time Input.cpp
@@ -1834,97 +1834,29 @@ void QueryRTX1Button( UINT32 *puiNewEvent )
{
fX1ButtonDown = FALSE;
if ( !_KeyDown( ALT ) && !_KeyDown( SHIFT ))
+ {
UIHandleChangeLevel( NULL );
+ }
else if( _KeyDown( SHIFT ) )
{
+ // WANNE: Jump through window?
+ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
+ {
+ INT8 bDirection;
+ SOLDIERTYPE *lSoldier;
-
-//dddokno код для отладки прыжков через окно============================================={
-//INT16 sGridNo;
-//STRUCTURE * pStructure;
-//
-//GetMouseMapPos( &sGridNo );
-//ScreenMsg( FONT_MCOLOR_LTYELLOW,0, L"gubMerkCanSeeThisTile=%d,gubWorldTileInLight=%d",gubMerkCanSeeThisTile[sGridNo],gubWorldTileInLight[sGridNo]);
-//pStructure = gpWorldLevelData[sGridNo].pStructureHead;
-//
-//SOLDIERTYPE *pSoldier;
-//GetSoldier( &pSoldier, gusSelectedSoldier );
-//
-//LEVELNODE *pNode = NULL; UINT32 uiTileType=0;
-//pNode = gpWorldLevelData[ sGridNo ].pStructHead;
-//
-//GetTileType( pNode->usIndex, &uiTileType );
-//
-//CHAR8 errorBuf[511];
-//
-//sprintf(errorBuf, "Tile=%s at line %d",
-//gTilesets[ giCurrentTilesetID ].TileSurfaceFilenames[ uiTileType ], uiTileType);
-//LiveMessage(errorBuf);
-
-
- //if ( _stricmp( gTilesets[ giCurrentTilesetID ].TileSurfaceFilenames[ uiTileType ], "build_13.sti" ) == 0 )
- //{
-// UINT16 sNewIndex;
-// GetTileIndexFromTypeSubIndex( gTileDatabase[ pNode->usIndex ].fType, uiTileType, (UINT16 *)&sNewIndex );
-// //GetTileIndexFromTypeSubIndex( STRUCTURE_WALLNWINDOW, uiTileType, (UINT16 *)&sNewIndex );
-//
-// ScreenMsg( FONT_MCOLOR_LTYELLOW,0, L"13 found=%d,strID=%d",sNewIndex,pNode->usIndex);
-//
-// UINT16 pusSubIndex;
-// GetSubIndexFromTileIndex( pNode->usIndex, (UINT16 *)&pusSubIndex );
-// ScreenMsg( FONT_MCOLOR_LTYELLOW,0, L"subidx=%d",pusSubIndex);
-// sprintf(errorBuf, "subidx= %d", pusSubIndex);
-//LiveMessage(errorBuf);
-
-
-//STRUCTURE *pBase;
-//UINT16 pusSubIndex;
-//pBase = FindStructure( sGridNo, STRUCTURE_WALLNWINDOW );
-//pNode = FindLevelNodeBasedOnStructure( pBase->sGridNo, pBase );
-//GetSubIndexFromTileIndex( pNode->usIndex, (UINT16 *)&pusSubIndex );
-//ScreenMsg( FONT_MCOLOR_LTYELLOW,0, L"subidx=%d",pusSubIndex);
-
-
-
- //}
-//dddokno код для отладки прыжков через окно============================================= }
-
- //dddokno{
- // старый код от скорпиона. удалить за ненадобностью--------------------------------------
- //SOLDIERTYPE *pjSoldier;
- //BOOLEAN fNearHeigherLevel;
- //BOOLEAN fNearLowerLevel;
- //INT8 bDirection;
-
- //if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
- //{
- // // CHRISL: Turn off manual jumping while wearing a backpack
- // if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
- // return;
-
- // // Make sure the merc is not collapsed!
- // if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
- // {
- // if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
- // {
- // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
- // }
-
- // return;
- // }
- //GetMercOknoDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
- //if ( FindOknoDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
- // {
- // BeginSoldierOkno( pjSoldier );
- // }
- //}
- //dddokno{
- // старый код от скорпиона. удалить за ненадобностью-------------------------------------
-
+ if ( GetSoldier( &lSoldier, gusSelectedSoldier ) )
+ {
+ if ( FindWindowJumpDirection( lSoldier, lSoldier->sGridNo, lSoldier->ubDirection, &bDirection ) )
+ {
+ lSoldier->BeginSoldierClimbWindow( );
+ }
+ }
+ }
}
else if (_KeyDown( ALT ) )
{
-
+ // Climb on roofs
SOLDIERTYPE *pjSoldier;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
@@ -1954,9 +1886,7 @@ void QueryRTX1Button( UINT32 *puiNewEvent )
if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
pjSoldier->BeginSoldierClimbFence( );
}
-
- }//else
-
+ }
}
}
}
diff --git a/Tactical/ShopKeeper Interface.cpp b/Tactical/ShopKeeper Interface.cpp
index 61835aa9..8dbd91a2 100644
--- a/Tactical/ShopKeeper Interface.cpp
+++ b/Tactical/ShopKeeper Interface.cpp
@@ -53,7 +53,8 @@
#include "Soldier Create.h"
#include "PATHAI.h"
#include "Points.h"
-#include "InterfaceItemImages.h"
+ #include "InterfaceItemImages.h"
+ #include "Interface Enhanced.h"
#endif
#include "BuildDefines.h"
@@ -1047,10 +1048,11 @@ ATM:
//Evaluate:
+ EnableDisableShopkeeperButtons(SHOPKEEPER_SCREEN, ACTIVATE_BUTTON);
// guiSKI_EvaluateButtonImage = LoadButtonImage("INTERFACE\\TradeButtons.sti", -1,0,-1,1,-1 );
// guiSKI_TransactionButtonImage = UseLoadedButtonImage( guiSKI_EvaluateButtonImage, -1,0,-1,1,-1 );
- guiSKI_TransactionButtonImage = LoadButtonImage("INTERFACE\\TradeButtons.sti", -1,0,-1,1,-1 );
- guiSKI_DoneButtonImage = UseLoadedButtonImage( guiSKI_TransactionButtonImage, -1,0,-1,1,-1 );
+ //guiSKI_TransactionButtonImage = LoadButtonImage("INTERFACE\\TradeButtons.sti", -1,0,-1,1,-1 );
+ //guiSKI_DoneButtonImage = UseLoadedButtonImage( guiSKI_TransactionButtonImage, -1,0,-1,1,-1 );
/*
//Evaluate:
@@ -1065,30 +1067,30 @@ ATM:
*/
//Transaction button
- guiSKI_TransactionButton = CreateIconAndTextButton( guiSKI_TransactionButtonImage, SKI_Text[SKI_TEXT_TRANSACTION], SKI_BUTTON_FONT,
- SKI_BUTTON_COLOR, DEFAULT_SHADOW,
- SKI_BUTTON_COLOR, DEFAULT_SHADOW,
- TEXT_CJUSTIFIED,
- SKI_TRANSACTION_BUTTON_X, SKI_TRANSACTION_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
- DEFAULT_MOVE_CALLBACK, BtnSKI_TransactionButtonCallback);
- SpecifyDisabledButtonStyle( guiSKI_TransactionButton, DISABLED_STYLE_HATCHED );
+ //guiSKI_TransactionButton = CreateIconAndTextButton( guiSKI_TransactionButtonImage, SKI_Text[SKI_TEXT_TRANSACTION], SKI_BUTTON_FONT,
+ // SKI_BUTTON_COLOR, DEFAULT_SHADOW,
+ // SKI_BUTTON_COLOR, DEFAULT_SHADOW,
+ // TEXT_CJUSTIFIED,
+ // SKI_TRANSACTION_BUTTON_X, SKI_TRANSACTION_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
+ // DEFAULT_MOVE_CALLBACK, BtnSKI_TransactionButtonCallback);
+ //SpecifyDisabledButtonStyle( guiSKI_TransactionButton, DISABLED_STYLE_HATCHED );
//if the dealer repairs, use the repair fast help text for the transaction button
- if( armsDealerInfo[ gbSelectedArmsDealerID ].ubTypeOfArmsDealer == ARMS_DEALER_REPAIRS )
- SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_REPAIR_TRANSACTION_BUTTON_HELP_TEXT ] );
- else
- SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_TRANSACTION_BUTTON_HELP_TEXT ] );
+ //if( armsDealerInfo[ gbSelectedArmsDealerID ].ubTypeOfArmsDealer == ARMS_DEALER_REPAIRS )
+ // SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_REPAIR_TRANSACTION_BUTTON_HELP_TEXT ] );
+ //else
+ // SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_TRANSACTION_BUTTON_HELP_TEXT ] );
//Done button
- guiSKI_DoneButton = CreateIconAndTextButton( guiSKI_DoneButtonImage, SKI_Text[SKI_TEXT_DONE], SKI_BUTTON_FONT,
- SKI_BUTTON_COLOR, DEFAULT_SHADOW,
- SKI_BUTTON_COLOR, DEFAULT_SHADOW,
- TEXT_CJUSTIFIED,
- SKI_DONE_BUTTON_X, SKI_DONE_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH+10,
- DEFAULT_MOVE_CALLBACK, BtnSKI_DoneButtonCallback);
- SpecifyDisabledButtonStyle( guiSKI_DoneButton, DISABLED_STYLE_HATCHED );
- SetButtonFastHelpText( guiSKI_DoneButton, SkiMessageBoxText[ SKI_DONE_BUTTON_HELP_TEXT ] );
+ //guiSKI_DoneButton = CreateIconAndTextButton( guiSKI_DoneButtonImage, SKI_Text[SKI_TEXT_DONE], SKI_BUTTON_FONT,
+ // SKI_BUTTON_COLOR, DEFAULT_SHADOW,
+ // SKI_BUTTON_COLOR, DEFAULT_SHADOW,
+ // TEXT_CJUSTIFIED,
+ // SKI_DONE_BUTTON_X, SKI_DONE_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH+10,
+ // DEFAULT_MOVE_CALLBACK, BtnSKI_DoneButtonCallback);
+ //SpecifyDisabledButtonStyle( guiSKI_DoneButton, DISABLED_STYLE_HATCHED );
+ //SetButtonFastHelpText( guiSKI_DoneButton, SkiMessageBoxText[ SKI_DONE_BUTTON_HELP_TEXT ] );
//Blanket the entire screen
@@ -1299,9 +1301,9 @@ BOOLEAN ExitShopKeeperInterface()
UnloadButtonImage( guiSKI_InvPageUpButtonImage );
UnloadButtonImage( guiSKI_InvPageDownButtonImage );
- UnloadButtonImage( guiSKI_TransactionButtonImage );
+ //UnloadButtonImage( guiSKI_TransactionButtonImage );
// UnloadButtonImage( guiSKI_EvaluateButtonImage );
- UnloadButtonImage( guiSKI_DoneButtonImage );
+ //UnloadButtonImage( guiSKI_DoneButtonImage );
//loop through the area and delete small faces
for(ubCnt=0; ubCntuiFlags |= BUTTON_FORCE_UNDIRTY;
@@ -5548,6 +5552,82 @@ void EnableDisableDealersInventoryPageButtons()
}
}
+void EnableDisableShopkeeperButtons(UINT32 uiCurrentItemDescriptionScreen, int bpAction)
+{
+ if(uiCurrentItemDescriptionScreen != SHOPKEEPER_SCREEN)
+ return;
+
+ switch (bpAction)
+ {
+ case ACTIVATE_BUTTON:
+ if(guiSKI_TransactionButton != 0)
+ RemoveButton( guiSKI_TransactionButton );
+ if(guiSKI_TransactionButtonImage != 0)
+ UnloadButtonImage( guiSKI_TransactionButtonImage );
+ if(guiSKI_DoneButton != 0)
+ RemoveButton( guiSKI_DoneButton );
+ if(guiSKI_DoneButtonImage != 0)
+ UnloadButtonImage( guiSKI_DoneButtonImage );
+
+ guiSKI_TransactionButtonImage = LoadButtonImage("INTERFACE\\TradeButtons.sti", -1,0,-1,1,-1 );
+ guiSKI_DoneButtonImage = UseLoadedButtonImage( guiSKI_TransactionButtonImage, -1,0,-1,1,-1 );
+
+ guiSKI_TransactionButton = CreateIconAndTextButton( guiSKI_TransactionButtonImage, SKI_Text[SKI_TEXT_TRANSACTION], SKI_BUTTON_FONT,
+ SKI_BUTTON_COLOR, DEFAULT_SHADOW, SKI_BUTTON_COLOR, DEFAULT_SHADOW, TEXT_CJUSTIFIED,
+ SKI_TRANSACTION_BUTTON_X, SKI_TRANSACTION_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
+ DEFAULT_MOVE_CALLBACK, BtnSKI_TransactionButtonCallback);
+ SpecifyDisabledButtonStyle( guiSKI_TransactionButton, DISABLED_STYLE_HATCHED );
+ //if the dealer repairs, use the repair fast help text for the transaction button
+ if( armsDealerInfo[ gbSelectedArmsDealerID ].ubTypeOfArmsDealer == ARMS_DEALER_REPAIRS )
+ SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_REPAIR_TRANSACTION_BUTTON_HELP_TEXT ] );
+ else
+ SetButtonFastHelpText( guiSKI_TransactionButton, SkiMessageBoxText[ SKI_TRANSACTION_BUTTON_HELP_TEXT ] );
+
+ //Done button
+ guiSKI_DoneButton = CreateIconAndTextButton( guiSKI_DoneButtonImage, SKI_Text[SKI_TEXT_DONE], SKI_BUTTON_FONT,
+ SKI_BUTTON_COLOR, DEFAULT_SHADOW, SKI_BUTTON_COLOR, DEFAULT_SHADOW, TEXT_CJUSTIFIED,
+ SKI_DONE_BUTTON_X, SKI_DONE_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH+10,
+ DEFAULT_MOVE_CALLBACK, BtnSKI_DoneButtonCallback);
+ SpecifyDisabledButtonStyle( guiSKI_DoneButton, DISABLED_STYLE_HATCHED );
+ SetButtonFastHelpText( guiSKI_DoneButton, SkiMessageBoxText[ SKI_DONE_BUTTON_HELP_TEXT ] );
+ break;
+ case DEACTIVATE_BUTTON:
+ if(guiSKI_TransactionButton != 0)
+ RemoveButton( guiSKI_TransactionButton );
+ if(guiSKI_DoneButton != 0)
+ RemoveButton( guiSKI_DoneButton );
+ EnableDisableShopkeeperButtons(uiCurrentItemDescriptionScreen, UNLOAD_BUTTON);
+ guiSKI_TransactionButtonImage = 0;
+ guiSKI_TransactionButton = 0;
+ guiSKI_DoneButtonImage = 0;
+ guiSKI_DoneButton = 0;
+ break;
+ case ENABLE_BUTTON:
+ if(guiSKI_TransactionButton == 0 || guiSKI_DoneButton == 0)
+ {
+ EnableDisableShopkeeperButtons(uiCurrentItemDescriptionScreen, DEACTIVATE_BUTTON);
+ EnableDisableShopkeeperButtons(uiCurrentItemDescriptionScreen, ACTIVATE_BUTTON);
+ }
+ if(guiSKI_TransactionButton != 0)
+ EnableButton( guiSKI_TransactionButton );
+ if(guiSKI_DoneButton != 0)
+ EnableButton( guiSKI_DoneButton );
+ break;
+ case DISABLE_BUTTON:
+ if(guiSKI_TransactionButton != 0)
+ DisableButton( guiSKI_TransactionButton );
+ if(guiSKI_DoneButton != 0)
+ DisableButton( guiSKI_DoneButton );
+ break;
+ case UNLOAD_BUTTON:
+ if(guiSKI_TransactionButtonImage != 0)
+ UnloadButtonImage( guiSKI_TransactionButtonImage );
+ if(guiSKI_DoneButtonImage != 0)
+ UnloadButtonImage( guiSKI_DoneButtonImage );
+ break;
+ }
+}
+
void EnableDisableEvaluateAndTransactionButtons()
{
UINT8 ubCnt;
@@ -5659,8 +5739,9 @@ void EnableDisableEvaluateAndTransactionButtons()
{
//Evaluate:
// DisableButton( guiSKI_EvaluateButton );
- DisableButton( guiSKI_TransactionButton );
- DisableButton( guiSKI_DoneButton );
+ EnableDisableShopkeeperButtons(SHOPKEEPER_SCREEN, DISABLE_BUTTON);
+ //DisableButton( guiSKI_TransactionButton );
+ //DisableButton( guiSKI_DoneButton );
}
else
{
@@ -6363,9 +6444,16 @@ void InitShopKeeperItemDescBox( OBJECTTYPE *pObject, UINT16 ubPocket, UINT8 ubFr
UINT16 ubSelectedInvSlot = ubPocket - gSelectArmsDealerInfo.ubFirstItemIndexOnPage;
- sPosX = SKI_ARMS_DEALERS_INV_START_X; // + ( SKI_INV_OFFSET_X * ( ubSelectedInvSlot % SKI_NUM_ARMS_DEALERS_INV_COLS ) - ( 358 / 2 ) ) + SKI_INV_SLOT_WIDTH / 2;
-
- sPosY = SKI_ARMS_DEALERS_INV_START_Y; // + ( ( SKI_INV_OFFSET_Y * ubSelectedInvSlot / SKI_NUM_ARMS_DEALERS_INV_COLS ) + 1 ) - ( 128 / 2 ) + SKI_INV_SLOT_HEIGHT / 2;
+ if(gGameSettings.fOptions[ TOPTION_ENHANCED_DESC_BOX ] == FALSE)
+ {
+ sPosX = SKI_ARMS_DEALERS_INV_START_X; // + ( SKI_INV_OFFSET_X * ( ubSelectedInvSlot % SKI_NUM_ARMS_DEALERS_INV_COLS ) - ( 358 / 2 ) ) + SKI_INV_SLOT_WIDTH / 2;
+ sPosY = SKI_ARMS_DEALERS_INV_START_Y; // + ( ( SKI_INV_OFFSET_Y * ubSelectedInvSlot / SKI_NUM_ARMS_DEALERS_INV_COLS ) + 1 ) - ( 128 / 2 ) + SKI_INV_SLOT_HEIGHT / 2;
+ }
+ else
+ {
+ sPosX = SCREEN_X_OFFSET + 2;
+ sPosY = SCREEN_Y_OFFSET + 146;
+ }
//if the start position + the height of the box is off the screen, reposition
if( sPosY < (0 + SCREEN_Y_OFFSET) )
@@ -6460,8 +6548,9 @@ void StartSKIDescriptionBox( void )
DisableButton( guiSKI_InvPageUpButton );
DisableButton( guiSKI_InvPageDownButton );
// DisableButton( guiSKI_EvaluateButton );
- DisableButton( guiSKI_TransactionButton );
- DisableButton( guiSKI_DoneButton );
+ EnableDisableShopkeeperButtons(SHOPKEEPER_SCREEN, DISABLE_BUTTON);
+ //DisableButton( guiSKI_TransactionButton );
+ //DisableButton( guiSKI_DoneButton );
/*
for (iCnt = 0; iCnt < NUM_SKI_ATM_BUTTONS; iCnt++)
DisableButton( guiSKI_AtmButton[ iCnt ] );
@@ -6509,8 +6598,9 @@ void DeleteShopKeeperItemDescBox()
EnableButton( guiSKI_InvPageUpButton );
EnableButton( guiSKI_InvPageDownButton );
- EnableButton( guiSKI_TransactionButton );
- EnableButton( guiSKI_DoneButton );
+ EnableDisableShopkeeperButtons(SHOPKEEPER_SCREEN, ENABLE_BUTTON);
+ //EnableButton( guiSKI_TransactionButton );
+ //EnableButton( guiSKI_DoneButton );
EnableDisableDealersInventoryPageButtons();
EnableDisableEvaluateAndTransactionButtons();
@@ -7588,7 +7678,7 @@ void BuildDoneWhenTimeString( CHAR16 sString[], UINT8 ubArmsDealer, INVENTORY_IN
for (DealerItemList::iterator iter = gArmsDealersInventory[ubArmsDealer].begin();
iter != gArmsDealersInventory[ubArmsDealer].end(); ++iter) {
if (iter->ItemIsInInventory() == true && iter->IsUnderRepair() == true) {
- if (pObject->ItemObject == iter->object) {
+ if (pObject->ItemObject == iter->object && pObject->uiRepairDoneTime == iter->uiRepairDoneTime) {
pSpecial = &(*iter);
break;
}
diff --git a/Tactical/ShopKeeper Interface.h b/Tactical/ShopKeeper Interface.h
index ab740682..f23e759a 100644
--- a/Tactical/ShopKeeper Interface.h
+++ b/Tactical/ShopKeeper Interface.h
@@ -118,7 +118,7 @@ bool RepairmanItemQsortCompare(INVENTORY_IN_SLOT& pInvSlot1, INVENTORY_IN_SLOT&
void EnterShopKeeperInterfaceScreen( UINT8 ubArmsDealer );
-
+void EnableDisableShopkeeperButtons(UINT32 uiCurrentItemDescriptionScreen, int bpAction);
void DrawHatchOnInventory( UINT32 uiSurface, UINT16 usPosX, UINT16 usPosY, UINT16 usWidth, UINT16 usHeight, UINT16 usColor = 0 );
BOOLEAN ShouldSoldierDisplayHatchOnItem( UINT8 ubProfileID, INT16 sSlotNum );
diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp
index fffbd6bc..d787ae27 100644
--- a/Tactical/Soldier Ani.cpp
+++ b/Tactical/Soldier Ani.cpp
@@ -3268,22 +3268,19 @@ void HandleKilledQuote( SOLDIERTYPE *pKilledSoldier, SOLDIERTYPE *pKillerSoldier
BOOLEAN HandleSoldierDeath( SOLDIERTYPE *pSoldier , BOOLEAN *pfMadeCorpse )
{
BOOLEAN fBuddyJustDead = FALSE;
-
*pfMadeCorpse = FALSE;
if ( pSoldier->stats.bLife == 0 && !( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) )
{
// Haydent/send death info
if (is_networked)
- {
-
- if(pSoldier->bTeam==0) send_death(pSoldier);
- else if(pSoldier->bTeam <6 && ((gTacticalStatus.ubTopMessageType == PLAYER_TURN_MESSAGE) || (gTacticalStatus.ubTopMessageType == PLAYER_INTERRUPT_MESSAGE)))send_death(pSoldier);
-
-
+ {
+ if(pSoldier->bTeam==0)
+ send_death(pSoldier);
+ else if(pSoldier->bTeam <6 && ((gTacticalStatus.ubTopMessageType == PLAYER_TURN_MESSAGE) || (gTacticalStatus.ubTopMessageType == PLAYER_INTERRUPT_MESSAGE)))
+ send_death(pSoldier);
}
-
-
+
// Cancel services here...
pSoldier->ReceivingSoldierCancelServices( );
pSoldier->GivingSoldierCancelServices( );
@@ -3348,129 +3345,133 @@ BOOLEAN HandleSoldierDeath( SOLDIERTYPE *pSoldier , BOOLEAN *pfMadeCorpse )
ubAssister = pSoldier->ubNextToPreviousAttackerID;
}
}
+
//////////////////////////////////////////////////////////////
-
- // IF this guy has an attacker and he's a good guy, play sound
- if ( ubAttacker != NOBODY )
+
+ // WANNE: This should fix crash in a MP game, when someone quits playing
+ if ( (is_networked && pSoldier->ubAttackerID < 254) || !is_networked )
{
- if ( MercPtrs[ pSoldier->ubAttackerID ]->bTeam == gbPlayerNum && gTacticalStatus.ubAttackBusyCount > 0 )
- {
- gTacticalStatus.fKilledEnemyOnAttack = TRUE;
- gTacticalStatus.ubEnemyKilledOnAttack = pSoldier->ubID;
- gTacticalStatus.ubEnemyKilledOnAttackLocation = pSoldier->sGridNo;
- gTacticalStatus.bEnemyKilledOnAttackLevel = pSoldier->pathing.bLevel;
- gTacticalStatus.ubEnemyKilledOnAttackKiller = ubAttacker;
-
- // also check if we are in mapscreen, if so update soldier's list
- if( guiCurrentScreen == MAP_SCREEN )
+ // IF this guy has an attacker and he's a good guy, play sound
+ if ( ubAttacker != NOBODY )
+ {
+ if ( MercPtrs[ pSoldier->ubAttackerID ]->bTeam == gbPlayerNum && gTacticalStatus.ubAttackBusyCount > 0 )
{
- ReBuildCharactersList( );
+ gTacticalStatus.fKilledEnemyOnAttack = TRUE;
+ gTacticalStatus.ubEnemyKilledOnAttack = pSoldier->ubID;
+ gTacticalStatus.ubEnemyKilledOnAttackLocation = pSoldier->sGridNo;
+ gTacticalStatus.bEnemyKilledOnAttackLevel = pSoldier->pathing.bLevel;
+ gTacticalStatus.ubEnemyKilledOnAttackKiller = ubAttacker;
+
+ // also check if we are in mapscreen, if so update soldier's list
+ if( guiCurrentScreen == MAP_SCREEN )
+ {
+ ReBuildCharactersList( );
+ }
}
- }
- else if ( pSoldier->bVisible == TRUE )
- {
- // We were a visible enemy, say laugh!
- if ( Random(3) == 0 && !CREATURE_OR_BLOODCAT( MercPtrs[ ubAttacker ] ) )
+ else if ( pSoldier->bVisible == TRUE )
{
- MercPtrs[ ubAttacker ]->DoMercBattleSound( BATTLE_SOUND_LAUGH1 );
- }
+ // We were a visible enemy, say laugh!
+ if ( Random(3) == 0 && !CREATURE_OR_BLOODCAT( MercPtrs[ ubAttacker ] ) )
+ {
+ MercPtrs[ ubAttacker ]->DoMercBattleSound( BATTLE_SOUND_LAUGH1 );
+ }
+ }
}
- }
-
- // Handle NPC Dead
- HandleNPCTeamMemberDeath( pSoldier );
-
- // if a friendly with a profile, increment kills
- // militia also now track kills...
- if ( ubAttacker != NOBODY )
- {
- if ( MercPtrs[ ubAttacker ]->bTeam == gbPlayerNum )
+
+ // Handle NPC Dead
+ HandleNPCTeamMemberDeath( pSoldier );
+
+ // if a friendly with a profile, increment kills
+ // militia also now track kills...
+ if ( ubAttacker != NOBODY )
{
- // increment kills
- /////////////////////////////////////////////////////////////////////////////////////
- // SANDRO - experimental - more specific statistics of mercs
- switch(pSoldier->ubSoldierClass)
+ if ( MercPtrs[ ubAttacker ]->bTeam == gbPlayerNum )
{
- case SOLDIER_CLASS_ELITE :
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsElites++;
- break;
- case SOLDIER_CLASS_ARMY :
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsRegulars++;
- break;
- case SOLDIER_CLASS_ADMINISTRATOR :
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsAdmins++;
- break;
- case SOLDIER_CLASS_CREATURE :
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsCreatures++;
- break;
- default :
- if ( CREATURE_OR_BLOODCAT( pSoldier ) )
+ // increment kills
+ /////////////////////////////////////////////////////////////////////////////////////
+ // SANDRO - experimental - more specific statistics of mercs
+ switch(pSoldier->ubSoldierClass)
+ {
+ case SOLDIER_CLASS_ELITE :
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsElites++;
+ break;
+ case SOLDIER_CLASS_ARMY :
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsRegulars++;
+ break;
+ case SOLDIER_CLASS_ADMINISTRATOR :
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsAdmins++;
+ break;
+ case SOLDIER_CLASS_CREATURE :
gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsCreatures++;
- else if ( TANK( pSoldier ) )
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsTanks++;
- else if ( pSoldier->bTeam == CIV_TEAM && !pSoldier->aiData.bNeutral && pSoldier->bSide != gbPlayerNum )
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsHostiles++;
+ break;
+ default :
+ if ( CREATURE_OR_BLOODCAT( pSoldier ) )
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsCreatures++;
+ else if ( TANK( pSoldier ) )
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsTanks++;
+ else if ( pSoldier->bTeam == CIV_TEAM && !pSoldier->aiData.bNeutral && pSoldier->bSide != gbPlayerNum )
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsHostiles++;
+ else
+ gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsOthers++;
+ break;
+ }
+ //gMercProfiles[ MercPtrs[ pSoldier->ubAttackerID ]->ubProfile ].usKills++;
+ /////////////////////////////////////////////////////////////////////////////////////
+ gStrategicStatus.usPlayerKills++;
+ }
+ else if ( MercPtrs[ ubAttacker ]->bTeam == MILITIA_TEAM )
+ {
+ // get a kill! 2 points!
+ MercPtrs[ ubAttacker ]->ubMilitiaKills += 2;
+ }
+
+ }
+
+ if ( ubAssister != NOBODY && ubAssister != ubAttacker )
+ {
+ if ( MercPtrs[ ubAssister ]->bTeam == gbPlayerNum )
+ {
+ /////////////////////////////////////////////////////////////////////////////////////
+ // SANDRO - new mercs' records
+ if( MercPtrs[ ubAttacker ] != NULL )
+ {
+ if( MercPtrs[ ubAttacker ]->bTeam == gbPlayerNum )
+ gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsMercs++;
+ else if ( MercPtrs[ ubAttacker ]->bTeam == MILITIA_TEAM )
+ gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsMilitia++;
else
- gMercProfiles[ MercPtrs[ ubAttacker ]->ubProfile ].records.usKillsOthers++;
- break;
- }
- //gMercProfiles[ MercPtrs[ pSoldier->ubAttackerID ]->ubProfile ].usKills++;
- /////////////////////////////////////////////////////////////////////////////////////
- gStrategicStatus.usPlayerKills++;
- }
- else if ( MercPtrs[ ubAttacker ]->bTeam == MILITIA_TEAM )
- {
- // get a kill! 2 points!
- MercPtrs[ ubAttacker ]->ubMilitiaKills += 2;
- }
-
- }
-
-
- if ( ubAssister != NOBODY && ubAssister != ubAttacker )
- {
- if ( MercPtrs[ ubAssister ]->bTeam == gbPlayerNum )
- {
- /////////////////////////////////////////////////////////////////////////////////////
- // SANDRO - new mercs' records
- if( MercPtrs[ ubAttacker ] != NULL )
- {
- if( MercPtrs[ ubAttacker ]->bTeam == gbPlayerNum )
- gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsMercs++;
- else if ( MercPtrs[ ubAttacker ]->bTeam == MILITIA_TEAM )
- gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsMilitia++;
+ gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsOthers++;
+ }
else
+ {
gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsOthers++;
+ }
+ //gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].usAssists++;
+ /////////////////////////////////////////////////////////////////////////////////////
}
- else
+ else if ( MercPtrs[ ubAssister ]->bTeam == MILITIA_TEAM )
{
- gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].records.usAssistsOthers++;
+ // get an assist - 1 points
+ MercPtrs[ ubAssister ]->ubMilitiaKills += 1;
}
- //gMercProfiles[ MercPtrs[ ubAssister ]->ubProfile ].usAssists++;
- /////////////////////////////////////////////////////////////////////////////////////
}
- else if ( MercPtrs[ ubAssister ]->bTeam == MILITIA_TEAM )
+ /*
+ // handle assist
+ // if killer is assister, don't increment
+ if ( pSoldier->ubPreviousAttackerID != NOBODY && pSoldier->ubPreviousAttackerID != pSoldier->ubAttackerID )
{
- // get an assist - 1 points
- MercPtrs[ ubAssister ]->ubMilitiaKills += 1;
+ if ( MercPtrs[ pSoldier->ubPreviousAttackerID ]->bTeam == gbPlayerNum )
+ {
+ gMercProfiles[ MercPtrs[ pSoldier->ubPreviousAttackerID ]->ubProfile ].usAssists++;
}
+ else if ( MercPtrs[ pSoldier->ubPreviousAttackerID ]->bTeam == MILITIA_TEAM )
+ {
+ // get an assist - 1 points
+ MercPtrs[ pSoldier->ubPreviousAttackerID ]->ubMilitiaKills += 1;
+ }
+ }
+ */
}
- /*
- // handle assist
- // if killer is assister, don't increment
- if ( pSoldier->ubPreviousAttackerID != NOBODY && pSoldier->ubPreviousAttackerID != pSoldier->ubAttackerID )
- {
- if ( MercPtrs[ pSoldier->ubPreviousAttackerID ]->bTeam == gbPlayerNum )
- {
- gMercProfiles[ MercPtrs[ pSoldier->ubPreviousAttackerID ]->ubProfile ].usAssists++;
- }
- else if ( MercPtrs[ pSoldier->ubPreviousAttackerID ]->bTeam == MILITIA_TEAM )
- {
- // get an assist - 1 points
- MercPtrs[ pSoldier->ubPreviousAttackerID ]->ubMilitiaKills += 1;
- }
- }
- */
}
if ( TurnSoldierIntoCorpse( pSoldier, TRUE, TRUE ) )
diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp
index 6bb3459a..1f80675c 100644
--- a/Tactical/Soldier Control.cpp
+++ b/Tactical/Soldier Control.cpp
@@ -2413,8 +2413,12 @@ BOOLEAN SOLDIERTYPE::CreateSoldierCommon( UINT8 ubBodyType, UINT16 usSoldierID,
// bad anims are: HOPFENCE,
// CLIMBDOWNROOF, FALLFORWARD_ROOF,FALLOFF, CLIMBUPROOF
if( !gfWorldLoaded &&
- ( usState == HOPFENCE ||
+ ( usState == HOPFENCE || usState == JUMPWINDOWS ||
usState == CLIMBDOWNROOF ||
+
+ usState == JUMPDOWNWALL ||
+ usState == JUMPUPWALL ||
+
usState == FALLFORWARD_ROOF ||
usState == FALLOFF ||
usState == CLIMBUPROOF ) )
@@ -2992,6 +2996,33 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart
return( TRUE );
}
}
+
+ if ( usNewState == JUMPUPWALL )
+ {
+ if ( this->ubPendingDirection != NO_PENDING_DIRECTION )
+ {
+ this->EVENT_SetSoldierDesiredDirection( this->ubPendingDirection );
+ this->ubPendingDirection = NO_PENDING_DIRECTION;
+ this->usPendingAnimation = JUMPUPWALL;
+ this->flags.fTurningUntilDone = TRUE;
+ this->SoldierGotoStationaryStance( );
+ return( TRUE );
+ }
+ }
+
+ if ( usNewState == JUMPDOWNWALL )
+ {
+ if ( this->ubPendingDirection != NO_PENDING_DIRECTION )
+ {
+ this->EVENT_SetSoldierDesiredDirection( this->ubPendingDirection );
+ this->ubPendingDirection = NO_PENDING_DIRECTION;
+ this->usPendingAnimation = JUMPDOWNWALL;
+ this->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
+ this->flags.fTurningUntilDone = TRUE;
+ this->SoldierGotoStationaryStance( );
+ return( TRUE );
+ }
+ }
// ATE: Don't raise/lower automatically if we are low on health,
// as our gun looks lowered anyway....
@@ -3229,7 +3260,7 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart
}
// ATE: Patch hole for breath collapse for roofs, fences
- if ( usNewState == CLIMBUPROOF || usNewState == CLIMBDOWNROOF || usNewState == HOPFENCE )
+ if ( usNewState == JUMPUPWALL || usNewState == JUMPDOWNWALL || usNewState == CLIMBUPROOF || usNewState == CLIMBDOWNROOF || usNewState == HOPFENCE || usNewState == JUMPWINDOWS)
{
// Check for breath collapse if a given animation like
if ( this->CheckForBreathCollapse( ) || this->bCollapsed )
@@ -3708,6 +3739,13 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart
else
DeductPoints( this, GetAPsToJumpFence( this, FALSE ), GetBPsToJumpFence( this, FALSE ) );
break;
+
+ case JUMPWINDOWS:
+ if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( this ) != ITEM_NOT_FOUND )
+ DeductPoints( this, GetAPsToJumpThroughWindows( this, TRUE ), GetBPsToJumpThroughWindows( this, TRUE ) );
+ else
+ DeductPoints( this, GetAPsToJumpThroughWindows( this, FALSE ), GetBPsToJumpThroughWindows( this, FALSE ) );
+ break;
// Deduct aps for falling down....
case FALLBACK_HIT_STAND:
@@ -3742,6 +3780,22 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart
DeductPoints( this, GetAPsToClimbRoof( this, FALSE), GetBPsToClimbRoof( this, FALSE) ); // changed by SANDRO
break;
+
+ case JUMPDOWNWALL:
+
+ // disable sight
+ gTacticalStatus.uiFlags |= DISALLOW_SIGHT;
+
+ DeductPoints( this, GetAPsToJumpWall( this, TRUE), GetBPsToJumpWall( this, TRUE) );
+ break;
+
+ case JUMPUPWALL:
+
+ // disable sight
+ gTacticalStatus.uiFlags |= DISALLOW_SIGHT;
+
+ DeductPoints( this, GetAPsToJumpWall( this, FALSE), GetBPsToJumpWall( this, FALSE) );
+ break;
case JUMP_OVER_BLOCKING_PERSON:
@@ -4311,6 +4365,17 @@ void SOLDIERTYPE::SetSoldierGridNo( INT32 sNewGridNo, BOOLEAN fForceRemove )
if(this->iLight!=(-1))
LightSpriteRoofStatus(this->iLight, FALSE );
}
+
+ if ( this->usAnimState == JUMPUPWALL )
+ {
+ if(this->iLight!=(-1))
+ LightSpriteRoofStatus(this->iLight, TRUE );
+ }
+ else if ( this->usAnimState == JUMPDOWNWALL )
+ {
+ if(this->iLight!=(-1))
+ LightSpriteRoofStatus(this->iLight, FALSE );
+ }
//JA2Gold:
//if the player wants the merc to cast the fake light AND it is night
@@ -6583,7 +6648,7 @@ void SOLDIERTYPE::EVENT_InternalSetSoldierDestination( UINT16 usNewDirection, BO
// OK, ATE: If we are side_stepping, calculate a NEW desired direction....
- if ( this->bReverse && usAnimState == SIDE_STEP )
+ if ( this->bReverse && (usAnimState == SIDE_STEP || usAnimState == ROLL_PRONE_R || usAnimState == ROLL_PRONE_L) )
{
UINT8 ubPerpDirection;
@@ -6691,7 +6756,7 @@ INT8 MultiTiledTurnDirection( SOLDIERTYPE * pSoldier, INT8 bStartDirection, INT8
void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState )
{
//if ( usAnimState == WALK_BACKWARDS )
- if ( pSoldier->bReverse && usAnimState != SIDE_STEP )
+ if ( pSoldier->bReverse && (usAnimState != SIDE_STEP && usAnimState != ROLL_PRONE_R && usAnimState != ROLL_PRONE_L) )
{
// OK, check if we are going to go in the exact opposite than our facing....
ubNewDirection = gOppositeDirection[ ubNewDirection ];
@@ -7245,6 +7310,19 @@ void SOLDIERTYPE::TurnSoldier( void )
HandleSystemNewAISituation( this, FALSE );
}
+
+ if ( this->flags.uiStatusFlags & SOLDIER_LOOK_NEXT_TURNSOLDIER )
+ {
+ if ( ( gAnimControl[ this->usAnimState ].uiFlags & ANIM_STATIONARY && this->usAnimState != JUMPUPWALL && this->usAnimState != JUMPDOWNWALL ) )
+ {
+ // HANDLE SIGHT!
+ HandleSight( this,SIGHT_LOOK | SIGHT_RADIO );
+ }
+ // Turn off!
+ this->flags.uiStatusFlags &= (~SOLDIER_LOOK_NEXT_TURNSOLDIER );
+
+ HandleSystemNewAISituation( this, FALSE );
+ }
if ( this->flags.fTurningToShoot )
@@ -8480,7 +8558,7 @@ void SOLDIERTYPE::BeginSoldierClimbFence( void )
void SOLDIERTYPE::BeginSoldierClimbWindow( void )
{
- INT8 bDirection;
+ INT8 bDirection;
// Make sure we hop the correct fence to follow our path!
if (this->pathing.usPathIndex < this->pathing.usPathDataSize)
@@ -8500,59 +8578,55 @@ void SOLDIERTYPE::BeginSoldierClimbWindow( void )
this->flags.fTurningUntilDone = TRUE;
// ATE: Reset flag to go back to prone...
this->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
- this->usPendingAnimation = HOPFENCE;
+ this->usPendingAnimation = JUMPWINDOWS; //HOPFENCE;
}
-
}
-void SOLDIERTYPE::BeginSoldierFence( void )
+void SOLDIERTYPE::BeginSoldierClimbWall( void )
{
INT8 bNewDirection;
UINT8 ubWhoIsThere;
-
- if ( FindFenceDirection( this, this->sGridNo, this->ubDirection, &bNewDirection ) && ( this->pathing.bLevel == 0 ) )
+ if ( FindWallJumpDirection( this, this->sGridNo, this->ubDirection, &bNewDirection ) && ( this->pathing.bLevel == 0 ) )
{
if ( EnoughPoints( this, GetAPsToClimbRoof( this, FALSE ), 0, TRUE ) )
{
//Kaiden: Helps if we look where we are going before we try to climb on top of someone
- ubWhoIsThere = WhoIsThere2( NewGridNo( this->sGridNo, (UINT16)DirectionInc(bNewDirection ) ), 1 );
- if ( ubWhoIsThere != NOBODY && ubWhoIsThere != this->ubID )
- {
- return;
- }
- else
- {
-
- if (this->bTeam == gbPlayerNum)
+ ubWhoIsThere = WhoIsThere2( NewGridNo( this->sGridNo, (UINT16)DirectionInc(bNewDirection ) ), 1 );
+ if ( ubWhoIsThere != NOBODY && ubWhoIsThere != this->ubID )
{
- SetUIBusy( this->ubID );
+ return;
}
+ else
+ {
+ if (this->bTeam == gbPlayerNum)
+ {
+ SetUIBusy( this->ubID );
+ }
- this->sTempNewGridNo = NewGridNo( this->sGridNo, (UINT16)DirectionInc(bNewDirection ) );
+ this->sTempNewGridNo = NewGridNo( this->sGridNo, (UINT16)DirectionInc(bNewDirection ) );
- this->ubPendingDirection = bNewDirection;
- this->EVENT_InitNewSoldierAnim( CLIMBUPROOF, 0 , FALSE );
-
- this->InternalReceivingSoldierCancelServices( FALSE );
- this->InternalGivingSoldierCancelServices( FALSE );
-
- this->BeginSoldierFenceUp( );
- }
+ this->ubPendingDirection = bNewDirection;
+ this->EVENT_InitNewSoldierAnim( JUMPUPWALL, 0 , FALSE );
+ this->InternalReceivingSoldierCancelServices( FALSE );
+ this->InternalGivingSoldierCancelServices( FALSE );
+
+ // this->BeginSoldierClimbWallUp( );
+ }
}
}
}
-void SOLDIERTYPE::BeginSoldierFenceUp( void )
+void SOLDIERTYPE::BeginSoldierClimbWallUp( void )
{
INT8 bNewDirection;
UINT8 ubWhoIsThere;
- if ( FindLowerLevelFence( this, this->sGridNo, this->ubDirection, &bNewDirection ) && ( this->pathing.bLevel > 0 ) )
+ if ( FindLowerLevelWall( this, this->sGridNo, this->ubDirection, &bNewDirection ) && ( this->pathing.bLevel > 0 ) )
{
- if ( EnoughPoints( this, GetAPsToClimbRoof( this, TRUE ), 0, TRUE ) )
+ if ( EnoughPoints( this, GetAPsToJumpWall( this, TRUE ), 0, TRUE ) )
{
//Kaiden: Helps if we look where we are going before we try to climb on top of someone
ubWhoIsThere = WhoIsThere2( NewGridNo( this->sGridNo, (UINT16)DirectionInc(bNewDirection ) ), 0 );
@@ -8573,10 +8647,12 @@ void SOLDIERTYPE::BeginSoldierFenceUp( void )
bNewDirection = gTwoCDirection[ bNewDirection ];
this->ubPendingDirection = bNewDirection;
- this->EVENT_InitNewSoldierAnim( CLIMBDOWNROOF, 0 , FALSE );
+ this->EVENT_InitNewSoldierAnim( JUMPDOWNWALL, 0 , FALSE );
this->InternalReceivingSoldierCancelServices( FALSE );
- this->InternalGivingSoldierCancelServices( FALSE );
+ this->InternalGivingSoldierCancelServices( FALSE );
+
+ this->BeginSoldierClimbWall( );
}
}
@@ -8585,7 +8661,6 @@ void SOLDIERTYPE::BeginSoldierFenceUp( void )
}
//------------------------------------------------------------------------------------------
-
UINT32 SleepDartSuccumbChance( SOLDIERTYPE * pSoldier )
{
UINT32 uiChance;
@@ -9884,7 +9959,7 @@ void SOLDIERTYPE::BeginSoldierClimbDownRoof( void )
bNewDirection = gTwoCDirection[ bNewDirection ];
this->ubPendingDirection = bNewDirection;
- this->EVENT_InitNewSoldierAnim( CLIMBDOWNROOF, 0 , FALSE );
+ this->EVENT_InitNewSoldierAnim( JUMPDOWNWALL, 0 , FALSE );
this->InternalReceivingSoldierCancelServices( FALSE );
this->InternalGivingSoldierCancelServices( FALSE );
@@ -11290,6 +11365,7 @@ void SOLDIERTYPE::EVENT_SoldierBeginFirstAid( INT32 sGridNo, UINT8 ubDirection )
if ( !fRefused )
{
+ /*
if ( CREATURE_OR_BLOODCAT( pTSoldier ) )
{
// nope!!
@@ -11297,6 +11373,8 @@ void SOLDIERTYPE::EVENT_SoldierBeginFirstAid( INT32 sGridNo, UINT8 ubDirection )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_REFUSE_FIRSTAID_FOR_CREATURE ] );
}
else if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide )
+ */
+ if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide )
{
fRefused = TRUE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_REFUSE_FIRSTAID ] );
@@ -11606,16 +11684,19 @@ UINT32 SOLDIERTYPE::SoldierDressWound( SOLDIERTYPE *pVictim, INT16 sKitPts, INT1
usLifeReturned = pVictim->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT ))/100;
pVictim->iHealableInjury = 0;
+ //CHRISL: Why would we arbitrarily use all ubPtsLeft when a victim isn't bleeding? And why would the medical bag, which we have to use in order to
+ // do surgery, have any extra benefit? Plus, the medical back bonus can actually result in ubPtsLeft being HIGHER then it was before we healed the
+ // victim, which makes no sense.
// keep the rest of the points to bandaging if neccessary
- if (pVictim->bBleeding > 0)
- {
+ //if (pVictim->bBleeding > 0)
+ //{
ubPtsLeft = max(0, (ubPtsLeft - (usLifeReturned / 100)));
- ubPtsLeft += (ubPtsLeft/2); // we use medical bag so add the bonus for that.
- }
- else
- {
- ubPtsLeft = 0;
- }
+ // ubPtsLeft += (ubPtsLeft/2); // we use medical bag so add the bonus for that.
+ //}
+ //else
+ //{
+ // ubPtsLeft = 0;
+ //}
// We are finished !!!
this->fDoingSurgery = FALSE;
@@ -11709,9 +11790,9 @@ UINT32 SOLDIERTYPE::SoldierDressWound( SOLDIERTYPE *pVictim, INT16 sKitPts, INT1
pVictim->flags.fWarnedAboutBleeding = FALSE;
}
-
+ //CHRISL: If by some chance ubPtsLeft ends up being higher then uiActual, we'll end up with a huge value since uiActual is an unsigned variable.
// if there are any ptsLeft now, then we didn't actually get to use them
- uiActual = max(0, (uiActual - ubPtsLeft));
+ uiActual = max(0, (INT32)(uiActual - ubPtsLeft));
// usedAPs equals (actionPts) * (%of possible points actually used)
uiUsedAPs = ( uiActual * uiAvailAPs ) / uiPossible;
@@ -12934,6 +13015,10 @@ void HandlePlacingRoofMarker( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fSet
return;
}
+ //CHRISL: If sGridNo is -1, which can be the case if there is a dead merc still listed as part of a unit, crashes will occur
+ if ( sGridNo == -1 )
+ return;
+
if ( pSoldier->bTeam != gbPlayerNum )
{
//return;
@@ -12950,6 +13035,11 @@ void HandlePlacingRoofMarker( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fSet
{
return;
}
+
+ if ( pSoldier->usAnimState == JUMPUPWALL && !fForce )
+ {
+ return;
+ }
if ( pRoofNode != NULL )
{
@@ -13622,6 +13712,9 @@ BOOLEAN SOLDIERTYPE::PlayerSoldierStartTalking( UINT8 ubTargetID, BOOLEAN fValid
//lal
// ATE; Check for normal civs...
+
+ BOOLEAN apsDeducted = FALSE;
+
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
{
//lal
@@ -13634,14 +13727,19 @@ BOOLEAN SOLDIERTYPE::PlayerSoldierStartTalking( UINT8 ubTargetID, BOOLEAN fValid
{
// Deduct points from our guy....
DeductPoints( this, sAPCost, 0 );
+ apsDeducted = TRUE;
StartCivQuote( pTSoldier );
return( FALSE );
}
}
-
-
+ // WANNE: This fixes the bug, that APs for talking are not always deducted.
+ if (!apsDeducted)
+ {
+ DeductPoints( this, sAPCost, 0 );
+ apsDeducted = TRUE;
+ }
// Are we an EPC that is being escorted?
if ( pTSoldier->ubProfile != NO_PROFILE && pTSoldier->ubWhatKindOfMercAmI == MERC_TYPE__EPC )
@@ -13981,7 +14079,7 @@ void InternalPlaySoldierFootstepSound( SOLDIERTYPE * pSoldier )
// Determine if we are on the floor
if ( !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
- if ( pSoldier->usAnimState == HOPFENCE )
+ if ( pSoldier->usAnimState == HOPFENCE || pSoldier->usAnimState == JUMPWINDOWS)
{
bVolume = HIGHVOLUME;
}
@@ -14264,6 +14362,11 @@ void SetSoldierPersonalLightLevel( SOLDIERTYPE *pSoldier )
return;
}
+ if(gpWorldLevelData[pSoldier->sGridNo].pMercHead == NULL)
+ {
+ return;
+ }
+
//THe light level for the soldier
gpWorldLevelData[pSoldier->sGridNo].pMercHead->ubShadeLevel = 3;
gpWorldLevelData[pSoldier->sGridNo].pMercHead->ubSumLights = 5;
@@ -14271,56 +14374,14 @@ void SetSoldierPersonalLightLevel( SOLDIERTYPE *pSoldier )
gpWorldLevelData[pSoldier->sGridNo].pMercHead->ubNaturalShadeLevel = 5;
}
-//---legion by JAzz---------------------------------------
-
-void BeginSoldierFence( SOLDIERTYPE *pSoldier )
-{
- INT8 bNewDirection;
- UINT8 ubWhoIsThere;
-
-
- if ( FindFenceDirection( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->pathing.bLevel == 0 ) )
- {
- if ( EnoughPoints( pSoldier, GetAPsToClimbRoof( pSoldier, FALSE ), 0, TRUE ) )
- {
- //Kaiden: Helps if we look where we are going before we try to climb on top of someone
- ubWhoIsThere = WhoIsThere2( NewGridNo( pSoldier->sGridNo, (UINT16)DirectionInc(bNewDirection ) ), 1 );
- if ( ubWhoIsThere != NOBODY && ubWhoIsThere != pSoldier->ubID )
- {
- return;
- }
- else
- {
-
- if (pSoldier->bTeam == gbPlayerNum)
- {
- SetUIBusy( pSoldier->ubID );
- }
-
- pSoldier->sTempNewGridNo = NewGridNo( pSoldier->sGridNo, (UINT16)DirectionInc(bNewDirection ) );
-
- pSoldier->ubPendingDirection = bNewDirection;
- pSoldier->EVENT_InitNewSoldierAnim( CLIMBUPROOF, 0 , FALSE );
-
- pSoldier->InternalReceivingSoldierCancelServices( FALSE );
- pSoldier->InternalGivingSoldierCancelServices( FALSE );
-
- BeginSoldierFenceUp( pSoldier );
- }
-
- }
- }
-
-}
-
-void BeginSoldierFenceUp( SOLDIERTYPE *pSoldier )
+void BeginSoldierClimbWallUp( SOLDIERTYPE *pSoldier )
{
INT8 bNewDirection;
UINT8 ubWhoIsThere;
- if ( FindLowerLevelFence( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->pathing.bLevel > 0 ) )
+ if ( FindLowerLevelWall( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->pathing.bLevel > 0 ) )
{
- if ( EnoughPoints( pSoldier, GetAPsToClimbRoof( pSoldier, TRUE ), 0, TRUE ) )
+ if ( EnoughPoints( pSoldier, GetAPsToJumpWall( pSoldier, TRUE ), 0, TRUE ) )
{
//Kaiden: Helps if we look where we are going before we try to climb on top of someone
ubWhoIsThere = WhoIsThere2( NewGridNo( pSoldier->sGridNo, (UINT16)DirectionInc(bNewDirection ) ), 0 );
@@ -14341,7 +14402,7 @@ void BeginSoldierFenceUp( SOLDIERTYPE *pSoldier )
bNewDirection = gTwoCDirection[ bNewDirection ];
pSoldier->ubPendingDirection = bNewDirection;
- pSoldier->EVENT_InitNewSoldierAnim( CLIMBDOWNROOF, 0 , FALSE );
+ pSoldier->EVENT_InitNewSoldierAnim( JUMPDOWNWALL, 0 , FALSE );
pSoldier->InternalReceivingSoldierCancelServices( FALSE );
pSoldier->InternalGivingSoldierCancelServices( FALSE );
diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h
index 3427fa53..4a90f7d7 100644
--- a/Tactical/Soldier Control.h
+++ b/Tactical/Soldier Control.h
@@ -34,6 +34,8 @@ extern UINT16 CivLastNames[MAXCIVLASTNAMES][10];
#define LOCKED_NO_NEWGRIDNO 2
+// WANNE: Yes I know, we support up to 254 profiles, but because of compatibility, profile Id = 200
+// is not a valid profil. We in MercProfiles.xml, the profile id = 200 should not be used!
#define NO_PROFILE 200
#define BATTLE_SND_LOWER_VOLUME 1
@@ -815,6 +817,9 @@ public:
// HEADROCK HAM 4: Two more values. These record the shooter's previous Counter Force applied on the gun.
FLOAT dPrevCounterForceX;
FLOAT dPrevCounterForceY;
+ // CHRISL: Track initial offsets for autofire
+ FLOAT dInitialMuzzleOffsetX;
+ FLOAT dInitialMuzzleOffsetY;
INT8 bTilesMoved;
FLOAT dNextBleed;
@@ -1258,9 +1263,9 @@ public:
void BeginTyingToFall( void );
//legion by Jazz
- void BeginSoldierFence( void );
- void BeginSoldierFenceUp( void );
+ void BeginSoldierClimbWall( void );
void BeginSoldierClimbWindow( void );
+ void BeginSoldierClimbWallUp( void );
void HandleAnimationProfile( UINT16 usAnimState, BOOLEAN fRemove );
void HandleSoldierTakeDamageFeedback( void );
diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp
index ead689cc..037efe39 100644
--- a/Tactical/Soldier Create.cpp
+++ b/Tactical/Soldier Create.cpp
@@ -546,13 +546,15 @@ void DecideToAssignSniperOrders( SOLDIERCREATE_STRUCT * pp )
if ( pp->bOrders == STATIONARY || pp->bOrders == ONGUARD )
{
- // 30% of anybody w/a scope and decent range being a sniper, 80% chance of a guy w/a sniper rifle being a sniper
- if ( (GunRange(&pp->Inv[HANDPOS], NULL) >= 40 && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < 30) || ( Weapon[pp->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < 80 ) ) // SANDRO - added argument forGunRange
- {
+ //CHRISL: Externalized values and added ability to restrict non-SR Snipers to Elite only
+ if(Weapon[pp->Inv[HANDPOS].usItem].ubWeaponType != GUN_SN_RIFLE && GunRange(&pp->Inv[HANDPOS], NULL) >= gGameExternalOptions.fAISniperRange && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < gGameExternalOptions.fAISniperChance){
+ if((gGameExternalOptions.fAISniperElite == TRUE && pp->ubSoldierClass == SOLDIER_CLASS_ELITE) || gGameExternalOptions.fAISniperElite == FALSE)
+ pp->bOrders = SNIPER;
+ }
+ else if(Weapon[pp->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < gGameExternalOptions.fAISniperChanceWithSR)
pp->bOrders = SNIPER;
- DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Sniper Created") );
- }
+ DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Sniper Created") );
}
}
diff --git a/Tactical/Soldier Create.h b/Tactical/Soldier Create.h
index 0903d776..87e4afeb 100644
--- a/Tactical/Soldier Create.h
+++ b/Tactical/Soldier Create.h
@@ -501,7 +501,7 @@ void OkayToUpgradeEliteToSpecialProfiledEnemy( SOLDIERCREATE_STRUCT *pp );
extern BOOLEAN gfProfiledEnemyAdded; //needs to be saved (used by the above function)
//Legion by Jazz
-void BeginSoldierClimbUpOkno( SOLDIERTYPE *pSoldier );
+//void BeginSoldierClimbUpOkno( SOLDIERTYPE *pSoldier );
void BeginSoldierFenceUp( SOLDIERTYPE *pSoldier );
//dnl ch27 240909
typedef enum
diff --git a/Tactical/Soldier Init List.cpp b/Tactical/Soldier Init List.cpp
index 0ea9d80d..27ac1ed9 100644
--- a/Tactical/Soldier Init List.cpp
+++ b/Tactical/Soldier Init List.cpp
@@ -1055,8 +1055,8 @@ void AddSoldierInitListEnemyDefenceSoldiers( UINT8 ubTotalAdmin, UINT8 ubTotalTr
(*pCurrTotal)--;
ubMaxNum--;
}
- else
- return;
+// else
+// return;
}
(*pCurrSlots)--;
//With the decrementing of the slot vars in this manner, the chances increase so that all slots
diff --git a/Tactical/Soldier Profile.cpp b/Tactical/Soldier Profile.cpp
index 5037f26d..54057a56 100644
--- a/Tactical/Soldier Profile.cpp
+++ b/Tactical/Soldier Profile.cpp
@@ -588,6 +588,8 @@ BOOLEAN LoadMercProfiles(void)
FileClose( fptr );
return(FALSE);
}
+
+
// WANNE: For the new WF merc, there is no entry in prof.dat, so we have to reset some flags manually!
if (uiLoop >= 170)
@@ -741,7 +743,24 @@ BOOLEAN LoadMercProfiles(void)
// ----- WANNE.PROFILE: New Profile Loading - BEGIN
if ( gGameExternalOptions.fReadProfileDataFromXML == FALSE )
- {
+ {
+ // WANNE: If all 4 (Friendly, Direct, Threaten, Recruit) are not set, set them to 100.
+ // These 4 values cannot be edit in Proedit if Merc Index >= 75.
+ // If we set these to 100 (which means it is equal the leadership of the merc), we fix the bug that the 4 UB Merc (Stogie, Tex, Gaston, Biggins) cannot recruit NPCs or do special quests).
+ if (uiLoop >= FIRST_NPC)
+ {
+ if (gMercProfiles[ uiLoop ].usApproachFactor[0] == 0 &&
+ gMercProfiles[ uiLoop ].usApproachFactor[1] == 0 &&
+ gMercProfiles[ uiLoop ].usApproachFactor[2] == 0 &&
+ gMercProfiles[ uiLoop ].usApproachFactor[3] == 0)
+ {
+ gMercProfiles[ uiLoop ].usApproachFactor[0] = 100;
+ gMercProfiles[ uiLoop ].usApproachFactor[1] = 100;
+ gMercProfiles[ uiLoop ].usApproachFactor[2] = 100;
+ gMercProfiles[ uiLoop ].usApproachFactor[3] = 100;
+ }
+ }
+
// AIM und MERC ( 0 - 51 )
if (uiLoop < 51)
{
diff --git a/Tactical/Soldier Tile.cpp b/Tactical/Soldier Tile.cpp
index 705bc7cf..2ba54cfd 100644
--- a/Tactical/Soldier Tile.cpp
+++ b/Tactical/Soldier Tile.cpp
@@ -204,6 +204,11 @@ void UnMarkMovementReserved( SOLDIERTYPE *pSoldier )
{
return;
}
+
+ if ( pSoldier->usAnimState == JUMPWINDOWS && pSoldier->sReservedMovementGridNo != sNewGridNo )
+ {
+ return;
+ }
// For single-tiled mercs, unset this gridno
// See if we have one reserved!
diff --git a/Tactical/SoldierTooltips.cpp b/Tactical/SoldierTooltips.cpp
index 434d8a3a..b0e7c958 100644
--- a/Tactical/SoldierTooltips.cpp
+++ b/Tactical/SoldierTooltips.cpp
@@ -24,6 +24,7 @@
// added by SANDRO
#include "SkillCheck.h"
#include "soldier profile type.h"
+#include "Soldier macros.h"
#endif
//forward declarations of common classes to eliminate includes
@@ -54,6 +55,13 @@ void DrawMouseTooltip(void);
void SoldierTooltip( SOLDIERTYPE* pSoldier )
{
+ // WANNE: No tooltips on bloodcats, bugs, tanks, roboter
+ if ( CREATURE_OR_BLOODCAT( pSoldier ) || TANK ( pSoldier ) ||
+ AM_A_ROBOT( pSoldier))
+ {
+ return;
+ }
+
SGPRect aRect;
extern void GetSoldierScreenRect(SOLDIERTYPE*,SGPRect*);
GetSoldierScreenRect( pSoldier, &aRect );
diff --git a/Tactical/Spread Burst.cpp b/Tactical/Spread Burst.cpp
index 8b809502..e854ae3e 100644
--- a/Tactical/Spread Burst.cpp
+++ b/Tactical/Spread Burst.cpp
@@ -147,7 +147,7 @@ void PickBurstLocations( SOLDIERTYPE *pSoldier )
do
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire && gbNumBurstLocations >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
diff --git a/Tactical/Squads.cpp b/Tactical/Squads.cpp
index ad7d97af..f0253a47 100644
--- a/Tactical/Squads.cpp
+++ b/Tactical/Squads.cpp
@@ -277,6 +277,18 @@ BOOLEAN AddCharacterToSquad( SOLDIERTYPE *pCharacter, INT8 bSquadValue )
SetGroupSectorValue( pCharacter->sSectorX, pCharacter->sSectorY, pCharacter->bSectorZ, SquadMovementGroups[ bSquadValue ] );
pCharacter->ubGroupID = SquadMovementGroups[ bSquadValue ];
}
+ else if( IsVehicle(pCharacter) )
+ {
+ INT32 iCounter = 0;
+ for( iCounter = 0; iCounter < ubNumberOfVehicles ; iCounter++ )
+ {
+ if(pVehicleList[ iCounter ].ubProfileID == pCharacter->ubProfile)
+ break;
+ }
+ //AddPlayerToGroup( pVehicleList[iCounter].ubMovementGroup, pCharacter );
+ SetGroupSectorValue( pCharacter->sSectorX, pCharacter->sSectorY, pCharacter->bSectorZ, pVehicleList[iCounter].ubMovementGroup );
+ pCharacter->ubGroupID = pVehicleList[iCounter].ubMovementGroup;
+ }
else
{
AddPlayerToGroup( SquadMovementGroups[ bSquadValue ], pCharacter );
diff --git a/Tactical/Structure Wrap.cpp b/Tactical/Structure Wrap.cpp
index 84adb941..db384fd7 100644
--- a/Tactical/Structure Wrap.cpp
+++ b/Tactical/Structure Wrap.cpp
@@ -83,7 +83,7 @@ BOOLEAN IsOknoFencePresentAtGridno( INT32 sGridNo )
return( FALSE );
}
-BOOLEAN IsLegionFencePresentAtGridno( INT32 sGridNo )
+BOOLEAN IsLegionWallPresentAtGridno( INT32 sGridNo )
{
STRUCTURE * pStructure;
@@ -92,7 +92,7 @@ BOOLEAN IsLegionFencePresentAtGridno( INT32 sGridNo )
if ( pStructure )
{
- if ( pStructure->fFlags & STRUCTURE_FENCE ) // && (pStructure->fFlags & STRUCTURE_SPECIAL))//&& !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ))
+ if ( pStructure->fFlags & STRUCTURE_FENCE && pStructure->fFlags & STRUCTURE_SPECIAL && pStructure->fFlags & STRUCTURE_WALL )
{
return( TRUE );
}
diff --git a/Tactical/Structure Wrap.h b/Tactical/Structure Wrap.h
index fd540b5b..d46b1c97 100644
--- a/Tactical/Structure Wrap.h
+++ b/Tactical/Structure Wrap.h
@@ -50,6 +50,6 @@ BOOLEAN SetOpenableStructureToClosed( INT32 sGridNo, UINT8 ubLevel );
//Legion by Jazz
BOOLEAN IsJumpableWindowPresentAtGridNo( INT32 sGridNo , INT8 direction2 ); //legion 2 Windows
-BOOLEAN IsLegionFencePresentAtGridno( INT32 sGridNo ); //legion 2 Fence
+BOOLEAN IsLegionWallPresentAtGridno( INT32 sGridNo ); //legion 2 Fence
#endif
\ No newline at end of file
diff --git a/Tactical/Tactical Save.cpp b/Tactical/Tactical Save.cpp
index c67a4171..e7798c6f 100644
--- a/Tactical/Tactical Save.cpp
+++ b/Tactical/Tactical Save.cpp
@@ -2839,6 +2839,16 @@ BOOLEAN AddDeadSoldierToUnLoadedSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ, S
//Add the soldiers items to an unloaded sector
AddWorldItemsToUnLoadedSector( sMapX, sMapY, bMapZ, sGridNo, uiNumberOfItems, pWorldItems, FALSE );
+
+ //CHRISL: Now that we've copied the dead soldiers items to pWorldItems, we need to actually remove the items from the dead soldier. Otherwise we have
+ // actually duplicated the items and there's a chance that these duplicated items will again find their way to sector.
+ for ( i = 0; i < pSoldier->inv.size(); i++ )
+ {
+ if( pSoldier->inv[ i ].exists() == true )
+ {
+ pSoldier->inv[i].initialize();
+ }
+ }
}
DropKeysInKeyRing( pSoldier, sGridNo, pSoldier->pathing.bLevel, 1, FALSE, 0, TRUE );
diff --git a/Tactical/Tactical_VS2005.vcproj b/Tactical/Tactical_VS2005.vcproj
index 2b212b48..bf88bc28 100644
--- a/Tactical/Tactical_VS2005.vcproj
+++ b/Tactical/Tactical_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
+
+
diff --git a/Tactical/Tactical_VS2008.vcproj b/Tactical/Tactical_VS2008.vcproj
index 251a8fce..aedf68c4 100644
--- a/Tactical/Tactical_VS2008.vcproj
+++ b/Tactical/Tactical_VS2008.vcproj
@@ -1091,6 +1091,10 @@
RelativePath="XML_Merge.cpp"
>
+
+
diff --git a/Tactical/Tactical_VS2010.vcxproj b/Tactical/Tactical_VS2010.vcxproj
index 8ca6690a..20907d23 100644
--- a/Tactical/Tactical_VS2010.vcxproj
+++ b/Tactical/Tactical_VS2010.vcxproj
@@ -211,6 +211,7 @@
+
diff --git a/Tactical/Tactical_VS2010.vcxproj.filters b/Tactical/Tactical_VS2010.vcxproj.filters
index 0bf039a5..d76b6f9d 100644
--- a/Tactical/Tactical_VS2010.vcxproj.filters
+++ b/Tactical/Tactical_VS2010.vcxproj.filters
@@ -599,5 +599,8 @@
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp
index 2c5fe004..99b46fcb 100644
--- a/Tactical/TeamTurns.cpp
+++ b/Tactical/TeamTurns.cpp
@@ -120,7 +120,8 @@ typedef struct
UINT8 ubFiller[16];
} TEAM_TURN_SAVE_STRUCT;
-#define MIN_APS_TO_INTERRUPT 4
+// WANNE: Moved to APBPConstants
+//#define MIN_APS_TO_INTERRUPT 4
void ClearIntList( void )
{
@@ -1437,7 +1438,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
}
// if soldier doesn't have enough APs
- if ( pSoldier->bActionPoints < MIN_APS_TO_INTERRUPT )
+ if ( pSoldier->bActionPoints < APBPConstants[MIN_APS_TO_INTERRUPT] )
{
return( FALSE );
}
@@ -2123,27 +2124,29 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter
}
// INTERRUPT is calculated on the pure client
else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn (we are moving)
- {
-#ifdef BETAVERSION
+ {
+ //// WANNE: Skip the interrupt (against enemy AI) on the pure client, when we are in a coop game!
+ //if (cGameType == MP_TYPE_COOP)
+ //{
+ // #ifdef BETAVERSION
+ // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for another team - pure client - skipping problematic interrupt");
+ // #endif
+ //}
+ //else
+ //{
+ send_interrupt( npSoldier );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for another team - PROBLEMATIC");
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for another team - pure client - skipping problematic interrupt");
-#endif
-
- /*
- // Only send interrupt if we (the client) got interrupted
- send_interrupt( npSoldier );
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for another team - PROBLEMATIC");
-
- SOLDIERTYPE* pMerc = MercPtrs[ gusSelectedSoldier ];
- //AdjustNoAPToFinishMove( pMerc, TRUE );
- pMerc->HaultSoldierFromSighting(TRUE);
- //pMerc->fTurningFromPronePosition = FALSE;// hmmm ??
- FreezeInterfaceForEnemyTurn();
- InitEnemyUIBar( 0, 0 );
- fInterfacePanelDirty = DIRTYLEVEL2;
- AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ nbTeam ] );
- gTacticalStatus.fInterruptOccurred = TRUE;
- */
+ SOLDIERTYPE* pMerc = MercPtrs[ gusSelectedSoldier ];
+ //AdjustNoAPToFinishMove( pMerc, TRUE );
+ pMerc->HaultSoldierFromSighting(TRUE);
+ //pMerc->fTurningFromPronePosition = FALSE;// hmmm ??
+ FreezeInterfaceForEnemyTurn();
+ InitEnemyUIBar( 0, 0 );
+ fInterfacePanelDirty = DIRTYLEVEL2;
+ AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ nbTeam ] );
+ gTacticalStatus.fInterruptOccurred = TRUE;
+ //}
}
else
{
diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp
index 52909be5..06c5d43c 100644
--- a/Tactical/Turn Based Input.cpp
+++ b/Tactical/Turn Based Input.cpp
@@ -152,7 +152,6 @@ extern UINT32 guiVObjectSize;
extern UINT32 guiVSurfaceSize;
extern BOOLEAN gfNextShotKills;
-BOOLEAN fAutofireBulletsMode = FALSE; // HEADROCK HAM 4: Track whether we're adjusting aim or number of bullets
UINT32 guiSoldierFlags;
UINT32 guiUITargetSoldierId = NOBODY;
@@ -217,10 +216,10 @@ void TogglePlanningMode();
void SetBurstMode();
void ObliterateSector();
void RandomizeMercProfile();
-void JumpFence();
void CreateNextCivType();
void ToggleCliffDebug();
void CreateCow();
+void CreateBloodCat();
void CreatePlayerControlledCow();
void ToggleRealTimeConfirm();
void TestMeanWhile( INT32 iID );
@@ -648,8 +647,6 @@ void QueryTBLeftButton( UINT32 *puiNewEvent )
{
// ATE: Reset refine aim..
pSoldier->aiData.bShownAimTime = 0;
- // HEADROCK HAM 4: Reset Autofire Bullets mode.
- fAutofireBulletsMode = FALSE;
if ( gsCurrentActionPoints == 0 )
{
@@ -669,13 +666,6 @@ void QueryTBLeftButton( UINT32 *puiNewEvent )
case CONFIRM_ACTION_MODE:
- // HEADROCK HAM 4: If in Autofire Mode, first click puts us in bullet adjust mode.
- if (UsingNewCTHSystem() == true && GetSoldier( &pSoldier, gusSelectedSoldier ))
- if (pSoldier->bDoAutofire && !fAutofireBulletsMode)
- fAutofireBulletsMode = TRUE;
- else
- *puiNewEvent = CA_MERC_SHOOT;
- else
*puiNewEvent = CA_MERC_SHOOT;
break;
@@ -2260,6 +2250,13 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
//EVENT_FireSoldierWeapon( MercPtrs[ gusSelectedSoldier ], sMapPos );
}
}
+ else if( fCtrl ) //toggle between the different npc debug modes
+ {
+ if ( CHEATER_CHEAT_LEVEL( ) )
+ {
+ CreateBloodCat();
+ }
+ }
else
ChangeCurrentSquad( 2 );
@@ -2582,23 +2579,37 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
case 'j':
if ( fShift )
{
- INT8 bDirection;
-
- if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
- {
+ // WANNE: Jump through window?
+ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
+ {
+ INT16 sAPCost;
+ INT16 sBPCost;
+ INT8 bDirection;
SOLDIERTYPE *lSoldier;
- if ( GetSoldier( &lSoldier, gusSelectedSoldier ) )
- {
- if ( FindWindowJumpDirection( lSoldier, lSoldier->sGridNo, lSoldier->ubDirection, &bDirection ) )
- {
- lSoldier->BeginSoldierClimbWindow( );
- }
-
+ if ( GetSoldier( &lSoldier, gusSelectedSoldier ) )
+ {
+ if ( FindWindowJumpDirection( lSoldier, lSoldier->sGridNo, lSoldier->ubDirection, &bDirection ) )
+ {
+ if((UsingNewInventorySystem() == true) && lSoldier->inv[BPACKPOCKPOS].exists() == true)
+ {
+ sAPCost = GetAPsToJumpThroughWindows( lSoldier, TRUE );
+ sBPCost = GetBPsToJumpThroughWindows( lSoldier, TRUE );
+ }
+ else
+ {
+ sAPCost = GetAPsToJumpFence( lSoldier, FALSE );
+ sBPCost = GetBPsToJumpFence( lSoldier, FALSE );
+ }
+
+ if (EnoughPoints(lSoldier, sAPCost, sBPCost, FALSE))
+ {
+ lSoldier->BeginSoldierClimbWindow( );
+ }
+ }
+ }
}
-
}
- }
else if( fAlt )
{
if ( CHEATER_CHEAT_LEVEL( ) )
@@ -2615,56 +2626,13 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
}
#endif
}
- //ddd{ удалить закомментированный текст за ненадобностью.
-// else if(_KeyDown( SHIFT ))
-// {
-//INT16 sGridNo;
-//STRUCTURE * pStructure;
-
-//GetMouseMapPos( &sGridNo );
-//ScreenMsg( FONT_MCOLOR_LTYELLOW,0, L"gubMerkCanSeeThisTile=%d,gubWorldTileInLight=%d,los=%d",gubMerkCanSeeThisTile[sGridNo],gubWorldTileInLight[sGridNo],gGameSettings.ubSizeOfLOS);
-//
-
- // SOLDIERTYPE *pjSoldier;
- // BOOLEAN fNearHeigherLevel;
- // BOOLEAN fNearLowerLevel;
- // INT8 bDirection;
-
- // if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
- // {
- // // CHRISL: Turn off manual jumping while wearing a backpack
- // if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
- // break;
-
- // // Make sure the merc is not collapsed!
- // if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
- // {
- // if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
- // {
- // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
- // }
-
- // break;
- // }
- // GetMercOknoDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
- // if ( FindOknoDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
- // {
- // BeginSoldierOkno( pjSoldier );
- // }
-
-
- // }
-
- //}//ddd}
else
{
SOLDIERTYPE *pjSoldier;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
- // CHRISL: Turn off manual jumping while wearing a backpack
- if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
- break;
-
+ INT16 sAPCost;
+ INT16 sBPCost;
BOOLEAN fNearHeigherLevel;
BOOLEAN fNearLowerLevel;
INT8 bDirection;
@@ -2680,28 +2648,66 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
break;
}
+ // Climb on roof
GetMercClimbDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
if ( fNearLowerLevel )
{
- pjSoldier->BeginSoldierClimbDownRoof( );
+ // No climbing when wearing a backpack!
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+
+ if ( EnoughPoints( pjSoldier, GetAPsToClimbRoof( pjSoldier, TRUE ), GetBPsToClimbRoof( pjSoldier, TRUE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbDownRoof( );
+ }
}
if ( fNearHeigherLevel )
{
- pjSoldier->BeginSoldierClimbUpRoof( );
+ // No climbing when wearing a backpack!
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+
+ if ( EnoughPoints( pjSoldier, GetAPsToClimbRoof( pjSoldier, FALSE ), GetBPsToClimbRoof( pjSoldier, FALSE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbUpRoof( );
+ }
}
+ // Jump over fence
if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
{
- pjSoldier->BeginSoldierClimbFence( );
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ {
+ sAPCost = GetAPsToJumpFence( pjSoldier, TRUE );
+ sBPCost = GetBPsToJumpFence( pjSoldier, TRUE );
+ }
+ else
+ {
+ sAPCost = GetAPsToJumpFence( pjSoldier, FALSE );
+ sBPCost = GetBPsToJumpFence( pjSoldier, FALSE );
+ }
+
+ if ( EnoughPoints( pjSoldier, sAPCost, sBPCost, FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbFence( );
+ }
}
- if (gGameExternalOptions.fCanClimbOnWalls == TRUE )
- {
- if ( FindFenceDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
- {
- pjSoldier->BeginSoldierFence( );
- }
+ // Climb on walls
+ if (gGameExternalOptions.fCanClimbOnWalls == TRUE)
+ {
+ if ( FindWallJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
+ {
+ // No climbing when wearing a backpack!
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+
+ if ( EnoughPoints( pjSoldier, GetAPsToJumpWall( pjSoldier, FALSE ), GetBPsToJumpWall( pjSoldier, FALSE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbWall( );
+ }
+ }
}
}
}
@@ -3210,6 +3216,8 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
SOLDIERTYPE *pSoldier = MercPtrs[ gusSelectedSoldier ];
BOOLEAN handFit = (CanItemFitInPosition(pSoldier, &pSoldier->inv[HANDPOS], GUNSLINGPOCKPOS, FALSE) || (pSoldier->inv[HANDPOS].exists() == false && pSoldier->inv[SECONDHANDPOS].exists() == false));
BOOLEAN slingFit = (CanItemFitInPosition(pSoldier, &pSoldier->inv[GUNSLINGPOCKPOS], HANDPOS, FALSE) || pSoldier->inv[GUNSLINGPOCKPOS].exists() == false);
+ if(Item[pSoldier->inv[GUNSLINGPOCKPOS].usItem].twohanded && pSoldier->inv[SECONDHANDPOS].exists() == true)
+ handFit = FALSE;
if( handFit == TRUE && slingFit == TRUE)
{
SwapObjs(&pSoldier->inv[HANDPOS], &pSoldier->inv[GUNSLINGPOCKPOS]);
@@ -3869,7 +3877,11 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
if ( fCtrl && fShift && fAlt && !is_networked)// ary-05/05/2009 : add forced turn mode
{
ToggleTurnMode();
- }
+ }
+ else if ( fCtrl && fShift )
+ {
+ SaveGame( SAVE__TIMED_AUTOSAVE, L"Auto Save" );
+ }
else
{
//resort Team by ubID
@@ -4877,19 +4889,6 @@ void RandomizeMercProfile()
}
}
-void JumpFence()
-{
- SOLDIERTYPE *pSoldier;
- INT8 bDirection;
- if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
- {
- if ( FindFenceJumpDirection( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bDirection ) )
- {
- pSoldier->BeginSoldierClimbFence( );
- }
- }
-}
-
void CreateNextCivType()
{
INT16 sWorldX, sWorldY;
@@ -4979,6 +4978,37 @@ void CreateCow()
}
}
+void CreateBloodCat()
+{
+ INT16 sWorldX, sWorldY;
+ SOLDIERCREATE_STRUCT MercCreateStruct;
+ INT32 usMapPos;
+ // Get Grid Corrdinates of mouse
+ if ( GetMouseWorldCoordsInCenter( &sWorldX, &sWorldY ) && GetMouseMapPos( &usMapPos ) )
+ {
+ INT8 iNewIndex;
+
+ MercCreateStruct.ubProfile = NO_PROFILE;
+ MercCreateStruct.sSectorX = gWorldSectorX;
+ MercCreateStruct.sSectorY = gWorldSectorY;
+ MercCreateStruct.bSectorZ = gbWorldSectorZ;
+ MercCreateStruct.bBodyType = BLOODCAT;
+ //MercCreateStruct.bTeam = SOLDIER_CREATE_AUTO_TEAM;
+ MercCreateStruct.bTeam = CREATURE_TEAM;
+ MercCreateStruct.sInsertionGridNo = usMapPos;
+ RandomizeNewSoldierStats( &MercCreateStruct );
+
+ if ( TacticalCreateSoldier( &MercCreateStruct, (UINT8 *)&iNewIndex ) )
+ {
+ AddSoldierToSector( iNewIndex );
+
+ // So we can see them!
+ AllTeamsLookForAll(NO_INTERRUPTS);
+
+ }
+ }
+}
+
void CreatePlayerControlledCow()
{
INT16 sWorldX, sWorldY;
@@ -5834,105 +5864,106 @@ void SwapGoggles(SOLDIERTYPE *pTeamSoldier)
{
// WDS - Smart goggle switching
// NOTE: Investigate using GetItemVisionRangeBonus from Items.cpp???
- if (gGameExternalOptions.smartGoggleSwitch)
+ // Look through the head slots and find any sort of goggle or an empty spot
+ OBJECTTYPE * pGoggles = 0;
+ int slotToUse = -1;
+ INT8 swapSlot = -1;
+ BOOLEAN isAttach = FALSE;
+
+ for (int headSlot = HEAD1POS; headSlot <= HEAD2POS; ++headSlot)
{
- // Look through the head slots and find any sort of goggle or an empty spot
- int slotToUse = -1;
-
- for (int headSlot = HEAD1POS; headSlot <= HEAD2POS; ++headSlot)
+ if ( (Item[pTeamSoldier->inv[headSlot].usItem].brightlightvisionrangebonus != 0) )
{
- if ( (Item[pTeamSoldier->inv[headSlot].usItem].brightlightvisionrangebonus != 0) )
- {
- slotToUse = headSlot;
- break;
- }
- if ( (Item[pTeamSoldier->inv[headSlot].usItem].dayvisionrangebonus != 0) )
- {
- slotToUse = headSlot;
- break;
- }
- else if ( (Item[pTeamSoldier->inv[headSlot].usItem].nightvisionrangebonus != 0) )
- {
- slotToUse = headSlot;
- break;
- }
- else if ( (Item[pTeamSoldier->inv[headSlot].usItem].cavevisionrangebonus != 0) )
- {
- slotToUse = headSlot;
- break;
- }
- else if (pTeamSoldier->inv[headSlot].exists() == false)
- {
- slotToUse = headSlot;
- }
- }
-
- if (slotToUse == -1)
- {
- // No place to swap in a new goggle, give up
- return;
- }
-
- // Find the best goggles for the current time of day anywhere in inventory
- // silversurfer: also check if underground
- OBJECTTYPE * pGoggles = 0;
- if (DayTime() && pTeamSoldier->bSectorZ == 0)
- {
- pGoggles = FindSunGogglesInInv( pTeamSoldier, TRUE );
+ slotToUse = headSlot;
+ break;
}
- else
+ if ( (Item[pTeamSoldier->inv[headSlot].usItem].dayvisionrangebonus != 0) )
{
- pGoggles = FindNightGogglesInInv( pTeamSoldier, TRUE );
+ slotToUse = headSlot;
+ break;
+ }
+ else if ( (Item[pTeamSoldier->inv[headSlot].usItem].nightvisionrangebonus != 0) )
+ {
+ slotToUse = headSlot;
+ break;
+ }
+ else if ( (Item[pTeamSoldier->inv[headSlot].usItem].cavevisionrangebonus != 0) )
+ {
+ slotToUse = headSlot;
+ break;
+ }
+ else if (pTeamSoldier->inv[headSlot].exists() == false)
+ {
+ slotToUse = headSlot;
}
+ }
+
+ if (slotToUse == -1)
+ {
+ // No place to swap in a new goggle, give up
+ return;
+ }
- if (pGoggles)
+ // Find the best goggles for the current time of day anywhere in inventory
+ // silversurfer: also check if underground
+ if (DayTime() && pTeamSoldier->bSectorZ == 0)
+ {
+ pGoggles = FindSunGogglesInInv( pTeamSoldier, &swapSlot, &isAttach, TRUE );
+ }
+ else
+ {
+ pGoggles = FindNightGogglesInInv( pTeamSoldier, &swapSlot, &isAttach, TRUE );
+ }
+
+ if (pGoggles)
+ {
+ // We need to check that pGoggles is compatible with whatever is in the other face slot
+ int otherFaceSlot = (slotToUse == HEAD1POS?HEAD2POS:HEAD1POS);
+ if(pTeamSoldier->inv[otherFaceSlot].exists() == true && !CompatibleFaceItem(pGoggles->usItem, pTeamSoldier->inv[otherFaceSlot].usItem))
+ pGoggles = NULL;
+ }
+
+ if (pGoggles)
+ {
+ // Now either swap or equip the best one that was found
+ if (pTeamSoldier->inv[slotToUse].exists())
{
- // Now either swap or equip the best one that was found
- if (pTeamSoldier->inv[slotToUse].exists())
- {
+ if(CanItemFitInPosition(pTeamSoldier, &pTeamSoldier->inv[slotToUse], swapSlot, TRUE))
SwapObjs( pTeamSoldier, slotToUse, pGoggles, TRUE );
- }
- else
- {
+ else if((pTeamSoldier->inv[HELMETPOS].exists()== true && pTeamSoldier->inv[HELMETPOS].AttachObject(pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE)) ||
+ AutoPlaceObject(pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE))
pGoggles->MoveThisObjectTo(pTeamSoldier->inv[slotToUse], 1, pTeamSoldier, slotToUse);
+ else
+ {
+ CHAR16 zTemp[ 100 ];
+ swprintf( zTemp, Message[ STR_CANNOT_ATTACH_ANY_SLOT ], ItemNames[ pTeamSoldier->inv[slotToUse].usItem ] );
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, zTemp );
}
}
else
{
- // No goggles to equip, should the current ones be unequiped?
- if (pTeamSoldier->inv[slotToUse].exists())
+ pGoggles->MoveThisObjectTo(pTeamSoldier->inv[slotToUse], 1, pTeamSoldier, slotToUse);
+ }
+ }
+ else
+ {
+ // No goggles to equip, should the current ones be unequiped?
+ if (pTeamSoldier->inv[slotToUse].exists())
+ {
+ if ((DayTime() && Item[pTeamSoldier->inv[slotToUse].usItem].nightvisionrangebonus > 0 && pTeamSoldier->bSectorZ == 0) ||
+ ((!DayTime() || pTeamSoldier->bSectorZ > 0) && (Item[pTeamSoldier->inv[slotToUse].usItem].brightlightvisionrangebonus > 0)))
{
- if ((DayTime() && Item[pTeamSoldier->inv[slotToUse].usItem].nightvisionrangebonus > 0 && pTeamSoldier->bSectorZ == 0) ||
- ((!DayTime() || pTeamSoldier->bSectorZ > 0) && (Item[pTeamSoldier->inv[slotToUse].usItem].brightlightvisionrangebonus > 0)))
+ // It's day and we're wearing night goggles (or vice-versa), find a place to stash them
+ if (pTeamSoldier->inv[ HELMETPOS ].exists())
{
- // It's day and we're wearing night goggles (or vice-versa), find a place to stash them
- if (pTeamSoldier->inv[ HELMETPOS ].exists())
+ if (pTeamSoldier->inv[ HELMETPOS ].AttachObject( NULL, &pTeamSoldier->inv[slotToUse] ))
{
- if (pTeamSoldier->inv[ HELMETPOS ].AttachObject( NULL, &pTeamSoldier->inv[slotToUse] ))
- {
- // It worked!
- }
- else
- {
- /* //If we're here we already know we can't attach, don't we?
- // Try dumping it anywhere in inventory because it doesn't attach to the helmet
- if (NASValidAttachment( pTeamSoldier->inv[slotToUse].usItem, pTeamSoldier->inv[HELMETPOS].usItem ) &&
- pTeamSoldier->inv[slotToUse][0]->attachments.size() < MAX_ATTACHMENTS)
- {
- pTeamSoldier->inv[HELMETPOS].AttachObject( pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE, 0 );
- }
- else
- */
- //{
- // Remove sungoggles.
- PlaceInAnyPocket(pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE);
- //}
- }
+ // It worked!
}
else
{
- /* //again useless?
- // Try dumping it anywhere in inventory given there's no helemt
+ /* //If we're here we already know we can't attach, don't we?
+ // Try dumping it anywhere in inventory because it doesn't attach to the helmet
if (NASValidAttachment( pTeamSoldier->inv[slotToUse].usItem, pTeamSoldier->inv[HELMETPOS].usItem ) &&
pTeamSoldier->inv[slotToUse][0]->attachments.size() < MAX_ATTACHMENTS)
{
@@ -5945,174 +5976,22 @@ void SwapGoggles(SOLDIERTYPE *pTeamSoldier)
PlaceInAnyPocket(pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE);
//}
}
- }
- }
- }
- }
- else
- {
- // Normal goggle switching
- /* CHRISL - Adjusted this option to allow the game to search through Helmet attachments
- as well as inventory positions.
- */
- OBJECTTYPE * pObj;
- OBJECTTYPE * pGoggles = NULL;
- INT8 bSlot1;
- int bestBonus;
- bool itemFound = false;
- //CHRISL: Before doing anything, we should look at both head slots to see if either slot has some sort of goggles
- for(bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
- {
- if(Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0)
- itemFound = true;
- if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0)
- itemFound = true;
- }
- //2 head slots
- for (bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
- {
- // if wearing sungoggles
- if ( Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0 )
- {
- itemFound = true;
- bestBonus = 0;
- pGoggles = FindNightGogglesInInv( pTeamSoldier );
- //search for better goggles on the helmet
- if (pGoggles)
+ }
+ else
{
- bestBonus = Item[pGoggles->usItem].nightvisionrangebonus;
- }
- //search helmet and vest
- for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
- {
- pObj = &(pTeamSoldier->inv[gear]);
- for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
+ /* //again useless?
+ // Try dumping it anywhere in inventory given there's no helemt
+ if (NASValidAttachment( pTeamSoldier->inv[slotToUse].usItem, pTeamSoldier->inv[HELMETPOS].usItem ) &&
+ pTeamSoldier->inv[slotToUse][0]->attachments.size() < MAX_ATTACHMENTS)
{
- if ( Item[ iter->usItem ].nightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE && iter->exists())
- {
- pGoggles = &(*iter);
- bestBonus = Item[ iter->usItem ].nightvisionrangebonus;
- }
- }
- }
- if ( pGoggles )
- {
- SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
- break;
- }
- // HEADROCK HAM B2.8: If no goggles were found to switch to, the character will remove what they're
- // wearing, to avoid situations where a character refuses to remove the wrong set of goggles and
- // thus suffers a penalty.
- else
- { //WarmSteel - This has become more complicated to check, it's better to just try and see if it works.
- //if (NASValidAttachment( pTeamSoldier->inv[bSlot1].usItem, pTeamSoldier->inv[HELMETPOS].usItem ) &&
- // pTeamSoldier->inv[bSlot1][0]->attachments.size() < MAX_ATTACHMENTS )
- if (pTeamSoldier->inv[HELMETPOS].AttachObject( pTeamSoldier, &pTeamSoldier->inv[bSlot1], FALSE, 0 ) )
- {
- //pTeamSoldier->inv[HELMETPOS].AttachObject( pTeamSoldier, &pTeamSoldier->inv[bSlot1], FALSE, 0 );
- break;
+ pTeamSoldier->inv[HELMETPOS].AttachObject( pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE, 0 );
}
else
- {
+ */
+ //{
// Remove sungoggles.
- PlaceInAnyPocket(pTeamSoldier, &pTeamSoldier->inv[bSlot1], FALSE);
- break;
- }
- }
- }
- // else if wearing NVGs
- else if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0)
- {
- itemFound = true;
- bestBonus = 0;
- pGoggles = FindSunGogglesInInv( pTeamSoldier );
- //search for better goggles on the helmet
- if (pGoggles)
- {
- bestBonus = Item[pGoggles->usItem].brightlightvisionrangebonus;
- }
- //search helmet and vest
- for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
- {
- pObj = &(pTeamSoldier->inv[gear]);
- for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
- {
- if ( Item[ iter->usItem ].brightlightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE )
- {
- pGoggles = &(*iter);
- bestBonus = Item[ iter->usItem ].brightlightvisionrangebonus;
- }
- }
- }
- if ( pGoggles )
- {
- SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
- break;
- }
- // HEADROCK HAM B2.8: If no goggles were found to switch to, the character will remove what they're
- // wearing, to avoid situations where a character refuses to remove the wrong set of goggles and
- // thus suffers a penalty.
- else
- { //WarmSteel - Again, better to just try and see if it works.
- //if (NASValidAttachment( pTeamSoldier->inv[bSlot1].usItem, pTeamSoldier->inv[HELMETPOS].usItem ) &&
- // pTeamSoldier->inv[bSlot1][0]->attachments.size() < MAX_ATTACHMENTS)
- if (pTeamSoldier->inv[HELMETPOS].AttachObject( pTeamSoldier, &pTeamSoldier->inv[bSlot1], FALSE, 0 ))
- {
- break;
- }
- else
- {
- // Remove nightgoggles.
- PlaceInAnyPocket(pTeamSoldier, &pTeamSoldier->inv[bSlot1], FALSE);
- break;
- }
- }
- }
- // else if not wearing anything and no goggles found
- else if(itemFound == false && pTeamSoldier->inv[bSlot1].exists() == false)
- {
- bestBonus = 0;
- // search helmet and vest for goggles of some kind
- for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
- {
- pObj = &(pTeamSoldier->inv[gear]);
- for(attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
- {
- if(iter->exists()){
- if(DayTime() == TRUE && Item[iter->usItem].brightlightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
- {
- pGoggles = &(*iter);
- bestBonus = Item[iter->usItem].brightlightvisionrangebonus;
- }
- else if(NightTime() == TRUE && Item[iter->usItem].nightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
- {
- pGoggles = &(*iter);
- bestBonus = Item[iter->usItem].nightvisionrangebonus;
- }
- }
- }
- if(pGoggles)
- {
- pGoggles->MoveThisObjectTo(pTeamSoldier->inv[bSlot1], 1, pTeamSoldier, bSlot1);
- pObj->RemoveAttachment(pGoggles);
- break;
- }
- }
- if(pTeamSoldier->inv[bSlot1].exists() == false)
- {
- if(DayTime() == TRUE)
- pGoggles = FindSunGogglesInInv( pTeamSoldier );
- else
- pGoggles = FindNightGogglesInInv( pTeamSoldier );
- if(pGoggles)
- {
- SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
- break;
- }
- }
- else
- {
- break;
+ PlaceInAnyPocket(pTeamSoldier, &pTeamSoldier->inv[slotToUse], FALSE);
+ //}
}
}
}
@@ -6140,6 +6019,8 @@ void SwapGogglesUniformly(SOLDIERTYPE *pTeamSoldier, BOOLEAN fToNightVision)
INT8 bSlot1;
int bestBonus;
bool itemFound = false;
+ INT8 swapSlot = -1;
+ BOOLEAN isAttach = FALSE;
//CHRISL: Before doing anything, we should look at both head slots to see if either slot has some sort of goggles
for(bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
@@ -6159,7 +6040,7 @@ void SwapGogglesUniformly(SOLDIERTYPE *pTeamSoldier, BOOLEAN fToNightVision)
{
itemFound = true;
bestBonus = 0;
- pGoggles = FindNightGogglesInInv( pTeamSoldier );
+ pGoggles = FindNightGogglesInInv( pTeamSoldier, &swapSlot, &isAttach );
//search for better goggles on the helmet
if (pGoggles)
{
@@ -6207,7 +6088,7 @@ void SwapGogglesUniformly(SOLDIERTYPE *pTeamSoldier, BOOLEAN fToNightVision)
{
itemFound = true;
bestBonus = 0;
- pGoggles = FindSunGogglesInInv( pTeamSoldier );
+ pGoggles = FindSunGogglesInInv( pTeamSoldier, &swapSlot, &isAttach );
//search for better goggles on the helmet
if (pGoggles)
{
@@ -6281,9 +6162,9 @@ void SwapGogglesUniformly(SOLDIERTYPE *pTeamSoldier, BOOLEAN fToNightVision)
if(pTeamSoldier->inv[bSlot1].exists() == false)
{
if(fToNightVision == FALSE)
- pGoggles = FindSunGogglesInInv( pTeamSoldier );
+ pGoggles = FindSunGogglesInInv( pTeamSoldier, &swapSlot, &isAttach );
else
- pGoggles = FindNightGogglesInInv( pTeamSoldier );
+ pGoggles = FindNightGogglesInInv( pTeamSoldier, &swapSlot, &isAttach );
if(pGoggles)
{
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
@@ -6612,50 +6493,52 @@ void QueryTBX1Button( UINT32 *puiNewEvent )
//*puiNewEvent = LC_LOOK;
fX1ButtonDown = FALSE;
if ( !_KeyDown( ALT ) && !_KeyDown( SHIFT ))
- UIHandleChangeLevel( NULL );
+ {
+ UIHandleChangeLevel( NULL );
+ }
else if( _KeyDown( SHIFT ) )
{
+ // WANNE: Jump through window?
+ if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
+ {
+ INT16 sAPCost;
+ INT16 sBPCost;
SOLDIERTYPE *pjSoldier;
- BOOLEAN fNearHeigherLevel;
- BOOLEAN fNearLowerLevel;
INT8 bDirection;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
- // CHRISL: Turn off manual jumping while wearing a backpack
- if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
- return;
-
- // Make sure the merc is not collapsed!
- if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
+ if ( FindWindowJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
{
- if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
{
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
+ sAPCost = GetAPsToJumpThroughWindows( pjSoldier, TRUE );
+ sBPCost = GetBPsToJumpThroughWindows( pjSoldier, TRUE );
+ }
+ else
+ {
+ sAPCost = GetAPsToJumpFence( pjSoldier, FALSE );
+ sBPCost = GetBPsToJumpFence( pjSoldier, FALSE );
}
- return;
+ if (EnoughPoints(pjSoldier, sAPCost, sBPCost, FALSE))
+ {
+ pjSoldier->BeginSoldierClimbWindow();
+ }
}
- GetMercOknoDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
- if ( FindWindowJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
- {
- pjSoldier->BeginSoldierClimbWindow();
- }
-
-
}
+ }
}
else if (_KeyDown( ALT ) )
{
SOLDIERTYPE *pjSoldier;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
+ INT16 sAPCost;
+ INT16 sBPCost;
BOOLEAN fNearHeigherLevel;
BOOLEAN fNearLowerLevel;
INT8 bDirection;
- // CHRISL: Turn off manual jumping while wearing a backpack
- if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
- return;
// Make sure the merc is not collapsed!
if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
@@ -6665,23 +6548,74 @@ void QueryTBX1Button( UINT32 *puiNewEvent )
return;
}
+ // Climb on roofs
GetMercClimbDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
if ( fNearLowerLevel )
- pjSoldier->BeginSoldierClimbDownRoof( );
+ {
+ // CHRISL: Turn off manual jumping while wearing a backpack
+ if(UsingNewInventorySystem() == true && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+
+ if ( EnoughPoints( pjSoldier, GetAPsToClimbRoof( pjSoldier, TRUE ), GetBPsToClimbRoof( pjSoldier, TRUE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbDownRoof( );
+ }
+ }
if ( fNearHeigherLevel )
- pjSoldier->BeginSoldierClimbUpRoof( );
-
- if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
- pjSoldier->BeginSoldierClimbFence( );
- }
-
- }//else
+ {
+ // No climbing when wearing a backpack!
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+ if ( EnoughPoints( pjSoldier, GetAPsToClimbRoof( pjSoldier, FALSE ), GetBPsToClimbRoof( pjSoldier, FALSE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbUpRoof( );
+ }
+ }
+
+ // Jump over fence
+ if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
+ {
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ {
+ sAPCost = GetAPsToJumpFence( pjSoldier, TRUE );
+ sBPCost = GetBPsToJumpFence( pjSoldier, TRUE );
+ }
+ else
+ {
+ sAPCost = GetAPsToJumpFence( pjSoldier, FALSE );
+ sBPCost = GetBPsToJumpFence( pjSoldier, FALSE );
+ }
+
+ if ( EnoughPoints( pjSoldier, sAPCost, sBPCost, FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbFence( );
+ }
+ }
+
+ // Climb on walls
+ if (gGameExternalOptions.fCanClimbOnWalls == TRUE)
+ {
+ if ( FindWallJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
+ {
+ // No climbing when wearing a backpack!
+ if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true)
+ return;
+
+ if ( EnoughPoints( pjSoldier, GetAPsToJumpWall( pjSoldier, FALSE ), GetBPsToJumpWall( pjSoldier, FALSE ), FALSE ) )
+ {
+ pjSoldier->BeginSoldierClimbWall( );
+ }
+ }
+ }
+ }
+ }
}
}
}
+
void QueryTBX2Button( UINT32 *puiNewEvent )
{
INT32 sMapPos;
diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp
index a7da93ab..8f61c090 100644
--- a/Tactical/UI Cursors.cpp
+++ b/Tactical/UI Cursors.cpp
@@ -383,12 +383,12 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
{
INT16 sCurAPCosts, sAPCosts;
- sCurAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sCurAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
do
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts == sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
@@ -543,12 +543,12 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
do
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire && gbNumBurstLocations >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
- gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, 0 );
+ gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, pSoldier->aiData.bShownAimTime );
}
}
@@ -576,11 +576,13 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
}
else
{
+ //usCursor = ACTION_TARGETREDBURST_UICURSOR;
usCursor = ACTION_TARGETCONFIRMBURST_UICURSOR;
// HEADROCK HAM B1: Burst cursor now shows multiple CTH bars (one for each bullet)
// and also a Targetted Bodypart indicator.
- if(pSoldier->bDoAutofire == 0 && gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
+ //if(pSoldier->bDoAutofire == 0 && gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
+ if(pSoldier->bDoAutofire == 0)
{
if(UsingNewCTHSystem() == true)
{
@@ -596,6 +598,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
uiHitChance = ChanceToHitApproximation( pSoldier, uiHitChance );
}
gfUICtHBar = TRUE;
+ gbCtHBurstCount = 0;
gCTHDisplay.MuzzleSwayPercentage = (gCTHDisplay.MuzzleSwayPercentage + uiHitChance)/2;
gCTHDisplay.iShooterGridNo = pSoldier->sGridNo;
gCTHDisplay.iTargetGridNo = usMapPos;
@@ -609,7 +612,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
pSoldier->bTargetLevel = bTempTargetLevel;
}
- else
+ else if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
{
if (gGameExternalOptions.ubNewCTHBars == 1 || gGameExternalOptions.ubNewCTHBars == 2)
{
@@ -632,7 +635,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
// Calculate hit chance (using the current bDoBurst for burst-penalty calculations)
UINT32 uiHitChance;
- uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, 0, pSoldier->bAimShotLocation );
+ uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->aiData.bShownAimTime ), pSoldier->bAimShotLocation );
// HEADROCK HAM B2.7: CTH approximation?
if (gGameExternalOptions.fApproximateCTH)
{
@@ -660,7 +663,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
pSoldier->bTargetLevel = (INT8) gsInterfaceLevel;
UINT32 uiHitChance;
- uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, 0, pSoldier->bAimShotLocation );
+ uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->aiData.bShownAimTime ), pSoldier->bAimShotLocation );
// HEADROCK HAM B2.7: CTH approximation?
if (gGameExternalOptions.fApproximateCTH)
{
@@ -679,7 +682,8 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
// HEADROCK HAM B2: Now autofire will show both its starting CTH and the CTH of the last
// bullet in the volley.
- else if(pSoldier->bDoAutofire > 0 && gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
+ //else if(pSoldier->bDoAutofire > 0 && gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
+ else if(pSoldier->bDoAutofire > 0)
{
if(UsingNewCTHSystem() == true)
{
@@ -703,6 +707,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
// Flag to tell the program to draw two CTH bars.
gfUICtHBar = TRUE;
+ gbCtHBurstCount = 0;
// Calculate distance to target
FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( usMapPos ));
@@ -713,7 +718,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
pSoldier->bTargetLevel = bTempTargetLevel;
}
- else
+ else if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
{
if (gGameExternalOptions.ubNewCTHBars == 1 || gGameExternalOptions.ubNewCTHBars == 3)
{
@@ -725,7 +730,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
UINT32 uiHitChance;
// Calculate CTH for the first bullet
- uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, 0, pSoldier->bAimShotLocation );
+ uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->aiData.bShownAimTime ), pSoldier->bAimShotLocation );
// HEADROCK HAM B2.7: CTH approximation?
if (gGameExternalOptions.fApproximateCTH)
{
@@ -741,7 +746,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
UINT8 saveDoBurst = pSoldier->bDoBurst;
pSoldier->bDoBurst = pSoldier->bDoAutofire;
- uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, 0, pSoldier->bAimShotLocation );
+ uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->aiData.bShownAimTime ), pSoldier->bAimShotLocation );
// HEADROCK HAM B2.7: CTH approximation?
if (gGameExternalOptions.fApproximateCTH)
{
@@ -766,7 +771,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
else
{
//DIGICRAB: Graphical CtH
- if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
+ //if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
{
//AXP 29.03.2007: Rooftop CtH fix. Temporarily set soldier targetlevel to the real interface
//level (selected with TAB), so the first shot after switching TL is calculated correctly
@@ -799,6 +804,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
if(UsingNewCTHSystem() == true)
{
gfUICtHBar = TRUE;
+ gbCtHBurstCount = 0;
// CTH for the first bullet is entered into this array, and later displayed
gCTHDisplay.MuzzleSwayPercentage = (gCTHDisplay.MuzzleSwayPercentage + uiHitChance)/2;
@@ -815,7 +821,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
pSoldier->bTargetLevel = bTempTargetLevel;
- if(UsingNewCTHSystem() == false)
+ if(UsingNewCTHSystem() == false && gGameSettings.fOptions[ TOPTION_CTH_CURSOR ])
{
gfUICtHBar = TRUE;
gbCtHBurstCount = 1;
@@ -2189,15 +2195,11 @@ void HandleLeftClickCursor( SOLDIERTYPE *pSoldier )
if ( gTacticalStatus.uiFlags & TURNBASED && (gTacticalStatus.uiFlags & INCOMBAT ) )
{
pSoldier->aiData.bShownAimTime = REFINE_AIM_1;
- // HEADROCK HAM 4: Reset Bullet Count for Autofire
- fAutofireBulletsMode = FALSE;
pSoldier->flags.fPauseAim = FALSE;
}
else
{
pSoldier->aiData.bShownAimTime = REFINE_AIM_1;
- // HEADROCK HAM 4: Reset Bullet Count for Autofire
- fAutofireBulletsMode = FALSE;
pSoldier->flags.fPauseAim = FALSE;
}
// Reset counter
@@ -2308,11 +2310,11 @@ void HandleRightClickAdjustCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos )
if(pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire )
{
//Calculate how many bullets we need to fire to add at least one more AP
- sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts <= sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire) //Increment the bullet count until we run out of APs or we spend the whole AP
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
//we've stepped over the border and used up one more ap, now let's make sure that it is spent to maximize the bullets
@@ -2322,12 +2324,12 @@ void HandleRightClickAdjustCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos )
do
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts == sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, pSoldier->aiData.bShownAimTime);
if(!EnoughPoints( pSoldier, sAPCosts, 0, FALSE )) //We've not enough points to fire those bullets
{
@@ -3180,11 +3182,11 @@ void HandleWheelAdjustCursor( SOLDIERTYPE *pSoldier, INT32 sMapPos, INT32 sDelta
if(pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire )
{
//Calculate how many bullets we need to fire to add at least one more AP
- sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts <= sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire) //Increment the bullet count until we run out of APs or we spend the whole AP
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
//we've stepped over the border and used up one more ap, now let's make sure that it is spent to maximize the bullets
@@ -3194,12 +3196,12 @@ void HandleWheelAdjustCursor( SOLDIERTYPE *pSoldier, INT32 sMapPos, INT32 sDelta
do
{
pSoldier->bDoAutofire+=sDelta;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts == sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
if(!EnoughPoints( pSoldier, sAPCosts, 0, FALSE )) //We've not enough points to fire those bullets
{
@@ -3398,11 +3400,11 @@ void HandleWheelAdjustCursorWOAB( SOLDIERTYPE *pSoldier, INT32 sMapPos, INT32 sD
if(pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire )
{
//Calculate how many bullets we need to fire to add at least one more AP
- sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = sCurAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts <= sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft > pSoldier->bDoAutofire) //Increment the bullet count until we run out of APs or we spend the whole AP
{
pSoldier->bDoAutofire++;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
//we've stepped over the border and used up one more ap, now let's make sure that it is spent to maximize the bullets
@@ -3412,12 +3414,12 @@ void HandleWheelAdjustCursorWOAB( SOLDIERTYPE *pSoldier, INT32 sMapPos, INT32 sD
do
{
pSoldier->bDoAutofire+=sDelta;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && sAPCosts == sCurAPCosts && pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
- sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, 0);
+ sAPCosts = CalcTotalAPsToAttack( pSoldier, sMapPos, TRUE, pSoldier->aiData.bShownAimTime);
if(!EnoughPoints( pSoldier, sAPCosts, 0, FALSE )) //We've not enough points to fire those bullets
{
diff --git a/Tactical/UI Cursors.h b/Tactical/UI Cursors.h
index 7f74a4d1..54ca1006 100644
--- a/Tactical/UI Cursors.h
+++ b/Tactical/UI Cursors.h
@@ -3,10 +3,10 @@
#define REFINE_PUNCH_1 0
-#define REFINE_PUNCH_2 6
+#define REFINE_PUNCH_2 gGameExternalOptions.fEnhancedCloseCombatSystem ? gSkillTraitValues.ubModifierForAPsAddedOnAimedPunches : 6
#define REFINE_KNIFE_1 0
-#define REFINE_KNIFE_2 6
+#define REFINE_KNIFE_2 gGameExternalOptions.fEnhancedCloseCombatSystem ? gSkillTraitValues.ubModifierForAPsAddedOnAimedBladedAttackes : 6
UINT8 GetProperItemCursor( UINT8 ubSoldierID, UINT16 ubItemIndex, INT32 usMapPos, BOOLEAN fActivated );
diff --git a/Tactical/Vehicles.cpp b/Tactical/Vehicles.cpp
index 101868eb..1981ba88 100644
--- a/Tactical/Vehicles.cpp
+++ b/Tactical/Vehicles.cpp
@@ -1049,6 +1049,20 @@ BOOLEAN CopyVehiclePathToSoldier( SOLDIERTYPE *pSoldier )
}
+BOOLEAN IsVehicle(SOLDIERTYPE *pSoldier)
+{
+ switch(pSoldier->ubProfile)
+ {
+ case PROF_HUMMER:
+ case PROF_ELDERODO:
+ case PROF_ICECREAM:
+ return(TRUE);
+ default:
+ return(FALSE);
+ }
+ return(FALSE);
+}
+
BOOLEAN SetUpMvtGroupForVehicle( SOLDIERTYPE *pSoldier )
{
@@ -1428,7 +1442,7 @@ void SetDriver( INT32 iID, UINT8 ubID )
#ifdef JA2TESTVERSION
void VehicleTest( void )
{
- SetUpHelicopterForPlayer( 9,1 );
+ SetUpHelicopterForPlayer( 9,1, SKYRIDER );
}
#endif
diff --git a/Tactical/Vehicles.h b/Tactical/Vehicles.h
index 7cc2cebe..b06836f7 100644
--- a/Tactical/Vehicles.h
+++ b/Tactical/Vehicles.h
@@ -123,6 +123,9 @@ INT32 GetTravelTimeOfVehicle( INT32 iId );
// is this vehicle a valid one?
BOOLEAN VehicleIdIsValid( INT32 iId );
+// Test whether a soldier is actually a vehicle
+BOOLEAN IsVehicle(SOLDIERTYPE *pSoldier);
+
// set up vehicle mvt for this grunt involved
BOOLEAN SetUpMvtGroupForVehicle( SOLDIERTYPE *pSoldier );
diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp
index cfb91533..e20052ca 100644
--- a/Tactical/Weapons.cpp
+++ b/Tactical/Weapons.cpp
@@ -422,7 +422,8 @@ weaponStartElementHandle(void *userData, const XML_Char *name, const XML_Char **
strcmp(name, "ubAimLevels") == 0 ||// HEADROCK HAM 4: Allowed aiming levels for this gun.
strcmp(name, "bRecoilX") == 0 || // HEADROCK HAM 4:
strcmp(name, "bRecoilY") == 0 || // HEADROCK HAM 4:
- strcmp(name, "ubRecoilDelay") == 0)) // HEADROCK HAM 4:
+ strcmp(name, "ubRecoilDelay") == 0 || // HEADROCK HAM 4:
+ strcmp(name, "Handling") == 0)) // CHRISL HAM 4:
{
pData->curElement = WEAPON_ELEMENT_WEAPON_PROPERY;
@@ -550,7 +551,7 @@ weaponEndElementHandle(void *userData, const XML_Char *name)
else if(strcmp(name, "ubMagSize") == 0)
{
pData->curElement = WEAPON_ELEMENT_WEAPON;
- pData->curWeapon.ubMagSize = (UINT8) atol(pData->szCharData);
+ pData->curWeapon.ubMagSize = (UINT16) atol(pData->szCharData);
}
else if(strcmp(name, "usRange") == 0)
{
@@ -682,6 +683,11 @@ weaponEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = WEAPON_ELEMENT_WEAPON;
pData->curWeapon.ubRecoilDelay = (INT8) atol(pData->szCharData);
}
+ else if(strcmp(name, "Handling") == 0)
+ {
+ pData->curElement = WEAPON_ELEMENT_WEAPON;
+ pData->curWeapon.ubHandling = (UINT8) atol(pData->szCharData);
+ }
pData->maxReadDepth--;
}
@@ -839,9 +845,10 @@ BOOLEAN ReadInWeaponStats(STR fileName)
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].APsToReloadManually);
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ManualReloadSound);
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubAimLevels);
- FilePrintf(hFile,"\t\t%d<\bRecoilX>\r\n", Weapon[cnt].bRecoilX);
- FilePrintf(hFile,"\t\t%d<\bRecoilY>\r\n", Weapon[cnt].bRecoilY);
- FilePrintf(hFile,"\t\t%d<\ubRecoilDelay>\r\n", Weapon[cnt].ubRecoilDelay);
+ FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].bRecoilX);
+ FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].bRecoilY);
+ FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubRecoilDelay);
+ FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubHandling);
FilePrintf(hFile,"\t\r\n");
}
FilePrintf(hFile,"\r\n");
@@ -955,6 +962,7 @@ BOOLEAN WriteWeaponStats()
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].NoSemiAuto);
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubAimLevels );
FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].EasyUnjam);
+ FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubHandling);
@@ -3790,7 +3798,7 @@ BOOLEAN UseLauncher( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
//sAPCost = MinAPsToAttack( pSoldier, sTargetGridNo, TRUE );
- sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, FALSE, 0 );
+ sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, FALSE, pSoldier->aiData.bShownAimTime );
}
else
@@ -4589,16 +4597,20 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
// make sure the guy's actually got a weapon in his hand!
pInHand = &(pSoldier->inv[pSoldier->ubAttackingHand]);
usInHand = pSoldier->usAttackingWeapon;
+ gCTHDisplay.fMaxAimReached = FALSE;
// calculate actual range (in units, 10 units = 1 tile)
iRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo );
+ FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( sGridNo ));
+ FLOAT dDeltaY = (FLOAT)(CenterY( pSoldier->sGridNo ) - CenterY( sGridNo ));
+ FLOAT d2DDistance = sqrt((dDeltaX*dDeltaX)+(dDeltaY*dDeltaY));
// Find a target in the tile
ubTargetID = WhoIsThere2( sGridNo, pSoldier->bTargetLevel ); // Target ubID
pTarget = SimpleFindSoldier( sGridNo, pSoldier->bTargetLevel ); // Target Pointer
// Calculate how easy it is to handle this gun.
- FLOAT iGunDifficulty = (FLOAT)(( Weapon[ usInHand ].ubReadyTime * (100 - GetPercentReadyTimeAPReduction(pInHand) )) / 100);
+ FLOAT iGunDifficulty = (FLOAT)(( Weapon[ usInHand ].ubHandling * (100 - GetPercentReadyTimeAPReduction(pInHand) )) / 100);
iGunDifficulty *= (FLOAT)(100 / APBPConstants[AP_MAXIMUM]); // Adjust for 100AP/25AP
FLOAT iGunBaseDifficulty = iGunDifficulty;
FLOAT iGunAimDifficulty = iGunDifficulty;
@@ -4648,6 +4660,10 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
iSightRange = 1;
}
}
+ // CHRISL: There are conditions where iSightRange can still return 0. If that happens, the result is that "impossible" shots are actually easier then
+ // simply "really hard" shots. As a result, if we can't see the target and we have a 0 sight range, we need to create an iSightRange based on iRange
+ if(iSightRange == 0)
+ iSightRange = __max((INT16)(sDistVis*1.5), iRange*2);
if(iSightRange > sDistVis)
fCantSeeTarget = true;
@@ -4940,7 +4956,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
/////////////////////////////////////////////
// Now apply Gun Difficulty to the Base Modifier.
- iBaseModifier += iGunBaseDifficulty * gGameCTHConstants.BASE_DRAW_COST;
+ iBaseModifier -= iGunBaseDifficulty * gGameCTHConstants.BASE_DRAW_COST;
// INJURY
if (pSoldier->stats.bLife < pSoldier->stats.bLifeMax)
@@ -5062,7 +5078,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
}
// AGILITY OR EXPERIENCE
- FLOAT iTempPenalty = __max((pTarget->stats.bExpLevel*10), pTarget->stats.bAgility);
+ FLOAT iTempPenalty = (FLOAT)__max((pTarget->stats.bExpLevel*10), pTarget->stats.bAgility);
iBaseModifier += (iTempPenalty * gGameCTHConstants.BASE_AGILE_TARGET) / 100;
}
@@ -5126,7 +5142,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
{
// Are we using a scope? If so, what's the range factor?
- FLOAT iScopeMagFactor = GetBestScopeMagnificationFactor( pInHand, (UINT32)iRange );
+ FLOAT iScopeMagFactor = GetBestScopeMagnificationFactor( pSoldier, pInHand, d2DDistance );
//CHRISL: This does make sense but it effectively makes high powered scopes worthless if a target is actually visible. As an example, a Battle Scope
// is going to have a iScopeMagFactor of 7. With a "NORMAL_SHOOTING_DISTANCE" also of 7, we're going to end up with uiBestScopeRange of 49. That's
// effectilvey saying that any target within 490m is "too close" for the scope to be effective. That by itself isn't realistic. But in JA2 it's also
@@ -5140,16 +5156,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
// uiBestScopeRange value in half. This should allow a Battle Scope to reach full effeciency at 24 tiles and a Sniper scope will be fully effecient at
// 35 tiles. ACOG becomes fully effecient at 14 tiles and 2x is fully effeciency at 7 tiles (compared to 28 and 14 respectively). This does mean that a
// 2x scope reaches full effeciency at the same point as "scopeless" shooting, but I don't think this will be a serious problem.
- FLOAT rangeModifier = gGameCTHConstants.SCOPE_RANGE_MULTIPLIER;
- if( gGameOptions.fNewTraitSystem )
- {
- if(iScopeMagFactor > .5)
- rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ) * 0.05f);
- else
- rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) * 0.05f);
- }
- else
- rangeModifier -= (NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT ) * 0.05f);
+ FLOAT rangeModifier = GetScopeRangeMultiplier(pSoldier, pInHand, (FLOAT)iRange);
UINT32 uiBestScopeRange = (UINT32)(iScopeMagFactor * gGameCTHConstants.NORMAL_SHOOTING_DISTANCE * rangeModifier);
FLOAT iAimModifier = 0;
@@ -5247,7 +5254,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
// End Gun Handling modifiers
//////////////////////////////////////////
- iAimModifier += gGameCTHConstants.AIM_DRAW_COST * iGunAimDifficulty;
+ iAimModifier -= gGameCTHConstants.AIM_DRAW_COST * iGunAimDifficulty;
// VISIBILITY
if (iRange > 0 && iSightRange > iRange)
@@ -5478,8 +5485,12 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
iMaxAimBonus += iScopePenalty;
}
+ iMaxAimBonus = __max(0, iMaxAimBonus); // can't get less than 0 points for aiming...
+
// Now let's find out how many CTH points we get per aiming level.
UINT8 ubAllowedAimingLevels = AllowedAimingLevels( pSoldier, sGridNo );
+ if(ubAimTime == ubAllowedAimingLevels)
+ gCTHDisplay.fMaxAimReached = TRUE;
FLOAT dAimFractionsDivisor = 0.0;
for (UINT8 cnt = 0; cnt < ubAllowedAimingLevels; cnt++)
{
@@ -5945,7 +5956,7 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime,
iMaxRange = GunRange( pInHand, pSoldier ); // SANDRO - added argument
else
iMaxRange = CELL_X_SIZE; // one tile
- iCoverRange = iSightRange - iRange;
+ iCoverRange = __max(0,iSightRange - iRange);
iMinRange = iMaxRange / 10;
iAccRangeMod = iRange * Weapon[usInHand].bAccuracy / 100;
/////////////////////////////////////////////////////////////////////////////////////
@@ -5964,9 +5975,11 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime,
iSightRange -= ((gbSkillTraitBonus[ PROF_SNIPER_OT ] * NUM_SKILL_TRAITS( pSoldier, PROF_SNIPER_OT )) * iSightRange) /100;
}
if (iRange < GetMinRangeForAimBonus(pInHand) && iScopeVisionRangeBonus > 50){ // iSightRange penalty for using a high power scope within min range due to poor focus
+ iPenalty = 0;
for(UINT8 loop = 0; loop < ((GetMinRangeForAimBonus(pInHand) - iRange)/CELL_X_SIZE); loop++){
- iSightRange += iSightRange * iScopeVisionRangeBonus / 100;
+ iPenalty += iSightRange * iScopeVisionRangeBonus / 100;
}
+ iSightRange += iPenalty;
}
if (iSightRange < 1) {
iSightRange = 1;
@@ -6026,8 +6039,14 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime,
// From for JA2.5: 3% bonus/penalty for each tile different from range NORMAL_RANGE.
if (!TANK(pSoldier)) // WANNE: No penalty on the tank
iPenalty = 3 * ( NORMAL_RANGE - iSightRange ) / CELL_X_SIZE;
- if ( fCantSeeTarget )
+ if ( fCantSeeTarget ){
+ // CHRISL: There are conditions where iSightRange can still return 0. If that happens, the result is that "impossible" shots are actually easier then
+ // simply "really hard" shots. As a result, if we can't see the target and we have a 0 sight range, we should reevaluate the above penalty but use
+ // iRange instead of iSightRange, then include the unseen penalty.
+ if(iSightRange == 0)
+ iPenalty = (3 * ( NORMAL_RANGE - iRange ) / CELL_X_SIZE) - gGameExternalOptions.iPenaltyShootUnSeen;
iPenalty = min(iPenalty, -gGameExternalOptions.iPenaltyShootUnSeen);
+ }
iChance += iPenalty;
//CHRISL: We should probably include these target size penalties even if we can't see the target so that shooting a "hidden" head is harder then a "hidden" body
// if aiming at the head, reduce chance to hit
@@ -6424,7 +6443,7 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime,
if ( pSoldier->bDoBurst && pSoldier->bDoAutofire == 0 )
{
/*CHRISL: At this point in the calculation, Bipods, Foregrips and other "recoil stabalizing" bonuses should reduce the weapons "recoil penalty"
- (BurstPenalty) by a percentage. This reduction should apply the the recoil per shot and not as a "flat" initial reduction. Later in the code,
+ (BurstPenalty) by a percentage. This reduction should apply to the recoil per shot and not as a "flat" initial reduction. Later in the code,
Bipods also grant their flat CTH bonus so we don't need to mess this that here*/
if(gGameExternalOptions.ubFlatAFTHBtoPrecentMultiplier)
{
@@ -10680,7 +10699,7 @@ UINT16 GetMagSize( OBJECTTYPE *pObj, UINT8 subObject )
UINT16 GetExpMagSize( OBJECTTYPE *pObj )
{
// DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("GetMagSize"));
- UINT8 magSize = 0;
+ UINT16 magSize = 0;
if(Item[pObj->usItem].usItemClass & IC_EXPLOSV)
magSize = Explosive[Item[pObj->usItem].ubClassIndex].ubMagSize;
else
@@ -10731,7 +10750,7 @@ void EstimateBulletsLeft( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj )
UINT16 usExpLevel;
UINT16 usDexterity;
UINT16 usWisdom;
- UINT8 ubMagSize = Weapon[pObj->usItem].ubMagSize;
+ UINT16 ubMagSize = Weapon[pObj->usItem].ubMagSize;
UINT16 usRealBulletCount = (*pObj)[0]->data.gun.ubGunShotsLeft;
UINT16 i = 0;
BOOLEAN fPsycho = FALSE;
@@ -10868,29 +10887,21 @@ void CalcMagFactorSimple( SOLDIERTYPE *pSoldier, FLOAT d2DDistance, INT16 bAimTi
FLOAT iHighestMagFactor = 0;
FLOAT iScopeFactor = 0;
FLOAT iProjectionFactor = 0;
- FLOAT iTargetMagFactor = 0;
- BOOLEAN isScopeBetter = FALSE;
-
- // Calculate the optimal magnification that would be required for the target's current distance.
- iTargetMagFactor = d2DDistance / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE;
+ FLOAT iTargetMagFactor = d2DDistance / gGameCTHConstants.NORMAL_SHOOTING_DISTANCE;
+ FLOAT rangeModifier = GetScopeRangeMultiplier(pSoldier, pWeapon, d2DDistance);
if (bAimTime > 0)
{
- iScopeFactor = GetBestScopeMagnificationFactor( pWeapon, (UINT32)d2DDistance );
+ iScopeFactor = GetBestScopeMagnificationFactor( pSoldier, pWeapon, d2DDistance );
// Set a display variable
gCTHDisplay.ScopeMagFactor = iScopeFactor;
- iScopeFactor = __min(iScopeFactor, iTargetMagFactor);
- iProjectionFactor = GetProjectionFactor( pWeapon );
-
+ iScopeFactor = __min(iScopeFactor, __max(1.0f, iTargetMagFactor/rangeModifier));
+ iProjectionFactor = CalcProjectionFactor(pSoldier, pWeapon, d2DDistance, (UINT8)bAimTime);
// Set a display variable
gCTHDisplay.ProjectionFactor = iProjectionFactor;
// The final factor is the largest of the two.
-
- if (iScopeFactor > iProjectionFactor)
- isScopeBetter=TRUE;
-
iHighestMagFactor = __max( iScopeFactor, iProjectionFactor );
}
else
diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h
index 98443c8f..8c6332b4 100644
--- a/Tactical/Weapons.h
+++ b/Tactical/Weapons.h
@@ -270,7 +270,7 @@ typedef struct
UINT8 ubDeadliness; // comparative ratings of guns
INT8 bAccuracy; // accuracy or penalty used by OCTH
INT8 nAccuracy; // accuracy or penalty used by NCTH
- UINT8 ubMagSize;
+ UINT16 ubMagSize;
UINT16 usRange;
UINT16 usReloadDelay;
UINT8 ubAttackVolume;
@@ -306,6 +306,7 @@ typedef struct
UINT8 ubAimLevels; // HEADROCK HAM 4: Dictates how many aiming levels this gun supports. If 0, the program
// chooses automatically based on the type of gun (see AllowedAimingLevels() ).
+ UINT8 ubHandling; // CHRISL HAM 4: This value replaces ubReadyTime for determining a weapons base handling characteristics.
} WEAPONTYPE;
typedef struct
diff --git a/Tactical/World Items.cpp b/Tactical/World Items.cpp
index cb0e20c5..96f4f0a9 100644
--- a/Tactical/World Items.cpp
+++ b/Tactical/World Items.cpp
@@ -460,10 +460,17 @@ INT32 AddItemToWorld( INT32 sGridNo, OBJECTTYPE *pObject, UINT8 ubLevel, UINT16
// OJW - 20091002 - Explosives
if (is_networked && is_client)
{
+ SOLDIERTYPE* pSoldier = NULL;
+
if (soldierID == -1)
- soldierID = gWorldItems[ iItemIndex ].object[0]->data.misc.ubBombOwner - 2; // undo the hack
+ {
+ if (gWorldItems[ iItemIndex ].object[0]->data.misc.ubBombOwner > 1)
+ {
+ soldierID = gWorldItems[ iItemIndex ].object[0]->data.misc.ubBombOwner - 2; // undo the hack
+ pSoldier = MercPtrs[ soldierID ];
+ }
+ }
- SOLDIERTYPE* pSoldier = MercPtrs[ soldierID ];
if (pSoldier != NULL)
{
// if soldier is on our team, or is AI and we are the server
diff --git a/Tactical/XML.h b/Tactical/XML.h
index e2761513..643c6fcf 100644
--- a/Tactical/XML.h
+++ b/Tactical/XML.h
@@ -189,6 +189,8 @@ typedef PARSE_STAGE;
#define QUOTEARRAYFILENAME "MercQuote.xml"
+#define FACEGEARFILENAME "FaceGear.xml"
+
extern BOOLEAN ReadInItemStats(STR fileName, BOOLEAN localizedVersion);
extern BOOLEAN WriteItemStats();
@@ -389,4 +391,7 @@ extern BOOLEAN WriteAimAvailability(STR fileName);
extern BOOLEAN WriteQarray(QARRAY_VALUES *pQarray, STR fileName);
extern BOOLEAN ReadInQarray(QARRAY_VALUES *pQarray, STR fileName);
+extern BOOLEAN WriteFaceGear();
+extern BOOLEAN ReadInFaceGear( FACE_GEAR_VALUES *pFaceGear, STR fileName );
+
#endif
diff --git a/Tactical/XML_MercStartingGear.cpp b/Tactical/XML_MercStartingGear.cpp
index 99496899..06d8eb8e 100644
--- a/Tactical/XML_MercStartingGear.cpp
+++ b/Tactical/XML_MercStartingGear.cpp
@@ -204,6 +204,20 @@ MercStartingGearEndElementHandle(void *userData, const XML_Char *name)
if(pData->curIndex < pData->maxArraySize && pData->curGears < NUM_MERCSTARTINGGEAR_KITS)
{
pData->curArray[pData->curIndex][pData->curGears] = pData->curMercStartingGear; //write the armour into the table
+ //CHRISL: after writing the gearkit, we need to clear gear data so it won't inadvertantly be reused
+ pData->curMercStartingGear.PriceModifier = 0;
+ for(unsigned int i = 0; i < pData->curMercStartingGear.inv.size(); i++)
+ {
+ pData->curMercStartingGear.inv[i] = 0;
+ pData->curMercStartingGear.iStatus[i] = 0;
+ pData->curMercStartingGear.iDrop[i] = 0;
+ pData->curMercStartingGear.iNumber[i] = 0;
+ }
+ for(unsigned int i = 0; i < pData->curMercStartingGear.lbe.size(); i++)
+ {
+ pData->curMercStartingGear.lbe[i] = 0;
+ pData->curMercStartingGear.lStatus[i] = 0;
+ }
}
pData->curElement = ELEMENT;
diff --git a/Tactical/XML_NewFaceGear.cpp b/Tactical/XML_NewFaceGear.cpp
new file mode 100644
index 00000000..f7884bce
--- /dev/null
+++ b/Tactical/XML_NewFaceGear.cpp
@@ -0,0 +1,230 @@
+#ifdef PRECOMPILEDHEADERS
+ #include "Tactical All.h"
+#else
+ #include "sgp.h"
+ #include "Debug Control.h"
+ #include "expat.h"
+ #include "XML.h"
+ #include "Interface.h"
+ #include "Faces.h"
+#endif
+
+struct
+{
+ PARSE_STAGE curElement;
+
+ CHAR8 szCharData[MAX_CHAR_DATA_LENGTH+1];
+ FACE_GEAR_VALUES curFaceGear;
+ FACE_GEAR_VALUES * curArray;
+
+ UINT32 maxArraySize;
+ UINT32 curIndex;
+ UINT32 currentDepth;
+ UINT32 maxReadDepth;
+}
+typedef faceGearParseData;
+
+BOOLEAN FaceGear_TextOnly;
+
+static void XMLCALL
+faceGearStartElementHandle(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+ faceGearParseData * pData = (faceGearParseData *)userData;
+
+ if(pData->currentDepth <= pData->maxReadDepth) //are we reading this element?
+ {
+ if(strcmp(name, "FACE_GEAR") == 0 && pData->curElement == ELEMENT_NONE)
+ {
+ pData->curElement = ELEMENT_LIST;
+
+ memset(pData->curArray,0,sizeof(FACE_GEAR_VALUES)*pData->maxArraySize);
+
+ pData->maxReadDepth++; //we are not skipping this element
+ }
+ else if(strcmp(name, "ITEM") == 0 && pData->curElement == ELEMENT_LIST)
+ {
+ pData->curElement = ELEMENT;
+
+ memset(&pData->curFaceGear,0,sizeof(FACE_GEAR_VALUES));
+
+ pData->maxReadDepth++; //we are not skipping this element
+ }
+ else if(pData->curElement == ELEMENT &&
+ (strcmp(name, "uiIndex") == 0 ||
+ strcmp(name, "Type") == 0 ||
+ strcmp(name, "szFile") == 0 ))
+ {
+ pData->curElement = ELEMENT_PROPERTY;
+
+ pData->maxReadDepth++; //we are not skipping this element
+ }
+
+ pData->szCharData[0] = '\0';
+ }
+
+ pData->currentDepth++;
+
+}
+
+static void XMLCALL
+faceGearCharacterDataHandle(void *userData, const XML_Char *str, int len)
+{
+ faceGearParseData * pData = (faceGearParseData *)userData;
+
+ if( (pData->currentDepth <= pData->maxReadDepth) &&
+ (strlen(pData->szCharData) < MAX_CHAR_DATA_LENGTH)
+ ){
+ strncat(pData->szCharData,str,__min((unsigned int)len,MAX_CHAR_DATA_LENGTH-strlen(pData->szCharData)));
+ }
+}
+
+
+static void XMLCALL
+faceGearEndElementHandle(void *userData, const XML_Char *name)
+{
+
+ char temp;
+
+ faceGearParseData * pData = (faceGearParseData *)userData;
+
+ if(pData->currentDepth <= pData->maxReadDepth)
+ {
+ if(strcmp(name, "FACE_GEAR") == 0)
+ {
+ pData->curElement = ELEMENT_NONE;
+ }
+ else if(strcmp(name, "ITEM") == 0)
+ {
+ pData->curElement = ELEMENT_LIST;
+
+
+ if(pData->curFaceGear.uiIndex < pData->maxArraySize)
+ {
+ pData->curArray[pData->curFaceGear.uiIndex] = pData->curFaceGear;
+ }
+
+ }
+ else if(strcmp(name, "uiIndex") == 0)
+ {
+ pData->curElement = ELEMENT;
+ pData->curFaceGear.uiIndex = (UINT16) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "Type") == 0)
+ {
+ pData->curElement = ELEMENT;
+ pData->curFaceGear.Type = (UINT16) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "szFile") == 0 )
+ {
+ pData->curElement = ELEMENT;
+
+ if(MAX_FACE_GERA_CHARS >= strlen(pData->szCharData))
+ strcpy(pData->curFaceGear.szFile,pData->szCharData);
+ else
+ {
+ strncpy(pData->curFaceGear.szFile,pData->szCharData,MAX_FACE_GERA_CHARS);
+ pData->curFaceGear.szFile[MAX_FACE_GERA_CHARS] = '\0';
+ }
+
+ for(int i=0;iszCharData),MAX_FACE_GERA_CHARS);i++)
+ {
+ temp = pData->szCharData[i];
+ pData->curFaceGear.szFile[i] = temp;
+ }
+
+ }
+ pData->maxReadDepth--;
+ }
+ pData->currentDepth--;
+}
+
+BOOLEAN ReadInFaceGear( FACE_GEAR_VALUES *pFaceGear, STR fileName ) //, BOOLEAN localizedVersion)
+{
+ HWFILE hFile;
+ UINT32 uiBytesRead;
+ UINT32 uiFSize;
+ CHAR8 * lpcBuffer;
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ faceGearParseData pData;
+
+ DebugMsg(TOPIC_JA2, DBG_LEVEL_3, "Loading FaceGear.xml" );
+
+ // Open file
+ hFile = FileOpen( fileName, FILE_ACCESS_READ, FALSE );
+ if ( !hFile )
+ return( FALSE );
+
+ uiFSize = FileGetSize(hFile);
+ lpcBuffer = (CHAR8 *) MemAlloc(uiFSize+1);
+
+ //Read in block
+ if ( !FileRead( hFile, lpcBuffer, uiFSize, &uiBytesRead ) )
+ {
+ MemFree(lpcBuffer);
+ return( FALSE );
+ }
+
+ lpcBuffer[uiFSize] = 0; //add a null terminator
+
+ FileClose( hFile );
+
+
+ XML_SetElementHandler(parser, faceGearStartElementHandle, faceGearEndElementHandle);
+ XML_SetCharacterDataHandler(parser, faceGearCharacterDataHandle);
+
+
+ memset(&pData,0,sizeof(pData));
+ pData.curArray = pFaceGear;
+ pData.maxArraySize = MAXITEMS;
+
+ XML_SetUserData(parser, &pData);
+
+
+ if(!XML_Parse(parser, lpcBuffer, uiFSize, TRUE))
+ {
+ CHAR8 errorBuf[511];
+
+ sprintf(errorBuf, "XML Parser Error in FaceGear.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser));
+ LiveMessage(errorBuf);
+
+ MemFree(lpcBuffer);
+ return FALSE;
+ }
+
+ MemFree(lpcBuffer);
+
+
+ XML_ParserFree(parser);
+
+
+ return( TRUE );
+}
+
+BOOLEAN WriteFaceGear()
+{
+ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"writeFaceGear");
+ HWFILE hFile;
+
+ hFile = FileOpen( "TABLEDATA\\FaceGear out.xml", FILE_ACCESS_WRITE | FILE_CREATE_ALWAYS, FALSE );
+ if ( !hFile )
+ return( FALSE );
+
+ {
+ UINT32 cnt;
+
+ FilePrintf(hFile,"\r\n");
+ for(cnt = 0;cnt < MAXITEMS;cnt++)
+ {
+ FilePrintf(hFile,"\t- \r\n");
+ FilePrintf(hFile,"\t\t%d\r\n",cnt);
+ FilePrintf(hFile,"\t\t%d\r\n", zNewFaceGear[cnt].Type);
+ FilePrintf(hFile,"\t\t\r\n");
+ FilePrintf(hFile,"\t
\r\n");
+ }
+ FilePrintf(hFile,"\r\n");
+ }
+ FileClose( hFile );
+
+ return( TRUE );
+}
diff --git a/Tactical/faces.h b/Tactical/faces.h
index 902df31e..09a36ea9 100644
--- a/Tactical/faces.h
+++ b/Tactical/faces.h
@@ -42,6 +42,19 @@ typedef struct
extern RPC_SMALL_FACE_VALUES gRPCSmallFaceValues[200];
extern UINT8 gubRPCSmallFaceProfileNum[200];
+#define MAX_FACE_GERA_CHARS 500
+
+typedef struct
+{
+ UINT16 Type;
+ UINT32 uiIndex;
+ CHAR8 szFile[MAX_FACE_GERA_CHARS];
+
+} FACE_GEAR_VALUES;
+
+extern FACE_GEAR_VALUES zNewFaceGear[MAXITEMS];
+extern FACE_GEAR_VALUES zNewFaceGearIMP[MAXITEMS];
+
#define FACE_AUTO_DISPLAY_BUFFER 0xFFFFF000
#define FACE_AUTO_RESTORE_BUFFER 0xFFFFFF00
#define FACE_NO_RESTORE_BUFFER 0xFFFFFFF0
@@ -239,6 +252,8 @@ void InternalShutupaYoFace( INT32 iFaceIndex, BOOLEAN fForce );
// If you still want the face in moemory but want to stop if from being displayed, or handled call
void SetAutoFaceInActive( INT32 iFaceIndex );
+void SetCamoFace(SOLDIERTYPE * pSoldier);
+
// To set all currently allocated faces to either active or incactive, call these
void SetAllAutoFacesInactive( );
diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp
index 94c6127e..6e8e8704 100644
--- a/Tactical/opplist.cpp
+++ b/Tactical/opplist.cpp
@@ -2862,7 +2862,7 @@ void RemoveOneOpponent(SOLDIERTYPE *pSoldier)
{
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Oppcnt for %d (%s) tried to go below 0", pSoldier->ubID, pSoldier->name ) );
#ifdef JA2BETAVERSION
- ScreenMsg( MSG_FONT_YELLOW, MSG_UI_FEEDBACK, L"Opponent counter dropped below 0 for person %d (%s). Please inform Sir-tech of this, and what has just been happening in the game.", pSoldier->ubID, pSoldier->name );
+ ScreenMsg( MSG_FONT_YELLOW, MSG_UI_FEEDBACK, L"Opponent counter dropped below 0 for person %d (%s). Please inform Sir-tech of this, and what has just been happening in the game.", pSoldier->ubID, pSoldier->name );
#endif
pSoldier->aiData.bOppCnt = 0;
}
@@ -5751,7 +5751,8 @@ void ProcessNoise(UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bLevel, UINT8 ubTerrTy
if (pSoldier->aiData.bOppList[ubNoiseMaker] == SEEN_CURRENTLY)
{
// civilians care about gunshots even if they come from someone they can see
- if ( !( pSoldier->aiData.bNeutral && ubNoiseType == NOISE_GUNFIRE ) )
+ // ChrisL: Crows will fly away if they hear any noise
+ if ( !( pSoldier->aiData.bNeutral && ubNoiseType == NOISE_GUNFIRE ) && pSoldier->ubBodyType != CROW )
{
continue; // then who cares whether he can also hear the guy?
}
@@ -6949,7 +6950,8 @@ void RecalculateOppCntsDueToNoLongerNeutral( SOLDIERTYPE * pSoldier )
if ( pOpponent->aiData.bOppList[pSoldier->ubID] == SEEN_CURRENTLY )
{
// have to add to opponent's oppcount as well since we just became non-neutral
- AddOneOpponent( pOpponent );
+ //CHRISL: If we do this, Bloodcats get counted at opponents multiple times and never get removed from the OppCnt variable.
+ //AddOneOpponent( pOpponent );
}
}
}
diff --git a/Tactical/soldier profile type.h b/Tactical/soldier profile type.h
index 480bf111..6186f7f3 100644
--- a/Tactical/soldier profile type.h
+++ b/Tactical/soldier profile type.h
@@ -5,6 +5,7 @@
#include "Soldier Control.h"
#define NUM_PROFILES 255 //170 new profiles by Jazz
+#define NUM_PROFILES_v111 170
//tais: maximum amount of starting gear kits
#define NUM_MERCSTARTINGGEAR_KITS 5
#define FIRST_RPC 57
diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp
index 75c257a4..ec8b7df5 100644
--- a/TacticalAI/Attacks.cpp
+++ b/TacticalAI/Attacks.cpp
@@ -2647,11 +2647,9 @@ void CheckIfShotPossible(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN s
// (suppressionFire && IsGunAutofireCapable(&pSoldier->inv[pBestShot->bWeaponIn] ) && GetMagSize(pObj) > 30 && (*pObj)[0]->data.gun.ubGunShotsLeft > 20 ))
BOOLEAN fEnableAISuppression = FALSE;
- if ( gGameExternalOptions.fIncreaseAISuppressionFire && ((!suppressionFire && ( (IsScoped(pObj) && GunRange(pObj, pSoldier) > MaxNormalDistanceVisible() ) || pSoldier->aiData.bOrders == SNIPER ) ) || // SANDRO - added argument to GunRange()
- (suppressionFire && IsGunAutofireCapable(&pSoldier->inv[pBestShot->bWeaponIn]))) )
- fEnableAISuppression = TRUE;
- else if ( !gGameExternalOptions.fIncreaseAISuppressionFire && ( (!suppressionFire && ( (IsScoped(pObj) && GunRange(pObj, pSoldier) > MaxNormalDistanceVisible() ) || pSoldier->aiData.bOrders == SNIPER ) ) || // SANDRO - added argument
- (suppressionFire && IsGunAutofireCapable(&pSoldier->inv[pBestShot->bWeaponIn] ) && GetMagSize(pObj) > 30 && (*pObj)[0]->data.gun.ubGunShotsLeft > 20 )))
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ if ( ((!suppressionFire && ( (IsScoped(pObj) && GunRange(pObj, pSoldier) > MaxNormalDistanceVisible() ) || pSoldier->aiData.bOrders == SNIPER ) ) || // SANDRO - added argument to GunRange()
+ (suppressionFire && IsGunAutofireCapable(&pSoldier->inv[pBestShot->bWeaponIn]) && GetMagSize(pObj) >= gGameExternalOptions.ubAISuppressionMinimumMagSize && (*pObj)[0]->data.gun.ubGunShotsLeft >= gGameExternalOptions.ubAISuppressionMinimumAmmo)) )
fEnableAISuppression = TRUE;
if (fEnableAISuppression)
@@ -2811,7 +2809,7 @@ FLOAT AICalcRecoilForShot( SOLDIERTYPE *pSoldier, OBJECTTYPE *pWeapon, UINT8 ubS
{
INT8 bRecoilX = 0;
INT8 bRecoilY = 0;
- GetRecoil( pWeapon, &bRecoilX, &bRecoilY, ubShotNum );
+ GetRecoil( pSoldier, pWeapon, &bRecoilX, &bRecoilY, ubShotNum );
// Return average shooter's ability to control this gun.
// HEADROCK HAM 4: TODO: Incorporate items that alter max counter-force.
FLOAT AverageRecoil = __max(0, ((FLOAT)sqrt( (FLOAT)(bRecoilX * bRecoilX) + (FLOAT)(bRecoilY * bRecoilY) ) - (gGameCTHConstants.RECOIL_MAX_COUNTER_FORCE * 0.7f) ) );
diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp
index 3ec91e00..59f17de6 100644
--- a/TacticalAI/DecideAction.cpp
+++ b/TacticalAI/DecideAction.cpp
@@ -739,21 +739,22 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
else
{
// done!
- pSoldier->flags.uiStatusFlags &= ~(SOLDIER_BOXER);
- if (pSoldier->bTeam == gbPlayerNum)
- {
- pSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
- TriggerEndOfBoxingRecord( pSoldier );
- }
- else if ( CountPeopleInBoxingRing() == 0 )
- {
- // Probably disqualified by jumping out of ring; the player
- // character then didn't trigger the end of boxing record
- // (and we know from the if statement above that we're
- // still in a boxing state of some sort...)
- //TriggerEndOfBoxingRecord( NULL );
- // HEADROCK HAM 3.6: This should trigger Darren's script
+ // WANNE: This should fix the bug if any merc are still under PC control. This could happen after boxing in SAN MONA.
+ SOLDIERTYPE *pTeamSoldier;
+ for (INT8 bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++)
+ {
+ pTeamSoldier=MercPtrs[bLoop];
+
+ if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
+ pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
+
+ if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER)
+ pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER);
+ }
+
+ if (pSoldier->bTeam == gbPlayerNum || CountPeopleInBoxingRing() == 0)
+ {
TriggerEndOfBoxingRecord( pSoldier );
}
}
@@ -871,7 +872,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
//if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pCorpse->def.sGridNo, pSoldier->pathing.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pCorpse->def.sGridNo, pCorpse->def.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
{
- ScreenMsg( MSG_FONT_YELLOW, MSG_INTERFACE, L"Warning: enemy corpse found!!!" );
+ ScreenMsg( MSG_FONT_YELLOW, MSG_INTERFACE, New113Message[MSG113_ENEMY_FOUND_DEAD_BODY]);
//pCorpse->def.ubAIWarningValue=0;
gRottingCorpse[ cnt ].def.ubAIWarningValue=0;
return( AI_ACTION_RED_ALERT );
@@ -2376,10 +2377,8 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
// current revamp of suppression fire.
BOOLEAN fEnableAIAutofire = FALSE;
- if ( gGameExternalOptions.fIncreaseAISuppressionFire && ( ( BestShot.ubPossible && BestShot.ubChanceToReallyHit < 50 ) || (BestShot.ubPossible && BestShot.ubChanceToReallyHit < (INT16)PreRandom(100)) && Menptr[BestShot.ubOpponent].pathing.bLevel == 0 && pSoldier->aiData.bOrders != SNIPER ))
- fEnableAIAutofire = TRUE;
-
- else if ( !gGameExternalOptions.fIncreaseAISuppressionFire && ( BestShot.ubPossible && BestShot.ubChanceToReallyHit < 50 && Menptr[BestShot.ubOpponent].pathing.bLevel == 0 && pSoldier->aiData.bOrders != SNIPER ))
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ if ( BestShot.bWeaponIn != -1 && (GetMagSize(&pSoldier->inv[BestShot.bWeaponIn]) >= gGameExternalOptions.ubAISuppressionMinimumMagSize && pSoldier->inv[BestShot.bWeaponIn][0]->data.gun.ubGunShotsLeft >= gGameExternalOptions.ubAISuppressionMinimumAmmo) && ( ( BestShot.ubPossible && BestShot.ubChanceToReallyHit < 50 ) || (BestShot.ubPossible && BestShot.ubChanceToReallyHit < (INT16)PreRandom(100)) && Menptr[BestShot.ubOpponent].pathing.bLevel == 0 && pSoldier->aiData.bOrders != SNIPER ))
fEnableAIAutofire = TRUE;
if (fEnableAIAutofire)
@@ -4672,10 +4671,9 @@ INT16 ubMinAPCost;
case ATTACKSLAYONLY:iChance += 30; break;
}
- // HEADROCK HAM B2.6: Allows control over increased enemy burstfire.
- if ( gGameExternalOptions.fIncreaseAISuppressionFire && pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft > 10 )
- iChance += 20;
- else if ( !gGameExternalOptions.fIncreaseAISuppressionFire && pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft > 50 )
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ if ( GetMagSize(&pSoldier->inv[BestAttack.bWeaponIn], 0) >= gGameExternalOptions.ubAISuppressionMinimumMagSize &&
+ pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft >= gGameExternalOptions.ubAISuppressionMinimumAmmo )
iChance += 20;
// increase chance based on proximity and difficulty of enemy
@@ -4769,10 +4767,9 @@ INT16 ubMinAPCost;
}
- // HEADROCK HAM B2.6: Allows control over increased enemy autofire.
- if ( gGameExternalOptions.fIncreaseAISuppressionFire && pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft > 20 )
- iChance += 30;
- else if ( !gGameExternalOptions.fIncreaseAISuppressionFire && pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft > 50 )
+ // CHRISL: Changed from a simple flag to two externalized values for more modder control over AI suppression
+ if ( GetMagSize(&pSoldier->inv[BestAttack.bWeaponIn], 0) >= gGameExternalOptions.ubAISuppressionMinimumMagSize &&
+ pSoldier->inv[BestAttack.bWeaponIn][0]->data.gun.ubGunShotsLeft >= gGameExternalOptions.ubAISuppressionMinimumAmmo )
iChance += 30;
if ( bInGas )
diff --git a/TacticalAI/NPC.cpp b/TacticalAI/NPC.cpp
index 3fb618e1..db53f499 100644
--- a/TacticalAI/NPC.cpp
+++ b/TacticalAI/NPC.cpp
@@ -49,6 +49,7 @@
#include "Campaign Types.h"
#include "GameSettings.h" // added by SANDRO
#include "Soldier Profile.h"
+ #include "GameVersion.h"
#endif
#include "Soldier Profile.h"
//forward declarations of common classes to eliminate includes
@@ -299,6 +300,7 @@ void BackupOriginalQuoteFile( UINT8 ubNPC )
gpNPCQuoteInfoArray[ubNPC] = NULL;
}
+extern UINT32 guiCurrentSaveGameVersion;
BOOLEAN EnsureQuoteFileLoaded( UINT8 ubNPC )
{
BOOLEAN fLoadFile = FALSE;
@@ -308,10 +310,35 @@ BOOLEAN EnsureQuoteFileLoaded( UINT8 ubNPC )
return( FALSE );
}
- if (gpNPCQuoteInfoArray[ubNPC] == NULL)
- {
- fLoadFile = TRUE;
- }
+ if(guiCurrentSaveGameVersion < FIXED_NPC_QUOTE_BUG)
+ {
+ if (gpNPCQuoteInfoArray[ubNPC] == NULL)
+ {
+ fLoadFile = TRUE;
+ }
+ else
+ {
+ // WANNE:Reload the NPC quote files if only ONE quote exists. This seems to be a bug anywhere in the quote system.
+ // This is a hack, but works :)
+ // This should fix the bug, that special quests are not triggerd when talking to NPCs!
+ if (gpNPCQuoteInfoArray[ubNPC][1].ubQuoteNum == 0 && gpNPCQuoteInfoArray[ubNPC][1].ubNumQuotes == 0)
+ {
+ fLoadFile = TRUE;
+ }
+ }
+ }
+ else
+ {
+ if (gpNPCQuoteInfoArray[ubNPC] == NULL)
+ {
+ fLoadFile = TRUE;
+ }
+ else if (gpNPCQuoteInfoArray[ubNPC][0].ubQuoteNum != 0 && gpNPCQuoteInfoArray[ubNPC][1].ubNumQuotes == 0)
+ { // CHRISL: This will reset the quote file if, for some reason, the first quote exists but the 2nd doesn't
+ fLoadFile = TRUE;
+ }
+ }
+
// if ( ubNPC >= FIRST_RPC && ubNPC < FIRST_NPC )
//new profiles by Jazz
@@ -3050,18 +3077,25 @@ BOOLEAN SaveNPCInfoToSaveGameFile( HWFILE hFile )
return( TRUE );
}
+extern INT32 ReadFieldByField(HWFILE hFile, PTR pDest, UINT32 uiFieldSize, UINT32 uiElementSize, UINT32 uiCurByteCount);
+
BOOLEAN LoadNPCInfoFromSavedGameFile( HWFILE hFile, UINT32 uiSaveGameVersion )
{
UINT32 uiNumBytesRead=0;
UINT32 cnt;
UINT8 ubLoadQuote=0;
UINT32 uiNumberToLoad=0;
+ INT32 numBytesRead = 0;
+ INT8 padding;
// If we are trying to restore a saved game prior to version 44, use the
// MAX_NUM_SOLDIERS, else use NUM_PROFILES. Dave used the wrong define!
- if( uiSaveGameVersion >= 44 )
+ // Verion 111 increased NUM_PROFILES from 170 to 255
+ if( uiSaveGameVersion >= 111 )
uiNumberToLoad = NUM_PROFILES;
+ else if( uiSaveGameVersion >= 44 )
+ uiNumberToLoad = NUM_PROFILES_v111;
else
uiNumberToLoad = MAX_NUM_SOLDIERS;
@@ -3097,8 +3131,75 @@ BOOLEAN LoadNPCInfoFromSavedGameFile( HWFILE hFile, UINT32 uiSaveGameVersion )
}
//Load the NPC quote entry
- FileRead( hFile, gpNPCQuoteInfoArray[ cnt ], sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS, &uiNumBytesRead );
- if( uiNumBytesRead != sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS )
+ numBytesRead = 0;
+ for(UINT32 cnt2 = 0; cnt2 < NUM_NPC_QUOTE_RECORDS; cnt2++)
+ {
+ if(guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ {
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].fFlags, sizeof(gpNPCQuoteInfoArray[ cnt ]->fFlags), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sRequiredItem, sizeof(gpNPCQuoteInfoArray[ cnt ]->sRequiredItem), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usFactMustBeTrue, sizeof(gpNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usFactMustBeFalse, sizeof(gpNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubFirstDay, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubFirstDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubLastDay, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubLastDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubApproachRequired, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubApproachRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubOpinionRequired, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubOpinionRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubQuoteNum, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubQuoteNum), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubNumQuotes, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubNumQuotes), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubStartQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubStartQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubEndQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubEndQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubTriggerNPC, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubTriggerNPC), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubTriggerNPCRec, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubFiller, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubFiller), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usSetFactTrue, sizeof(gpNPCQuoteInfoArray[ cnt ]->usSetFactTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usGiftItem, sizeof(gpNPCQuoteInfoArray[ cnt ]->usGiftItem), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usUnused, sizeof(gpNPCQuoteInfoArray[ cnt ]->usUnused), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sActionData, sizeof(gpNPCQuoteInfoArray[ cnt ]->sActionData), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sRequiredGridNo, sizeof(gpNPCQuoteInfoArray[ cnt ]->sRequiredGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usGoToGridNo, sizeof(gpNPCQuoteInfoArray[ cnt ]->usGoToGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usSourceDialogueLevel, sizeof(gpNPCQuoteInfoArray[ cnt ]->usSourceDialogueLevel), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usDestDialogueLevel, sizeof(gpNPCQuoteInfoArray[ cnt ]->usDestDialogueLevel), sizeof(UINT16), numBytesRead);
+ }
+ else
+ {
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].fFlags, sizeof(gpNPCQuoteInfoArray[ cnt ]->fFlags), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sRequiredItem, sizeof(gpNPCQuoteInfoArray[ cnt ]->sRequiredItem), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sRequiredGridNo, sizeof(gpNPCQuoteInfoArray[ cnt ]->sRequiredGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usFactMustBeTrue, sizeof(gpNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usFactMustBeFalse, sizeof(gpNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubFirstDay, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubFirstDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubLastDay, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubLastDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubApproachRequired, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubApproachRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubOpinionRequired, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubOpinionRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(UINT8), numBytesRead); //previous ubUnused no longer exists
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubQuoteNum, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubQuoteNum), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubNumQuotes, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubNumQuotes), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubStartQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubStartQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubEndQuest, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubEndQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubTriggerNPC, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubTriggerNPC), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].ubTriggerNPCRec, sizeof(gpNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usSetFactTrue, sizeof(gpNPCQuoteInfoArray[ cnt ]->usSetFactTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usGiftItem, sizeof(gpNPCQuoteInfoArray[ cnt ]->usGiftItem), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].sActionData, sizeof(gpNPCQuoteInfoArray[ cnt ]->sActionData), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpNPCQuoteInfoArray[ cnt ][cnt2].usGoToGridNo, sizeof(gpNPCQuoteInfoArray[ cnt ]->usGoToGridNo), sizeof(INT32), numBytesRead);
+ }
+ }
+ if(guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ {
+ while(numBytesRead != (sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS) )
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(INT8), numBytesRead);
+ }
+ else
+ {
+ while(numBytesRead != 1800 )
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(INT8), numBytesRead);
+ numBytesRead += 200;
+ }
+ //FileRead( hFile, gpNPCQuoteInfoArray[ cnt ], sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS, &uiNumBytesRead );
+ //if( uiNumBytesRead != sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS )
+ if( numBytesRead != sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS )
{
return( FALSE );
}
@@ -3268,8 +3369,13 @@ BOOLEAN LoadBackupNPCInfoFromSavedGameFile( HWFILE hFile, UINT32 uiSaveGameVersi
UINT32 cnt;
UINT8 ubLoadQuote=0;
UINT32 uiNumberOfProfilesToLoad=0;
+ INT32 numBytesRead = 0;
+ INT8 padding;
- uiNumberOfProfilesToLoad = NUM_PROFILES;
+ if( guiCurrentSaveGameVersion >= STOMP12_SAVEGAME_DATATYPE_CHANGE )
+ uiNumberOfProfilesToLoad = NUM_PROFILES;
+ else
+ uiNumberOfProfilesToLoad = NUM_PROFILES_v111;
//Loop through all the NPC quotes
for( cnt=0; cnt= STOMP12_SAVEGAME_DATATYPE_CHANGE)
+ {
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->fFlags, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->fFlags), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredItem, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredItem), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubFirstDay, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubFirstDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubLastDay, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubLastDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubApproachRequired, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubApproachRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubOpinionRequired, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubOpinionRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubQuoteNum, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubQuoteNum), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubNumQuotes, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubNumQuotes), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubStartQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubStartQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubEndQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubEndQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPC, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPC), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubFiller, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubFiller), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usSetFactTrue, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usSetFactTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usGiftItem, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usGiftItem), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usUnused, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usUnused), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sActionData, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sActionData), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredGridNo, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usGoToGridNo, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usGoToGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usSourceDialogueLevel, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usSourceDialogueLevel), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usDestDialogueLevel, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usDestDialogueLevel), sizeof(UINT16), numBytesRead);
+ while(numBytesRead != (sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS) )
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(INT8), numBytesRead);
+ }
+ else
+ {
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->fFlags, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->fFlags), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredItem, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredItem), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredGridNo, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sRequiredGridNo), sizeof(INT32), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usFactMustBeFalse), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubFirstDay, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubFirstDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubLastDay, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubLastDay), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubApproachRequired, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubApproachRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubOpinionRequired, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubOpinionRequired), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(UINT8), numBytesRead); //previous ubUnused no longer exists
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubQuoteNum, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubQuoteNum), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubNumQuotes, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubNumQuotes), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubStartQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubStartQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubEndQuest, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubEndQuest), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPC, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPC), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->ubTriggerNPCRec), sizeof(UINT8), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usSetFactTrue, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usSetFactTrue), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usGiftItem, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usGiftItem), sizeof(UINT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->sActionData, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->sActionData), sizeof(INT16), numBytesRead);
+ numBytesRead = ReadFieldByField(hFile, &gpBackupNPCQuoteInfoArray[ cnt ]->usGoToGridNo, sizeof(gpBackupNPCQuoteInfoArray[ cnt ]->usGoToGridNo), sizeof(INT32), numBytesRead);
+ while(numBytesRead != 1800 )
+ numBytesRead = ReadFieldByField(hFile, &padding, sizeof(padding), sizeof(INT8), numBytesRead);
+ numBytesRead += 200;
+ }
+ //FileRead( hFile, gpBackupNPCQuoteInfoArray[ cnt ], sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS, &uiNumBytesRead );
+ //if( uiNumBytesRead != sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS )
+ if( numBytesRead != sizeof( NPCQuoteInfo ) * NUM_NPC_QUOTE_RECORDS )
{
return( FALSE );
}
diff --git a/TacticalAI/TacticalAI_VS2005.vcproj b/TacticalAI/TacticalAI_VS2005.vcproj
index c76ab393..aa9100f9 100644
--- a/TacticalAI/TacticalAI_VS2005.vcproj
+++ b/TacticalAI/TacticalAI_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
= 0 && gubWorldRoomInfo[ sGridNo ] != NO_ROOM )
+ {
if ( pubRoomNo )
{
*pubRoomNo = gubWorldRoomInfo[ sGridNo ];
@@ -79,7 +80,7 @@ BOOLEAN InARoom( INT32 sGridNo, UINT8 *pubRoomNo )
BOOLEAN InAHiddenRoom( INT32 sGridNo, UINT8 *pubRoomNo )
{
- if ( gubWorldRoomInfo[ sGridNo ] != NO_ROOM )
+ if ( sGridNo >= 0 && gubWorldRoomInfo[ sGridNo ] != NO_ROOM )
{
if ( (gubWorldRoomHidden[ gubWorldRoomInfo[ sGridNo ] ] ) )
{
diff --git a/TileEngine/TileEngine_VS2005.vcproj b/TileEngine/TileEngine_VS2005.vcproj
index 14329658..69af221c 100644
--- a/TileEngine/TileEngine_VS2005.vcproj
+++ b/TileEngine/TileEngine_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
ubWallOrientation )
- {
- case OUTSIDE_TOP_LEFT:
- SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_WALL );
- SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_JUMPABLEWINDOW );
- SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_WALL );
-
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHEAST, 0, TRAVELCOST_WALL );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_JUMPABLEWINDOW_N );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHWEST, 0, TRAVELCOST_WALL );
-
- // DO CORNERS
- SET_MOVEMENTCOST( usGridNo - 1, NORTHWEST, 0, TRAVELCOST_WALL );
- SET_MOVEMENTCOST( usGridNo + 1, NORTHEAST, 0, TRAVELCOST_WALL );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_WALL );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_WALL );
-
- break;
-
- case INSIDE_TOP_LEFT:
- SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_WALL );
- SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_JUMPABLEWINDOW );
- SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_WALL );
-
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_JUMPABLEWINDOW_N );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
-
- // DO CORNERS
- SET_MOVEMENTCOST( usGridNo - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
-
- break;
-
- case OUTSIDE_TOP_RIGHT:
- SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_JUMPABLEWINDOW );
- SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
-
- SET_MOVEMENTCOST( usGridNo + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + 1, EAST, 0, TRAVELCOST_JUMPABLEWINDOW_W );
- SET_MOVEMENTCOST( usGridNo + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
-
- // DO CORNERS
- SET_MOVEMENTCOST( usGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo - WORLD_COLS, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
-
-
- break;
-
- case INSIDE_TOP_RIGHT:
- SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_JUMPABLEWINDOW );
- SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
-
- SET_MOVEMENTCOST( usGridNo + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + 1, EAST, 0, TRAVELCOST_JUMPABLEWINDOW_W );
- SET_MOVEMENTCOST( usGridNo + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
-
- // DO CORNERS
- SET_MOVEMENTCOST( usGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo - WORLD_COLS, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
-
- break;
-
-
- //switch( pStructure->ubWallOrientation )
- //{
- // case OUTSIDE_TOP_LEFT: //3 \# - клетка внутри помещения, стена наружу
- // case INSIDE_TOP_LEFT: //1 -клетка снаружи помещения \№ стена внутрь
- // SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_JUMPABLEWINDOW );
- // SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_OBSTACLE);
- // SET_CURRMOVEMENTCOST( EAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( EAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTHEAST, TRAVELCOST_OBSTACLE);
- // SET_CURRMOVEMENTCOST( SOUTH, TRAVELCOST_JUMPABLEWINDOW);
- // SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
- // //?
- // FORCE_SET_MOVEMENTCOST( sGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_NONE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + 1, EAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- // FORCE_SET_MOVEMENTCOST( sGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_NONE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - 1, WEST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- //
-
-
- // break;
-
- // case OUTSIDE_TOP_RIGHT: //4 #/ //клетка внутри помещения, стена наружу
-
- // case INSIDE_TOP_RIGHT:
-
- // //2 #/
- // //. стена стоит на правом нижн. краю и смотрит на ЮВ
- // // клетка находится снаружи помещения, стена внутри клетки
-
-
- // SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( EAST, TRAVELCOST_JUMPABLEWINDOW );
- // SET_CURRMOVEMENTCOST( SOUTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTH, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_JUMPABLEWINDOW );
- // SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
- // //?
- // // set values for the tiles EXITED from this location
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- // // make sure no obstacle costs exists before changing path cost to 0
- // if ( gubWorldMovementCosts[ sGridNo + 1 ][ EAST ][ 0 ] < TRAVELCOST_BLOCKED )
- // {
- // FORCE_SET_MOVEMENTCOST( sGridNo + 1, EAST, 0, TRAVELCOST_NONE );
- // }
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
- // if ( gubWorldMovementCosts[ sGridNo - 1 ][ WEST ][ 0 ] < TRAVELCOST_BLOCKED )
- // {
- // FORCE_SET_MOVEMENTCOST( sGridNo - 1, WEST, 0, TRAVELCOST_NONE );
- // }
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
-
-
- // break;
- // default:
- // // corners aren't jumpable
- // for (ubDirLoop=0; ubDirLoop < NUM_WORLD_DIRECTIONS; ubDirLoop++)
- // {
- // SET_CURRMOVEMENTCOST( ubDirLoop, TRAVELCOST_OBSTACLE );
- // }
- // break;
- //}
-
-
-
- //************************************старый почти работающий код. тока аи иногда тупит ))
- //if ( (pStructure->fFlags & STRUCTURE_WALLNWINDOW) //&& !(pStructure->fFlags & STRUCTURE_SPECIAL)
- // && (pStructure->fFlags & STRUCTURE_WALLSTUFF)==0 )
- //if(pStructure->pDBStructureRef->pDBStructure->bPartnerDelta == NO_PARTNER_STRUCTURE)
-
- // jumpable!
- // switch( pStructure->ubWallOrientation )
- // {
- // case OUTSIDE_TOP_LEFT:
- // case INSIDE_TOP_LEFT:
- // // can be jumped north and south
- // SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_FENCE );
- // SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( EAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTH, TRAVELCOST_FENCE );
- // SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
- // // set values for the tiles EXITED from this location
- // FORCE_SET_MOVEMENTCOST( sGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_NONE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + 1, EAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- // FORCE_SET_MOVEMENTCOST( sGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_NONE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - 1, WEST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- // break;
-
- // case OUTSIDE_TOP_RIGHT:
- // case INSIDE_TOP_RIGHT:
- // // can be jumped east and west
- // SET_CURRMOVEMENTCOST( NORTH, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( NORTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( EAST, TRAVELCOST_FENCE );
- // SET_CURRMOVEMENTCOST( SOUTHEAST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTH, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( SOUTHWEST, TRAVELCOST_OBSTACLE );
- // SET_CURRMOVEMENTCOST( WEST, TRAVELCOST_FENCE );
- // SET_CURRMOVEMENTCOST( NORTHWEST, TRAVELCOST_OBSTACLE );
- // // set values for the tiles EXITED from this location
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
- // // make sure no obstacle costs exists before changing path cost to 0
- // if ( gubWorldMovementCosts[ sGridNo + 1 ][ EAST ][ 0 ] < TRAVELCOST_BLOCKED )
- // {
- // FORCE_SET_MOVEMENTCOST( sGridNo + 1, EAST, 0, TRAVELCOST_NONE );
- // }
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_OBSTACLE );
- // SET_MOVEMENTCOST( sGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
- // if ( gubWorldMovementCosts[ sGridNo - 1 ][ WEST ][ 0 ] < TRAVELCOST_BLOCKED )
- // {
- // FORCE_SET_MOVEMENTCOST( sGridNo - 1, WEST, 0, TRAVELCOST_NONE );
- // }
- // SET_MOVEMENTCOST( sGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );
- // break;
-
- // //default:
- // // corners aren't jumpable
- // for (ubDirLoop=0; ubDirLoop < NUM_WORLD_DIRECTIONS; ubDirLoop++)
- // {
- // SET_CURRMOVEMENTCOST( ubDirLoop, TRAVELCOST_OBSTACLE );
- // }
- // break;
- // }//switch
- //}//}if dddokno==============================================================================
- */
-
else if (pStructure->fFlags & STRUCTURE_BLOCKSMOVES)
{
if ( (pStructure->fFlags & STRUCTURE_FENCE) && !(pStructure->fFlags & STRUCTURE_SPECIAL) )
@@ -3003,12 +2778,42 @@ BOOLEAN LoadWorld(const STR8 puiFilename, FLOAT* pMajorMapVersion, UINT8* pMinor
LOADDATA(&iRowSize, pBuffer, sizeof(INT32));
LOADDATA(&iColSize, pBuffer, sizeof(INT32));
}
+
+ // Actual world size of the map we loaded!
INT32 iWorldSize = iRowSize * iColSize;
+
#ifdef JA2EDITOR
- if(gMapTrn.SetTrnPar(iRowSize, iColSize, iNewMapWorldRows, iNewMapWorldCols))
+ // TODO.MAP: Make a new checkbox "Lock Rows & Cols". If set, load the map like it is now, with the set ROWS and COLS
+ // If not set, load the map with the original rows and cols
+
+ // WANNE: Only resize the map, when the checkbox is set
+ if(gfResizeMapOnLoading && gMapTrn.SetTrnPar(iRowSize, iColSize, iNewMapWorldRows, iNewMapWorldCols))
+ {
+ // We enlarge the map
SetWorldSize(iNewMapWorldRows, iNewMapWorldCols);
+
+ // Uncheck "vanilla map saving", because it is not allowed on maps > 160x160
+ UnclickEditorButton(OPTIONS_VANILLA_MODE);
+ }
else
+ {
+ // Mapsize has not changed
SetWorldSize(iRowSize, iColSize);
+
+ // We still have the "normal" map size -> Check "vanilla map saving"
+ if (iRowSize <= OLD_WORLD_ROWS && iRowSize <= OLD_WORLD_COLS)
+ {
+ ClickEditorButton(OPTIONS_VANILLA_MODE);
+ }
+ else
+ {
+ UnclickEditorButton(OPTIONS_VANILLA_MODE);
+ }
+ }
+
+ // Always reset to unchecked!
+ UnclickEditorButton(OPTIONS_RESIZE_MAP_ON_LOADING);
+
#else
SetWorldSize(iRowSize, iColSize);
#endif
@@ -4470,6 +4275,7 @@ void MAPTRANSLATION::ResizeTrnCnt(INT32& cnt)
BOOLEAN MAPTRANSLATION::SetTrnPar(INT32 iFromRows, INT32 iFromCols, INT32 iToRows, INT32 iToCols)
{
+ // WANNE: Only enlarging works currently, making the make small does not work
if(iFromRows < iToRows && iFromCols < iToCols)
{
fTrn = TRUE;
diff --git a/TileEngine/worlddef.h b/TileEngine/worlddef.h
index 0ccb7910..be14acc2 100644
--- a/TileEngine/worlddef.h
+++ b/TileEngine/worlddef.h
@@ -9,11 +9,6 @@
#define WORLD_TILE_X 40
#define WORLD_TILE_Y 20
-//#define WORLD_COLS 160
-//#define WORLD_ROWS 160
-//#define WORLD_COORD_COLS 1600
-//#define WORLD_COORD_ROWS 1600
-//#define WORLD_MAX 25600
#define CELL_X_SIZE 10
#define CELL_Y_SIZE 10
// variable map size
@@ -22,9 +17,7 @@ extern INT32 guiWorldRows;
#define OLD_WORLD_COLS 160
#define OLD_WORLD_ROWS 160
-#define OLD_WORLD_COORD_COLS 1600
-#define OLD_WORLD_COORD_ROWS 1600
-#define OLD_WORLD_MAX 25600
+#define OLD_WORLD_MAX 25600
#define WORLD_COLS guiWorldCols
#define WORLD_ROWS guiWorldRows
diff --git a/TileEngine/worldman.cpp b/TileEngine/worldman.cpp
index 65e5388f..0f33d989 100644
--- a/TileEngine/worldman.cpp
+++ b/TileEngine/worldman.cpp
@@ -117,7 +117,7 @@ void DebugLevelNodePage( void )
{
gprintf( 0, LINE_HEIGHT * (uiLoop + 1), gzLevelString[uiLoop], guiLNCount[uiLoop] );
}
- gprintf( 0, LINE_HEIGHT * 12, L"%d land nodes in excess of world max (25600)", guiLNCount[1] - WORLD_MAX);
+ gprintf( 0, LINE_HEIGHT * 12, L"%d land nodes in excess of world max", guiLNCount[1] - WORLD_MAX);
gprintf( 0, LINE_HEIGHT * 13, L"Total # levelnodes %d, %d bytes each", guiLNCount[0], sizeof( LEVELNODE ) );
gprintf( 0, LINE_HEIGHT * 14, L"Total memory for levelnodes %d", guiLNCount[0] * sizeof( LEVELNODE ) );
}
@@ -3591,9 +3591,10 @@ LEVELNODE * FindLevelNodeBasedOnStructure( INT32 sGridNo, STRUCTURE * pStructure
pLevelNode = pLevelNode->pNext;
}
+ // WANNE: Removed the assertion, because it can happen on custom maps.
+ // It is not a big deal, if the node cannot be found.
// Assert here if it cannot be found....
- AssertMsg( 0, "FindLevelNodeBasedOnStruct failed.");
-
+ //AssertMsg( 0, "FindLevelNodeBasedOnStruct failed.");
return( NULL );
}
diff --git a/Utils/Cursors.cpp b/Utils/Cursors.cpp
index 2da6039f..76acd575 100644
--- a/Utils/Cursors.cpp
+++ b/Utils/Cursors.cpp
@@ -88,6 +88,7 @@ CursorFileData CursorFileDatabase[] =
{ "CURSORS\\wirecutr.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\bullet_g.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\bullet_d.sti" , FALSE, 0, 0, 0, NULL },
+
{ "CURSORS\\ibeamWhite.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\throwg.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\throwb.sti" , FALSE, 0, 0, 0, NULL },
@@ -98,9 +99,9 @@ CursorFileData CursorFileDatabase[] =
{ "CURSORS\\remoteg.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\remoter.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\steering.sti" , FALSE, 0, 0, 0, NULL },
+
{ "CURSORS\\cur_car.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\cur_wait.sti" , FALSE, 0, 0, 0, NULL },
-
//Tactical GUI cursors
{ "CURSORS\\singlecursor.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\groupcursor.sti" , FALSE, 0, 0, 0, NULL },
@@ -110,6 +111,7 @@ CursorFileData CursorFileDatabase[] =
{ "CURSORS\\repairr.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\jar_cur.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\jar_cur_red.sti" , FALSE, 0, 0, 0, NULL },
+
{ "CURSORS\\cur_x.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\can_01.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\can_02.sti" , FALSE, 0, 0, 0, NULL },
@@ -118,7 +120,14 @@ CursorFileData CursorFileDatabase[] =
{ "CURSORS\\deadleap.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\can_01.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\can_02.sti" , FALSE, 0, 0, 0, NULL },
+ { "CURSORS\\cur_tagr_ncth.sti" , FALSE, 0, ANIMATED_CURSOR, 7, NULL },
+ { "CURSORS\\targblak_ncth.sti" , FALSE, 0, ANIMATED_CURSOR, 7, NULL },
+ { "CURSORS\\cur_rbst_ncth.sti" , FALSE, 0, ANIMATED_CURSOR, 7, NULL },
+ { "CURSORS\\burstblk_ncth.sti" , FALSE, 0, ANIMATED_CURSOR, 7, NULL },
+ { "CURSORS\\cur_tr_ncth.sti" , FALSE, 0, 0, 0, NULL },
+ { "CURSORS\\cur_trw_ncth.sti" , FALSE, 0, 0, 0, NULL },
+ { "CURSORS\\cur_try_ncth.sti" , FALSE, 0, 0, 0, NULL },
};
void RaiseMouseToLevel( INT8 bLevel )
@@ -1189,19 +1198,10 @@ CursorData CursorDatabase[] =
void InitCursors( )
{
- //CHRISL: NCTH uses a completely different cursor so if we're in NCTH mode, we want to use different graphics
- if(UsingNewCTHSystem() == true){
- strncpy((char *)CursorFileDatabase[2].ubFilename,"CURSORS\\cur_tagr_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[3].ubFilename,"CURSORS\\targblak_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[5].ubFilename,"CURSORS\\cur_rbst_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[6].ubFilename,"CURSORS\\burstblk_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[7].ubFilename,"CURSORS\\cur_tr_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[8].ubFilename,"CURSORS\\cur_trw_ncth.sti",MAX_FILENAME_LEN);
- strncpy((char *)CursorFileDatabase[35].ubFilename,"CURSORS\\cur_try_ncth.sti",MAX_FILENAME_LEN);
- }
- InitCursorDatabase( CursorFileDatabase, CursorDatabase, NUM_CURSOR_FILES );
- SetMouseBltHook( (MOUSEBLT_HOOK)BltJA2CursorData );
+ InitCursorDatabase( CursorFileDatabase, CursorDatabase, NUM_CURSOR_FILES );
+
+ SetMouseBltHook( (MOUSEBLT_HOOK)BltJA2CursorData );
}
@@ -1690,6 +1690,44 @@ void UpdateAnimatedCursorFrames( UINT32 uiCursorIndex )
{
pCurImage = &( pCurData->Composites[ cnt ] );
+ //CHRISL: NCTH uses a completely different cursor so if we're in NCTH mode, we want to use different graphics
+ if(UsingNewCTHSystem() == true){
+ switch(pCurImage->uiFileIndex)
+ {
+ case 2:
+ pCurImage->uiFileIndex = 68; break;
+ case 3:
+ pCurImage->uiFileIndex = 69; break;
+ case 5:
+ pCurImage->uiFileIndex = 70; break;
+ case 6:
+ pCurImage->uiFileIndex = 71; break;
+ case 7:
+ pCurImage->uiFileIndex = 72; break;
+ case 8:
+ pCurImage->uiFileIndex = 73; break;
+ case 35:
+ pCurImage->uiFileIndex = 74; break;
+ }
+ } else {
+ switch(pCurImage->uiFileIndex)
+ {
+ case 68:
+ pCurImage->uiFileIndex = 2; break;
+ case 69:
+ pCurImage->uiFileIndex = 3; break;
+ case 70:
+ pCurImage->uiFileIndex = 5; break;
+ case 71:
+ pCurImage->uiFileIndex = 6; break;
+ case 72:
+ pCurImage->uiFileIndex = 7; break;
+ case 73:
+ pCurImage->uiFileIndex = 8; break;
+ case 74:
+ pCurImage->uiFileIndex = 35; break;
+ }
+ }
if ( CursorFileDatabase[ pCurImage->uiFileIndex ].ubFlags & ANIMATED_CURSOR )
{
diff --git a/Utils/Cursors.h b/Utils/Cursors.h
index 5c1e8e37..2dcacae9 100644
--- a/Utils/Cursors.h
+++ b/Utils/Cursors.h
@@ -227,6 +227,13 @@ typedef enum
C_JUMPOVER,
C_FUEL,
C_FUEL_RED,
+ C_ACTIONMODERED_NCTH,
+ C_ACTIONMODEBLACK_NCTH,
+ C_TARGMODEBURSTRED_NCTH,
+ C_TARGMODEBURSTBLACK_NCTH,
+ C_TRINGS_NCTH,
+ C_TWRINGS_NCTH,
+ C_YELLOWRINGS_NCTH,
NUM_CURSOR_FILES
diff --git a/Utils/Text.h b/Utils/Text.h
index fb192c64..c77da986 100644
--- a/Utils/Text.h
+++ b/Utils/Text.h
@@ -7,6 +7,75 @@
#define STRING_LENGTH 255
+//Editor
+//Editor Taskbar Creation.cpp
+extern STR16 iEditorItemStatsButtonsText[];
+extern STR16 FaceDirs[8];
+extern STR16 iEditorMercsToolbarText[];
+extern STR16 iEditorBuildingsToolbarText[];
+extern STR16 iEditorItemsToolbarText[];
+extern STR16 iEditorMapInfoToolbarText[];
+extern STR16 iEditorOptionsToolbarText[];
+extern STR16 iEditorTerrainToolbarText[];
+extern STR16 iEditorTaskbarInternalText[];
+//Editor Taskbar Utils.cpp
+extern STR16 iRenderMapEntryPointsAndLightsText[];
+extern STR16 iBuildTriggerNameText[];
+extern STR16 iRenderDoorLockInfoText[];
+extern STR16 iRenderEditorInfoText[];
+//EditorBuildings.cpp
+extern STR16 iUpdateBuildingsInfoText[];
+extern STR16 iRenderDoorEditingWindowText[];
+//EditorItems.cpp
+extern STR16 pInitEditorItemsInfoText[];
+extern STR16 pDisplayItemStatisticsTex[];
+extern STR16 pUpdateMapInfoText[];
+//EditorMercs.cpp
+extern CHAR16 gszScheduleActions[ 11 ][20]; // NUM_SCHEDULE_ACTIONS = 11
+extern STR16 zDiffNames[5]; // NUM_DIFF_LVLS = 5
+extern STR16 EditMercStat[12];
+extern STR16 EditMercOrders[8];
+extern STR16 EditMercAttitudes[6];
+extern STR16 pDisplayEditMercWindowText[];
+extern STR16 pCreateEditMercWindowText[];
+extern STR16 pDisplayBodyTypeInfoText[];
+extern STR16 pUpdateMercsInfoText[];
+extern CHAR16 pRenderMercStringsText[][100];
+extern STR16 pClearCurrentScheduleText[];
+extern STR16 pCopyMercPlacementText[];
+extern STR16 pPasteMercPlacementText[];
+//editscreen.cpp
+extern STR16 pEditModeShutdownText[];
+extern STR16 pHandleKeyboardShortcutsText[];
+extern STR16 pPerformSelectedActionText[];
+extern STR16 pWaitForHelpScreenResponseText[];
+extern STR16 pAutoLoadMapText[];
+extern STR16 pShowHighGroundText[];
+//Item Statistics.cpp
+extern CHAR16 gszActionItemDesc[ 34 ][ 30 ]; // NUM_ACTIONITEMS = 34
+extern STR16 pUpdateItemStatsPanelText[];
+extern STR16 pSetupGameTypeFlagsText[];
+extern STR16 pSetupGunGUIText[];
+extern STR16 pSetupArmourGUIText[];
+extern STR16 pSetupExplosivesGUIText[];
+extern STR16 pSetupTriggersGUIText[];
+//Sector Summary.cpp
+extern STR16 pCreateSummaryWindowText[];
+extern STR16 pRenderSectorInformationText[];
+extern STR16 pRenderItemDetailsText[];
+extern STR16 pRenderSummaryWindowText[];
+extern STR16 pUpdateSectorSummaryText[];
+extern STR16 pSummaryLoadMapCallbackText[];
+extern STR16 pReportErrorText[];
+extern STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[];
+extern STR16 pSummaryUpdateCallbackText[];
+extern STR16 pApologizeOverrideAndForceUpdateEverythingText[];
+//selectwin.cpp
+extern STR16 pDisplaySelectionWindowGraphicalInformationText[];
+//Cursor Modes.cpp
+extern STR16 wszSelType[6];
+//--
+
extern CHAR16 gszAimPages[ 6 ][ 20 ];
extern CHAR16 zGrod[][500];
extern STR16 pCreditsJA2113[];
@@ -173,6 +242,7 @@ extern STR16 pSkillTraitBeginIMPStrings[];
extern STR16 sgAttributeSelectionText[];
extern STR16 pCharacterTraitBeginIMPStrings[];
extern STR16 gzIMPCharacterTraitText[];
+extern STR16 gzIMPAttitudesText[];
extern STR16 gzIMPColorChoosingText[];
extern STR16 sColorChoiceExplanationTexts[];
extern STR16 gzIMPDisabilityTraitText[];
@@ -389,6 +459,7 @@ enum
STR_SNOW_WASHED_OFF,
STR_CANNOT_ATTACH_SLOT,
+ STR_CANNOT_ATTACH_ANY_SLOT,
TEXT_NUM_STR_MESSAGE,
};
@@ -489,9 +560,9 @@ extern STR16 szUDBGenExplosiveStatsTooltipText[ 18 ];
extern STR16 szUDBGenExplosiveStatsExplanationsTooltipText[ 18 ];
extern STR16 szUDBGenSecondaryStatsTooltipText[ 26 ];
extern STR16 szUDBGenSecondaryStatsExplanationsTooltipText[ 26 ];
-extern STR16 szUDBAdvStatsTooltipText[ 44 ];
-extern STR16 szUDBAdvStatsExplanationsTooltipText[ 44 ];
-extern STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[ 44 ];
+extern STR16 szUDBAdvStatsTooltipText[ 48 ];
+extern STR16 szUDBAdvStatsExplanationsTooltipText[ 48 ];
+extern STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[ 48 ];
// Headrock: End Externs
extern STR16 sKeyDescriptionStrings[2];
@@ -1924,6 +1995,9 @@ enum
MSG113_BLOODCATS_AMBUSH_PREVENTED,
MSG113_SOLDIER_HIT_TO_GROIN,
+ MSG113_ENEMY_FOUND_DEAD_BODY,
+ MSG113_AMMO_SPEC_STRING,
+
TEXT_NUM_MSG113,
};
diff --git a/Utils/Utils_VS2005.vcproj b/Utils/Utils_VS2005.vcproj
index bdabfabc..c43e03eb 100644
--- a/Utils/Utils_VS2005.vcproj
+++ b/Utils/Utils_VS2005.vcproj
@@ -39,7 +39,7 @@
/>
25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] = // NUM_DIFF_LVLS = 5
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] =
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:",//20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
- L"Page 1/2", //0
- L"Page 2/2",
+ L"йЎµ 1/2", //0
+ L"йЎµ 2/2",
- L"Page 1/3",
- L"Page 2/3",
- L"Page 3/3",
+ L"йЎµ 1/3",
+ L"йЎµ 2/3",
+ L"йЎµ 3/3",
L"Page 1/1", //5
};
-// by Jazz: TODO.Translate
+// by Jazz:
CHAR16 zGrod[][500] =
{
- L"Robot", //0 // Robot
+ L"жњєе™Ёдєє", //0 // Robot
};
STR16 pCreditsJA2113[] =
@@ -180,7 +1193,7 @@ CHAR16 AmmoCaliber[MAXITEMS][20];// =
//};
// This BobbyRayAmmoCaliber is virtually the same as AmmoCaliber however the bobby version doesnt have as much room for the words.
-//
+//
// Different weapon calibres
// CAWS is Close Assault Weapon System and should probably be left as it is
// NATO is the North Atlantic Treaty Organization
@@ -310,7 +1323,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"ж— ",
L"йЂЂе‡єеђеј№",
L"й™„д»¶",
-
+
//You cannot use "item(s)" and your "other item" at the same time.
//Ex: You cannot use sun goggles and you gas mask at the same time.
L"дЅ дёЌиѓЅеђЊж—¶дЅїз”Ё%sе’Њ%sгЂ‚",
@@ -340,20 +1353,21 @@ CHAR16 Message[][STRING_LENGTH] =
L"ж— еЌЉи‡ЄеЉЁ",
L"敌人已经没有装备可偷了!",
L"敌人手дёжІЎжњ‰иЈ…备!",
-// TODO.Translate
- L"%s's desert camouflage has worn off.",
- L"%s's desert camouflage has washed off.",
-
- L"%s's wood camouflage has worn off.",
- L"%s's wood camouflage has washed off.",
-
- L"%s's urban camouflage urban has worn off.",
- L"%s's urban camouflage urban has washed off.",
-
- L"%s's snow camouflage snow has worn off.",
- L"%s's snow camouflage has washed off.",
- L"You cannot attach %s to this slot.",
+ L"%s зљ„жІ™жј иї·еЅ©жІ№е·Із»ЏиЂ—з«е¤±ж•€дє†.",
+ L"%s зљ„жІ™жј иї·еЅ©жІ№е·Із»Џе†Іе€·е¤±ж•€дє†.",
+
+ L"%s зљ„дё›жћ—иї·еЅ©жІ№е·Із»ЏиЂ—з«е¤±ж•€дє†.",
+ L"%s 的丛林迷彩油已经冲刷失效了.",
+
+ L"%s зљ„еџЋеё‚дјЄиЈ…иї·еЅ©жІ№е·Із»ЏиЂ—з«е¤±ж•€дє†.",
+ L"%s 的城市伪装迷彩油已经冲刷失效了.",
+
+ L"%s зљ„й›Єењ°иї·еЅ©жІ№е·Із»ЏиЂ—з«е¤±ж•€дє†.",
+ L"%s 的雪地迷彩油已经冲刷失效了.",
+
+ L"дЅ дёЌиѓЅе°†е…¶й™„еЉ ењЁеЅ“е‰ЌеЉџиѓЅж§Ѕ.",
+ L"%s 不适合打开的任何功能槽.",
};
@@ -390,7 +1404,7 @@ STR16 sTimeStrings[] =
};
-// Assignment Strings: what assignment does the merc have right now? For example, are they on a squad, training,
+// Assignment Strings: what assignment does the merc have right now? For example, are they on a squad, training,
// administering medical aid (doctor) or training a town. All are abbreviated. 8 letters is the longest it can be.
STR16 pAssignmentStrings[] =
@@ -507,12 +1521,12 @@ STR16 pPersonnelAssignmentStrings[] =
L"дї®зђ†",
L"й”»з‚ј",
L"и®з»ѓж°‘е…µ",
- L"Training Mobile Militia", // TODO.Translate
+ L"и®з»ѓжёёе‡»йџ", // TODO.Translate
L"ж•™з»ѓ",
L"е¦е‘",
- L"Facility Staff", // TODO.Translate
+ L"и®ѕж–ЅиЃЊе‘", // TODO.Translate
L"Resting at Facility", // TODO.Translate
- L"ж»дєЎ",
+ L"дј‘жЃЇ",
L"ж— еЉ›дё",
L"ж€дї",
L"еЊ»й™ў",
@@ -552,11 +1566,11 @@ STR16 pLongAssignmentStrings[] =
L"дї®зђ†",
L"з»ѓд№ ",
L"и®з»ѓж°‘е…µ",
- L"Train Mobiles", // TODO.Translate
+ L"и®з»ѓжёёе‡»йџ", //L"Train Mobiles", // TODO.Translate // done by kkkk@tbs 10-07-21
L"и®з»ѓйџеЏ‹",
L"е¦е‘",
- L"Staff Facility", // TODO.Translate
- L"Rest at Facility", // TODO.Translate
+ L"и®ѕж–ЅиЃЊе‘", //L"Staff Facility", // TODO.Translate // done by kkkk@tbs 10-07-21
+ L"дј‘жЃЇ", //L"Rest at Facility", // TODO.Translate // done by kkkk@tbs 10-07-21
L"ж»дєЎ",
L"ж— еЉ›дё",
L"ж€дї",
@@ -581,7 +1595,7 @@ STR16 pContractStrings[] =
STR16 pPOWStrings[] =
{
L"е›љз¦Ѓ", //an acronym for Prisoner of War
- L"??",
+ L" В± В± ",
};
STR16 pLongAttributeStrings[] =
@@ -708,7 +1722,7 @@ STR16 pMilitiaControlMenuStrings[] =
// L"Hold Position", // set militia to stationary
// L"Retreat", // retreat militia
// L"Come to me", // retreat militia
-// L"Get down", // retreat militia
+// L"Get down", // retreat militia
// L"Cancel", // cancel this menu
//};
@@ -800,70 +1814,71 @@ STR16 pPersonnelScreenStrings[] =
L"еЏ—дј¤ж¬Ўж•°: ", // number of times merc has been wounded
L"жЉЂиѓЅ: ",
L"жІЎжњ‰жЉЂиѓЅ",
- L"Achievements:", // added by SANDRO
+ L"ж€ђе°±:", // added by SANDRO
};
-// SANDRO - helptexts for merc records
// SANDRO - helptexts for merc records
STR16 pPersonnelRecordsHelpTexts[] =
{
- L"Elite soldiers: %d\n",
- L"Regular soldiers: %d\n",
- L"Admin soldiers: %d\n",
- L"Hostile groups: %d\n",
- L"Creatures: %d\n",
- L"Tanks: %d\n",
- L"Others: %d\n",
+ L"зІѕе…µ: %d\n",
+ L"жќ‚е…µ: %d\n",
+ L"头目: %d\n",
+ L"е€Ѓж°‘: %d\n",
+ L"动物: %d\n",
+ L"еќ¦е…‹: %d\n",
+ L"е…¶д»–: %d\n",
- L"Mercs: %d\n",
- L"Militia: %d\n",
- L"Others: %d\n",
+ L"её®еЉ©дЅЈе…µ: %d\n",
+ L"её®еЉ©ж°‘е…µ: %d\n",
+ L"её®еЉ©е…¶д»–: %d\n",
- L"Shots fired: %d\n",
- L"Missiles fired: %d\n",
- L"Grenades thrown: %d\n",
- L"Knives thrown: %d\n",
- L"Blade attacks: %d\n",
- L"Hand to hand attacks: %d\n",
- L"Successful hits: %d\n",
+ L"枪弹射击: %d\n",
+ L"зЃ«з®еЏ‘е°„: %d\n",
+ L"榴弹投掷: %d\n",
+ L"йЈће€ЂжЉ•жЋ·: %d\n",
+ L"з™Ѕе€ѓз ЌжќЂ: %d\n",
+ L"徒手攻击: %d\n",
+ L"有效攻击总数: %d\n",
- L"Locks picked: %d\n",
- L"Locks breached: %d\n",
- L"Traps removed: %d\n",
- L"Explosives detonated: %d\n",
- L"Items repaired: %d\n",
- L"Items combined: %d\n",
- L"Items stolen: %d\n",
- L"Militia trained: %d\n",
- L"Mercs bandaged: %d\n",
- L"Surgeries made: %d\n",
- L"Persons met: %d\n",
- L"Sectors discovered: %d\n",
- L"Ambushes prevented: %d\n",
- L"Quests handled: %d\n",
+ L"е·Ґе…·ж’¬й”Ѓ: %d\n",
+ L"жљґеЉ›ејЂй”Ѓ: %d\n",
+ L"排除陷й±: %d\n",
+ L"拆除炸弹: %d\n",
+ L"修理物品: %d\n",
+ L"合成物品: %d\n",
+ L"偷窃物品: %d\n",
+ L"и®з»ѓж°‘е…µ: %d\n",
+ L"ж€ењ°жЂҐж•‘: %d\n",
+ L"外科手术: %d\n",
+ L"遇见人物: %d\n",
+ L"жЋўзґўеЊєеџџ: %d\n",
+ L"避免伏击: %d\n",
+ L"жёёж€Џд»»еЉЎ: %d\n",
- L"Tactical battles: %d\n",
- L"Autoresolve battles: %d\n",
- L"Times retreated: %d\n",
- L"Ambushes experienced: %d\n",
- L"Hardes battle: %d Enemies\n",
+ L"еЏ‚еЉ ж€ж–—: %d\n",
+ L"и‡ЄеЉЁж€ж–—: %d\n",
+ L"ж’¤йЂЂж€ж–—: %d\n",
+ L"еЃ·иўж¬Ўж•°: %d\n",
+ L"еЏ‚еЉ иї‡жњЂе¤љжњ‰: %d 名敌军的ж€ж–—\n",
- L"Shot: %d\n",
- L"Stabbed: %d\n",
- L"Punched: %d\n",
- L"Blasted: %d\n",
- L"Suffered damages in facilities: %d\n",
- L"Surgeries undergoed: %d\n",
- L"Facility accidents: %d\n",
+ L"дёжћЄ: %d\n",
+ L"е€Ђз Ќ: %d\n",
+ L"拳打: %d\n",
+ L"爆炸: %d\n",
+ L"и®ѕж–Ѕдј¤е®і: %d\n",
+ L"经历手术: %d\n",
+ L"и®ѕж–Ѕдє‹ж•…: %d\n",
- L"Character:",
- L"Weakening:",
+ L"жЂ§ж ј:",
+ L"еј±з‚№:",
+ L"жЂЃеє¦:", // WANNE: For old traits display instead of "Character:"!
};
//These string correspond to enums used in by the SkillTrait enums in SoldierProfileType.h
-STR16 gzMercSkillText[] =
+STR16 gzMercSkillText[] =
{
+ // SANDRO - tweaked this
L"жІЎжњ‰жЉЂиѓЅ",
L"ејЂй”Ѓ",
L"еѕ’ж‰‹ж јж–—", //JA25: modified
@@ -880,54 +1895,48 @@ STR16 gzMercSkillText[] =
L"е€ЂжЉЂ",
L"狙击手",
L"дјЄиЈ…", //JA25: modified
- // SANDRO - removed this
- //L"дјЄиЈ…пј€еџЋеё‚пј‰",
- //L"дјЄиЈ…пј€жІ™жј пј‰",
- //L"дјЄиЈ…пј€й›Єењ°пј‰",
L"дё“е®¶",
};
-
//////////////////////////////////////////////////////////
// SANDRO - added this
STR16 gzMercSkillTextNew[] =
{
// Major traits
- L"No Skill",
- L"Auto Weapons",
- L"Heavy Weapons",
- L"Marksman",
- L"Hunter",
- L"Gunslinger",
- L"Hand to Hand",
- L"Deputy",
- L"Technician",
- L"Paramedic",
+ L"жІЎжњ‰жЉЂиѓЅ",
+ L"и‡ЄеЉЁж¦е™Ё",
+ L"й‡Ќж¦е™Ё",
+ L"射手",
+ L"猎手",
+ L"枪手",
+ L"ж јж–—е®¶",
+ L"谈判专家",
+ L"жЉЂеё€",
+ L"ж•‘жЉ¤е…µ",
// Minor traits
- L"Ambidextrous",
- L"Melee",
- L"Throwing",
- L"Night Ops",
- L"Stealthy",
- L"Athletics",
- L"Bodybuilding",
- L"Demolitions",
- L"Teaching",
- L"Scouting",
+ L"搏击术",
+ L"иї‘ж€",
+ L"жЉ•жЋ·",
+ L"е¤њж€",
+ L"е°ѕиЎЊ",
+ L"дЅ“иѓЅи®з»ѓ",
+ L"肌肉男",
+ L"з€†з ґ",
+ L"ж•™е¦",
+ L"дѕ¦еЇџ",
// second names for major skills
- L"Machinegunner",
- L"Bombardier",
- L"Sniper",
- L"Ranger",
- L"Gunfighter",
- L"Martial Arts",
- L"Squadleader",
- L"Engineer",
- L"Doctor",
- L"More...",
+ L"机枪手",
+ L"投弹手",
+ L"狙击手",
+ L"жёёдѕ ",
+ L"大镖客",
+ L"ж¦жњЇе®¶",
+ L"е°Џйџй•ї",
+ L"е·ҐзЁ‹её€",
+ L"еЊ»з”џ",
+ L"更多...",
};
//////////////////////////////////////////////////////////
-
// This is pop up help text for the options that are available to the merc
STR16 pTacticalPopupButtonStrings[] =
@@ -987,7 +1996,7 @@ STR16 pMapScreenMouseRegionHelpText[] =
L"睡觉",
};
-// volumes of noises
+// volumes of noises
STR16 pNoiseVolStr[] =
{
@@ -997,7 +2006,7 @@ STR16 pNoiseVolStr[] =
L"非常大声的",
};
-// types of noises
+// types of noises
STR16 pNoiseTypeStr[] = // OBSOLETE
{
@@ -1017,7 +2026,7 @@ STR16 pNoiseTypeStr[] = // OBSOLETE
// Directions that are used to report noises
-STR16 pDirectionStr[] =
+STR16 pDirectionStr[] =
{
L"дёњеЊ—ж–№",
L"дёњж–№",
@@ -1029,7 +2038,7 @@ STR16 pDirectionStr[] =
L"еЊ—ж–№"
};
-// These are the different terrain types.
+// These are the different terrain types.
STR16 pLandTypeStrings[] =
{
@@ -1091,7 +2100,7 @@ STR16 gpStrategicString[] =
L"ж•Ње†›з»™дЅ дёЂдёЄжЉ•й™Ќзљ„жњєдјљгЂ‚",
L"敌军дїи™Џдє†жЏиї·дёзљ„дЅЈе…µгЂ‚",
- //The text that goes on the autoresolve buttons
+ //The text that goes on the autoresolve buttons
L"ж’¤йЂЂ", //The retreat button
L"е®Њж€ђ", //The done button //STR_AR_DONE_BUTTON
@@ -1123,15 +2132,15 @@ STR16 gpStrategicString[] =
L"ж€ж–—з”Ёж—¶", //STR_AR_TIME_ELAPSED,
- //Labels for status of merc if retreating. (UPPERCASE)
+ //Labels for status of merc if retreating. (UPPERCASE)
L"е·Іж’¤йЂЂ", //STR_AR_MERC_RETREATED,
L"жЈењЁж’¤йЂЂ", //STR_AR_MERC_RETREATING,
L"ж’¤йЂЂ", //STR_AR_MERC_RETREAT,
- //PRE BATTLE INTERFACE STRINGS
+ //PRE BATTLE INTERFACE STRINGS
//Goes on the three buttons in the prebattle interface. The Auto resolve button represents
- //a system that automatically resolves the Combat for the player without having to do anything.
+ //a system that automatically resolves the combat for the player without having to do anything.
//These strings must be short (two lines -- 6-8 chars per line)
L"и‡ЄеЉЁж€ж–—", //STR_PB_AUTORESOLVE_BTN,
@@ -1163,7 +2172,7 @@ STR16 gpStrategicString[] =
L"е°Џж—¶", //One letter abbreviation of hour
//TACTICAL PLACEMENT USER INTERFACE STRINGS
- //The four buttons
+ //The four buttons
L"清除",
L"分散",
@@ -1201,7 +2210,7 @@ STR16 gpStrategicString[] =
L"е°†е°Џйџж’¤йЂЂе€°е…€е‰Ќзљ„分区。(|R)", //singular version
L"е°†ж‰Ђжњ‰е°Џйџж’¤йЂЂе€°е…€е‰Ќзљ„分区。(|R)", //multiple groups with same previous sector
- //various popup messages for battle conditions.
+ //various popup messages for battle conditions.
//%c%d is the sector -- ex: A9
L"ж•Ње†›еђ‘дЅ ењЁ%c%d分区的民兵发起了攻击。",
@@ -1217,13 +2226,13 @@ STR16 gpStrategicString[] =
};
-STR16 gpGameClockString[] =
+STR16 gpGameClockString[] =
{
//This is the day represented in the game clock. Must be very short, 4 characters max.
L"ж—Ґ",
};
-//When the merc finds a key, they can get a description of it which
+//When the merc finds a key, they can get a description of it which
//tells them where and when they found it.
STR16 sKeyDescriptionStrings[2] =
{
@@ -1238,7 +2247,7 @@ CHAR16 gWeaponStatsDesc[][ 17 ] =
// HEADROCK: Changed this for Extended Description project
L"зЉ¶жЂЃ: ",
L"й‡Ќй‡Џ: ",
- L"AP Costs",
+ L"AP ж¶€иЂ—",
L"е°„зЁ‹: ", // Range
L"жќЂдј¤еЉ›: ", // Damage
L"еј№иЌЇ", // Number of bullets left in a magazine
@@ -1256,10 +2265,8 @@ CHAR16 gWeaponStatsDesc[][ 17 ] =
// Obviously, THIS SHOULD BE DONE IN ALL LANGUAGES...
L"й™„д»¶:", //14 //ham3.6
L"иїћеЏ‘/5AP: ", //15
- L"Remaining ammo:", //16 // TODO.Translate
-
- // TODO.Translate
- L"Default:", //17 //WarmSteel - So we can also display default attachments
+ L"剩余弹药:", //16 // TODO.Translate
+ L"й»и®¤:", //17 //WarmSteel - So we can also display default attachments
};
@@ -1271,7 +2278,7 @@ STR16 gzWeaponStatsFasthelp[ 32 ] =
L"зІѕеє¦",
L"жќЂдј¤",
L"е°„зЁ‹",
- L"Aiming Levels",
+ L"зІѕзћ„з‰зє§",
L"зІѕзћ„дї®жЈ",
L"平均最佳激光瞄准距离",
L"ж¶€з„°",
@@ -1307,7 +2314,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"зІѕеє¦",
L"жќЂдј¤",
L"е°„зЁ‹",
- L"Aiming Levels",
+ L"зІѕзћ„з‰зє§",
L"зІѕзћ„дї®жЈ",
L"平均最佳激光瞄准距离",
L"ж¶€з„°",
@@ -1324,7 +2331,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"дёЉеј№AP",
L"手动上弹AP",
L"", //19
- L"дё¤и§’жћ¶дї®жЈ",
+ L"дё¤и„љжћ¶дї®жЈ",
L"иїћеЏ‘ж•°й‡Џ/5AP",
L"点射/自动惩罚(越低越好)", //22
L"жЉ•жЋ·AP", //20
@@ -1338,7 +2345,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"点射惩罚(越低越好)",
};
-STR16 gzAmmoStatsFasthelp[ 20 ] =
+STR16 gzAmmoStatsFasthelp[ 20 ] =
{
L"侵彻力(越低越好)",
L"еђеј№зї»ж»љеЉ›пј€и¶Љй«и¶ЉеҐЅпј‰",
@@ -1453,15 +2460,15 @@ STR16 gzMiscItemStatsFasthelp[ 34 ] =
// HEADROCK HAM 4: New condition-based text similar to JA1.
STR16 gConditionDesc[] =
{
- L"In ",
- L"PERFECT",
- L"EXCELLENT",
- L"GOOD",
- L"FAIR",
- L"POOR",
- L"BAD",
- L"TERRIBLE",
- L" condition."
+ L"处于 ",
+ L"е®ЊзѕЋ",
+ L"дјз§Ђ",
+ L"好的",
+ L"е°љеЏЇ",
+ L"дёЌи‰Ї",
+ L"е·®зљ„",
+ L"зіџзі•зљ„",
+ L" зЉ¶жЂЃ."
};
//The headers used for the merc's money.
@@ -1480,7 +2487,7 @@ CHAR16 gMoneyStatsDesc[][ 13 ] =
};
//The health of various creatures, enemies, characters in the game. The numbers following each are for comment
-//only, but represent the precentage of points remaining.
+//only, but represent the precentage of points remaining.
CHAR16 zHealthStr[][13] =
{
@@ -1493,8 +2500,8 @@ CHAR16 zHealthStr[][13] =
L"极好", //"EXCELLENT", // >= 90
};
-STR16 gzMoneyAmounts[6] =
-{
+STR16 gzMoneyAmounts[6] =
+{
L"$1000",
L"$100",
L"$10",
@@ -1503,13 +2510,13 @@ STR16 gzMoneyAmounts[6] =
L"жЏђеЏ–",
};
-// short words meaning "Advantages" for "Pros" and "Disadvantages" for "Cons."
-CHAR16 gzProsLabel[10] =
+// short words meaning "Advantages" for "Pros" and "Disadvantages" for "Cons."
+CHAR16 gzProsLabel[10] =
{
L"дјз‚№: ",
};
-CHAR16 gzConsLabel[10] =
+CHAR16 gzConsLabel[10] =
{
L"зјєз‚№: ",
};
@@ -1534,7 +2541,7 @@ CHAR16 zDealerStrings[4][ SMALL_STRING_LENGTH ]=
L"дї®зђ†",
};
-CHAR16 zDialogActions[1][ SMALL_STRING_LENGTH ] =
+CHAR16 zDialogActions[1][ SMALL_STRING_LENGTH ] =
{
L"е®Њж€ђ",
};
@@ -1657,11 +2664,11 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"要雇佣%sеђ—(жЇЏж—Ґеѕ—ж”Їд»%s)?",
- // This line is used repeatedly to ask player if they wish to participate in a boxing match.
+ // This line is used repeatedly to ask player if they wish to participate in a boxing match.
L"дЅ и¦Ѓиї›иЎЊж‹іе‡»жЇ”иµ›еђ—?",
- // In the next string, the first %s is an item name and the
+ // In the next string, the first %s is an item name and the
// second %s is an amount of money (including $ sign)
L"и¦Ѓд№°%sеђ—(еѕ—ж”Їд»%s)?",
@@ -1785,7 +2792,7 @@ STR16 pExitingSectorHelpText[] =
//If you attempt to leave a sector when you have multiple squads in a hostile sector.
L"иЇҐе€†еЊєиў«ж•Ње†›еЌ жЌ®гЂ‚дЅ дёЌиѓЅе°†дЅЈе…µз•™ењЁиї™й‡ЊгЂ‚\nењЁиї›е…Ґе…¶е®ѓе€†еЊєе‰ЌпјЊдЅ еї…йЎ»жЉЉиї™й‡Њзљ„й—®йўи§Је†ігЂ‚",
- //Because you only have one squad in the sector, and the "move all" option is checked, the "go to sector" option is locked to on.
+ //Because you only have one squad in the sector, and the "move all" option is checked, the "go to sector" option is locked to on.
//The helptext explains why it is locked.
L"让留下的佣兵离开本分区,\n将立即进入邻近的分区。",
L"让留下的佣兵离开本分区,\nдЅ е°†иў«з«‹еЌіи‡ЄеЉЁж”ѕзЅ®ењЁењ°е›ѕе±Џе№•пјЊ\nе› дёєдЅ зљ„дЅЈе…µи¦ЃиЉ±дє›ж—¶й—ґжќҐиЎЊе†›гЂ‚",
@@ -1822,7 +2829,7 @@ STR16 pExitingSectorHelpText[] =
-STR16 pRepairStrings[] =
+STR16 pRepairStrings[] =
{
L"物品", // tell merc to repair items in inventor
L"SAMеЇјеј№еџєењ°", // tell merc to repair SAM site - SAM is an acronym for Surface to Air Missile
@@ -1832,7 +2839,7 @@ STR16 pRepairStrings[] =
// NOTE: combine prestatbuildstring with statgain to get a line like the example below.
-// "John has gained 3 points of marksmanship skill."
+// "John has gained 3 points of marksmanship skill."
STR16 sPreStatBuildString[] =
{
@@ -2041,7 +3048,7 @@ STR16 pMapScreenBorderButtonHelpText[] =
L"жѕз¤єйў†з©є (|A)",
L"жѕз¤єз‰©е“Ѓ (|I)",
L"жѕз¤єж°‘е…µе’Њж•Њдєє (|Z)",
- L"Show Mobile Militia Restrictions", // HEADROCK HAM 4: Mobile Restrictions Button
+ L"жѕз¤єж°‘е…µз§»еЉЁ", // HEADROCK HAM 4: Mobile Restrictions Button
};
@@ -2134,8 +3141,8 @@ CHAR16 pSenderNameList[500][128] =
L"John Kulba",
L"A.I.M.",
};
-
*/
+
// next/prev strings
STR16 pTraverseStrings[] =
@@ -2144,7 +3151,7 @@ STR16 pTraverseStrings[] =
L"дё‹дёЂдёЄ",
};
-// new mail notify string
+// new mail notify string
STR16 pNewMailStrings[] =
{
@@ -2258,7 +3265,7 @@ STR16 pTransactionAlternateText[] =
L"е»¶й•ї%sзљ„еђ€еђЊдё¤е‘ЁгЂ‚",
};
-// helicopter pilot payment
+// helicopter pilot payment
STR16 pSkyriderText[] =
{
@@ -2287,7 +3294,7 @@ STR16 pMoralStrings[] =
// Mercs equipment has now arrived and is now available in Omerta or Drassen.
STR16 pLeftEquipmentString[] =
-{
+{
L"%s的装备现在可以在Omerta (A9)获得。",
L"%s的装备现在可以在Drassen (B13)获得。",
};
@@ -2323,7 +3330,7 @@ STR16 pTrashItemText[] =
};
-STR16 pMapErrorString[] =
+STR16 pMapErrorString[] =
{
L"е°ЏйџдёЌиѓЅиЎЊе†›пјЊе› 为有人在睡觉。",
@@ -2727,7 +3734,7 @@ STR16 sATMText[ ]=
L"еї…йЎ»жЇ$10зљ„еЂЌж•°", // transfer amount must be a multiple of $10
};
-// Web error messages. Please use foreign language equivilant for these messages.
+// Web error messages. Please use foreign language equivilant for these messages.
// DNS is the acronym for Domain Name Server
// URL is the acronym for Uniform Resource Locator
@@ -2953,8 +3960,8 @@ STR16 InsContractText[] =
//Insurance Info
// Text on the buttons on the bottom of the screen
-STR16 InsInfoText[] =
-{
+STR16 InsInfoText[] =
+{
L"дёЉдёЂйЎµ",
L"дё‹дёЂйЎµ",
};
@@ -2963,7 +3970,7 @@ STR16 InsInfoText[] =
//For use at the M.E.R.C. web site. Text relating to the player's account with MERC
-STR16 MercAccountText[] =
+STR16 MercAccountText[] =
{
// Text on the buttons on the bottom of the screen
L"ж”Їд»",
@@ -2978,7 +3985,7 @@ STR16 MercAccountText[] =
};
// Merc Account Page buttons
-STR16 MercAccountPageText[] =
+STR16 MercAccountPageText[] =
{
// Text on the buttons on the bottom of the screen
L"дёЉдёЂйЎµ",
@@ -3041,7 +4048,7 @@ STR16 MercHomePageText[] =
L"查看帐户点击这里", //"To view account press here",
L"查看文件点击这里", //"To view files press here",
// The version number on the video conferencing system that pops up when Speck is talking
- L"Speck Com v3.2", //"Speck Com v3.2",
+ L"Speck Com v3.2",
};
// For use at MiGillicutty's Web Page.
@@ -3068,7 +4075,7 @@ STR16 sFuneralString[] =
// Text for the florist Home page
-STR16 sFloristText[] =
+STR16 sFloristText[] =
{
//Text on the button on the bottom of the page
@@ -3098,7 +4105,7 @@ STR16 sFloristText[] =
//Florist OrderForm
-STR16 sOrderFormText[] =
+STR16 sOrderFormText[] =
{
//Text on the buttons
@@ -3163,7 +4170,7 @@ STR16 sFloristCards[] =
// Text for Bobby Ray's Mail Order Site
-STR16 BobbyROrderFormText[] =
+STR16 BobbyROrderFormText[] =
{
L"и®ўеЌ•", //"Order Form", //Title of the page
L"ж•°й‡Џ", //"Qty", // The number of items ordered
@@ -3244,7 +4251,7 @@ STR16 BobbyRFilter[] =
// This text is used when on the various Bobby Ray Web site pages that sell items
-STR16 BobbyRText[] =
+STR16 BobbyRText[] =
{
L"и®ўиґ", //"To Order", // Title
// instructions on how to order
@@ -3262,7 +4269,7 @@ STR16 BobbyRText[] =
L"и®ўиґ§еЌ•", //"ORDER FORM",
L"дё»йЎµ", //"Home", //10
- //The following 2 lines are used on the Ammunition page.
+ //The following 2 lines are used on the Ammunition page.
//They are used for help text to display how many items the player's merc has
//that can use this type of ammo
@@ -3413,7 +4420,7 @@ STR16 CharacterInfo[] =
L"дёЂе‘Ё", //"one week",
L"дё¤е‘Ё", //"two weeks",
- // text for the buttons that either go to the previous merc,
+ // text for the buttons that either go to the previous merc,
// start talking to the merc, or go to the next merc
L"дёЉдёЂдЅЌ", //"Previous",
@@ -3423,13 +4430,13 @@ STR16 CharacterInfo[] =
L"й™„еЉ дїЎжЃЇ", //"Additional Info", // Title for the additional info for the merc's bio
L"зЋ°еЅ№ж€ђе‘", //"Active Members", //20 // Title of the page
L"可选装备: ", //"Optional Gear:", // Displays the optional gear cost
- L"gear", //tais: Displays the optional gear cost in nsgi, this moved and can have only a small room, so just make it "gear" without extra's
+ L"装备", //tais: Displays the optional gear cost in nsgi, this moved and can have only a small room, so just make it "gear" without extra's
L"所需医疗保证金", //"MEDICAL deposit required", // If the merc required a medical deposit, this is displayed
- L"Kit 1", // Text on Starting Gear Selection Button 1 // TODO.Translate
- L"Kit 2", // Text on Starting Gear Selection Button 2
- L"Kit 3", // Text on Starting Gear Selection Button 3
- L"Kit 4", // Text on Starting Gear Selection Button 4
- L"Kit 5", // Text on Starting Gear Selection Button 5
+ L"装备1", // Text on Starting Gear Selection Button 1 // TODO.Translate
+ L"装备2", // Text on Starting Gear Selection Button 2
+ L"装备3", // Text on Starting Gear Selection Button 3
+ L"装备4", // Text on Starting Gear Selection Button 4
+ L"装备5", // Text on Starting Gear Selection Button 5
};
@@ -3448,7 +4455,7 @@ STR16 VideoConfercingText[] =
L"дёЂе‘Ё", //"One Week",
L"дё¤е‘Ё", //"Two Weeks",
- //Text on the buttons to determine if you want the merc to come with the equipment
+ //Text on the buttons to determine if you want the merc to come with the equipment
L"不买装备", //"No Equipment",
L"иґд№°иЈ…备", //"Buy Equipment",
@@ -3617,10 +4624,10 @@ STR16 AimBottomMenuText[] =
//ShopKeeper Interface
-// The shopkeeper interface is displayed when the merc wants to interact with
+// The shopkeeper interface is displayed when the merc wants to interact with
// the various store clerks scattered through out the game.
-STR16 SKI_Text[ ] =
+STR16 SKI_Text[ ] =
{
L"еє“е商品", //"MERCHANDISE IN STOCK", //Header for the merchandise available
L"йЎµйќў", //"PAGE", //The current store inventory page being displayed
@@ -3663,8 +4670,8 @@ STR16 SkiAtmText[] =
//Shopkeeper Interface
-STR16 gzSkiAtmText[] =
-{
+STR16 gzSkiAtmText[] =
+{
// Text on the bank machine panel that....
L"йЂ‰ж‹©з±»ећ‹", //"Select Type", // tells the user to select either to give or take from the merc
@@ -3690,7 +4697,7 @@ STR16 SkiMessageBoxText[] =
//OptionScreen.c
-STR16 zOptionsText[] =
+STR16 zOptionsText[] =
{
//button Text
L"дїќежёёж€Џ", //"Save Game",
@@ -3712,23 +4719,23 @@ STR16 zOptionsText[] =
};
-//SaveLoadScreen
-STR16 zSaveLoadText[] =
+//SaveLoadScreen
+STR16 zSaveLoadText[] =
{
- L"дїќежёёж€Џ", //"Save Game",
- L"иЅЅе…Ґжёёж€Џ", //"Load Game",
- L"еЏ–ж¶€", //"Cancel",
- L"йЂ‰ж‹©и¦ЃежЎЈзљ„дЅЌзЅ®", //"Save Selected",
- L"йЂ‰ж‹©и¦ЃиЇ»жЎЈзљ„дЅЌзЅ®", //"Load Selected",
-
- L"дїќежёёж€Џж€ђеЉџ", //"Saved the game successfully",
- L"дїќежёёж€Џй”™иЇЇпјЃ", //"ERROR saving the game!",
- L"иЅЅе…Ґжёёж€Џж€ђеЉџ", //"Loaded the game successfully",
- L"иЅЅе…Ґжёёж€Џй”™иЇЇпјЃ", //"ERROR loading the game!",
+ L"дїќежёёж€Џ",
+ L"иЅЅе…Ґжёёж€Џ",
+ L"еЏ–ж¶€",
+ L"йЂ‰ж‹©и¦ЃежЎЈзљ„дЅЌзЅ®",
+ L"йЂ‰ж‹©и¦ЃиЇ»жЎЈзљ„дЅЌзЅ®",
+ L"дїќежёёж€Џж€ђеЉџ",
+ L"дїќежёёж€Џй”™иЇЇпјЃ",
+ L"иЅЅе…Ґжёёж€Џж€ђеЉџ",
+ L"иЅЅе…Ґжёёж€Џй”™иЇЇпјЃ",
+
L"е档的游戏版本不同于当前的游戏版本。读取它的话很可能游戏可以жЈеёёиї›иЎЊгЂ‚и¦ЃиЇ»еЏ–иЇҐежЎЈеђ—пјџ",
L"ежЎЈеЏЇиѓЅе·Із»Џж— ж•€гЂ‚дЅ и¦Ѓе€ й™¤е®ѓд»¬еђ—пјџ",
-
+
//Translators, the next two strings are for the same thing. The first one is for beta version releases and the second one
//is used for the final version. Please don't modify the "#ifdef JA2BETAVERSION" or the "#else" or the "#endif" as they are
//used by the compiler and will cause program errors if modified/removed. It's okay to translate the strings though.
@@ -3810,8 +4817,8 @@ STR16 zMarksMapScreenText[] =
L"дЅЈе…µзљ„еђ€еђЊжІЎжЉ•дїќ", //"Merc's contract is not insured",
L"地图概况",//"Map Overview", // 24
// HEADROCK HAM 4: Prompt messages when turning on Mobile Militia Restrictions view.
- L"You currently have no Mobile Militia. Return to this view mode once you've recruited some.",
- L"This view shows where your Mobile Militia can and cannot go. GREY = Mobile Militia refuse to go here. RED = Mobile Militia can go here, but you've told them not to. YELLOW = Mobile Militia can enter this sector, but not leave. GREEN = Mobile Militia can go here freely. Right click a Green/Yellow sector to cycle its behavior.",
+ L"дЅ з›®е‰ЌжІЎжњ‰ж°‘е…µгЂ‚еЅ“дЅ ж‹›е‹џдє†дёЂдє›еђЋе†Ќиї”е›ћиї™дёЄжѕз¤єжЁЎејЏгЂ‚",
+ L"这个视图жѕз¤єдЅ зљ„з§»еЉЁж°‘е…µиѓЅеЋ»е’ЊдёЌиѓЅеЋ»е“Єй‡ЊгЂ‚ зЃ°и‰І = 移动民兵拒绝来这里. зєўи‰І = 移动民兵能来这里, дЅ†жЇдЅ е‘ЉиЇ‰д»–д»¬дёЌи¦Ѓиї™ж ·. й»„и‰І = з§»еЉЁж°‘е…µиѓЅиї›е…Ґиї™дёЄеЊєеџџ, дЅ†жЇдёЌиѓЅз¦»ејЂ. з»їи‰І = 移动民兵可以自由的进入这里. 右击一个绿色/й»„и‰ІеЊєеџџеѕЄзЋЇе®ѓзљ„иЎЊдёє.",
};
@@ -3841,23 +4848,23 @@ STR16 pMilitiaConfirmStrings[] =
};
//Strings used in the popup box when withdrawing, or depositing money from the $ sign at the bottom of the single merc panel
-STR16 gzMoneyWithdrawMessageText[] =
+STR16 gzMoneyWithdrawMessageText[] =
{
L"дЅ жЇЏж¬ЎжњЂе¤љиѓЅжЏђеЏ–$20,000гЂ‚",
L"дЅ зЎ®и®¤и¦ЃжЉЉ%sее…ҐдЅ зљ„еёђж€·еђ—пјџ",
};
-STR16 gzCopyrightText[] =
+STR16 gzCopyrightText[] =
{
L"Copyright (C) 1999 Sir-tech Canada Ltd. All rights reserved.",
};
//option Text
-STR16 zOptionsToggleText[] =
+STR16 zOptionsToggleText[] =
{
L"иЇйџі", //"Speech",
L"确认静й»", //"Mute Confirmations",
- L"жѕз¤єеЇ№иЇќж–‡е—", //"SubTitles",
+ L"жѕз¤єеЇ№иЇќж–‡е—", //"Subtitles",
L"жѕз¤єеЇ№иЇќж–‡е—ж—¶жљ‚еЃњ", //"Pause Text Dialogue",
L"зѓџзЃ«ж•€жћњ", //"Animate Smoke",
L"иЎЂи…Ґж•€жћњ", //"Blood n Gore",
@@ -3877,9 +4884,9 @@ STR16 zOptionsToggleText[] =
L"жѕз¤є3Dе…‰ж ‡", //"Show 3D Cursor",
L"жѕз¤єе‘ЅдёжњєзЋ‡", //"Show Chance to Hit on cursor",
L"ж¦ґеј№еЏ‘е°„е™ЁиїћеЏ‘ж—¶дЅїз”ЁжћЄе‡»е…‰ж ‡", //"GL Burst uses Burst cursor",
- L"Allow Enemy Taunts", // Changed from "Enemies Drop all Items" - SANDRO
+ L"е…Ѓи®ёж•ЊдєєеІи®Ѕ", // Changed from "Enemies Drop all Items" - SANDRO
L"е…Ѓи®ёй«д»°и§’榴弹发射", //"High angle Grenade launching",
- L"Allow Real Time Sneaking", // Changed from "Restrict extra Aim Levels" - SANDRO
+ L"е…Ѓи®ёе®ћж—¶жЅњиЎЊ", // Changed from "Restrict extra Aim Levels" - SANDRO
L"жЊ‰з©єж јй”®йЂ‰ж‹©дё‹дёЂж”Їе°Џйџ", //"Space selects next Squad",
L"жѕз¤єз‰©е“ЃйґеЅ±", //"Show Item Shadow",
L"з”Ёж јж•°жѕз¤єж¦е™Ёе°„зЁ‹", //"Show Weapon Ranges in Tiles",
@@ -3889,12 +4896,15 @@ STR16 zOptionsToggleText[] =
L"е…Ѓи®ёеЈ«е…µе·Ґе…·жЏђз¤є", // Show Soldier Tooltips
L"и‡ЄеЉЁез›", //"Auto save",
L"жІ‰й»зљ„Skyrider", //"Silent Skyrider",
- L"й™ЌдЅЋCPUзљ„дЅїз”ЁзЋ‡", //"Low CPU usage",
+ //L"й™ЌдЅЋCPUзљ„дЅїз”ЁзЋ‡", //"Low CPU usage",
L"Enhanced Description Box",
L"ејєе€¶е›ћеђ€е€¶жЁЎејЏ", // add forced turn mode
L"е±ћжЂ§иї›еє¦жќЎ", //L"Stat Progress Bars", // Show progress towards stat increase //ham3.6
- L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
- L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"ж›їд»Јж€з•Ґењ°е›ѕйўњи‰І", // Change color scheme of Strategic Map
+ L"ж›їд»Јеђеј№е›ѕеѓЏ", // Show alternate bullet graphics (tracers)
+ L"ејЂеђЇж–°зљ„ CTH зі»з»џ", // use NCTH
+ L"жѕз¤єи„ёйѓЁиЈ…备图",
+ L"жѕз¤єи„ёйѓЁиЈ…е¤‡е›ѕж ‡",
L"--дЅњејЉжЁЎејЏйЂ‰йЎ№--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"ејєе€¶ Bobby Ray йЂЃиґ§", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3978,9 +4988,9 @@ STR16 zOptionsScreenHelpText[] =
// Options for 1.13
L"еЅ“ж‰“ејЂж—¶пјЊењЁе…‰ж ‡дёЉжѕз¤єе‘ЅдёжњєзЋ‡гЂ‚",
L"开启该选项时,榴弹发射器点射使用点射的准жџ",
- L"When ON, enemies will occasionally comment certain actions.", // Changed from Enemies Drop All Items - SANDRO
+ L"еЅ“еђЇз”Ёж—¶пјЊж•ЊдєєиЎЊеЉЁдёжњ‰ж—¶дјљеё¦жњ‰еЇ№з™ЅгЂ‚", // Changed from Enemies Drop All Items - SANDRO
L"当打开时,榴弹发射器允许采用较й«д»°и§’发射榴弹。(|Q)",
- L"When ON, the turn based mode will not be entered when sneaking unnoticed and seeing an enemy unless pressing |C|t|r+|X.", // Changed from Restrict Extra Aim Levels - SANDRO
+ L"当启用时, 潜行时没有被敌人发现时不会进入回合制模式,除非按下 |C|t|r+|X.", // Changed from Restrict Extra Aim Levels - SANDRO
L"еЅ“ж‰“ејЂж—¶пјЊжЊ‰з©єж јй”®и‡ЄеЉЁе€‡жЌўе€°дё‹дёЂе°ЏйџгЂ‚(|S|p|a|c|e)",
L"ејЂеђЇиЇҐйЂ‰йЎ№ж—¶пјЊдјљжѕз¤єз‰©е“ЃйґеЅ±",
L"еЅ“ж‰“ејЂж—¶пјЊз”Ёж јж•°жѕз¤єж¦е™Ёе°„зЁ‹гЂ‚",
@@ -3990,23 +5000,26 @@ STR16 zOptionsScreenHelpText[] =
L"еЅ“еђЇз”Ёж—¶пјЊжЉЉе…‰ж ‡е®љдЅЌењЁж•Њдєєиє«дёЉе№¶дё”жЊ‰дё‹ |A|l|t й”®дјљжѕз¤єдёЂдёЄжЏђз¤єе·Ґе…·зЄ—еЏЈгЂ‚",
L"当打开时,游戏将在玩家回合后自动ез›",
L"当打开时,Skyriderе°†дїќжЊЃжІ‰й»гЂ‚",
- L"当打开时,游戏将使用更少的CPU资源。",
+ //L"当打开时,游戏将使用更少的CPU资源。",
L"当打开时,将出现物品及ж¦е™Ёзљ„“增强描述框”(EDBпј‰гЂ‚",
L"当打开时,且在ж€жњЇз”»йќўе†…е在敌军时,将一直处于回合制模式直至该地区所有敌军被消зЃпј€еЏЇд»ҐйЂљиї‡еї«жЌ·й”®|C|T|R|L+|S|H|I|F|T+|A|L|T+|T来控制打开或关й—ејєе€¶е›ћеђ€е€¶жЁЎејЏпј‰",
L"当打开时,可жѕз¤єеђ„е±ћжЂ§зљ„ж€ђй•їиї›еє¦гЂ‚", // L"When ON, shows character progress towards gaining levels.", //ham3.6
- L"When ON, the Strategic Map will be colored differently based on exploration.",
- L"When ON, alternate bullet graphics will be shown when you shoot.", // TODO.Translate
+ L"еЅ“еђЇз”Ёж—¶, ж€з•Ґењ°е›ѕе°†дјљж №жЌ®жЋўзґўзЉ¶жЂЃжѕз¤єдёЌеђЊзљ„зќЂи‰ІгЂ‚",
+ L"еЅ“еђЇз”Ёж—¶, еЅ“дЅ е°„е‡»ж—¶дјљжѕз¤єй—ґйљ”еђеј№е›ѕеѓЏгЂ‚", // TODO.Translate
+ L"еЅ“еђЇз”Ёж—¶, дЅїз”Ёж–°е‘ЅдёзЋ‡зі»з»џе’Ње…‰ж ‡гЂ‚",
+ L"当启用时, 将会看到佣兵脸部装备图。",
+ L"еЅ“еђЇз”Ёж—¶, е°†ењЁдЅЈе…µи‚–еѓЏеЏідё‹и§’жѕз¤єи„ёйѓЁиЈ…е¤‡е›ѕж ‡",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
- L"Force all pending Bobby Ray shipments",
+ L"ејєе€¶ Bobby Ray е‡єиґ§",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
- L"(text not rendered)TOPTION_DEBUG_MODE_OPTIONS_HEADER", // an example options screen options header (pure text)
- L"|H|A|M |4 |D|e|b|u|g: When ON, will report the distance each bullet deviates from the\ncenter of the target, taking all NCTH factors into account.",
- L"Click me to fix corrupt game settings", // failsafe show/hide option to reset all options
- L"Click me to fix corrupt game settings", // a do once and reset self option (button like effect)
- L"Allows debug options in release or mapeditor builds", // allow debugging in release or mapeditor
- L"Toggle to display debugging render options", // an example option that will show/hide other options
- L"Attempts to display slash-rects around mouse regions", // an example of a DEBUG build option
- L"(text not rendered)TOPTION_DEBUG_MODE_OPTIONS_END", // an example options screen options divider (pure text)
+ L"(text not rendered)TOPTION_DEBUG_MODE_OPTIONS_HEADER", // an example options screen options header (pure text)
+ L"|H|A|M |4 |D|e|b|u|g: еЅ“еђЇеЉЁж—¶, е°†жЉҐе‘ЉжЇЏдёЄеђеј№еЃЏз¦»з›®ж ‡дёеїѓз‚№зљ„距离,考虑各种NCTHе› зґ гЂ‚",
+ L"点击这里修复损坏的游戏设置", // failsafe show/hide option to reset all options
+ L"点击这里修复损坏的游戏设置", // a do once and reset self option (button like effect)
+ L"ењЁе»єз«‹releasж€–mapeditorж—¶пјЊе…Ѓи®ёи°ѓиЇ•ж“ЌдЅњ", // allow debugging in release or mapeditor
+ L"切换以жѕз¤єи°ѓиЇ•жёІжџ“йЂ‰йЎ№", // an example option that will show/hide other options
+ L"е°ќиЇ•ењЁйј ж ‡е‘Ёе›ґењ°еЊєжѕз¤єж–њзєїзџ©еЅў", // an example of a DEBUG build option
+ L"(text not rendered)TOPTION_DEBUG_MODE_OPTIONS_END", // an example options screen options divider (pure text)
// this is THE LAST option that exists (debug the options screen, doesnt do anything, except exist)
@@ -4021,15 +5034,15 @@ STR16 gzGIOScreenText[] =
L"зЋ°е®ћ",
L"з§‘е№»",
L"金版",
- L"Available Arsenal", // changed by SANDRO
+ L"ж¦е™Ёж•°й‡Џ", // changed by SANDRO
L"大量ж¦е™Ё",
- L"Reduced", // changed by SANDRO
+ L"е°‘й‡Џж¦е™Ё", // changed by SANDRO
L"йљѕеє¦",
L"新手",
L"老手",
L"дё“е®¶",
L"з–Їеђ",
- L"Start", // TODO.Translate
+ L"зЎ®е®љ", // TODO.Translate
L"еЏ–ж¶€",
L"йўќе¤–йљѕеє¦",
L"еЏЇйљЏж—¶ез›",
@@ -4040,42 +5053,41 @@ STR16 gzGIOScreenText[] =
L"иѕѓе¤љ",
L"еѕ€е¤љ",
L"囧……多",
- L"Inventory / Attachments", // TODO.Translate
+ L"жђєиЎЊзі»з»џ / й™„д»¶зі»з»џ", // TODO.Translate
L"NOT USED",
L"NOT USED",
L"иЇ»еЏ–иЃ”жњєжёёж€Џ",
L"жёёж€Џе€ќе§‹и®ѕзЅ®пј€д»…ењЁжњЌеЉЎе™Ёи®ѕзЅ®ж—¶жњ‰ж•€пј‰",
// Added by SANDRO
- L"Skill Traits",
- L"Old",
- L"New",
- L"Max IMP Characters",
+ L"特殊技能",
+ L"ж—§",
+ L"ж–°",
+ L"IMP ж•°й‡Џ",
L"1",
L"2",
L"3",
L"4",
L"5",
L"6",
- L"Enemies Drop All Items",
- L"Off",
- L"On",
- L"Number of Terrorists",
- L"Random",
- L"All",
- L"Secret Weapon Caches",
- L"Random",
- L"All",
- L"Progress Speed of Item Choices",
- L"Very Slow",
- L"Slow",
- L"Normal",
- L"Fast",
- L"Very Fast",
+ L"敌人物品全掉",
+ L"е…і",
+ L"ејЂ",
+ L"йЂљзј‰зЉЇе‡єзЋ°е‡ зЋ‡",
+ L"йљЏжњє",
+ L"е…ЁйѓЁ",
+ L"ж¦е™Ёеј№иЌЇе‚Ёи—Џе‡єзЋ°е‡ зЋ‡",
+ L"йљЏжњє",
+ L"е…ЁйѓЁ",
+ L"装备进展速度",
+ L"и¶…ж…ў",
+ L"ж…ў",
+ L"一般",
+ L"еї«",
+ L"и¶…еї«",
- // TODO.Translate
- L"Old / Old",
- L"New / Old",
- L"New / New",
+ L"ж—§ / ж—§",
+ L"ж–° / ж—§",
+ L"ж–° / ж–°",
};
STR16 gzMPJScreenText[] =
@@ -4098,7 +5110,6 @@ STR16 gzMPJScreenText[] =
L"ж‚Ёеї…йЎ»иѕ“е…ҐжЈзЎ®зљ„服务器端口,范围1~65535гЂ‚",//L"You must enter a valid Server Port between 1 and 65535.",
};
-// TODO.Translate
STR16 gzMPJHelpText[] =
{
L"Visit http://webchat.quakenet.org/?channels=ja2-multiplayer to find other players.",
@@ -4115,45 +5126,44 @@ STR16 gzMPJHelpText[] =
L"Click on 'Join' to join an already hosted Multiplayer Game.",
};
-// TODO.Translate
STR16 gzMPHScreenText[] =
{
- L"HOST GAME",
- L"Start",
- L"Cancel",
- L"Server Name",
- L"Game Type",
- L"Deathmatch",
- L"Team-Deathmatch",
- L"Co-Operative",
- L"Maximum Players",
- L"Maximum Mercs",
- L"Merc Selection",
- L"Merc Hiring",
- L"Hired by Player",
- L"Starting Cash",
- L"Allow Hiring Same Merc",
+ L"е»єз«‹дё»жњє",//L"HOST GAME",
+ L"ејЂе§‹",//L"Start",
+ L"еЏ–ж¶€",//L"Cancel",
+ L"жњЌеЉЎе™ЁеђЌ",//L"Server Name",
+ L"жёёж€Џз±»ећ‹",//L"Game Type",
+ L"ж»дєЎжЁЎејЏ",//L"Deathmatch",
+ L"е›ўйџж»дєЎжЁЎејЏ",//L"Team Deathmatch",
+ L"еђ€дЅњжЁЎејЏ",//L"Co-operative",
+ L"最大玩家数",//L"Max Players",
+ L"е°Џйџи§„жЁЎ",//L"Squad Size",
+ L"йЂ‰ж‹©дЅЈе…µ",//L"Merc Selection",
+ L"йљЏжњєдЅЈе…µ",//L"Random Mercs",
+ L"已被雇佣",//L"Hired by Player",
+ L"иµ·е§‹е№іиЎЎ",//L"Starting Cash",
+ L"可以雇佣相同佣兵",//L"Can Hire Same Merc",
L"Report Hired Mercs",
- L"Bobby Rays",
+ L"开启Bobby Rays网上商店",
L"Sector Starting Edge",
- L"You must enter a server name",
+ L"еї…йЎ»иѕ“е…ҐжњЌеЉЎе™ЁеђЌ",
L"",
L"",
- L"Starting Time",
+ L"ејЂе§‹ж—¶й—ґ",
L"",
L"",
- L"Weapon Damage",
+ L"ж¦е™Ёдј¤е®і",
L"",
- L"Timed Turns",
+ L"и®Ўж—¶е™Ё",
L"",
- L"Enable Civilians in CO-OP",
+ L"еђ€дЅњжЁЎејЏдёе…Ѓи®ёе№іж°‘",
L"",
L"Maximum Enemies in CO-OP",
- L"Synchronize Game Directory",
- L"MP Sync. Directory",
- L"You must enter a file transfer directory.",
- L"(Use '/' instead of '\\' for directory delimiters.)",
- L"The specified synchronisation directory does not exist.",
+ L"еђЊжҐжёёж€Џз›®еЅ•",
+ L"еђЊжҐе¤љдєєжЁЎејЏз›®еЅ•",
+ L"дЅ еї…йЎ»иї›е…ҐдёЂдёЄж–‡д»¶дј иѕ“з›®еЅ•.",
+ L"(使用 '/' 代替 '\\' 作为目录分隔符)",
+ L"жЊ‡е®љзљ„еђЊжҐз›®еЅ•дёЌеењЁгЂ‚",
L"1",
L"2",
L"3",
@@ -4339,7 +5349,7 @@ STR16 pMessageStrings[] =
L"%sиї›е…ҐжЅњиЎЊжЁЎејЏгЂ‚", //"%s on stealth mode.",
L"%sйЂЂе‡єжЅњиЎЊжЁЎејЏгЂ‚", //"%s off stealth mode.",
- //Wireframes are shown through buildings to reveal doors and windows that can't otherwise be seen in
+ //Wireframes are shown through buildings to reveal doors and windows that can't otherwise be seen in
//an isometric engine. You can toggle this mode freely in the game.
L"打开жѕз¤єиЅ®е»“", //"Extra Wireframes On",
L"е…ій—жѕз¤єиЅ®е»“", //"Extra Wireframes Off",
@@ -4367,8 +5377,8 @@ STR16 pMessageStrings[] =
L"日志已经更新。", //"History log updated.",
L"榴弹发射器点射时使用准жџе…‰ж ‡пј€еЏЇд»Ґж‰«е°„пј‰",
L"ж¦ґеј№еЏ‘е°„е™ЁиїћеЏ‘ж—¶дЅїз”Ёеј№йЃ“е…‰ж ‡(不可以扫射", //"Grenade Bursts use Trajectory Cursor (Spread fire disabled)",
- L"Enabled Soldier Tooltips", // Changed from Drop All On - SANDRO
- L"Disabled Soldier Tooltips", // Changed from Drop All Off - SANDRO
+ L"开启敌兵装备提示", // Changed from Drop All On - SANDRO
+ L"е…ій—敌兵装备提示", // Changed from Drop All Off - SANDRO
L"榴弹发射器以жЈеёёд»°и§’发射榴弹", //"Grenade Launchers fire at standard angles",
L"榴弹发射器以较й«д»°и§’发射榴弹", //L"Grenade Launchers fire at higher angles",
// forced turn mode strings
@@ -4381,9 +5391,7 @@ STR16 pMessageStrings[] =
#endif
L"..\\SavedGames\\MP_SavedGames", //The name of the directory where games are saved.//84
L"е®ўж€·з«Ї", //"Client",
-
- // TODO.Translate
- L"You cannot use the Old Inventory and the New Attachment System at the same time.",
+ L"ж—§жђєиЎЊзі»з»џдёЌиѓЅдёЋж–°й™„д»¶зі»з»џеђЊж—¶дЅїз”Ё.",
};
@@ -4416,7 +5424,7 @@ STR16 pMapScreenJustStartedHelpText[] =
L"еЅ“дЅ е‡†е¤‡е‡єеЏ‘е‰ЌеѕЂArulco,点击屏幕右下方的时间压缩按钮。",
};
-STR16 pAntiHackerString[] =
+STR16 pAntiHackerString[] =
{
L"错误。丢失或损坏文件。游戏将退出。",
};
@@ -4476,13 +5484,13 @@ STR16 gzMiscString[] =
L"дЅ дёўе¤±дє†еЉ жІ№з‚№гЂ‚", //"You have lost a refueling site.",
};
-STR16 gzIntroScreen[] =
+STR16 gzIntroScreen[] =
{
L"找不到视频文件",
};
// These strings are combined with a merc name, a volume string (from pNoiseVolStr),
-// and a direction (either "above", "below", or a string from pDirectionStr) to
+// and a direction (either "above", "below", or a string from pDirectionStr) to
// report a noise.
// e.g. "Sidney hears a loud sound of MOVEMENT coming from the SOUTH."
STR16 pNewNoiseStr[] =
@@ -4512,14 +5520,14 @@ STR16 wMapScreenSortButtonHelpText[] =
-STR16 BrokenLinkText[] =
+STR16 BrokenLinkText[] =
{
L"й”™иЇЇ404", //"Error 404",
L"зЅ‘з«™жњЄж‰ѕе€°", //"Site not found.",
};
-STR16 gzBobbyRShipmentText[] =
+STR16 gzBobbyRShipmentText[] =
{
L"иї‘жњџиїђиґ§", //"Recent Shipments",
L"и®ўеЌ• #", //"Order #",
@@ -4650,9 +5658,9 @@ STR16 gzLateLocalizedString[] =
//In autoresolve if there were 5 mercs fighting 8 enemies the text would be "5 vs. 8"
//"vs." is the abbreviation of versus.
L"%d vs. %d",
-
+
L"%sж»Ўдє†гЂ‚",
-
+
L"%s现在不用包扎,他(她)需要认真的治疗和休息。",
//20
@@ -4715,6 +5723,7 @@ STR16 gzLateLocalizedString[] =
//46-48
L"%s的增程枪管掉下来了!", //"%s's gun barrel extender falls off!",
+ // HEADROCK HAM 3.5: Changed to reflect facility effect.
L"еЏЄе…Ѓи®ёдёЌе¤љдєЋ%d名佣兵在这个分区и®з»ѓж°‘е…µгЂ‚", //"No more than %d militia trainers are permitted per sector.", //L"No more than %d militia trainers are permitted in this sector.",//ham3.6
L"дЅ зЎ®е®љеђ—пјџ", //"Are you sure?",
@@ -4736,13 +5745,13 @@ STR16 gzLateLocalizedString[] =
L"The Jagged Alliance 2 v1.13 PLAY DISK was not found. Program will now exit.",
L"物品组合成功。",
-
+
//58
//Displayed with the version information when cheats are enabled.
L"当前/最大进展: %d%%/%d%%", //"Current/Max Progress: %d%%/%d%%",//zww
-
+
L"жЉ¤йЂЃJohnе’ЊMaryпјџ",
-
+
// 60
L"ејЂе…іиў«жїЂжґ»", //"Switch Activated.",
@@ -4751,7 +5760,8 @@ STR16 gzLateLocalizedString[] =
L"%s多打了1еЏ‘еђеј№пјЃ", //"%s fires %d more round than intended!",
};
-STR16 gzCWStrings[] =
+// HEADROCK HAM 3.5: Added sector name
+STR16 gzCWStrings[] =
{
L"жЇеђ¦е‘јеЏ«й‚»иї‘еЊєеџџзљ„жЏґе…µе€°%sпјџ", //L"Call reinforcements to %s from adjacent sectors?",
};
@@ -4800,9 +5810,9 @@ STR16 gzTooltipStrings[] =
L"ж— дЅњж€иЈ¤",
L"|жЉ¤|з”І: %s\n",
// Added - SANDRO
- L"%s|Skill 1: %s\n",
- L"%s|Skill 2: %s\n",
- L"%s|Skill 3: %s\n",
+ L"%s|жЉЂиѓЅ 1: %s\n",
+ L"%s|жЉЂиѓЅ 2: %s\n",
+ L"%s|жЉЂиѓЅ 3: %s\n",
};
STR16 New113Message[] =
@@ -4831,29 +5841,33 @@ STR16 New113Message[] =
L"视野дёжІЎжњ‰ж•Њдєє",
L"еЌіж—¶жЅњиЎЊжЁЎејЏ е…ій—",
L"еЌіж—¶жЅњиЎЊжЁЎејЏ ејЂеђЇ",
+ //L"Enemy spotted! (Ctrl + x to enter turn based)",
L"еЏ‘зЋ°ж•ЊдєєпјЃ", // this should be enough - SANDRO
//////////////////////////////////////////////////////////////////////////////////////
// These added by SANDRO
- L"%s was successful on stealing!",
- L"%s had not enough action points to steal all selected items.",
- L"Do you want to make surgery on %s before bandaging? (You can heal about %i Health.)",
- L"Do you want to make surgery on %s? (You can heal about %i Health.)",
- L"Do you wish to make necessary surgeries first? (%i patient(s))",
- L"Do you wish to make the surgery on this patient first?",
- L"Apply first aid automatically with necessary surgeries or without them?",
- L"Surgery on %s finished.",
- L"%s is hit in the chest and loses a point of maximum health!",
- L"%s is hit in the chest and loses %d points of maximum health!",
- L"%s has regained one point of lost %s",
- L"%s has regained %d points of lost %s",
- L"Your scouting skills prevented you to be ambushed by the enemy!",
- L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
- L"%s is hit to groin and falls down in pain!",
+ L"%s еЃ·зЄѓж€ђеЉџпјЃ",// L"%s was successful on stealing!",
+ L"%s 没有足够的行动点来偷取所有所选物品。",// L"%s had not enough action points to steal all selected items.",
+ L"жЇеђ¦ењЁеЊ…ж‰Ће‰ЌеЇ№ %s 实施手术?(可回复 %i з”џе‘ЅгЂ‚пј‰",// L"Do you want to make surgery on %s before bandaging? (You can heal about %i Health.)",
+ L"жЇеђ¦еЇ№ %s 实施手术?(可回复 %i з”џе‘ЅгЂ‚пј‰",// L"Do you want to make surgery on %s? (You can heal about %i Health.)",
+ L"жЇеђ¦иї›иЎЊеї…要的手术?(%i дёЄдј¤иЂ…пј‰",// L"Do you wish to make necessary surgeries first? (%i patient(s))",
+ L"жЇеђ¦ењЁиЇҐдј¤иЂ…身上进行手术?",// L"Do you wish to make the surgery on this patient first?",
+ L"ењЁеЊ…ж‰Ће‰ЌжЇеђ¦иї›иЎЊж‰‹жњЇпјџ",// L"Apply first aid automatically with necessary surgeries or without them?",
+ L"%s 手术完毕。",// L"Surgery on %s finished.",
+ L"%s иѓёйѓЁдёеј№пјЊе¤±еЋ»1з‚№з”џе‘ЅдёЉй™ђпјЃ",// L"%s is hit in the chest and loses a point of maximum health!",
+ L"%s иѓёйѓЁдёеј№пјЊе¤±еЋ» %d з‚№з”џе‘ЅдёЉй™ђпјЃ",// L"%s is hit in the chest and loses %d points of maximum health!",
+ L"%s 重获1点失去的 %s",// L"%s has regained one point of lost %s",
+ L"%s 重获 %d 点失去的 %s",// L"%s has regained %d points of lost %s",
+ L"дЅ зљ„дѕ¦еЇџиѓЅеЉ›йЃїе…Ќдє†ж•Њдєєзљ„еЃ·иўпјЃ",// L"Your scouting skills prevented you to be ambushed by the enemy!",
+ L"е¤љдєЏдє†дЅ зљ„дѕ¦жџҐжЉЂиѓЅпјЊдЅ ж€ђеЉџзљ„йЃїејЂдє†е¤§зѕ¤иЎЂзЊ«пјЃ",// L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
+ L"%s е‘Ѕж №еђдёеј№пјЊз—›и‹¦зљ„еЂ’дё‹дє†пјЃ",// L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"жіЁж„Џ: ж•Њдєєе°ёдЅ“иў«еЏ‘зЋ°!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
};
-STR16 New113HAMMessage[] =
+STR16 New113HAMMessage[] =
{
+ // 0 - 5
L"%s е®іжЂ•еѕ—йЂЂзј©дє†пјЃ",// L"%s cowers in fear!",
L"%s иў«еЋ‹е€¶дЅЏдє†пјЃ",// L"%s is pinned down!", //ham3.6
L"%s е¤љж‰“дє†е‡ еЏ‘еђеј№пјЃ",// L"%s fires more rounds than intended!",
@@ -4880,90 +5894,93 @@ STR16 New113HAMMessage[] =
L"ж—Ґеёёж”Їе‡є",// L"Daily Expenses",
// 21 - 25
L"维持民兵的资金不足!%d名民兵回老家结婚去了。",// L"Insufficient funds to pay all enlisted militia! %d militia have disbanded and returned home.",
+
};
-
// WANNE: This are the email texts, when one of the 4 new 1.13 MERC mercs have levelled up, that Speck sends
-// INFO: Do not replace the ?characters. They indicate the (-> Newline) from the edt files
+// INFO: Do not replace the В± characters. They indicate the (-> Newline) from the edt files
STR16 New113MERCMercMailTexts[] =
{
// Gaston: Text from Line 39 in Email.edt
- L"鉴于Gaston最近发挥异常突出,他的服务费也跟着上涨。以我个人的观点,这一点也不让我惊讶。??Speck T. Kline ?",
+ L"鉴于Gaston最近发挥异常突出,他的服务费也跟着上涨。以我个人的观点,这一点也不让我惊讶。 ± ± Speck T. Kline ± ",
// Stogie: Text from Line 43 in Email.edt
- L"иЇ·жіЁж„ЏпјЊStogieиї‘жњџиѓЅеЉ›жњ‰ж‰ЂжЏђеЌ‡пјЊд»–зљ„д»·ж јд№џи¦ЃйљЏд№‹еўћй•їгЂ‚ ??Speck T. Kline ?",
+ L"иЇ·жіЁж„ЏпјЊStogieиї‘жњџиѓЅеЉ›жњ‰ж‰ЂжЏђеЌ‡пјЊд»–зљ„д»·ж јд№џи¦ЃйљЏд№‹еўћй•їгЂ‚ В± В± Speck T. Kline В± ",
// Tex: Text from Line 45 in Email.edt
- L"иЇ·жіЁж„ЏпјЊе› дёєTexж–°иЋ·еѕ—зљ„з»ЏйЄЊпјЊ 更й«зљ„иє«д»·ж‰ЌеЊ№й…Ќд»–зљ„иѓЅеЉ›гЂ‚ ??Speck T. Kline ?",
+ L"иЇ·жіЁж„ЏпјЊе› дёєTexж–°иЋ·еѕ—зљ„з»ЏйЄЊпјЊ 更й«зљ„иє«д»·ж‰ЌеЊ№й…Ќд»–зљ„иѓЅеЉ›гЂ‚ В± В± Speck T. Kline В± ",
// Biggens: Text from Line 49 in Email.edt
- L"鉴于BigginsеЏ‘жЊҐжњ‰ж‰ЂжЏђй«пјЊ д»–зљ„д»·ж јд№џеђЊж—¶дёЉж¶ЁгЂ‚ ??Speck T. Kline ?",
+ L"鉴于BigginsеЏ‘жЊҐжњ‰ж‰ЂжЏђй«пјЊ д»–зљ„д»·ж јд№џеђЊж—¶дёЉж¶ЁгЂ‚ В± В± Speck T. Kline В± ",
};
-// TODO.Translate
// WANNE: This is email text (each 2 line), when we left a message on AIM and now the merc is back
STR16 New113AIMMercMailTexts[] =
{
// Monk
- L"FW from AIM Server: Message from Victor Kolesnikov",
- L"You want to talk to me? I have time.",
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљVictor Kolesnikovзљ„дїЎд»¶",
+ L"дЅ еҐЅпјЊиї™жЇMonkпјЊз•™иЁЂе·Іж”¶е€°гЂ‚ж€‘е·Із»Џе›ћжќҐдє†пјЊдЅ еЏЇд»ҐиЃ”зі»ж€‘дє†гЂ‚ В± В± з‰дЅ зљ„з”µиЇќгЂ‚ В± ",
- // Brain
- L"FW from AIM Server: Message from Janno Allik",
- L"I am back. Waiting for your call.",
+ // Brain: Text from Line 60
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљJanno Allikзљ„дїЎд»¶",
+ L"我已经准备好接受任务了。我有空干任何事情 ± ± Janno Allik ± ",
- // Scream
- L"FW from AIM Server: Message from Lennart Vilde",
- L"Sorry, I was out of office, now I am back.",
+ // Scream: Text from Line 62
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљLennart Vildeзљ„дїЎд»¶",
+ L"Lennart Vilde已经准备好了! ± ",
- // Henning
- L"FW from AIM Server: Message from Henning von Branitz",
- L"Back from business. You want my help?",
+ // Henning: Text from Line 64
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљHenning von Branitzзљ„дїЎд»¶",
+ L"дЅ зљ„з•™иЁЂж€‘е·Іж”¶е€°пјЊи°ўи°ўгЂ‚иЇ·е€°AIM主页联系我,然后讨论招募事宜。 В± В± й‚Јж—¶и§ЃпјЃ В± В± Henning von Branitz В± ",
- // Luc
- L"FW from AIM Server: Message from Luc Fabre",
- L"Give me a call, if you are interested.",
+ // Luc: Text from Line 66
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљLuc Fabreзљ„дїЎд»¶",
+ L"ж”¶е€°з•™иЁЂпјЊMerciпј€и°ўи°ўпј‰пјЃ дЅ иѓЅиЂѓи™‘ж€‘ж€‘йќћеёёй«е…ґгЂ‚дЅ зџҐйЃ“ењЁе“Єй‡ЊиѓЅж‰ѕе€°ж€‘гЂ‚ В± В± еёЊжњ›иѓЅж”¶е€°дЅ зљ„з”µиЇќгЂ‚ В± ",
- // Laura
- L"FW from AIM Server: Message from Dr. Laura Colin",
- L"I am now available.",
+ // Laura: Text from Line 68
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљDr. Laura Colinзљ„дїЎд»¶",
+ L"дЅ еҐЅпјЃйќћеёёй«е…ґдЅ 能给我留言,我很感兴趣。 В± В± иЇ·е†ЌдёЉAIM,我愿意听听详细事宜 В± В± ж¤и‡ґж•¬з¤јпјЃ В± В± Dr. Laura Colin В± ",
- // Grace
- L"FW from AIM Server: Message from Graziella Girelli",
- L"Got your message. If you still want me, you know what to do.",
+ // Grace: Text from Line 70
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљGraziella Girelliзљ„дїЎд»¶",
+ L"дЅ дёЉж¬ЎжѓіиЃ”зі»ж€‘дЅ†жЇжІЎжњ‰ж€ђеЉџгЂ‚В± В± дЅ ж‡‚еѕ—пјџе®¶еєиЃљдјље•¦гЂ‚我现在已经厌倦了我的家еєпјЊдЅ иѓЅе†ЌдёЉAIM联系我的话我会非常й«е…ґ В± В± Ciaoпј€е†Ќи§Ѓпј‰пјЃ В± ",
- // Rudolf
- L"FW from AIM Server: Message from Rudolf Steiger",
- L"Rudolf here. Call me back.",
+ // Rudolf: Text from Line 72
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљRudolf Steigerзљ„дїЎд»¶",
+ L"дЅ зџҐйЃ“ж€‘жЇЏе¤©жњ‰е¤ље°‘дёЄз”µиЇќи¦ЃжЋҐеђ—пјџжЇЏдёЄи ўиґ§йѓЅи®¤дёєд»–еЏЇд»ҐCall我。 В± В± еЏЌжЈж€‘回来了,前提жЇдЅ 真的有有趣的工作给我的话。 В± ",
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"иЅ¬еЏ‘и‡ЄAIMжњЌеЉЎе™ЁпјљMessage about merc availability",
+ L"ж€‘ж”¶е€°дЅ зљ„з•™иЁЂпјЊз‰дЅ иЃ”зі»гЂ‚ В± ",
};
// WANNE: These are the missing skills from the impass.edt file
-// INFO: Do not replace the ?characters. They indicate the (-> Newline) from the edt files
+// INFO: Do not replace the В± characters. They indicate the (-> Newline) from the edt files
STR16 MissingIMPSkillsDescriptions[] =
{
// Sniper
- L"狙击手: ж‹Ґжњ‰й№°зљ„зњјзќ›е’Њз™ѕжҐз©їжќЁзљ„жћЄжі•пјЃ?",
+ L"狙击手: ж‹Ґжњ‰й№°зљ„зњјзќ›е’Њз™ѕжҐз©їжќЁзљ„жћЄжі•пјЃВ± ",
// Camouflage
- L"дјЄиЈ…: и·џдЅ зљ„дјЄиЈ…иї·еЅ©жЇ”иµ·жќҐпјЊж ‘дё›зњ‹иµ·жќҐеЂ’и±ЎжЇеЃ‡зљ„пјЃ?",
+ L"дјЄиЈ…: и·џдЅ зљ„дјЄиЈ…иї·еЅ©жЇ”иµ·жќҐпјЊж ‘дё›зњ‹иµ·жќҐеЂ’и±ЎжЇеЃ‡зљ„пјЃВ± ",
// SANDRO - new strings for new traits added
+ // MINTY - Altered the texts for more natural English, and added a little flavour too
// Ranger
- L"Ranger: You are the one from Texas deserts, aren't you! В± ",
+ L"зЊЋдєєпјљдЅ и·џй‚Јдє›д»Ћеѕ·е…‹иђЁж–ЇжќҐзљ„ењџеЊ…еђеЏЇе¤§дёЌдёЂж ·пјЃ В± ",
// Gunslinger
- L"Gunslinger: With a handgun or two, you can be as lethal as the Billy Kid! В± ",
+ L"еї«жћЄж‰‹пјљж‹їзќЂдёЂдё¤жЉЉж‰‹жћЄпјЊдЅ еЏЇд»Ґе’ЊBilly the KidдёЂж ·и‡ґе‘ЅпјЃ В± ",
// Squadleader
- L"Squadleader: Natural leader and boss, you are the big shot no kidding! В± ",
+ L"йў†йџпјље¤©з”џзљ„йў†иў–пјЊдЅ зљ„йџе‘йњЂи¦ЃдЅ зљ„зЃµж„џпјЃ В± ",
// Technician
- L"Technician: Fixing stuff, removing traps, planting bombs, that's your bussiness! В± ",
+ L"жЉЂеё€пјљдЅ жЇ”MacGyverз‰›йЂје¤љдє†пјЃж— и®єжњєжў°гЂЃз”µеђдє§е“ЃиїжЇз€†з ґз‰©пјЊдЅ йѓЅиѓЅдї®пјЃ В± ",
// Doctor
- L"Doctor: You can make a quick surgery with pocket-knife and chewing gum anywhere! В± ",
+ L"еЊ»з”џпјљд»ЋиЅ»еѕ®ж“¦дј¤е€°ејЂи‚ з ґи‚љпјЊз”љи‡іж€Єи‚ўпјЊдЅ йѓЅиѓЅжІ»пјЃ В± ",
// Athletics
- L"Athletics: Your speed and vitality is on top of possibilities! В± ",
+ L"дЅ“иѓЅи®з»ѓпјљдЅ 的速度和活力能和奥运会运动е‘з›ёжЏђе№¶и®єпјЃВ± ",
// Bodybuilding
- L"Bodybuilding: That big muscular figure which cannot be overlooked is you actually! В± ",
+ L"еЃҐиє«пјљж–Ѕз“¦иѕ›ж јпјџзЄќе›ЉеєџдёЂдёЄгЂ‚дЅ еЏЄз”ЁдёЂеЏЄж‰‹е°±иѓЅеЉћжЋ‰д»–гЂ‚ В± ",
// Demolitions
- L"Demolitions: You can blow up a whole city just by common home stuff! В± ",
+ L"з€†з ґпјљж’种手雷,深埋炸弹,看羊羔飞。这就жЇдЅ 的生活! В± ",
// Scouting
- L"Scouting: Nothing can escape your notice! В± ",
+ L"дѕ¦жџҐпјљжІЎжњ‰д»Ђд№€дёњиҐїдЅ и§‰еЇџдёЌе€°пјЃ В± ",
};
-STR16 NewInvMessage[] =
+STR16 NewInvMessage[] =
{
L"ж¤ж—¶ж— жі•ж‹ѕиµ·иѓЊеЊ…",
L"иѓЊеЊ…дёж— 处可放",
@@ -5095,14 +6112,13 @@ STR16 MPClientMessage[] =
L"Client is not running.",
};
-// TODO.Translate
STR16 gszMPEdgesText[] =
{
- L"N",
- L"S",
- L"E",
- L"W",
- L"C", // "C"enter
+ L"еЊ—", //L"N",
+ L"еЌ—", //L"S",
+ L"дёњ", //L"E",
+ L"西", //L"W",
+ L"дё", //L"C", // "C"enter
};
STR16 gszMPTeamNames[] =
@@ -5179,23 +6195,24 @@ STR16 ChineseSpecString7 = L"%s [%d%пј…]\n%s %1.1f %s";
// Following strings added - SANDRO
STR16 pSkillTraitBeginIMPStrings[] =
{
- // For old traits
- L"On the next page, you are going to choose your skill traits according to your proffessional specialization as a mercenary. No more than two different traits or one expert trait can be selected.",
- L"You can also choose only one or even no traits, which will give you a bonus to your attribute points as a compensation. Note that Electronics and Ambidextrous traits cannot be achieved at expert levels.",
- // For new major/minor traits
- L"Next stage is about choosing your skill traits according to your proffessional specialization as a mercenary. On first page you can select up to two potential major traits, which mostly represent your main role in a team. While on second page is list of possible minor traits, which represent personal feats.",
- L"No more then three choices altogeher are possible. Which means if you choose no major traits, you can then choose three minor traits. If you choose both major traits (or one enhanced), you can then choose only one minor trait...",
+ // For old traits 用于旧特长
+ L"дё‹дёЂйЎµдЅ еї…йЎ»дѕќз…§дЅ дЅњдёєй›‡дЅЈе…µзљ„дё“дёљйЂ‰ж‹©з‰№й•їгЂ‚жіЁж„ЏдЅ еЏЄиѓЅйЂ‰ж‹©дё¤з§ЌдёЂи€¬з‰№й•їж€–иЂ…дёЂз§Ќдё“е®¶зє§з‰№й•їгЂ‚",
+ L"дЅ еЏЇд»ҐеЏЄйЂ‰ж‹©дёЂдёЄдё“е®¶з‰№й•їж€–иЂ…е№Іи„†д»Ђд№€д№џдёЌйЂ‰пјЊдЅњдёєе›ћжЉҐдЅ дјљеѕ—е€°йўќе¤–зљ„иѓЅеЉ›з‚№ж•°гЂ‚жіЁж„Џз”µеђгЂЃе·¦еЏіејЂеј“е’ЊдјЄиЈ…жЇжІЎжњ‰дё“е®¶зє§зљ„гЂ‚",
+ // For new major/minor traits 用于新的主/副特长
+ L"дё‹дёЂжҐдЅ еї…йЎ»дѕќз…§дЅ дЅњдёєй›‡дЅЈе…µзљ„дё“дёљйЂ‰ж‹©з‰№й•їгЂ‚ењЁз¬¬дёЂйЎµдЅ еЏЇд»ҐжњЂе¤љйЂ‰ж‹©дё¤дёЄдё»з‰№й•їпјЊд»ҐеЏЌж дЅ ењЁе°Џйџдёж‰®жј”зљ„дё»и¦Ѓи§’и‰ІгЂ‚ењЁз¬¬дєЊйЎµе°†жњ‰е‰Їз‰№й•їзљ„е€—иЎЁдѕ›дЅ йЂ‰ж‹©пјЊд»ҐеЏЌж дЅ дёЄдєєзљ„еЂѕеђ‘гЂ‚",
+ L"дё»/е‰Їз‰№й•їеЉ иµ·жќҐжњЂе¤љдёЌиѓЅи¶…иї‡дё‰йЎ№пјЊд№џе°±жЇиЇґе¦‚жћњдЅ дёЌйЂ‰ж‹©д»»дЅ•дё»з‰№й•їпјЊдЅ е°±иѓЅйЂ‰ж‹©дё‰йЎ№е‰Їз‰№й•їгЂ‚е¦‚жћњдЅ йЂ‰ж‹©дє†дё¤йЎ№дё»з‰№й•їпјЊ(或者一项专家特长)пјЊй‚Јд№€дЅ е°±еЏЄиѓЅйЂ‰ж‹©дёЂйЎ№е‰Їз‰№й•ї...",
};
-STR16 sgAttributeSelectionText[] =
+
+STR16 sgAttributeSelectionText[] =
{
L"иЇ· жЊ‰ з…§ дЅ еЇ№ и‡Є е·± зљ„ ж„џ 觉 пјЊ и°ѓ ж•ґ дЅ зљ„ еђ„ йЎ№ иѓЅ еЉ› еЂј гЂ‚ еђ„ йЎ№ иѓЅ еЉ› еЂј зљ„ жњЂ 大 еЂј дёє",
L"IMP能力值和技能概览。",
L"奖励点数 :",
L"ејЂе§‹з‰зє§",
// New strings for new traits
- L"On the next page you are going to specify your physical attributes and skills. As 'attributes' are called: health, dexterity, agility, strength and wisdom. Attributes cannot go lower than %d.",
- L"The rest are called 'skills' and unlike attributes skills can be set to zero meaning you have absolutely no proficieny in it.",
- L"All scores are set to a minimum at the beginning. Note that certain attributes are set to specific values according to skill traits you have selected. You cannot set those attributes lower than that.",
+ L"дё‹дёЂйЎµдЅ е°†и®ѕе®љдЅ зљ„е±ћжЂ§пј€з”џе‘Ѕ, ж•ЏжЌ·, зЃµж•ЏпјЊеЉ›й‡Џе’Њж™єеЉ›пј‰е’Њеџєжњ¬жЉЂиѓЅгЂ‚е±ћжЂ§дёЌиѓЅдЅЋдєЋ %dгЂ‚",
+ L"е…¶дЅ™зљ„жЇвЂњжЉЂиѓЅвЂќпјЊе®ѓеЏЇд»Ґи®ѕе®љдёєй›¶пјЊиЎЁз¤єдЅ еЇ№ж¤дёЂзЄЌдёЌйЂљгЂ‚",
+ L"ж‰Ђжњ‰е€ќе§‹ж•°еЂјйѓЅи®ѕзЅ®ењЁжњЂдЅЋпјЊе…¶дёжњ‰дёЂдє›ж•°еЂје› дёєдЅ йЂ‰ж‹©зљ„з‰№жЉЂиЂЊиў«и®ѕењЁдёЂдёЄжњЂдЅЋж ‡е‡†пјЊдёЌиѓЅдЅЋдєЋиЇҐж ‡е‡†гЂ‚",
};
STR16 pCharacterTraitBeginIMPStrings[] =
@@ -5222,30 +6239,30 @@ STR16 gzIMPAttitudesText[]=
STR16 gzIMPCharacterTraitText[]=
{
- L"Normal",
- L"Sociable",
- L"Loner",
- L"Optimist",
- L"Assertive",
- L"Intellectual",
- L"Primitive",
- L"Aggressive",
- L"Phlegmatic",
- L"Dauntless",
- L"Pacifist",
- L"Malicious",
- L"Show-off",
- L"I.M.P. Character Traits",
+ L"ж™®йЂљ",
+ L"е–њж¬ўз¤ѕдє¤",
+ L"з‹¬иЎЊдѕ ",
+ L"д№ђи§‚",
+ L"еќље®љи‡ЄдїЎ",
+ L"知识份еђ",
+ L"й‡ЋжЂ§",
+ L"дѕµз•ҐжЂ§",
+ L"镇定",
+ L"ж— ж‰Ђз•Џжѓ§",
+ L"和平主义者",
+ L"жЃ¶жЇ’",
+ L"з€±з‚«иЂЂ",
+ L"I.M.P. жЂ§ж јз‰№еѕЃ",
};
-STR16 gzIMPColorChoosingText[] =
+STR16 gzIMPColorChoosingText[] =
{
L"I.M.P. йўњи‰ІеЏЉиє«ећ‹",
L"I.M.P. йўњи‰І",
L"иЇ·йЂ‰ж‹©дЅ е–њж¬ўзљ„IMP发色、肤色、服装颜色以及体型。",
L"иЇ·йЂ‰ж‹©дЅ е–њж¬ўзљ„IMP发色、肤色、服装颜色。",
L"点选这里佣兵将单手持大枪",
- L"\n(Caution: you will need a big strength for this.)",
+ L"\n(жЏђз¤є: дЅ еї…йЎ»жњ‰ејєеЈ®дЅ“ж ј.)",
};
STR16 sColorChoiceExplanationTexts[]=
@@ -5378,95 +6395,105 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 窗口模式需要一个16bpp或更少的颜色深度。",
+
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
+
};
// SANDRO - Taunts (here for now, xml for future, I hope)
+// MINTY - Changed some of the following taunts to sound more natural
STR16 sEnemyTauntsFireGun[]=
{
- L"Suck this!",
- L"Touch this!",
- L"Come get some!",
- L"You're mine!",
- L"Die!",
- L"You scared, motherfucker?",
- L"This will hurt!",
- L"Come on you bastard!",
- L"Come on! I don't got all day!",
- L"Come to daddy!",
- L"You'll be six feet under in no time!",
- L"Will send ya home in a pinebox, loser!",
- L"Hey, wanna play?",
- L"You should have stayed home, bitch.",
- L"Sucker!",
+ L"吃我一发吧!",
+ L"е…”еґЅеђпјЊжќҐи§ЃдЅ е¤–е…¬пјЃ", // MINTY - "Touch this" just doesn't sound right, so I changed it to a Scarface quote.
+ L"放马过来吧!",
+ L"дЅ жЇж€‘зљ„дє†!",
+ L"еЋ»ж»еђ§!",
+ L"е®іжЂ•дє†еђ—?ж“ЌдЅ е¦€е¦€зљ„!",
+ L"这会很痛的哦!",
+ L"жќҐеђ§дЅ иї™дёЄж··и›‹!",
+ L"ж€еђ§пјЃеѕ€еї«е°±дјље€†е‡єиѓњиґџзљ„пјЃ",
+ L"过来爸爸的怀抱里吧!",
+ L"дЅ зљ„и‘¬з¤јй©¬дёЉе°±дјљдёѕиЎЊзљ„дє†!",
+ L"е°Џж ·пјЃдЅ еѕ€еї«е°±дјљиў«ж‰“еЊ…еЇ„е›ћеЋ»зљ„пјЃ",
+ L"еїпјЃжѓізЋ©зЋ©жЇеђ§пјџ",
+ L"и‡е©ЉеђпјЊдЅ 早应该呆在家里!",
+ L"йќ пјЃ",
};
STR16 sEnemyTauntsFireLauncher[]=
{
- L"We have a barbecue here.",
- L"I got a present for ya.",
- L"Bam!",
- L"Smile!",
+ L"жЉЉдЅ д»¬еЃљж€ђзѓ¤и‚‰!",// L"We have a barbecue here.",
+ L"йЂЃз»™дЅ зљ„з¤јз‰©!",// L"I got a present for ya.",
+ L"зЃ°йЈћзѓџзЃеђ§!",// L"Bam!",
+ L"说“茄еђвЂќ!",// L"Smile!",
};
STR16 sEnemyTauntsThrow[]=
{
- L"Catch!",
- L"Here ya go!",
- L"Pop goes the weasel.",
- L"This one's for you.",
- L"Muhehe.",
- L"Catch this, swine!",
- L"I like this.",
+ L"给我接住!",
+ L"иї™жЇз»™дЅ зљ„!",
+ L"иЂЃйј з»™ж€‘е‡єжќҐеђ§пјЃ",
+ L"иї™дёЄжЇдё“й—Ёз»™дЅ е°ќе°ќзљ„.",
+ L"зЃе“€е“€е“€е“€е“€!",
+ L"接住吧!猪头!",
+ L"ж€‘е°±е–њж¬ўиї™ж ·пјЃ",
};
STR16 sEnemyTauntsChargeKnife[]=
{
- L"I'll get your scalp.",
- L"Come to papa.",
- L"Show me your guts!",
- L"I'll rip you to pieces!",
- L"Motherfucker!",
+ L"ж€‘и¦ЃжЉЉдЅ зљ„е¤ґзљ®жґ»жґ»е‰Ґдё‹жќҐ!ж»дєєе¤ґпјЃ",
+ L"来跟我玩玩吧!",
+ L"ж€‘и¦Ѓи®©дЅ ејЂи‚ з ґи‚љ!",
+ L"ж€‘дјљжЉЉдЅ зўЋе°ёдё‡ж®µ!",
+ L"他妈的!",
};
STR16 sEnemyTauntsRunAway[]=
{
- L"We're in some real shit...",
- L"They said join the army. Not for this shit!",
- L"I have enough.",
- L"Oh my God.",
- L"They ain't paying us enough for this.",
- L"It's just too much for me.",
- L"I'll bring some friends.",
+ L"йќ пјЃзњ‹жќҐж€‘д»¬йЃ‡е€°зєЇз€·д»¬дє†...",
+ L"ж€‘еЏ‚еЉ е†›йџжЇдёєдє†жЉўеЁд»¬зљ„дёЌжЇйЂЃж»зљ„!",
+ L"我受够啦!",
+ L"上帝啊!救救我吧!",
+ L"我可不想白白送ж»..",
+ L"妈妈咪啊",
+ L"иЂЃеђиїдјље›ћжќҐзљ„пјЃеђЋдјљжњ‰жњџпјЃ",
};
STR16 sEnemyTauntsSeekNoise[]=
{
- L"I heard that!",
- L"Who's there?",
- L"What was that?",
- L"Hey! What the...",
+ L"我似乎听见啥了!",
+ L"и°ЃењЁй‚Јй‡Њ?",
+ L"жђћд»Ђд№€жђћ?",
+ L"еїпјЃжЇи°Ѓпјџ...",
};
STR16 sEnemyTauntsAlert[]=
{
- L"They are here!",
- L"Now the fun can start.",
- L"I hoped this will never happen.",
+ L"他们就在那里!",
+ L"现在我们来玩玩吧!",
+ L"我可没想到事情会еЏж€ђиї™ж ·..",
};
STR16 sEnemyTauntsGotHit[]=
{
- L"Ouch!",
- L"Ugh!",
- L"This.. hurts!",
- L"You fuck!",
- L"You will regret.. uhh.. this.",
- L"What the..!",
- L"Now you have.. pissed me off.",
+ L"е•Ље•Ље•Љ!",
+ L"е‘ње‘њ!",
+ L"з—›ж»ж€‘啦!",
+ L"ж“ЌдЅ е¦€е¦€зљ„!",
+ L"дЅ дјљеђЋж‚”зљ„!",
+ L"д»Ђд№€..!",
+ L"дЅ зЋ°ењЁеЏЇжЇзњџжЈжЉЉз€·ж€‘жѓ№зЃ«дє†.",
};
@@ -5475,29 +6502,29 @@ STR16 sEnemyTauntsGotHit[]=
//////////////////////////////////////////////////////
STR16 gzItemDescTabButtonText[] =
{
- L"Description",
- L"General",
- L"Advanced",
+ L"д»‹з»Ќ",
+ L"еёёи§„",
+ L"иї›й¶",
};
STR16 gzItemDescTabButtonShortText[] =
{
- L"Desc",
- L"Gen",
- L"Adv",
+ L"д»‹з»Ќ",
+ L"еёёи§„",
+ L"иї›й¶",
};
STR16 gzItemDescGenHeaders[] =
{
- L"Primary",
- L"Secondary",
- L"AP Costs",
- L"Burst / Autofire",
+ L"еџєжњ¬жЂ§иѓЅ",
+ L"й™„еЉ жЂ§иѓЅ",
+ L"AP ж¶€иЂ—",
+ L"з‚№е°„ / иїћеЏ‘",
};
STR16 gzItemDescGenIndexes[] =
{
- L"Prop.",
+ L"еЏ‚ж•°.",
L"0",
L"+/-",
L"=",
@@ -5505,369 +6532,379 @@ STR16 gzItemDescGenIndexes[] =
STR16 gzUDBButtonTooltipText[]=
{
- L"|D|e|s|c|r|i|p|t|i|o|n |P|a|g|e:\n \nShows basic textual information about this item.",
- L"|G|e|n|e|r|a|l |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows specific data about this item.",
- L"|A|d|v|a|n|c|e|d| |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows bonuses given by this item.",
+ L"|д»‹|з»Ќ|йЎµ|йќў:\n \nжѕз¤єиЇҐз‰©е“Ѓзљ„еџєжњ¬ж–‡е—жЏЏиї°гЂ‚",
+ L"|常|规|性|能|页|面:\n \n以数据的形式描述这件物品。",
+ L"|иї›|й¶|жЂ§|иѓЅ|йЎµ|йќў:\n \nжѕз¤єиї™д»¶з‰©е“Ѓзљ„й™„еЉ жЂ§иѓЅгЂ‚",
};
STR16 gzUDBHeaderTooltipText[]=
{
- L"|P|r|i|m|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nProperties and data related to this item's class\n(Weapon / Armor / etcetera).",
- L"|S|e|c|o|n|d|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nAdditional features of this item,\nand/or possible secondary abilities.",
- L"|A|P |C|o|s|t|s:\n \nVarious Action Point costs to fire\nor manipulate this weapon.",
- L"|B|u|r|s|t |/ |A|u|t|o|f|i|r|e |P|r|o|p|e|r|t|i|e|s:\n \nData related to firing this weapon in\nBurst or Autofire modes.",
+ L"|еџє|жњ¬|жЂ§|иѓЅ:\n \n基于该物品类别(ж¦е™Ё/жЉ¤з”І/杂物)的性能数据。",
+ L"|й™„|еЉ |жЂ§|иѓЅ:\n \nиЇҐз‰©е“Ѓзљ„й™„еЉ з‰№жЂ§пјЊж€–з‰№ж®ЉиѓЅеЉ›гЂ‚",
+ L"|A|P |ж¶€|иЂ—:\n \nдЅїз”Ёиї™д»¶ж¦е™ЁйњЂи¦Ѓе¤ље°‘APгЂ‚",
+ L"|з‚№|е°„ |/ |иїћ|еЏ‘|жЂ§|иѓЅ:\n \nжѕз¤єж¦е™ЁењЁз‚№е°„/иїћеЏ‘жЁЎејЏдё‹зљ„з›ёе…іж•°жЌ®гЂ‚",
};
STR16 gzUDBGenIndexTooltipText[]=
{
- L"|P|r|o|p|e|r|t|y |i|c|o|n\n \nMouse-over to reveal the property's name.",
- L"|B|a|s|i|c |v|a|l|u|e\n \nThe basic value given by this item, excluding any\nbonuses or penalties from attachments or ammo.",
- L"|A|t|t|a|c|h|m|e|n|t |B|o|n|u|s|e|s\n \nBonus or penalty given by ammo, any attachments,\nor low item condition.",
- L"|F|i|n|a|l |V|a|l|u|e\n \nThe final value given by this item, including any\nbonuses/penalties from attachments or ammo.",
+ L"|еЏ‚|ж•°|е›ѕ|ж ‡:\n \nйј ж ‡ж‚¬еЃњжѕз¤єеЏ‚ж•°еђЌз§°",
+ L"|基|础|值:\n \n该物品基础值,不包括由附件或弹药带来的属\n性奖励或惩罚。",
+ L"|й™„|д»¶|еЉ |ж€ђ:\n \nеј№иЌЇпјЊй™„д»¶ж€–иї‡дЅЋзљ„ж¦е™Ёдїќе…»еє¦её¦жќҐзљ„属性奖\nеЉ±ж€–жѓ©зЅљгЂ‚",
+ L"|最|终|值:\n \n该物品最终值,包括所有由附件或弹药带来的\n属性奖励或惩罚。",
};
STR16 gzUDBAdvIndexTooltipText[]=
{
- L"Property icon (mouse-over to reveal name).",
- L"Bonus/penalty given while |s|t|a|n|d|i|n|g.",
- L"Bonus/penalty given while |c|r|o|u|c|h|i|n|g.",
- L"Bonus/penalty given while |p|r|o|n|e.",
- L"Bonus/penalty given",
+ L"еЏ‚ж•°е›ѕж ‡пј€йј ж ‡ж‚¬еЃњжѕз¤єеђЌз§°пј‰",
+ L"|站|立 姿态的奖励/惩罚",
+ L"|蹲|伏 姿态的奖励/惩罚",
+ L"|匍|匐 姿态的奖励/惩罚",
+ L"奖励/惩罚",
};
STR16 szUDBGenWeaponsStatsTooltipText[]=
{
- L"|A|c|c|u|r|a|c|y",
- L"|D|a|m|a|g|e",
- L"|R|a|n|g|e",
- L"|A|l|l|o|w|e|d |A|i|m|i|n|g |L|e|v|e|l|s",
- L"|S|c|o|p|e |M|a|g|n|i|f|i|c|a|t|i|o|n |F|a|c|t|o|r",
- L"|P|r|o|j|e|c|t|i|o|n |F|a|c|t|o|r",
- L"|H|i|d|d|e|n |M|u|z|z|l|e |F|l|a|s|h",
- L"|L|o|u|d|n|e|s|s",
- L"|R|e|l|i|a|b|i|l|i|t|y",
- L"|R|e|p|a|i|r |E|a|s|e",
- L"|M|i|n|. |R|a|n|g|e |f|o|r |A|i|m|i|n|g |B|o|n|u|s",
- L"|T|o|-|H|i|t |M|o|d|i|f|i|e|r",
+ L"|зІѕ|еє¦",
+ L"|жќЂ|дј¤|еЉ›",
+ L"|е°„|зЁ‹",
+ L"|зІѕ|зћ„|з‰|зє§",
+ L"|瞄|准|镜|倍|率",
+ L"|зєў|з‚№|ж•€|жћњ",
+ L"|ж¶€|з„°",
+ L"|е™Є|йџі",
+ L"|еЏЇ|йќ |жЂ§",
+ L"|дї®|зђ†|йљѕ|еє¦",
+ L"|精|瞄|最|低|有|效|距|离",
+ L"|е‘Ѕ|дё|зЋ‡|дї®|жЈ",
L"", // (12)
- L"|A|P|s |t|o |R|e|a|d|y",
- L"|A|P|s |t|o |A|t|t|a|c|k",
- L"|A|P|s |t|o |B|u|r|s|t",
- L"|A|P|s |t|o |A|u|t|o|f|i|r|e",
- L"|A|P|s |t|o |R|e|l|o|a|d",
- L"|A|P|s |t|o |R|e|c|h|a|m|b|e|r",
- L"|L|a|t|e|r|a|l |R|e|c|o|i|l",
- L"|V|e|r|t|i|c|a|l |R|e|c|o|i|l",
- L"|A|u|t|o|f|i|r|e |B|u|l|l|e|t|s |p|e|r |5 |A|P|s",
+ L"|дёѕ|жћЄ|A|P",
+ L"|еЌ•|еЏ‘|A|P",
+ L"|з‚№|е°„|A|P",
+ L"|иїћ|еЏ‘|A|P",
+ L"|дёЉ|еј№|A|P",
+ L"|换|弹|夹|A|P",
+ L"|ж°ґ|е№і|еђЋ|еќђ|еЉ›",
+ L"|垂|直|后|坐|力",
+ L"|иїћ|еЏ‘|еђ|еј№|ж•°/5|A|P",
};
STR16 szUDBGenWeaponsStatsExplanationsTooltipText[]=
{
- L"\n \nDetermines whether bullets fired by\nthis gun will stray far from where\nit is pointed.\n \nScale: 0-100.\nHigher is better.",
- L"\n \nDetermines the average amount of damage done\nby bullets fired from this weapon, before\ntaking into account armor or armor-penetration.\n \nHigher is better.",
- L"\n \nThe maximum distance (in tiles) that\nbullets fired from this gun will travel\nbefore they begin dropping towards the\nground.\n \nHigher is better.",
- L"\n \nThis is the number of Extra Aiming\nLevels you can add when aiming this gun.\n \nThe FEWER aiming levels are allowed, the MORE\nbonus each aiming level gives you. Therefore,\nhaving FEWER levels makes the gun faster to aim,\nwithout making it any less accurate.\n \nLower is better.",
- L"\n \nWhen greater than 1.0, will proportionally reduce\naiming errors at a distance.\n \nRemember that high scope magnification is detrimental\nwhen the target is too close!\n \nA value of 1.0 means no scope is installed.",
- L"\n \nProportionally reduces aiming errors at a distance.\n \nThis effect works up to a given distance,\nthen begins to dissipate and eventually\ndisappears at sufficient range.\n \nHigher is better.",
- L"\n \nWhen this property is in effect, the weapon\nproduces no visible flash when firing.\n \nEnemies will not be able to spot you\njust by your muzzle flash (but they\nmight still HEAR you).",
- L"\n \nWhen firing this weapon, Loudness is the\ndistance (in tiles) that the sound of\ngunfire will travel.\n \nEnemies within this distance will probably\nhear the shot.\n \nLower is better.",
- L"\n \nDetermines how quickly this weapon will degrade\nwith use.\n \nHigher is better.",
- L"\n \nDetermines how difficult it is to repair this weapon.\n \nHigher is better.",
- L"\n \nThe minimum range at which a scope can provide it's aimBonus.",
- L"\n \nTo hit modifier granted by laser sights.",
+ L"\n \nе†іе®љд»ЋиЇҐж¦е™ЁеЏ‘е°„зљ„еђеј№дјљеЃЏз¦»з›®ж ‡е¤љиїњгЂ‚\n \n数值范围:0~100гЂ‚и¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nе†іе®љиЇҐжћЄеЏ‘е°„зљ„еђеј№зљ„е№іеќ‡дј¤е®іпјЊж¤дј¤е®іжІЎжњ‰\nз®—жЉ¤з”Іж€–з©їз”Із‰дї®жЈгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nд»ЋиЇҐжћЄе°„е‡єзљ„еђеј№ењЁиђЅењ°е‰Ќзљ„最大飞行距离(\nж јж•°пј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™дёЄж•°еЂјжѕз¤єдє†иЇҐж¦е™Ёзљ„зІѕзћ„з‰зє§гЂ‚\n \nзІѕзћ„з‰зє§и¶ЉдЅЋпјЊжЇЏж¬Ўзћ„准获得的命дёзЋ‡еЉ ж€ђи¶Љ\nй«гЂ‚е› ж¤пјЊиѕѓе°‘зљ„зІѕзћ„з‰зє§дЅїеѕ—иЇҐж¦е™ЁењЁдёЌжЌџ\n失精度的情况下快速瞄准。\n \n该数值越低越好。",
+ L"\n \n当该值大于1.0时,远距离瞄准дёзљ„иЇЇе·®дјљжЊ‰\nжЇ”дѕ‹е‡Џе°ЏгЂ‚\n \nиЇ·и®°дЅЏпјЊй«еЂЌзЋ‡зљ„瞄准镜在过近的距离不起作\nз”ЁгЂ‚\n \nеЅ“иЇҐеЂјз‰дєЋ1.0ж—¶е€™ж„Џе‘ізќЂиЇҐж¦е™ЁжІЎжњ‰е®‰иЈ…зћ„\n准镜。",
+ L"\n \n按比例减少瞄准过程дёзљ„иЇЇе·®гЂ‚\n \n红点效果只能在指定距离内使用,超过该距离\n光点就会暗淡直到最终消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеЅ“иЇҐе±ћжЂ§иµ·дЅњз”Ёж—¶пјЊиЇҐж¦е™ЁеЏ‘е°„ж—¶дёЌдјљдє§з”џжћЄ\nз„°гЂ‚\n \n敌人不能通过枪焰判ж–дЅ зљ„дЅЌзЅ®пјЊдЅ†жЇд»–们可\nиѓЅдјљеђ¬е€°дЅ гЂ‚",
+ L"\n \nиЇҐеЏ‚ж•°жѕз¤єдє†еЅ“дЅїз”Ёиї™жЉЉжћЄејЂзЃ«ж—¶пјЊжћЄеЈ°ж‰Ђдј \nж’зљ„иЊѓе›ґпј€ж јж•°пј‰гЂ‚\n \n在这个范围之内的敌人均有可能听到枪声。\n \n该数值越低越好。",
+ L"\n \nе†іе®љдє†иЇҐж¦е™ЁењЁж€ењєдёЉе¤љеї«жЌџеќЏгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nе†іе®љдє†иЇҐж¦е™Ёе¤љйљѕдї®зђ†гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n瞄准镜能提供瞄准命дёзЋ‡еЉ ж€ђзљ„жњЂзџи·ќз¦»гЂ‚\nпј€е†Ќиї‘е°±ж— ж•€дє†пј‰",
+ L"\n \n激光瞄准提供的命дёзЋ‡дї®жЈгЂ‚",
L"", // (12)
- L"\n \nThe number of APs required to bring this\nweapon up to firing stance.\n \nOnce the weapon is raised, you may fire repeatedly\nwithout paying this cost again.\n \nA weapon is automatically 'Unreadied' if its\nwielder performs any action other than\nfiring or turning.\n \nLower is better.",
- L"\n \nThe number of APs required to perform\na single attack with this weapon.\n \nFor guns, this is the cost of firing\na single shot without extra aiming.\n \nIf this icon is greyed-out, single-shots\n are not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to fire\na burst.\n \nThe number of bullets fired in each burst is\ndetermined by the weapon itself, and indicated\nby the number of bullets shown on this icon.\n \nIf this icon is greyed-out, burst fire\nis not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to fire\nan Autofire Volley of three bullets.\n \nIf you wish to fire more than 3 bullets,\nyou will need to pay extra APs.\n \nIf this icon is greyed-out, autofire\nis not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to reload\nthis weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to rechamber this weapon\nbetween each and every shot fired.\n \nLower is better.",
- L"\n \nThe distance this weapon's muzzle will shift\nhorizontally between each and every bullet in a\nburst or autofire volley.\n \nPositive numbers indicate shifting to the right.\nNegative numbers indicate shifting to the left.\n \nCloser to 0 is better.",
- L"\n \nThe distance this weapon's muzzle will shift\nvertically between each and every bullet in a\nburst or autofire volley.\n \nPositive numbers indicate shifting upwards.\nNegative numbers indicate shifting downwards.\n \nCloser to 0 is better.",
- L"\n \nIndicates the number of bullets that will be added\nto an autofire volley for every extra 5 APs\nyou spend.\n \nHigher is better.",
+ L"\n \n端起枪准备开火所需的APгЂ‚\n \nеЅ“дёѕиµ·иЇҐж¦е™ЁеђЋпјЊдЅ 可以连з»еЏ‘е°„иЂЊдёЌе†Ќж¶€иЂ—\nдёѕжћЄAPгЂ‚\n \nдЅ†жЇпјЊй™¤дє†иЅ¬еђ‘和开火之外的其他动作均会放\nдё‹ж¦е™ЁгЂ‚\n \n该数值越低越好。",
+ L"\n \nе°„е‡єеЌ•еЏ‘еђеј№ж‰ЂйњЂзљ„APгЂ‚\n \nиЇҐж•°еЂјжѕз¤єдє†ењЁдёЌзІѕзћ„的情况下发射一发еђеј№\nзљ„APж¶€иЂ—гЂ‚\n \nе¦‚жћњиЇҐе›ѕж ‡еЏ‘зЃ°пјЊе€™иЇҐж¦е™ЁдёЌеЏЇеЌ•发射击。\n \n该数值越低越好。",
+ L"\n \nз‚№е°„дёЂж¬Ўж‰ЂйњЂзљ„APгЂ‚\n \nжЇЏж¬Ўз‚№е°„еЏ‘е°„зљ„еђеј№ж•°з”±жћЄж”Їжњ¬иє«е†іе®љпјЊиЂЊдё”\nиЇҐе›ѕж ‡жѕз¤єдє†жЇЏж¬Ўз‚№е°„еЏ‘е°„зљ„еђеј№ж•°гЂ‚\n \nе¦‚жћњиЇҐе›ѕж ‡еЏ‘зЃ°пјЊе€™иЇҐж¦е™ЁдёЌеЏЇз‚№е°„гЂ‚\n \n该数值越低越好。",
+ L"\n \n3еЏ‘йЅђе°„дёЂж¬Ўж‰ЂйњЂзљ„APгЂ‚\n \nиЇҐж•°еЂјжѕз¤єдє†иЇҐж¦е™ЁењЁиїћеЏ‘жЁЎејЏдё‹еЏ‘е°„3еЏ‘еђеј№\nзљ„APж¶€иЂ—гЂ‚е¦‚жћњдЅ жѓідёЂж¬ЎеЏ‘е°„е¤љдєЋ3еЏ‘зљ„еђеј№пјЊ\nдЅ йњЂи¦Ѓйўќе¤–зљ„APгЂ‚\n \nе¦‚жћњиЇҐе›ѕж ‡еЏ‘зЃ°пјЊе€™иЇҐж¦е™ЁдёЌеЏЇиїћеЏ‘гЂ‚\n \n该数值越低越好。",
+ L"\n \nй‡Ќж–°иЈ…еЎ«еђеј№ж‰ЂйњЂзљ„APгЂ‚\n \n该数值越低越好。",
+ L"\n \nиЇҐж•°еЂјжѕз¤єдє†ењЁе°„击之间给该ж¦е™Ёж‰‹еЉЁж›ґжЌўеј№\n夹的APж¶€иЂ—гЂ‚\n \n该数值越低越好。",
+ L"\n \nиЇҐеЏ‚ж•°жѕз¤єдє†жћЄеЏЈењЁз‚№е°„ж€–иїћеЏ‘жЁЎејЏдё‹еЏ‘е°„еђеј№\nж—¶зљ„ж°ґе№ідЅЌз§»гЂ‚\n \nеЅ“иЇҐеЏ‚ж•°дёєжЈж—¶пјЊжћЄеЏЈеЏіеЃЏгЂ‚反之,则向左偏。\n \nи¶ЉжЋҐиї‘0越好。",
+ L"\n \nиЇҐеЏ‚ж•°жѕз¤єдє†жћЄеЏЈењЁз‚№е°„ж€–иїћеЏ‘жЁЎејЏдё‹еЏ‘е°„еђеј№\n时的垂直位移。\n \nеЅ“иЇҐеЏ‚ж•°дёєжЈж—¶пјЊжћЄеЏЈдёЉеЃЏгЂ‚反之,则向下偏。\n \nи¶ЉжЋҐиї‘0越好。",
+ L"\n \nиЇҐеЏ‚ж•°жѕз¤єдє†иЇҐж¦е™ЁењЁиїћеЏ‘жЁЎејЏдё‹жЇЏе¤љеЉ 5APж‰Ђ\nеЉ зљ„еђеј№ж•°гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
};
STR16 szUDBGenArmorStatsTooltipText[]=
{
- L"|P|r|o|t|e|c|t|i|o|n |V|a|l|u|e",
- L"|C|o|v|e|r|a|g|e",
- L"|D|e|g|r|a|d|e |R|a|t|e",
+ L"|йІ|жЉ¤|еЂј",
+ L"|覆|盖|率",
+ L"|жЌџ|еќЏ|зЋ‡",
};
STR16 szUDBGenArmorStatsExplanationsTooltipText[]=
{
- L"\n \nThis primary armor property defines how much\ndamage the armor will absorb from any attack.\n \nRemember that armor-piercing attacks and\nvarious randomal factors may alter the\nfinal damage reduction.\n \nHigher is better.",
- L"\n \nDetermines how much of the protected\nbodypart is covered by the armor.\n \nIf coverage is below 100%, attacks have\na certain chance of bypassing the armor\ncompletely, causing maximum damage\nto the protected bodypart.\n \nHigher is better.",
- L"\n \nIndicates how quickly this armor's condition\ndrops when it is struck, proportional to\nthe damage caused by the attack.\n \nLower is better.",
+ L"\n \nжЉ¤е…·жњЂй‡Ќи¦Ѓзљ„е±ћжЂ§гЂ‚е®ѓе†іе®љдє†иЇҐйІеј№иЎЈеЏЇд»Ґеђёж”¶е¤љ\n少伤害。请记住,穿甲攻击会随机影响最终伤害。\n \nи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n决定了该护具可以覆盖身体多少。如果该\nеЂјдёЌжЇ100%пјЊе€™ењЁдёЂе®ље‡ зЋ‡дё‹д»»дЅ•ж”»\n \n击都有可能对ж¤йѓЁе€†иє«дЅ“йЂ ж€ђжњЂе¤§дј¤е®ігЂ‚и¶Љ\nй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиЇҐеЂјжѕз¤єдє†иЇҐжЉ¤е…·иў«е‡»дёж—¶зљ„зЈЁжЌџйЂџзЋ‡пјЊз”±йЂ ж€ђзљ„\n伤害成比例增长。越低越好。",
};
STR16 szUDBGenAmmoStatsTooltipText[]=
{
- L"|A|r|m|o|r |P|i|e|r|c|i|n|g",
- L"|B|u|l|l|e|t |T|u|m|b|l|e",
- L"|P|r|e|-|I|m|p|a|c|t |E|x|p|l|o|s|i|o|n",
+ L"|дѕµ|еЅ»|еЉ›|пј€|з©ї|з”І|еј№|пј‰",
+ L"|зї»|жђ…|еЉ›|пј€|ејЂ|иЉ±|еј№|пј‰",
+ L"|爆|з‚ё|еЉ›|пј€|з‚ё|еђ|е„ї|пј‰",
};
STR16 szUDBGenAmmoStatsExplanationsTooltipText[]=
{
- L"\n \nThis is the bullet's ability to penetrate\na target's armor.\n \nWhen above 1.0, the bullet proportionally\nreduces the Protection value of any\narmor it hits.\n \nWhen below 1.0, the bullet increases the\nprotection value of the armor instead.\n \nHigher is better.",
- L"\n \nDetermines a proportional increase of damage\npotential once the bullet gets through the\ntarget's armor and hits the bodypart behind it.\n \nWhen above 1.0, the bullet's damage\nincreases after penetrating the armor.\n \nWhen below 1.0, the bullet's damage\npotential decreases after passing through armor.\n \nHigher is better.",
- L"\n \nA multiplier to the bullet's damage potential\nthat is applied immediately before hitting the\ntarget.\n \nValues above 1.0 indicate an increase in damage,\nvalues below 1.0 indicate a decrease.\n \nHigher is better.",
+ L"\n \nиї™й‡Њжѕз¤єзљ„жЇеђеј№з©їйЂЏжЉ¤з”Ізљ„иѓЅеЉ›гЂ‚\n \n当该值大于1ж—¶пјЊеђеј№зљ„з©їз”ІиѓЅеЉ›жЊ‰жЇ”дѕ‹дёЉеЌ‡гЂ‚\n \nеЅ“иЇҐеЂје°ЏдєЋ1ж—¶пјЊеђеј№е°±жЇз»™жЉ¤з”ІжЊ з—’з—’пјЊз›ёеЅ“\nдєЋеўћеЉ дє†жЉ¤з”ІйІжЉ¤еЂјгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиЇҐеЂје†іе®љдє†еђеј№ж‰“穿护甲击дёиє«дЅ“ж—¶зљ„дј¤е®іеЉ›\nеЉ ж€ђгЂ‚\n \n当该值大于1ж—¶пјЊеђеј№ењЁз©їиї‡жЉ¤з”ІеђЋдјљеўћеЉ дј¤е®ігЂ‚\n \nеЅ“иЇҐеЂје°ЏдєЋ1ж—¶пјЊеђеј№з©їиї‡жЉ¤з”ІеђЋдјље‡Џе°‘дј¤е®ігЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеђеј№ењЁе‡»дёз›®ж ‡ж—¶зљ„дј¤е®іеЉ›еЂЌзЋ‡гЂ‚\n \n当该值大于1ж—¶е€™еўћеЉ дј¤е®іпјЊиЇҐеЂје°ЏдєЋ1ж—¶е‡Џ\nе°‘дј¤е®ігЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
};
STR16 szUDBGenExplosiveStatsTooltipText[]=
{
- L"|D|a|m|a|g|e",
- L"|S|t|u|n |D|a|m|a|g|e",
- L"|B|l|a|s|t |R|a|d|i|u|s",
- L"|S|t|u|n |B|l|a|s|t |R|a|d|i|u|s",
- L"|N|o|i|s|e |B|l|a|s|t |R|a|d|i|u|s",
- L"|T|e|a|r|g|a|s |S|t|a|r|t |R|a|d|i|u|s",
- L"|M|u|s|t|a|r|d |G|a|s |S|t|a|r|t |R|a|d|i|u|s",
- L"|L|i|g|h|t |S|t|a|r|t |R|a|d|i|u|s",
- L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
- L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
- L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
- L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
- L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
- L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
- L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
- L"|L|o|u|d|n|e|s|s",
- L"|V|o|l|a|t|i|l|i|t|y",
+ L"|жќЂ|дј¤|еЉ›",
+ L"|зњ©|ж™•|жќЂ|дј¤|еЉ›",
+ L"|爆|炸|范|围",
+ L"|眩|晕|爆|炸|范|围",
+ L"|噪|音|扩|散|范|围",
+ L"|催|泪|毒|气|初|始|范|围",
+ L"|иЉҐ|еђ|жЇ’|ж°”|е€ќ|е§‹|иЊѓ|围",
+ L"|з…§|жЋ|е€ќ|е§‹|иЊѓ|围",
+ L"|烟|雾|初|始|范|围",
+ L"|燃|烧|初|始|范|围",
+ L"|催|泪|毒|气|最|终|范|围",
+ L"|иЉҐ|еђ|жЇ’|ж°”|жњЂ|终|иЊѓ|围",
+ L"|з…§|жЋ|жњЂ|终|иЊѓ|围",
+ L"|烟|雾|最|终|范|围",
+ L"|燃|烧|最|终|范|围",
+ L"|ж•€|жћњ|жЊЃ|з»|ж—¶|й—ґ",
+ L"|е™Є|йџі",
+ L"|жЊҐ|еЏ‘|жЂ§",
};
STR16 szUDBGenExplosiveStatsExplanationsTooltipText[]=
{
- L"\n \nThe amount of damage caused by this explosive.\n \nNote that blast-type explosives deliver this damage\nonly once (when they go off), while prolonged effect\nexplosives deliver this amount of damage every turn until the\neffect dissipates.\n \nHigher is better.",
- L"\n \nThe amount of non-lethal (stun) damage caused\nby this explosive.\n \nNote that blast-type explosives deliver their damage\nonly once (when they go off), while prolonged effect\nexplosives deliver this amount of stun damage every\nturn until the effect dissipates.\n \nHigher is better.",
- L"\n \nThis is the radius of the explosive blast caused by\nthis explosive item.\n \nTargets will suffer less damage the further they are\nfrom the center of the explosion.\n \nHigher is better.",
- L"\n \nThis is the radius of the stun-blast caused by\nthis explosive item.\n \nTargets will suffer less damage the further they are\nfrom the center of the blast.\n \nHigher is better.",
- L"\n \nThis is the distance that the noise from this\ntrap will travel. Soldiers within this distance\nare likely to hear the noise and be alerted.\n \nHigher is better.",
- L"\n \nThis is the starting radius of the tear-gas\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the mustard-gas\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the light\nemitted by this explosive item.\n \nTiles close to the center of the effect will become\nvery bright, while tiles nearer the edge\nwill only be a little brighter than normal.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nAlso remember that unlike other explosives with\ntimed effects, the light effect gets SMALLER\nover time, until it disappears.\n \nHigher is better.",
- L"\n \nThis is the starting radius of the smoke\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn\n(if any), unless wearing a gas mask. More importantly,\nanyone inside the cloud becomes extremely difficult to spot,\nand also loses a large chunk of sight-range themselves.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the flames\ncaused by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn.\n \nAlso note the end radius and duration of the effect\n(displayed below).\n \nHigher is better.",
- L"\n \nThis is the final radius of the tear-gas released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the mustard-gas released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the light emitted\nby this explosive item before it dissipates.\n \nTiles close to the center of the effect will become\nvery bright, while tiles nearer the edge\nwill only be a little brighter than normal.\n \nAlso note the start radius and duration\nof the effect.\n \nAlso remember that unlike other explosives with\ntimed effects, the light effect gets SMALLER\nover time, until it disappears.\n \nHigher is better.",
- L"\n \nThis is the final radius of the smoke released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn\n(if any), unless wearing a gas mask. More importantly,\nanyone inside the cloud becomes extremely difficult to spot,\nand also loses a large chunk of sight-range themselves.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the flames caused\nby this explosive item before they dissipate.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn.\n \nAlso note the start radius and duration of the effect.\n \nHigher is better.",
- L"\n \nThis is the duration of the explosive effect.\n \nEach turn, the radius of the effect will grow by\none tile in every direction, until reaching\nthe listed End Radius.\n \nOnce the duration has been reached, the effect\ndissipates completely.\n \nNote that light-type explosives become SMALLER\nover time, unlike other effects.\n \nHigher is better.",
- L"\n \nThis is the distance (in Tiles) within which\nsoldiers and mercs will hear the explosion when\nit goes off.\n \nEnemies hearing the explosion will be alerted to your\npresence.\n \nLower is better.",
- L"\n \nThis value represents a chance (out of 100) for this\nexplosive to spontaneously explode whenever it is damaged\n(for instance, when other explosions go off nearby).\n \nCarrying highly-volatile explosives into combat\nis therefore extremely risky and should be avoided.\n \nScale: 0-100.\nLower is better.",
+ L"\n \nз€†з ґиѓЅе¤џйЂ ж€ђзљ„дј¤е®іеЂјгЂ‚\n \nжіЁж„Џз€†з‚ёећ‹з€†з ґе“ЃеЏЄиѓЅйЂ ж€ђдёЂж¬Ўдј¤е®іпј€ењЁиў«еј•\n爆时),而持з»ж•€жћњећ‹з€†з ґе“ЃжЇЏиЅ®йѓЅиѓЅйЂ ж€ђдј¤\n害,直到效果消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nз€†з ґиѓЅе¤џйЂ ж€ђзљ„зњ©ж™•дј¤е®іеЂјпј€йќћи‡ґе‘ЅжЂ§пј‰гЂ‚\n \nжіЁж„Џз€†з‚ёећ‹з€†з ґе“ЃеЏЄиѓЅйЂ ж€ђдёЂж¬Ўдј¤е®іпј€ењЁиў«еј•\n爆时),而持з»ж•€жћњећ‹з€†з ґе“ЃжЇЏиЅ®йѓЅиѓЅйЂ ж€ђдј¤\n害,直到效果消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓзљ„дј¤е®іжњ‰ж•€еЌЉеѕ„гЂ‚\n \n离爆炸дёеїѓж›ґиїњзљ„з›®ж ‡дјљеЏ—е€°ж›ґе°‘дј¤е®ігЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓзљ„зњ©ж™•дј¤е®іжњ‰ж•€еЌЉеѕ„гЂ‚\n \n离爆炸дёеїѓж›ґиїњзљ„з›®ж ‡дјљеЏ—е€°ж›ґе°‘дј¤е®ігЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐй™·й±еЏ‘出的噪音能够被听到的距离。\n \n在该距离之内的士兵会听到这个噪音并且и¦и§‰\n起来。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„催泪毒气的初始半径。\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\nз‰й‡Џзљ„дј¤е®ігЂ‚\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„иЉҐеђжЇ’ж°”зљ„е€ќе§‹еЌЉеѕ„гЂ‚\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\nз‰й‡Џзљ„дј¤е®ігЂ‚\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“ЃеЏ‘е‡єзљ„дє®е…‰зљ„е€ќе§‹еЌЉеѕ„гЂ‚\n \n离爆炸дёеїѓиѕѓиї‘зљ„ж јеђдјљеЏеѕ—йќћеёёдє®пјЊиЂЊжЋҐиї‘\nиѕ№зјзљ„ж јеђеЏЄдјљжЇ”е№іеёёдє®дёЂз‚№з‚№гЂ‚\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„зѓџй›ѕзљ„е€ќе§‹еЌЉеѕ„гЂ‚\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\n(如果有的话)з‰й‡Џзљ„伤害。更重要的жЇпјЊењЁ\nзѓџй›ѕдёзљ„人会极难被看到,但同时他们也会失\n去很大一部分视距。\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„зЃ«з„°зљ„е€ќе§‹еЌЉеѕ„гЂ‚\n \n在该半径之内的敌人每轮都会受到与列出的伤\nе®іеЂје’Њзњ©ж™•дј¤е®іеЂјз‰й‡Џзљ„дј¤е®ігЂ‚\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„催泪毒气消散前的最大\nеЌЉеѕ„гЂ‚\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\nз‰й‡Џзљ„дј¤е®ігЂ‚n \n请同时查看初始半径和有效时间。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕе‡єзљ„иЉҐеђжЇ’气消散前的最大\nеЌЉеѕ„гЂ‚\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\nз‰й‡Џзљ„дј¤е®ігЂ‚\n \n请同时查看初始半径和有效时间。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“ЃеЏ‘出的亮光消失前的半径。\n \n离爆炸дёеїѓиѕѓиї‘зљ„ж јеђдјљеЏеѕ—йќћеёёдє®пјЊиЂЊжЋҐиї‘\nиѕ№зјзљ„ж јеђеЏЄдјљжЇ”е№іеёёдє®дёЂз‚№з‚№гЂ‚\n \n请查看最大半径和有效时间(жѕз¤єењЁдё‹йќўпј‰гЂ‚\n \nд№џиЇ·и®°дЅЏдёЋе…¶д»–з€†з ґе“ЃдёЌеђЊзљ„жЇз…§жЋж•€жћњдјљйљЏ\n着时间流逝越来越小直到消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕзљ„烟雾消散前的最大半径。\n \n除非佩戴了йІжЇ’面具,否则在该半径之内的敌\nдєєжЇЏиЅ®йѓЅдјљеЏ—е€°дёЋе€—е‡єзљ„дј¤е®іеЂје’Њзњ©ж™•дј¤е®іеЂј\n(如果有的话)з‰й‡Џзљ„дј¤е®ігЂ‚\n更重要的жЇпјЊењЁзѓџй›ѕдёзљ„дєєдјљжћЃйљѕиў«зњ‹е€°пјЊдЅ†\n同时他们也会失去很大一部分视距。\n \n请同时查看初始半径和有效时间。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇиЇҐз€†з ґе“Ѓй‡Љж”ѕзљ„火焰熄зЃе‰Ќзљ„最大半径。\n \n在该半径之内的敌人每轮都会受到与列出的伤\nе®іеЂје’Њзњ©ж™•дј¤е®іеЂјз‰й‡Џзљ„дј¤е®ігЂ‚\n \n请同时查看初始半径和有效时间。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇз€†з‚ёж•€жћњзљ„жЊЃз»ж—¶й—ґгЂ‚\n \nз€†з‚ёж•€жћњзљ„иЊѓе›ґжЇЏиЅ®йѓЅдјљеђ‘ж‰Ђжњ‰зљ„ж–№еђ‘еўћеЉ дёЂ\nж јпјЊз›ґе€°еЌЉеѕ„иѕѕе€°е€—е‡єзљ„жњЂе¤§еЌЉеѕ„гЂ‚\n \nдёЂж—¦жЊЃз»ж—¶й—ґиї‡еЋ»пјЊз€†з‚ёж•€жћње°±дјље®Ње…Ёж¶€е¤±гЂ‚\n \nжіЁж„ЏдёЋе…¶д»–ж•€жћњдёЌеђЊпјЊдє®е…‰ж•€жћњдјљйљЏзќЂж—¶й—ґжµЃ\n逝越来越小。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇз€†з ґе“Ѓз€†з‚ёж—¶еЏ‘е‡єзљ„еЈ°йџіиѓЅе¤џиў«дЅЈе…µе’Њж•Њ\n军听到的距离。\n \nеђ¬е€°з€†з‚ёеЈ°зљ„ж•Ње†›дјљеЇџи§‰е€°дЅ зљ„дЅЌзЅ®гЂ‚\n \n该数值越低越好。",
+ L"\n \nиї™дёЄж•°еЂјд»ЈиЎЁиЇҐз€†з ґе“ЃеЏ—е€°дј¤е®ізљ„еђЊж—¶з€†з‚ёзљ„\nе‡ зЋ‡пј€жЇ”е¦‚еЅ“е…¶д»–з€†з ґе“ЃењЁиї‘е¤„з€†з‚ёж—¶пј‰гЂ‚\n \nжђєеё¦й«жЊҐеЏ‘жЂ§зљ„з€†з ґе“Ѓиї›е…Ґж€ж–—дјљжћЃе…¶еЌ±й™©пјЊ\n所以应当极力避免。\n \n数值范围:0~100,越低越好。",
};
STR16 szUDBGenSecondaryStatsTooltipText[]=
{
- L"|T|r|a|c|e|r |A|m|m|o",
- L"|A|n|t|i|-|T|a|n|k |A|m|m|o",
- L"|I|g|n|o|r|e|s |A|r|m|o|r",
- L"|A|c|i|d|i|c |A|m|m|o",
- L"|L|o|c|k|-|B|u|s|t|i|n|g |A|m|m|o",
- L"|R|e|s|i|s|t|a|n|t |t|o |E|x|p|l|o|s|i|v|e|s",
- L"|W|a|t|e|r|p|r|o|o|f",
- L"|E|l|e|c|t|r|o|n|i|c",
- L"|G|a|s |M|a|s|k",
- L"|N|e|e|d|s |B|a|t|t|e|r|i|e|s",
- L"|C|a|n |P|i|c|k |L|o|c|k|s",
- L"|C|a|n |C|u|t |W|i|r|e|s",
- L"|C|a|n |S|m|a|s|h |L|o|c|k|s",
- L"|M|e|t|a|l |D|e|t|e|c|t|o|r",
- L"|R|e|m|o|t|e |T|r|i|g|g|e|r",
- L"|R|e|m|o|t|e |D|e|t|o|n|a|t|o|r",
- L"|T|i|m|e|r |D|e|t|o|n|a|t|o|r",
- L"|C|o|n|t|a|i|n|s |G|a|s|o|l|i|n|e",
- L"|T|o|o|l |K|i|t",
- L"|T|h|e|r|m|a|l |O|p|t|i|c|s",
- L"|X|-|R|a|y |D|e|v|i|c|e",
- L"|C|o|n|t|a|i|n|s |D|r|i|n|k|i|n|g |W|a|t|e|r",
- L"|C|o|n|t|a|i|n|s |A|l|c|o|h|o|l",
- L"|F|i|r|s|t |A|i|d |K|i|t",
- L"|M|e|d|i|c|a|l |K|i|t",
- L"|L|o|c|k |B|o|m|b",
+ L"|ж›і|е…‰|еј№",
+ L"|еЏЌ|еќ¦|е…‹|еј№",
+ L"|з ґ|з”І",
+ L"|й…ё|и…ђ|еј№",
+ L"|з ґ|й”Ѓ|еј№",
+ L"|йІ|爆",
+ L"|йІ|ж°ґ",
+ L"|з”µ|еђ|дє§|е“Ѓ",
+ L"|йІ|жЇ’|йќў|е…·",
+ L"|йњЂ|и¦Ѓ|з”µ|ж± ",
+ L"|иѓЅ|е¤џ|ејЂ|й”Ѓ",
+ L"|иѓЅ|е¤џ|е‰Є|зєї",
+ L"|иѓЅ|е¤џ|ж’¬|й”Ѓ",
+ L"|金|属|探|测|器",
+ L"|иїњ|зЁ‹|爆|з ґ|иЈ…|зЅ®",
+ L"|иїњ|зЁ‹|爆|з ґ|еј•|дїЎ",
+ L"|е®љ|ж—¶|爆|з ґ|еј•|дїЎ",
+ L"|иЈ…|ж±Ѕ|жІ№",
+ L"|е·Ґ|е…·|з®±",
+ L"|зѓ|ж€ђ|еѓЏ|д»Є",
+ L"|X|е…‰|е°„|зєї|д»Є",
+ L"|装|饮|用|水",
+ L"|装|酒|精|饮|品",
+ L"|жЂҐ|ж•‘|еЊ…",
+ L"|еЊ»|иЌЇ|з®±",
+ L"|з ґ|й”Ѓ|з‚ё|еј№",
};
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
{
- L"\n \nThis ammo creates a tracer effect when firedin\nfull-auto or burst mode.\n \nTracer fire helps keep the volley accurate\nand thus deadly despite the gun's recoil.\n \nAlso, tracer bullets create paths of light that\ncan reveal a target in darkness. However, they\nalso reveal the shooter to the enemy!\n \nTracer Bullets automatically disable any\nMuzzle Flash Suppression items installed on the\nsame weapon.",
- L"\n \nThis ammo can damage the armor on a tank.\n \nAmmo WITHOUT this property will do no damage\nat all to tanks.\n \nEven with this property, remember that most guns\ndon't cause enough damage anyway, so don't\nexpect too much.",
- L"\n \nThis ammo ignores armor completely.\n \nWhen fired at an armored target, it will behave\nas though the target is completely unarmored,\nand thus transfer all its damage potential to the target!",
- L"\n \nWhen this ammo strikes the armor on a target,\n \nit will cause that armor to degrade rapidly.\n \nThis can potentially strip a target of its\narmor!",
- L"\n \nThis type of ammo is exceptional at breaking locks.\n \nFire it directly at a locked door or container\nto cause massive damage to the lock.",
- L"\n \nThis armor is three times more resistant\nagainst explosives than it should be, given\nits Protection value.\n \nWhen an explosion hits the armor, its Protection\nvalue is considered three times higher than\nthe listed value.",
- L"\n \nThis item is imprevious to water. It does not\nreceive damage from being submerged.\n \nItems WITHOUT this property will gradually deteriorate\nif the person carrying them goes for a swim.",
- L"\n \nThis item is electronic in nature, and contains\ncomplex circuitry.\n \nElectronic items are inherently more difficult\nto repair, at least without the ELECTRONICS skill.",
- L"\n \nWhen this item is worn on a character's face,\nit will protect them from all sorts of noxious gasses.\n \nNote that some gasses are corrosive, and might eat\nright through the mask...",
- L"\n \nThis item requires batteries. Without batteries,\nyou cannot activate its primary abilities.\n \nTo use a set of batteries, attach them to\nthis item as you would a scope to a rifle.",
- L"\n \nThis item can be used to pick open locked\ndoors or containers.\n \nLockpicking is silent, although it requires\nsubstantial mechanical skill to pick anything\nbut the simplest locks.",
- L"\n \nThis item can be used to cut through wire fences.\n \nThis allows a character to rapidly move through\nfenced areas, possibly outflanking the enemy!",
- L"\n \nThis item can be used to smash open locked\ndoors or containers.\n \nLock-smashing requires substantial strength,\ngenerates a lot of noise, and can easily\ntire a character out. However, it is a good\nway to get through locks without superior skills or\ncomplicated tools.",
- L"\n \nThis item can be used to detect metallic objects\nunder the ground.\n \nNaturally, its primary function is to detect\nmines without the necessary skills to spot them\nwith the naked eye.\n \nMaybe you'll find some buried treasure too.",
- L"\n \nThis item can be used to detonate a bomb\nwhich has been set with a remote detonator.\n \nPlant the bomb first, then use the\nRemote Trigger item to set it off when the\ntime is right.",
- L"\n \nWhen attached to an explosive device and set up\nin the right position, this detonator can be triggered\nby a (separate) remote device.\n \nRemote Detonators are great for setting traps,\nbecause they only go off when you tell them to.\n \nAlso, you have plenty of time to get away!",
- L"\n \nWhen attached to an explosive device and set up\nin the right position, this detonator will count down\nfrom the set amount of time, and explode once the\ntimer expires.\n \nTimer Detonators are cheap and easy to install,\nbut you'll need to time them just right to give\nyourself enough chance to get away!",
- L"\n \nThis item contains gasoline (fuel).\n \nIt might come in handy if you ever\nneed to fill up a gas tank...",
- L"\n \nThis item contains various tools that can\nbe used to repair other items.\n \nA toolkit item is always required when setting\na character to repair duty.",
- L"\n \nWhen worn in a face-slot, this item provides\nthe ability to spot enemies through walls,\nthanks to their heat signature.",
- L"\n \nThis powerful device can be used to scan\nfor enemies using X-rays.\n \nIt will reveal all enemies within a certain radius\nfor a short period of time.\n \nKeep away from reproductive organs!",
- L"\n \nThis item contains fresh drinking water.\nUse when thirsty.",
- L"\n \nThis item contains liquor, alcohol, booze,\nwhatever you fancy calling it.\n \nUse with caution. Do not drink and drive.\nMay cause cirrhosis of the liver.",
- L"\n \nThis is a basic field medical kit, containing\nitems required to provide basic medical aid.\n \nIt can be used to bandage wounded characters\nand prevent bleeding.\n \nFor actual healing, use a proper Medical Kit\nand/or plenty of rest.",
- L"\n \nThis is a proper medical kit, which can\nbe used in surgery and other serious medicinal\npurposes.\n \nMedical Kits are always required when setting\na character to Doctoring duty.",
- L"\n \nThis item can be used to blast open locked\ndoors and containers.\n \nExplosives skill is required to avoid\npremature detonation.\n \nBlowing locks is a relatively easy way of quickly\ngetting through locked doors. However,\nit is very loud, and dangerous to most characters.",
+ L"\n \nењЁз‚№е°„ж€–иЂ…иїће°„ж—¶пјЊж›іе…‰еј№дјљдє§з”џж›іе…‰ж•€жћњгЂ‚\n \nз”±дєЋж›іе…‰иѓЅе¤џеё®еЉ©жЊЃжћЄиЂ…ж Ўе‡†пјЊж‰Ђд»ҐеЌідЅїиЂѓи™‘\nеђЋеє§еЉ›пјЊиЇҐеђеј№жќЂдј¤д»ЌжЇи‡ґе‘Ѕзљ„пј›ж›іе…‰еј№дє§з”џ\nзљ„е…‰д№џиѓЅе¤џењЁй»‘жљ—дёз…§дє®з›®ж ‡гЂ‚\n \nдЅ†жЇж›іе…‰еј№д№џдјље°†е°„手的位置暴露予敌人!\n \nж›іе…‰еј№дјљжЉµж¶€жћЄеЏЈж¶€з„°е™Ёзљ„ж•€жћњгЂ‚",
+ L"\n \nиї™з§Ќеђеј№иѓЅе¤џеЇ№еќ¦е…‹зљ„иЈ…з”ІйЂ ж€ђдј¤е®ігЂ‚\n \nжІЎжњ‰з©їз”Іе±ћжЂ§зљ„еђеј№дёЌиѓЅеЇ№еќ¦е…‹йЂ ж€ђд»»дЅ•дј¤е®ігЂ‚\n \n但即使有穿甲属性,大部分枪械的伤害力仍然\n不足,所以对这种еђеј№дёЌи¦ЃжЉ±е¤Єе¤§зљ„жњџжњ›гЂ‚",
+ L"\n \nиї™з§Ќеђеј№е®Ње…Ёж— 视йІеј№иЈ…з”ІгЂ‚\n \nеЌідЅїз›®ж ‡з©їзќЂйІеј№иЎЈпјЊиў«иЇҐеђеј№е‡»дёд»Ќз„¶жЇж— жµЋ\nдєЋдє‹пјЊе®ѓд»Ќз„¶иѓЅе°†ж‰Ђжњ‰дј¤е®іиЅ¬еЊ–и‡із›®ж ‡иє«дёЉпјЃ",
+ L"\n \nиї™з§Ќеђеј№ењЁе‡»дёз›®ж ‡иє«дёЉзљ„йІеј№иЈ…з”Іж—¶дјљдЅїиЇҐ\nиЈ…з”Іеї«йЂџжЌџеќЏгЂ‚\n \nд№џеЏЇиѓЅе®Ње…Ёз ґеќЏз›®ж ‡иє«дёЉзљ„йІеј№иЈ…з”ІгЂ‚",
+ L"\n \nиї™з§Ќеђеј№еЇ№дєЋз ґй”Ѓжњ‰з‰№ж•€гЂ‚\n \nе®ѓиѓЅе¤џеЇ№й—Ёй”Ѓж€–иЂ…е…¶д»–е®№е™Ёзљ„й”ЃйЂ ж€ђдёҐй‡Ќдј¤е®ігЂ‚",
+ L"\n \nиї™з§ЌйІеј№иЈ…з”ІеЇ№з€†з ґзљ„йІеѕЎеЉ›жЇеЋџз‰€зљ„е››еЂЌгЂ‚\n \nењЁз€†з ґе“Ѓдј¤е®іе€°иЇҐиЈ…з”Іж—¶пјЊе®ѓзљ„йІеѕЎж•°еЂјжЊ‰з…§\nиЈ…з”Іе±ћжЂ§дёе€—е‡єж•°еЂјзљ„е››еЂЌи®Ўз®—гЂ‚",
+ L"\n \n该物品йІж°ґгЂ‚\n \nе®ѓдёЌдјље› дёєжµёжІЎењЁж°ґдёиЂЊеЏ—жЌџгЂ‚жІЎжњ‰иЇҐе±ћжЂ§зљ„\n物品会在持有者游泳时慢慢受损。",
+ L"\n \n该物品жЇз”µеђдє§е“ЃпјЊеђ«жњ‰е¤Ќжќ‚з”µи·ЇгЂ‚\n \nз”µеђдє§е“ЃењЁз»ґдї®иЂ…жІЎжњ‰з”µеђжЉЂиѓЅж—¶еѕ€йљѕиў«дї®е¤Ќ\nгЂ‚",
+ L"\n \n该物品佩戴于面部时,能够使佩戴者不受任何\nжњ‰жЇ’ж°”дЅ“зљ„дј¤е®ігЂ‚\n \nи®°дЅЏжњ‰дє›ж°”дЅ“жЇи…ђиљЂжЂ§зљ„,它们可以通过腐蚀\nдЅњз”Ёз©їиї‡иї™дёЄйќўзЅ©гЂ‚",
+ L"\n \nиЇҐз‰©е“ЃйњЂи¦Ѓз”µж± гЂ‚жІЎжњ‰е®‰иЈ…з”µж± ж—¶дЅїз”ЁиЂ…дёЌ\n能开启这个物品的主要功能。\n \nеЏЄи¦ЃжЉЉж‰ЂйњЂз”µж± е®‰иЈ…дєЋиЇҐз‰©е“Ѓзљ„й™„д»¶ж ЏеЌіеЏЇ\nпј€жҐйЄ¤дёЋе°†зћ„准镜安装在жҐжћЄдёЉдёЂж ·пј‰гЂ‚",
+ L"\n \n该物品能够用于开锁。\n \nпј€з”ЁжЉЂе·§пј‰ејЂй”ЃдёЌдјљеЏ‘е‡єеЈ°йџіпјЊдЅ†жЇејЂзЁЌеѕ®е¤Ќ\nжќ‚дёЂдє›зљ„й”ЃйњЂи¦Ѓеѕ€й«зљ„жњєжў°иѓЅеЉ›гЂ‚",
+ L"\n \n该物品能够绞ж–й“ЃдёќзЅ‘гЂ‚\n \n佣兵能够快速穿越用铁丝网封锁的地区,以便\n包围敌人!",
+ L"\n \n该物品能够用于撬锁。\n \n(用力量)撬锁需要很大的力量,在发出很大\nе™Єйџізљ„еђЊж—¶иЂ—иґ№дЅЈе…µзљ„дЅ“еЉ›гЂ‚дЅ†жЇењЁжІЎжњ‰е‡єи‰І\nзљ„жЉЂе·§е’Ње¤Ќжќ‚зљ„е·Ґе…·ж—¶пјЊз”ЁеЉ›й‡Џж’¬й”Ѓд№џжЇжЋж™є\n之举。",
+ L"\n \n该物品能够探测地下的金属物品。\n \n原本它主要用于在没有肉眼识别能力时探测地\nй›·гЂ‚дЅ†жЇдЅ д№џеЏЇиѓЅеЏ‘зЋ°еџ‹ењЁењ°дё‹зљ„е®ќи—ЏгЂ‚",
+ L"\n \n该物品能够用来引爆已经安装远程引信的炸弹\n。\n \n先放置炸弹,时机一到再用它引爆。",
+ L"\n \nе®‰иЈ…иЇҐеј•дїЎзљ„з€†з ґз‰©дёЂж—¦иў«и®ѕзЅ®ењЁжЈзЎ®зљ„дЅЌзЅ®\n,可以被(另一个)远程控制器引爆。\n \nиїњзЁ‹еј•дїЎжЇй™·й±зљ„дёЌдєЊйЂ‰ж‹©пјЊе®ѓеЏЄдјљењЁдЅ йњЂи¦Ѓ\nе®ѓз€†з‚ёзљ„ж—¶еЂ™иў«еј•з€†пјЊе№¶дё”дЅ жњ‰и¶іе¤џзљ„ж—¶й—ґи·‘\nејЂпјЃ",
+ L"\n \nе®‰иЈ…иЇҐеј•дїЎзљ„з€†з ґз‰©дёЂж—¦иў«и®ѕзЅ®ењЁжЈзЎ®зљ„дЅЌзЅ®\nпјЊиЇҐеј•дїЎдјљеЂ’ж•°и®Ўж—¶пјЊе№¶ењЁи®ѕзЅ®зљ„ж—¶й—ґи®Ўе®ЊеђЋ\n引爆。\n \nи®Ўж—¶еј•дїЎдѕїе®ње№¶дё”ж“于安装,但жЇдЅ еї…йЎ»з»™е®ѓ\nе®љдёЉи¶іе¤џзљ„ж—¶й—ґд»ҐдѕїдЅ иѓЅе¤џи·‘ејЂпјЃ",
+ L"\n \n该物品装满汽油。\n \nењЁдЅ йњЂи¦ЃеЉ жІ№ж—¶дЅїз”ЁгЂ‚",
+ L"\n \n该工具箱装有各种能用来修复其他物品的工具。\n \n设置佣兵进行修复工作时该佣兵必须持有工具\n箱。",
+ L"\n \n该物品佩戴于面部。\n \n利用зѓж€ђеѓЏеЋџзђ†пјЊиѓЅе¤џжЏђдѕ›з©їеў™зґўж•Њзљ„еЉџиѓЅгЂ‚",
+ L"\n \n这种功能强大的仪器利用X光搜索敌军。\n \n它可以在зџж—¶й—ґе†…暴露一定范围дёзљ„ж•ЊдєєдЅЌзЅ®гЂ‚\n使用时请远离生殖器!",
+ L"\n \n该物品装满饮用水。\n \n口渴时请用。",
+ L"\n \n该物品装满美酒、酒精饮料、洋酒、еїеїдЅ еЏ«\nе®ѓд»Ђд№€йѓЅиЎЊгЂ‚\n \n适量饮用,不要酒后驾驶,小心肝!",
+ L"\n \nиЇҐж€ењєжЂҐж•‘еЊ…жЏђдѕ›еџєжњ¬зљ„еЊ»з–—з”Ёе“ЃгЂ‚\n \n它能够被用来包扎受伤的佣兵以жўиЎЂгЂ‚\n \n如需要回复生命,请使用医药箱并注意休息。",
+ L"\n \n该医药箱用于外科手术或其他复杂的治疗。\n \n设置佣兵进行医生工作时,该佣兵必须持有医\n药箱。",
+ L"\n \nиЇҐз‰©е“ЃиѓЅе¤џз”ЁдєЋз ґй”ЃгЂ‚\n \nдЅїз”Ёе®ѓйњЂи¦Ѓз€†з ґжЉЂиѓЅд»ҐйЃїе…Ќиї‡ж—©еј•з€†гЂ‚\n \nдЅїз”Ёз‚ёиЌЇжЇдёЂдёЄз›ёеЇ№з®ЂеЌ•зљ„з ґй”Ѓж‰‹ж®µпјЊдЅ†жЇдјљ\n发出很大噪音,并且对于大部分佣兵来说过于\nеЌ±й™©гЂ‚",
};
STR16 szUDBAdvStatsTooltipText[]=
{
- L"|A|c|c|u|r|a|c|y |M|o|d|i|f|i|e|r",
- L"|F|l|a|t |S|n|a|p|s|h|o|t |M|o|d|i|f|i|e|r",
- L"|P|e|r|c|e|n|t |S|n|a|p|s|h|o|t |M|o|d|i|f|i|e|r",
- L"|F|l|a|t |A|i|m|i|n|g |M|o|d|i|f|i|e|r",
- L"|P|e|r|c|e|n|t |A|i|m|i|n|g |M|o|d|i|f|i|e|r",
- L"|A|l|l|o|w|e|d |A|i|m|i|n|g |L|e|v|e|l|s |M|o|d|i|f|i|e|r",
- L"|A|i|m|i|n|g |C|a|p |M|o|d|i|f|i|e|r",
- L"|G|u|n |H|a|n|d|l|i|n|g |M|o|d|i|f|i|e|r",
- L"|D|r|o|p |C|o|m|p|e|n|s|a|t|i|o|n |M|o|d|i|f|i|e|r",
- L"|T|a|r|g|e|t |T|r|a|c|k|i|n|g |M|o|d|i|f|i|e|r",
- L"|D|a|m|a|g|e |M|o|d|i|f|i|e|r",
- L"|M|e|l|e|e |D|a|m|a|g|e |M|o|d|i|f|i|e|r",
- L"|R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|S|c|o|p|e |M|a|g|n|i|f|i|c|a|t|i|o|n |F|a|c|t|o|r",
- L"|P|r|o|j|e|c|t|i|o|n |F|a|c|t|o|r",
- L"|L|a|t|e|r|a|l |R|e|c|o|i|l |M|o|d|i|f|i|e|r",
- L"|V|e|r|t|i|c|a|l |R|e|c|o|i|l |M|o|d|i|f|i|e|r",
- L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e |M|o|d|i|f|i|e|r",
- L"|C|o|u|n|t|e|r|-|F|o|r|c|e |A|c|c|u|r|a|c|y |M|o|d|i|f|i|e|r",
- L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y |M|o|d|i|f|i|e|r",
- L"|T|o|t|a|l |A|P |M|o|d|i|f|i|e|r",
- L"|A|P|-|t|o|-|R|e|a|d|y |M|o|d|i|f|i|e|r",
- L"|S|i|n|g|l|e|-|a|t|t|a|c|k |A|P |M|o|d|i|f|i|e|r",
- L"|B|u|r|s|t |A|P |M|o|d|i|f|i|e|r",
- L"|A|u|t|o|f|i|r|e |A|P |M|o|d|i|f|i|e|r",
- L"|R|e|l|o|a|d |A|P |M|o|d|i|f|i|e|r",
- L"|M|a|g|a|z|i|n|e |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|B|u|r|s|t |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|H|i|d|d|e|n |M|u|z|z|l|e |F|l|a|s|h",
- L"|L|o|u|d|n|e|s|s |M|o|d|i|f|i|e|r",
- L"|I|t|e|m |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|R|e|l|i|a|b|i|l|i|t|y |M|o|d|i|f|i|e|r",
- L"|W|o|o|d|l|a|n|d |C|a|m|o|u|f|l|a|g|e",
- L"|U|r|b|a|n |C|a|m|o|u|f|l|a|g|e",
- L"|D|e|s|e|r|t |C|a|m|o|u|f|l|a|g|e",
- L"|S|n|o|w |C|a|m|o|u|f|l|a|g|e",
- L"|S|t|e|a|l|t|h |M|o|d|i|f|i|e|r",
- L"|H|e|a|r|i|n|g |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|G|e|n|e|r|a|l |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|N|i|g|h|t|-|t|i|m|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|D|a|y|-|t|i|m|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|зІѕ|еє¦|дї®|жЈ",
+ L"|йЂџ|е°„|зІѕ|еє¦|дї®|жЈ|еЂј",
+ L"|йЂџ|е°„|зІѕ|еє¦|дї®|жЈ|з™ѕ|分|жЇ”",
+ L"|зІѕ|зћ„|дї®|жЈ|еЂј",
+ L"|зІѕ|зћ„|дї®|жЈ|з™ѕ|分|жЇ”",
+ L"|зІѕ|зћ„|з‰|зє§|дї®|жЈ",
+ L"|зІѕ|зћ„|дёЉ|й™ђ|дї®|жЈ",
+ L"|жћЄ|жў°|дЅї|з”Ё|дї®|жЈ",
+ L"|еј№|йЃ“|дё‹|еќ |дї®|жЈ",
+ L"|зћ„|准|иЇЇ|е·®|дї®|жЈ",
+ L"|жќЂ|дј¤|еЉ›|дї®|жЈ",
+ L"|иї‘|ж€|жќЂ|дј¤|еЉ›|дї®|жЈ",
+ L"|е°„|зЁ‹|дї®|жЈ",
+ L"|瞄|准|镜|倍|率",
+ L"|зєў|з‚№|ж•€|жћњ",
+ L"|ж°ґ|е№і|еђЋ|еќђ|еЉ›|дї®|жЈ",
+ L"|ећ‚|直|еђЋ|еќђ|еЉ›|дї®|жЈ",
+ L"|жњЂ|大|е€¶|йЂЂ|еЉ›|дї®|жЈ",
+ L"|е€¶|йЂЂ|еЉ›|зІѕ|еє¦|дї®|жЈ",
+ L"|е€¶|йЂЂ|еЉ›|йў‘|ж¬Ў|дї®|жЈ",
+ L"|A|P|жЂ»|й‡Џ|дї®|жЈ",
+ L"|дёѕ|жћЄ|A|P|дї®|жЈ",
+ L"|еЌ•|еЏ‘|A|P|дї®|жЈ",
+ L"|з‚№|е°„|A|P|дї®|жЈ",
+ L"|иїћ|еЏ‘|A|P|дї®|жЈ",
+ L"|дёЉ|еј№|A|P|дї®|жЈ",
+ L"|еј№|夹|е®№|й‡Џ|дї®|жЈ",
+ L"|з‚№|е°„|еј№|ж•°|дї®|жЈ",
+ L"|ж¶€|з„°",
+ L"|е™Є|йџі|дї®|жЈ",
+ L"|物|е“Ѓ|е°є|еЇё|дї®|жЈ",
+ L"|еЏЇ|йќ |жЂ§|дї®|жЈ",
+ L"|дё›|жћ—|иї·|еЅ©",
+ L"|еџЋ|её‚|иї·|еЅ©",
+ L"|жІ™|жј |иї·|еЅ©",
+ L"|й›Є|ењ°|иї·|еЅ©",
+ L"|жЅњ|иЎЊ|дї®|жЈ",
+ L"|еђ¬|觉|и·ќ|离|дї®|жЈ",
+ L"|视|и·ќ|дї®|жЈ",
+ L"|е¤њ|ж™љ|视|и·ќ|дї®|жЈ",
+ L"|з™Ѕ|天|视|и·ќ|дї®|жЈ",
+ L"|й«|е…‰|视|и·ќ|дї®|жЈ",
+ L"|жґћ|з©ґ|视|и·ќ|дї®|жЈ",
+ L"|隧|道|视|野|效|应",
+ L"|最|大|制|退|力",
+ L"|е€¶|йЂЂ|еЉ›|йў‘|ж¬Ў",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
STR16 szUDBAdvStatsExplanationsTooltipText[]=
{
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Accuracy value.\n \nIncreased accuracy allows the gun to hit targets\nat longer ranges more often, assuming it is\nalso well-aimed.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the shooter's accuracy\nfor ANY shot with a ranged weapon by the\nlisted amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the shooter's accuracy\nfor ANY shot with a ranged weapon by the\nlisted percentage, based on their original accuracy.\n \nHigher is better.",
- L"\n \nThis item modifies the accuracy gained from each\nextra aiming level you pay for, when aiming\na ranged weapon, by the\nlisted amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the accuracy gained from each\nextra aiming level you pay for, when aiming\na ranged weapon, by the\nlisted percentage based on the original value.\n \nHigher is better.",
- L"\n \nThis item modifies the number of extra aiming\nlevels this gun can take.\n \nReducing the number of allowed aiming levels\nmeans that each level adds proportionally\nmore accuracy to the shot.\nTherefore, the FEWER aiming levels are allowed,\nthe faster you can aim this gun, without losing\naccuracy!\n \nLower is better.",
- L"\n \nThis item modifies the shooter's maximum accuracy\nwhen using ranged weapons, as a percentage\nof their original maximum accuracy.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Handling difficulty.\n \nBetter handling makes the gun more accurate to fire,\nwith or without extra aiming.\n \nNote that this is based on the gun's original\nGun Handling factor, which is higher for rifles and\nheavy weapons, and lower for pistols and small\nweapons.\n \nLower is better.",
- L"\n \nThis item modifies the difficulty of\ncompensating for shots beyond a weapon's range.\n \nA high bonus here can increase a weapon's\nnatural Maximum Range by at least a few tiles.\n \nHigher is better.",
- L"\n \nThis item modifies the difficulty of hitting\na moving target with a ranged weapon.\n \nA high bonus here can help hitting\nfast-moving targets, even at a distance.\n \nHigher is better.",
- L"\n \nThis item modifies the damage output of\nyour weapon, by the listed amount.\n \nHigher is better.",
- L"\n \nThis item modifies the damage output of\nyour melee weapon, by the listed amount.\n \nThis applies only to melee weapons, both sharp\nand blunt.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies its maximum effective range.\n \nMaximum Range mainly dictates how far a bullet\nfired from the weapon can fly before it begins\ndropping sharply towards the ground.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nprovides extra magnification, making shots at a distance\ncomparatively easier to make.\n \nNote that a high Magnification Factor is detrimental\nwhen used at targets CLOSER than the\noptimal distance.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nprojects a dot on the target, making it easier to hit.\n \nThe projection effect is only useful up to a given\ndistance, beyond which it begins to diminish and\neventually disappears.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon capable\nof Burst or Autofire modes, this item modifies\nthe weapon's Horizontal Recoil\nby the listed percentage.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable\nof Burst or Autofire modes, this item modifies\nthe weapon's Vertical Recoil\nby the listed percentage.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis item modifies the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nWhen high, this can help a shooter to control\nguns with powerful recoil, even if the shooter\nhas low Strength.\n \nHigher is better.",
- L"\n \nThis item modifies the shooter's ability to\naccurately apply counter-force against a gun's\nrecoil, during Burst or Autofire volleys.\n \nA high bonus helps the shooter bring the gun's muzzle\nprecisely towards the target, even at longer ranges,\nmaking volleys more accurate as a result.\n \nHigher is better.",
- L"\n \nThis item modifies the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nHigher frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nHigher is better.",
- L"\n \nThis item directly modifies the amount of\nAPs the character gets at the start of each turn.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifiest the AP cost to bring the weapon to\n'Ready' mode.\n \nLower is better.",
- L"\n \nWhen attached to any weapon, this item\nmodifies the AP cost to make a single attack with\nthat weapon.\n \nNote that for Burst/Auto-capable weapons, the\ncost of using these modes is directly influenced\nby this modifier as well!\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable of\nBurst-fire mode, this item modifies the AP cost\nof firing a Burst.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable of\nAuto-fire mode, this item modifies the AP cost\nof firing an Autofire Volley.\n \nNote that it does NOT modify the extra AP\ncost for adding bullets to the volley, only\nthe initial cost for starting the volley.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the AP cost of reloading the weapon.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nchanges the size of magazines that can be loaded\ninto the weapon.\n \nThat weapon will now accept larger or smaller\nmagazines of the same caliber.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the amount of bullets fired\nby the weapon in Burst mode.\n \nIf the weapon was not initially Burst-Capable, and the\nmodifier is positive, attaching it to the weapon\nwill enable burst-fire mode.\n \nConversely, if the weapon is initially Burst-Capable,\na high-enough negative modifier here can disable\nburst mode completely.\n \nHigher is USUALLY better. Of course, part of the\npoint in Burst Mode is to conserve bullets...",
- L"\n \nWhen attached to a ranged weapon, this item\nwill hide the weapon's muzzle flash.\n \nThis makes sure that enemies cannot spot the shooter\nif he is firing while hidden, and is especially\nimportant at night.",
- L"\n \nWhen attached to a weapon, this item modifies\nthe range at which firing the weapon can be\nheard by both enemies and mercs.\n \nIf this modifier drops the weapon's Loudness value\nto 0, the weapon becomes completely silent.\n \nLower is better.",
- L"\n \nThis item modifies the size of any item it\nis attached to.\n \nSize is important when using the New Inventory system,\nwhere pockets only accept items of specific sizes and shapes.\n \nIncreasing an item's size makes it too big for some pockets\nit used to fit into.\n \nConversely, making an item smaller means it will fit into\nmore pockets, and pockets will be able to contain\nmore of it.\n \nLower is generall better.",
- L"\n \nWhen attached to any weapon, this item modifies\nthat weapon's Reliability value.\n \nIf positive, the weapon's condition will deteriorate\nslower when used in combat. Otherwise, the\nweapon deteriorates faster.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nwoodland backgrounds.\n \nTo make good on a positive Woodland Camo modifier, the\nwearer needs to stay close to trees or tall grass.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nurban backgrounds.\n \nTo make good on a positive Urban Camo modifier, the\nwearer needs to stay close to asphalt or concrete.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\ndesert backgrounds.\n \nTo make good on a positive Desert Camo modifier, the\nwearer needs to stay close to sand, gravel, or\ndesert vegetation.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nsnowy backgrounds.\n \nTo make good on a positive Snow Camo modifier, the\nwearer needs to stay close to snowy tiles.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's stealth ability by\nmaking it more difficult to HEAR the character moving\nwhile in Sneaking mode.\n \nNote that this does NOT change a character's visibility,\nonly the amount of noise they make while sneaking.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Hearing Range by the\nlisted number of tiles.\n \nA positive bonus makes it possible to hear noises\nfrom a greater distance.\n \nConversely, a negative modifier impairs the wearer's hearing.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis General modifier works in all conditions.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Night-Vision modifier works only when light\nlevels are sufficiently low.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Day-Vision modifier works only when light\nlevels are average or higher.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈж¦е™Ёзљ„зІѕ\nеє¦гЂ‚\n \nжЏђй«зІѕеє¦иѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕдёиїњ\nи·ќз¦»зљ„з›®ж ‡гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品按照数值修жЈе°„手使用远程ж¦е™Ёж‰“е‡єеЋ»\nзљ„жЇЏйў—еђеј№зљ„зІѕеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品按照百分比修жЈе°„手使用远程ж¦е™Ёж‰“е‡є\nеЋ»зљ„жЇЏйў—еђеј№зљ„зІѕеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品按照数值修жЈе°„手使用远程ж¦е™Ёзћ„准时,\nжЇЏж¬ЎзІѕзћ„ж‰ЂеўћеЉ зљ„зІѕеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品按照百分比修жЈе°„手使用远程ж¦е™Ёзћ„准\nж—¶пјЊжЇЏж¬ЎзІѕзћ„ж‰ЂеўћеЉ зљ„зІѕеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈиЇҐж¦е™Ёзљ„зІѕзћ„з‰зє§гЂ‚\n \nе‡Џе°‘зІѕзћ„з‰зє§ж„Џе‘ізќЂжЇЏдёЂж¬ЎзІѕзћ„дјљеўћеЉ ж›ґе¤љзљ„\nзІѕеє¦гЂ‚е› ж¤пјЊи™Ѕз„¶зІѕзћ„з‰зє§е‡Џе°‘дє†пјЊдЅ†иї™д»¶ж¦\n器可以在不损精度的情况下快速瞄准。\n \n该数值越低越好。",
+ L"\n \n该物品按照百分比修жЈе°„手使用远程ж¦е™Ёж—¶иѓЅ\n达到的最大精度。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈж¦е™Ёзљ„ж“Ќ\nжЋ§йљѕеє¦гЂ‚\n \nж“дєЋж“ЌжЋ§дЅїиЇҐж¦е™ЁдёЌи®єжњ‰жІЎжњ‰иї›иЎЊзІѕзћ„йѓЅж›ґеЉ \n准确。\n \nжіЁж„ЏиЇҐдї®жЈжЇеџєдєЋж¦е™Ёе€ќе§‹зљ„ж“ЌжЋ§йљѕеє¦пјЊжҐжћЄ\nе’Њй‡Ќж¦е™Ёйљѕеє¦й«иЂЊж‰‹жћЄе’ЊиЅ»ж¦е™Ёйљѕеє¦дЅЋгЂ‚\n \n该数值越低越好。",
+ L"\n \n该物品修жЈи¶…е°„и·ќе‘Ѕдёзљ„йљѕеє¦гЂ‚\n \nй«дї®жЈеЂјз›ёеЅ“дєЋеўћеЉ дє†ж¦е™Ёзљ„жњЂе¤§е°„зЁ‹и‡іе°‘е‡ \nдёЄж јгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈе‘Ѕдёз§»еЉЁз›®ж ‡зљ„йљѕеє¦гЂ‚\n \nй«дї®жЈеЂјиѓЅе¤џењЁиѕѓиїњзљ„и·ќз¦»дёЉеўћеЉ е‘Ѕдёз§»еЉЁз›®\nж ‡зљ„е‡ зЋ‡гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈж¦е™Ёдј¤е®іеЂјгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈж¦е™Ёзљ„иї‘ж€дј¤е®іеЂјгЂ‚\n \nиЇҐдї®жЈеЂјеЏЄдЅњз”ЁдєЋиї‘ж€ж¦е™ЁпјЊж— и®єжЇе€©е™ЁиїжЇ\nй’ќе™ЁгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈиЇҐж¦е™Ёзљ„\n最大射程。\n \n最大射程жЇжЊ‡еђеј№жЋжѕеќ 落前所飞行的距离。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“ЃжЏђдѕ›йўќе¤–зљ„зћ„\n准倍率,使远距离射击更容ж“е‘ЅдёгЂ‚\n \nжіЁж„ЏењЁз›®ж ‡жЇ”жњЂдЅізћ„е‡†и·ќз¦»иї‘ж—¶пјЊй«еЂЌзЋ‡еЇ№дєЋ\n瞄准жЇдёЌе€©зљ„гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“ЃењЁз›®ж ‡иє«дёЉжЉ•\n影出一个红点,让其更容ж“иў«е‘ЅдёгЂ‚\n \n红点效果只能在指定距离内使用,超过该距离\n光点就会暗淡直到最终消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于可点射或可连发的远程ж¦е™ЁдёЉж—¶пјЊиЇҐ\n物品按照百分比修жЈиЇҐж¦е™Ёзљ„ж°ґе№іеђЋеє§еЉ›гЂ‚\n \n在点射或连发时,降低后坐力可以帮助射手一\nз›ґдїќжЊЃжћЄеЏЈеЇ№е‡†з›®ж ‡гЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于可点射或可连发的远程ж¦е™ЁдёЉж—¶пјЊиЇҐ\n物品按照百分比修жЈиЇҐж¦е™Ёзљ„垂直后座力。\n \n在点射或连发时,降低后坐力可以帮助射手一\nз›ґдїќжЊЃжћЄеЏЈеЇ№е‡†з›®ж ‡гЂ‚\n \n该数值越低越好。",
+ L"\n \n该物品修жЈе°„手在点射或者连发时,制退后坐\nеЉ›зљ„иѓЅеЉ›гЂ‚\n \nй«дї®жЈеЂјиѓЅеё®еЉ©е°„手控制强大后坐力的ж¦е™ЁпјЊ\n哪怕射手力量很低。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈе°„手在点射或者连发时,运用反作\nз”ЁеЉ›е€¶йЂЂеђЋеќђеЉ›зљ„зІѕзЎ®еє¦гЂ‚\n \nй«дї®жЈеЂјиѓЅеё®еЉ©е°„ж‰‹з»ґжЊЃжћЄеЏЈе§‹з»€жњќеђ‘з›®ж ‡пјЊ\nе“ЄжЂ•з›®ж ‡иѕѓиїњпјЊд№џиѓЅжЏђеЌ‡зІѕеє¦гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品修жЈе°„手在点射或者连发时,频繁估量\n制退力大小的能力。\n \nй«дї®жЈеЂјиѓЅе¤џжЏђй«еђеј№зљ„总体精度,在射手能\nжЈзЎ®е€¶йЂЂеђЋеќђеЉ›зљ„前提下,远距离的连发也更\nиѓЅеЉ е‡†зЎ®гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n该物品直接修жЈдЅЈе…µжЇЏе›ћеђ€зљ„е€ќе§‹APй‡ЏгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈдёѕжћЄAPгЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈеЌ•еЏ‘APгЂ‚\n \n注意对于可以点射或连发的ж¦е™ЁжќҐиЇґпјЊиЇҐз‰©е“Ѓ\nд№џдјљдї®жЈз‚№е°„е’ЊиїћеЏ‘APгЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈз‚№е°„APгЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈиїћеЏ‘APгЂ‚\n \nжіЁж„ЏпјЊиї™дёЌж”№еЏиїћеЏ‘еўћеЉ еђеј№ж—¶зљ„APж¶€иЂ—пјЊеЏЄ\nеЅ±е“ЌиїћеЏ‘ж—¶APзљ„е€ќе§‹ж¶€иЂ—гЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈдёЉеј№APгЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈиЇҐж¦е™Ёзљ„\n弹夹容量。\n \nиЇҐж¦е™ЁдѕїиѓЅе¤џдЅїз”Ёз›ёеђЊеЏЈеѕ„的不同容量的弹夹。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈиЇҐж¦е™ЁењЁ\nз‚№е°„ж—¶еЏ‘е°„зљ„еђеј№ж•°гЂ‚\n \n如果该ж¦е™ЁдёЌиѓЅз‚№е°„иЂЊж¤дї®жЈеЂјдёєжЈпјЊиЇҐз‰©е“Ѓ\nдјљдЅїж¦е™ЁиѓЅе¤џз‚№е°„гЂ‚\n \n相反,如果该ж¦е™ЁеЋџжњ¬иѓЅе¤џз‚№е°„пјЊиЂЊж¤дї®жЈеЂј\n为负,该物品可能使ж¦е™Ёе¤±еЋ»з‚№е°„иѓЅеЉ›гЂ‚\n \n该数值一般越й«и¶ЉеҐЅгЂ‚еЅ“з„¶иїћеЏ‘ж—¶д№џйњЂи¦ЃжіЁж„Џ\nиЉ‚зњЃеј№иЌЇгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“ЃиѓЅе¤џйљђи—ЏиЇҐж¦\nе™Ёзљ„жћЄз„°гЂ‚.\n \n当射手在隐蔽的地方开枪,将不会被敌人发现\nпјЊиї™ењЁе¤њж€дёеѕ€й‡Ќи¦ЃгЂ‚",
+ L"\n \n当安装于ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈдЅїз”ЁиЇҐж¦е™Ёж—¶\n发出的噪音能被敌人和佣兵发觉的距离。\n \n如果该修жЈеЂје°†ж¦е™Ёзљ„е™Єйџіж•°еЂје‰Ље‡Џи‡і0пјЊй‚Ј\nд№€иЇҐж¦е™Ёе°±иў«е®Ње…Ёж¶€йџідє†гЂ‚\n \n该数值越低越好。",
+ L"\n \n该物品修жЈжЉЉе®ѓдЅњдёєй™„件的物品的尺寸大小。\n \n物品大小在新携行系统дёеѕ€й‡Ќи¦ЃпјЊе› дёєеЏЈиў‹еЏЄ\n能装下特定大小和形状的物品。\n \nеўћеЉ е°єеЇёдјљдЅїз‰©е“Ѓе¤Єе¤§иЂЊдёЌиѓЅж”ѕе…Ґжџђдє›еЏЈиў‹гЂ‚\n \n反之,减少尺寸意味着该物品可以适合于更多\n的口袋,并且一个口袋可以装更多。\n \n该数值一般越低越好。",
+ L"\n \n当安装于ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈиЇҐж¦е™Ёзљ„еЏЇйќ \nжЂ§ж•°еЂјгЂ‚\n \n如果该修жЈеЂјдёєжЈпјЊиЇҐж¦е™ЁењЁдЅїз”Ёиї‡зЁ‹дёзљ„зЈЁ\n损会更慢,反之磨损会更快。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеЅ“иЇҐз‰©е“Ѓж€ґењЁиє«дёЉж€–й™„ењЁз©їж€ґе“ЃдёЉж—¶пјЊеўћеЉ ењЁ\nдё›жћ—зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘ж ‘жњЁж€–иЌ‰дё›ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеЅ“иЇҐз‰©е“Ѓж€ґењЁиє«дёЉж€–й™„ењЁз©їж€ґе“ЃдёЉж—¶пјЊеўћеЉ ењЁ\nеџЋеё‚зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘жІҐйќ’ж€–ж°ґжіҐж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеЅ“иЇҐз‰©е“Ѓж€ґењЁиє«дёЉж€–й™„ењЁз©їж€ґе“ЃдёЉж—¶пјЊеўћеЉ ењЁ\nжІ™жј зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘жІ™з ѕж€–жІ™жј ж¤Ќиў«ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџ\nж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nеЅ“иЇҐз‰©е“Ѓж€ґењЁиє«дёЉж€–й™„ењЁз©їж€ґе“ЃдёЉж—¶пјЊеўћеЉ ењЁ\nй›Єењ°зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘й›Єењ°ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈжЅњ\n行的能力,使潜行者更难被听到。\n \nжіЁж„ЏиЇҐдї®жЈеЂје№¶дёЌиѓЅдЅїе…¶д»–дєєзњ‹дёЌи§ЃжЅњиЎЊиЂ…пјЊ\nиЂЊеЏЄиѓЅж”№еЏжЅњиЎЊдёзљ„动静大小。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈеђ¬\nи§‰и·ќз¦»пј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nжЈж•°дї®жЈеЂји®©дЅїз”ЁиЂ…听得更远。\n \n反之,负数修жЈеЂјй»зўЌдЅїз”ЁиЂ…зљ„еђ¬еЉ›гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈи§†\nи·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈдЅњз”ЁдєЋд»»дЅ•情况下。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈи§†\nи·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋе¤њж™љзљ„дЅЋе…‰зЋЇеўѓдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈи§†\nи·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…作用于白天光量适дёж€–зЁЌејєзљ„зЋЇеўѓ\nдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈи§†\nи·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋй«е…‰зЋЇеўѓдёпјЊе¦‚жЈеЌ€ж—¶ж€–иЂ…\nжџҐзњ‹иў«еЏ‘е…‰жЈ’з…§дє®зљ„ж јеђж—¶гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,修жЈи§†\nи·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋдЅЋе…‰зљ„жґћз©ґдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当该物品戴在身上或附在穿戴品上时,改еЏи§†\n野范围,使可视角度еЏзЄ„гЂ‚\n \n该数值越低越好。",
+ L"\n \nиї™жЇе°„手在点射或者连发时,制退后坐力的能力。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇе°„手在点射或者连发时,频繁估量制退力\n大小的能力。\n \nдЅЋдї®жЈеЂјиѓЅе¤џжЏђй«еђеј№зљ„总体精度,在射手能\nжЈзЎ®е€¶йЂЂеђЋеќђеЉ›зљ„前提下,远距离的连发也更\nиѓЅеЉ е‡†зЎ®гЂ‚\n \n该数值越低越好。",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈж¦е™Ёзљ„е‘Ѕ\nдёзЋ‡гЂ‚\n \nжЏђй«е‘ЅдёзЋ‡иѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕдё\nиїњи·ќз¦»зљ„з›®ж ‡гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当安装于远程ж¦е™ЁдёЉж—¶пјЊиЇҐз‰©е“Ѓдї®жЈж¦е™Ёзљ„зІѕ\nзћ„еЉ ж€ђгЂ‚\n \nжЏђй«зІѕзћ„еЉ ж€ђиѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕ\nдёиїњи·ќз¦»зљ„з›®ж ‡гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
{
- L"\n \nThis weapon's accuracy is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased accuracy allows the gun to hit targets\nat longer ranges more often, assuming it is\nalso well-aimed.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies its shooter's accuracy\nwith ANY shot by the listed amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies its shooter's accuracy\nwith ANY shot by the listed percentage\nbased on the shooter's original accuracy.\n \nHigher is better.",
- L"\n \nThis weapon modifies the amount of accuracy\ngained from each extra aiming level you\npay for by the listed amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies the amount of accuracy\ngained from each extra aiming level you\npay for by the listed percentage, based\non the shooter's original accuracy.\n \nHigher is better.",
- L"\n \nThe number of Extra Aiming Levels allowed\nfor this gun has been modified by its ammo,\nattachments, or built-in attributes.\nIf the number of levels is being reduced, the gun is\nfaster to aim without being any less accurate.\n \nConversely, if the number of levels is increased,\nthe gun becomes slower to aim without being\nmore accurate.\n \nLower is better.",
- L"\n \nThis weapon modifies the shooter's maximum\naccuracy, as a percentage of the shooter's original\nmaximum accuracy.\n \nHigher is better.",
- L"\n \nThis weapon's attachments or inherent abilities\nmodify the weapon's Handling difficulty.\n \nBetter handling makes the gun more accurate to fire,\nwith or without extra aiming.\n \nNote that this is based on the gun's original\nGun Handling factor, which is higher for rifles and\nheavy weapons, and lower for pistols and small\nweapons.\n \nLower is better.",
- L"\n \nThis weapon's ability to compensate for shots\nbeyond its maximum range is being modified by\nattachments or the weapon's inherent abilities.\n \nA high bonus here can increase a weapon's\nnatural Maximum Range by at least a few tiles.\n \nHigher is better.",
- L"\n \nThis weapon's ability to hit moving targets\nat a distance is being modified by attachments\nor the weapon's inherent abilities.\n \nA high bonus here can help hitting\nfast-moving targets, even at a distance.\n \nHigher is better.",
- L"\n \nThis weapon's damage output is being modified\nby its ammo, attachments, or inherent abilities.\n \nHigher is better.",
- L"\n \nThis weapon's melee-combat damage output is being\nmodified by its ammo, attachments, or inherent abilities.\n \nThis applies only to melee weapons, both sharp\nand blunt.\n \nHigher is better.",
- L"\n \nThis weapon's maximum range has been increased\nor decreased thanks to its ammo, attachments,\nor inherent abilities.\n \nMaximum Range mainly dictates how far a bullet\nfired from the weapon can fly before it begins\ndropping sharply towards the ground.\n \nHigher is better.",
- L"\n \nThis weapon is equipped with optical magnification,\nmaking shots at a distance comparatively easier to make.\n \nNote that a high Magnification Factor is detrimental\nwhen used at targets CLOSER than the\noptimal distance.\n \nHigher is better.",
- L"\n \nThis weapon is equipped with a projection device\n(possibly a laser), which projects a dot on\nthe target, making it easier to hit.\n \nThe projection effect is only useful up to a given\ndistance, beyond which it begins to diminish and\neventually disappears.\n \nHigher is better.",
- L"\n \nThis weapon's horizontal recoil strength is being\nmodified by its ammo, attachments, or inherent\nabilities.\n \nThis has no effect if the weapon lacks both\nBurst and Auto-Fire modes.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis weapon's vertical recoil strength is being\nmodified by its ammo, attachments, or inherent\nabilities.\n \nThis has no effect if the weapon lacks both\nBurst and Auto-Fire modes.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis weapon modifies the shooter's ability to\ncope with recoil during Burst or Autofire volleys,\ndue to its attachments, ammo, or inherent abilities.\n \nWhen high, this can help a shooter to control\nguns with powerful recoil, even if the shooter\nhas low Strength.\n \nHigher is better.",
- L"\n \nThis weapon modifies the shooter's ability to\naccurately apply counter-force against its\nrecoil, due to its attachments, ammo, or inherent abilities.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nA high bonus helps the shooter bring the gun's muzzle\nprecisely towards the target, even at longer ranges,\nmaking volleys more accurate as a result.\n \nHigher is better.",
- L"\n \nThis weapon modifies the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, due to its\nattachments, ammo, or inherent abilities.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nHigher frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nHigher is better.",
- L"\n \nWhen held in hand, this weapon modifies the amount of\nAPs its user gets at the start of each turn.\n \nHigher is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to bring this weapon to 'Ready' mode has\nbeen modified.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to make a single attack with this\nweapon has been modified.\n \nNote that for Burst/Auto-capable weapons, the\ncost of using these modes is directly influenced\nby this modifier as well!\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to fire a Burst with this weapon has\nbeen modified.\n \nNaturally, this has no effect if the weapon is not\ncapable of Burst fire.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to fire an Autofire Volley with this weapon\nhas been modified.\n \nNaturally, this has no effect if the weapon is not\ncapable of Auto Fire.\n \nNote that it does NOT modify the extra AP\ncost for adding bullets to the volley, only\nthe initial cost for starting the volley.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost of reloading this weapon has been modified.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe size of magazines that can be loaded into this\nweapon has been modified.\n \nThe weapon will now accept larger or smaller\nmagazines of the same caliber.\n \nHigher is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe amount of bullets fired by this weapon in Burst mode\nhas been modified.\n \nIf the weapon was not initially Burst-Capable, and the\nmodifier is positive, then this is what\ngives the weapon its burst-fire capability.\n \nConversely, if the weapon was initially Burst-Capable,\na high-enough negative modifier here may have\ndisabled burst mode entirely for this weapon.\n \nHigher is USUALLY better. Of course, part of the\npoint in Burst Mode is to conserve bullets...",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon produces no muzzle flash.\n \nThis makes sure that enemies cannot spot the shooter\nif he is firing while hidden, and is especially\nimportant at night.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's loudness has been modified. The distance\nat which enemies and mercs can hear the weapon being\nused has subsequently changed.\n \nIf this modifier drops the weapon's Loudness value\nto 0, the weapon becomes completely silent.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's size category has changed.\n \nSize is important when using the New Inventory system,\nwhere pockets only accept items of specific sizes and shapes.\n \nIncreasing an item's size makes it too big for some pockets\nit used to fit into.\n \nConversely, making an item smaller means it will fit into\nmore pockets, and pockets will be able to contain\nmore of it.\n \nLower is generall better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's reliability has been modified.\n \nIf positive, the weapon's condition will deteriorate\nslower when used in combat. Otherwise, the\nweapon deteriorates faster.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in woodland backgrounds.\n \nTo make good on a positive Woodland Camo modifier, the\nwearer needs to stay close to trees or tall grass.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in urban backgrounds.\n \nTo make good on a positive Urban Camo modifier, the\nwearer needs to stay close to asphalt or concrete.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in desert backgrounds.\n \nTo make good on a positive Desert Camo modifier, the\nwearer needs to stay close to sand, gravel, or\ndesert vegetation.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in snowy backgrounds.\n \nTo make good on a positive Snow Camo modifier, the\nwearer needs to stay close to snowy tiles.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's stealth ability by making it\nmore or less difficult to HEAR the character moving\nwhile in Sneaking mode.\n \nNote that this does NOT change a character's visibility,\nonly the amount of noise they make while sneaking.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's Hearing Range by the listed number of tiles.\n \nA positive bonus makes it possible to hear noises\nfrom a greater distance.\n \nConversely, a negative modifier impairs the wearer's hearing.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis General modifier works in all conditions.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Night-Vision modifier works only when light\nlevels are sufficiently low.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Day-Vision modifier works only when light\nlevels are average or higher.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \n由于所装的附件,弹药或其内置特性,这件ж¦\nе™Ёзљ„зІѕеє¦еѕ—е€°дє†дї®жЈгЂ‚\n \nжЏђй«зІѕеє¦иѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕдёиїњ\nи·ќз¦»зљ„з›®ж ‡гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁжЊ‰з…§ж•°еЂјдї®жЈдє†е°„手打出去的每颗еђ\nеј№зљ„зІѕеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁжЊ‰з…§з™ѕе€†жЇ”дї®жЈдє†е°„手打出去的每颗\nеђеј№зљ„зІѕеє¦гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁжЊ‰з…§ж•°еЂјдї®жЈдє†жЇЏж¬ЎзІѕзћ„ж‰ЂеўћеЉ зљ„зІѕ\nеє¦гЂ‚\n \n数值范围:-100~+100пјЊи¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁжЊ‰з…§з™ѕе€†жЇ”дї®жЈдє†жЇЏж¬ЎзІѕзћ„ж‰ЂеўћеЉ зљ„\nзІѕеє¦гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于其所装的附件,弹药或由于其内置特性,\nиї™д»¶ж¦е™Ёзљ„зІѕзћ„з‰зє§еѕ—е€°дє†дї®жЈгЂ‚\n \n如果精瞄з‰зє§е‡Џе°‘дє†пјЊе€™иї™д»¶ж¦е™ЁеЏЇд»ҐењЁдёЌжЌџ\n失精度的情况下快速瞄准。\n \n反之,如果精瞄з‰зє§еўћеЉ пјЊе€™иї™д»¶ж¦е™Ёзћ„准的\nж›ґж…ўпјЊдЅ†еЌґдёЌдјљйўќе¤–еўћеЉ зІѕеє¦гЂ‚\n \n该数值越低越好。",
+ L"\n \nиї™д»¶ж¦е™ЁжЊ‰з…§з™ѕе€†жЇ”дї®жЈе°„手能达到的最大精\nеє¦гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,ж¦е™Ёж“Ќ\nжЋ§йљѕеє¦еѕ—е€°дє†дї®жЈгЂ‚\n \nж“дєЋж“ЌжЋ§дЅїиЇҐж¦е™ЁдёЌи®єжњ‰жІЎжњ‰иї›иЎЊзІѕзћ„йѓЅж›ґеЉ \n准确。\n \nжіЁж„ЏиЇҐдї®жЈжЇеџєдєЋж¦е™Ёе€ќе§‹зљ„ж“ЌжЋ§йљѕеє¦пјЊжҐжћЄ\nе’Њй‡Ќж¦е™Ёйљѕеє¦й«иЂЊж‰‹жћЄе’ЊиЅ»ж¦е™Ёйљѕеє¦дЅЋгЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёи¶…е°„и·ќе‘Ѕдёзљ„иѓЅеЉ›еѕ—е€°дє†дї®жЈгЂ‚\n \nй«дї®жЈеЂјз›ёеЅ“дєЋеўћеЉ дє†иЇҐж¦е™Ёзљ„最大射程至少\nе‡ дёЄж јгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёе‘Ѕдёз§»еЉЁз›®ж ‡зљ„иѓЅеЉ›еѕ—е€°дє†дї®жЈгЂ‚\n \nй«дї®жЈеЂјиѓЅе¤џењЁиѕѓиїњзљ„и·ќз¦»дёЉеўћеЉ е‘Ѕдёз§»еЉЁз›®\nж ‡зљ„е‡ зЋ‡гЂ‚\n \nHigher is better.",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„дј¤е®іеЂјеѕ—е€°дє†дї®жЈгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„иї‘ж€дј¤е®іеЂјеѕ—е€°дє†дї®жЈгЂ‚\n \nиЇҐдї®жЈеЂјд»…й™ђдєЋиї‘ж€ж¦е™ЁпјЊж— и®єжЇе€©е™ЁиїжЇй’ќ\nе™ЁгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\n器的最大射程得到了修жЈгЂ‚\n \n最大射程жЇжЊ‡еђеј№жЋжѕеќ 落前所飞行的距离。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁиЈ…备了光е¦зћ„准镜,使远距离射击更\nе®№ж“е‘ЅдёгЂ‚\n \nжіЁж„ЏењЁз›®ж ‡жЇ”жњЂдЅізћ„е‡†и·ќз¦»иї‘ж—¶пјЊй«еЂЌзЋ‡еЇ№дєЋ\n瞄准жЇдёЌе€©зљ„гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™д»¶ж¦е™ЁиЈ…备了投影设备(可能жЇжїЂе…‰пј‰пјЊе®ѓ\nеЏЇд»ҐењЁз›®ж ‡иє«дёЉжЉ•еЅ±е‡єдёЂдёЄзєўз‚№пјЊи®©е…¶ж›ґе®№ж“\nиў«е‘ЅдёгЂ‚\n \n红点效果只能在指定距离内使用,超过该距离\n光点就会暗淡直到最终消失。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„ж°ґе№іеђЋеќђеЉ›еѕ—е€°дє†дї®жЈгЂ‚\n \n如果点射和连发功能都没有,则ж¤дї®жЈж— ж•€гЂ‚\n \n在点射或连发时,降低后坐力可以帮助射手一\nз›ґдїќжЊЃжћЄеЏЈеЇ№е‡†з›®ж ‡гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\n器的垂直后坐力得到了修жЈгЂ‚\n \n如果点射和连发功能都没有,则ж¤дї®жЈж— ж•€гЂ‚\n \n在点射或连发时,降低后坐力可以帮助射手一\nз›ґдїќжЊЃжћЄеЏЈеЇ№е‡†з›®ж ‡гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёдї®жЈдє†е°„手在点射或者连发时,制退后坐力\nзљ„иѓЅеЉ›гЂ‚\n \nй«дї®жЈж•°еЂјиѓЅеё®еЉ©е°„手控制强大后坐力的ж¦е™Ё\n,哪怕射手力量很低。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёдї®жЈдє†е°„手运用反作用力制退后坐力的精确\nеє¦гЂ‚\n \n如果点射和连发功能都没有,则ж¤дї®жЈж— ж•€гЂ‚\n \nй«дї®жЈеЂјиѓЅеё®еЉ©е°„ж‰‹з»ґжЊЃжћЄеЏЈе§‹з»€жњќеђ‘з›®ж ‡пјЊ\nе“ЄжЂ•з›®ж ‡иѕѓиїњпјЊд№џиѓЅжЏђеЌ‡зІѕеє¦гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёдї®жЈдє†е°„手频繁估量制退力大小的能力。\n \n如果点射和连发功能都没有,则ж¤дї®жЈж— ж•€гЂ‚\n \nй«дї®жЈеЂјиѓЅе¤џжЏђй«еђеј№зљ„总体精度,在射手能\nжЈзЎ®е€¶йЂЂеђЋеќђеЉ›зљ„前提下,远距离的连发也更\nиѓЅеЉ е‡†зЎ®гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当拿在手дёж—¶пјЊиї™д»¶ж¦е™Ёдї®жЈдЅЈе…µжЇЏе›ћеђ€зљ„е€ќ\nе§‹APй‡ЏгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„дёѕжћЄAPеѕ—е€°дє†дї®жЈгЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„еЌ•еЏ‘APеѕ—е€°дє†дї®жЈгЂ‚\n \n注意对于可以点射或连发的ж¦е™ЁжќҐиЇґпјЊз‚№е°„е’Њ\nиїћеЏ‘APд№џдјљиў«дї®жЈгЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„з‚№е°„APеѕ—е€°дє†дї®жЈгЂ‚\n \n如果ж¦е™ЁжІЎжњ‰з‚№е°„еЉџиѓЅпјЊе€™ж¤дї®жЈж— ж•€гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„иїћеЏ‘APеѕ—е€°дє†дї®жЈгЂ‚\n \n如果ж¦е™ЁжІЎжњ‰иїћеЏ‘еЉџиѓЅпјЊе€™ж¤дї®жЈж— ж•€гЂ‚\n \nжіЁж„ЏпјЊиї™дёЌж”№еЏиїћеЏ‘еўћеЉ еђеј№ж—¶зљ„APж¶€иЂ—пјЊ\nеЏЄеЅ±е“ЌиїћеЏ‘ж—¶APзљ„е€ќе§‹ж¶€иЂ—гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„дёЉеј№APеѕ—е€°дє†дї®жЈгЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,ж¤ж¦е™Ё\n的弹夹容量得到了修жЈгЂ‚\n \nзЋ°ењЁиї™д»¶ж¦е™ЁеЏЇд»ҐжЋҐеЏ—з›ёеђЊеЏЈеѕ„зљ„дёЌеђЊе®№й‡Џзљ„\n弹夹。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™ЁењЁз‚№е°„ж—¶еЏ‘е°„зљ„еђеј№ж•°еѕ—е€°дє†дї®жЈгЂ‚\n \n如果ж¤ж¦е™ЁдёЌиѓЅз‚№е°„иЂЊж¤дї®жЈеЂјдёєжЈпјЊж¤ж¦е™Ё\n可以点射。\n \n反之,如果ж¤ж¦е™ЁеЋџжњ¬иѓЅе¤џз‚№е°„пјЊиЂЊж¤дї®жЈеЂј\nдёєиґџпјЊе€™еЏЇиѓЅдЅїж¤ж¦е™Ёе¤±еЋ»з‚№е°„иѓЅеЉ›гЂ‚\n \n该数值一般越й«и¶ЉеҐЅгЂ‚еЅ“з„¶иїћеЏ‘ж—¶д№џйњЂи¦ЃжіЁж„Џ\nиЉ‚зњЃеј№иЌЇгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,ж¤ж¦е™Ё\nдёЌе†Ќжњ‰жћЄз„°гЂ‚\n \n当射手在隐蔽的地方开枪,将不会被敌人发现,这在夜ж€дёеѕ€й‡Ќи¦ЃгЂ‚",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™ЁеЏ‘е‡єзљ„е™Єйџіеѕ—е€°дє†дї®жЈгЂ‚随之敌人和佣兵能\n发觉枪响的距离也就修жЈдє†гЂ‚\n \n如果该修жЈеЂје°†ж¦е™Ёзљ„е™Єйџіж•°еЂје‰Ље‡Џи‡і0пјЊй‚Ј\nд№€иЇҐж¦е™Ёе°±иў«е®Ње…Ёж¶€йџідє†гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\n器的尺寸大小得到了修жЈгЂ‚\n \n物品大小在新携行系统дёеѕ€й‡Ќи¦ЃпјЊе› дёєеЏЈиў‹еЏЄ\n能装下特定大小和形状的物品。\n \nеўћеЉ е°єеЇёдјљдЅїз‰©е“Ѓе¤Єе¤§иЂЊдёЌиѓЅж”ѕе…Ґжџђдє›еЏЈиў‹гЂ‚\n \n反之,减少尺寸意味着该物品可以适合于更多\n的口袋,并且一个口袋可以装更多。\n \n该数值一般越低越好。",
+ L"\n \n由于所装的附件,弹药或其固有特性,这件ж¦\nе™Ёзљ„еЏЇйќ жЂ§еѕ—е€°дє†дї®жЈгЂ‚\n \n如果该修жЈеЂјдёєжЈпјЊиЇҐж¦е™ЁењЁдЅїз”Ёиї‡зЁ‹дёзљ„зЈЁ\n损会更慢,反之磨损会更快。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊеўћеЉ ењЁдё›жћ—зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘ж ‘жњЁж€–иЌ‰дё›ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊеўћеЉ ењЁеџЋеё‚зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘жІҐйќ’ж€–ж°ґжіҐж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊеўћеЉ ењЁжІ™жј зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘жІ™з ѕж€–жІ™жј ж¤Ќиў«ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџ\nж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊеўћеЉ ењЁй›Єењ°зЋЇеўѓдёзљ„дјЄиЈ…еЂјгЂ‚\n \nиЇҐдјЄиЈ…йњЂйќ иї‘й›Єењ°ж‰ЌиѓЅеЏ‘жЊҐжњЂе¤§еЉџж•€гЂ‚\n \nиЇҐдјЄиЈ…ж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊдї®жЈжЅњиЎЊзљ„иѓЅеЉ›пјЊдЅїжЅњиЎЊ\n者更难或更容ж“иў«еђ¬е€°гЂ‚\n \nжіЁж„ЏиЇҐдї®жЈеЂје№¶дёЌиѓЅдЅїе…¶д»–дєєзњ‹дёЌи§ЃжЅњиЎЊиЂ…пјЊ\nиЂЊеЏЄиѓЅж”№еЏжЅњиЎЊдёзљ„动静大小。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊдї®жЈеђ¬и§‰и·ќз¦»пј€д»Ґж јж•°и®Ў\nз®—пј‰гЂ‚\n \nжЈж•°дї®жЈеЂји®©дЅїз”ЁиЂ…听得更远。\n \n反之,负数修жЈеЂјй»зўЌдЅїз”ЁиЂ…зљ„еђ¬еЉ›гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装附件或其固有特性,当装备这件ж¦е™Ё\nж—¶пјЊдї®жЈи§†и·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈдЅњз”ЁдєЋд»»дЅ•情况下。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装附件或其固有特性,当装备这件ж¦е™Ё\nж—¶пјЊдї®жЈи§†и·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋе¤њж™љзљ„дЅЋе…‰зЋЇеўѓдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装附件或其固有特性,当装备这件ж¦е™Ё\nж—¶пјЊдї®жЈи§†и·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…作用于白天光量适дёж€–зЁЌејєзљ„зЋЇеўѓ\nдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装附件或其固有特性,当装备这件ж¦е™Ё\nж—¶пјЊдї®жЈи§†и·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋй«е…‰зЋЇеўѓдёпјЊе¦‚жЈеЌ€ж—¶ж€–иЂ…\nжџҐзњ‹иў«еЏ‘е…‰жЈ’з…§дє®зљ„ж јеђж—¶гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装附件或其固有特性,当装备这件ж¦е™Ё\nж—¶пјЊдї®жЈи§†и·ќпј€д»Ґж јж•°и®Ўз®—пј‰гЂ‚\n \nиї™йЎ№дї®жЈд»…дЅњз”ЁдєЋдЅЋе…‰зљ„жґћз©ґдёгЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n当装备这件ж¦е™Ёж—¶пјЊж”№еЏи§†й‡ЋиЊѓе›ґпјЊдЅїеЏЇи§†и§’\nеє¦еЏзЄ„гЂ‚\n \n该数值越低越好。",
+ L"\n \nиї™жЇе°„手在点射和连发时,制退后坐力的能力。\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \nиї™жЇе°„手频繁估量制退力大小的能力。\n \n如果ж¦е™Ёз‚№е°„е’ЊиїћеЏ‘еЉџиѓЅйѓЅжІЎжњ‰пјЊе€™ж¤иѓЅеЉ›ж— \nж•€гЂ‚\n \nдЅЋдї®жЈеЂјиѓЅе¤џжЏђй«еђеј№зљ„总体精度,在射手能\nжЈзЎ®е€¶йЂЂеђЋеќђеЉ›зљ„前提下,远距离的连发也更\nиѓЅеЉ е‡†зЎ®гЂ‚\n \n该数值越低越好。",
+ L"\n \n由于所装的附件,弹药或其内置特性,这件ж¦\nе™Ёзљ„е‘ЅдёзЋ‡еѕ—е€°дє†дї®жЈгЂ‚\n \nжЏђй«е‘ЅдёзЋ‡иѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕдё\nиїњи·ќз¦»зљ„з›®ж ‡гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
+ L"\n \n由于所装的附件,弹药或其内置特性,这件ж¦\nе™Ёзљ„зІѕзћ„еЉ ж€ђеѕ—е€°дє†дї®жЈгЂ‚\n \nжЏђй«зІѕзћ„еЉ ж€ђиѓЅе¤џдЅїиЇҐж¦е™ЁењЁзІѕзћ„时更容ж“е‘Ѕ\nдёиїњи·ќз¦»зљ„з›®ж ‡гЂ‚\n \nиЇҐж•°еЂји¶Љй«и¶ЉеҐЅгЂ‚",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
STR16 gzNCTHlabels[]=
{
- L"SINGLE",
+ L"еЌ•еЏ‘",
L"AP",
};
//////////////////////////////////////////////////////
diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp
index 36ec0654..aafd983b 100644
--- a/Utils/_DutchText.cpp
+++ b/Utils/_DutchText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("DUTCH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#if defined( DUTCH )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -112,6 +117,1015 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
*/
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
// TODO.Translate
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
@@ -349,6 +1363,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s's snow camouflage has washed off.",
L"You cannot attach %s to this slot.",
+ L"The %s will not fit in any open slots.",
};
@@ -851,7 +1866,9 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Facility accidents: %d\n",
L"Character:",
- L"Weakening:",
+ L"Weakness:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -873,11 +1890,7 @@ STR16 gzMercSkillText[] =
L"Vechtkunsten",
L"Mesworp",
L"Sniper",
- L"Camouflaged",
- // SANDRO - removed this
- //L"Camouflage (Urban)",
- //L"Camouflage (Desert)",
- //L"Camouflage (Snow)",
+ L"Camouflaged",
L"(Expert)",
};
@@ -1315,10 +2328,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"APs to fire Auto",
L"APs to Reload",
L"APs to Reload Manually",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Bipod Modifier",
L"Autofire shots per 5 AP",
- L"Burst/Auto Penalty (Lower is better)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"Burst/Auto Penalty (Lower is better)", //23
L"APs to Throw",
L"APs to Launch",
L"APs to Stab",
@@ -1326,8 +2340,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"No Burst Mode!",
L"No Auto Mode!",
L"APs to Bash",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3880,12 +4893,15 @@ STR16 zOptionsToggleText[] =
L"Show Soldier Tooltips",
L"Auto save",
L"Silent Skyrider",
- L"Low CPU Usage",
+ //L"Low CPU Usage",
L"Enhanced Description Box",
L"Forced Turn Mode", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase // TODO.Translate
L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"Activate New CTH system", // use NCTH
+ L"Show Face gear graphics", // TODO.Translate
+ L"Show Face gear icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3981,12 +4997,15 @@ STR16 zOptionsScreenHelpText[] =
L"When ON, a tooltip window is shown when pressing |A|l|t and hovering cursor over an enemy.",
L"When ON, game will be saved after each players turn.",
L"When ON, Skyrider will not talk anymore.",
- L"When ON, game will run with much lower CPU usage.",
+ //L"When ON, game will run with much lower CPU usage.",
L"When ON, enhanced descriptions will be shown for items and weapons.",
L"When ON and enemy present, Turn Base mode persists untill sector is free (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
L"When ON, shows character progress towards gaining levels.", // TODO.Translate
L"When ON, the Strategic Map will be colored differently based on exploration.",
L"When ON, alternate bullet graphics will be shown when you shoot.", // TODO.Translate
+ L"When ON, New CTH system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.", // TODO.Translate
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4840,6 +5859,9 @@ STR16 New113Message[] =
L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
// TODO.Translate
@@ -4923,6 +5945,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"FW from AIM Server: Message from Rudolf Steiger",
L"Rudolf here. Call me back.",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5154,7 +6180,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Multiplayer Chat",
- L"Chat: Press 'ENTER' to send of 'ESC' to cancel.",
+ L"'ENTER' to send, 'ESC' to cancel",
};
// Following strings added - SANDRO
@@ -5364,6 +6390,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 windowed modus vereist een kleurdiepte van 16 bits per pixel.",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5614,8 +6649,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5751,6 +6786,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5800,6 +6839,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5848,6 +6891,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp
index d545c166..183ab819 100644
--- a/Utils/_EnglishText.cpp
+++ b/Utils/_EnglishText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("ENGLISH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#if defined( ENGLISH )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -109,6 +114,1016 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
SirTech uses the "@@@" notation.
*/
+
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] = // NUM_DIFF_LVLS = 5
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] =
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:",//20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
L"Page 1/2", //0
@@ -352,6 +1367,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s's snow camouflage has washed off.",
L"You cannot attach %s to this slot.",
+ L"The %s will not fit in any open slots.",
};
@@ -854,7 +1870,9 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Facility accidents: %d\n",
L"Character:",
- L"Weakening:",
+ L"Weakness:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -877,10 +1895,7 @@ STR16 gzMercSkillText[] =
L"Martial Arts",
L"Knifing",
L"Sniper",
- L"Camouflage", //JA25: modified
- //L"Camouflage (Urban)",
- //L"Camouflage (Desert)",
- //L"Camouflage (Snow)",
+ L"Camouflage", //JA25: modified
L"(Expert)",
};
//////////////////////////////////////////////////////////
@@ -1316,10 +2331,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"APs to fire Auto",
L"APs to Reload",
L"APs to Reload Manually",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Bipod Modifier",
L"Autofire shots per 5 AP",
- L"Burst/Auto Penalty (Lower is better)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"Burst/Auto Penalty (Lower is better)", //23
L"APs to Throw",
L"APs to Launch",
L"APs to Stab",
@@ -1327,8 +2343,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"No Burst Mode!",
L"No Auto Mode!",
L"APs to Bash",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3850,16 +4865,16 @@ STR16 zOptionsToggleText[] =
{
L"Speech",
L"Mute Confirmations",
- L"SubTitles",
+ L"Subtitles",
L"Pause Text Dialogue",
L"Animate Smoke",
- L"Blood n Gore",
- L"Never Move My Mouse!",
- L"Old Selection Method",
+ L"Blood & Gore",
+ L"Never move my Mouse",
+ L"Old selection Method",
L"Show Movement Path",
L"Show Misses",
L"Real Time Confirmation",
- L"Display sleep/wake notifications",
+ L"Display sleep/wake Notifications",
L"Use Metric System",
L"Merc Lights during Movement",
L"Snap Cursor to Mercs",
@@ -3868,26 +4883,29 @@ STR16 zOptionsToggleText[] =
L"Show Tree Tops",
L"Show Wireframes",
L"Show 3D Cursor",
- L"Show Chance to Hit on cursor",
- L"GL Burst uses Burst cursor",
+ L"Show Chance to Hit on Cursor",
+ L"GL Burst uses Burst Cursor",
L"Allow Enemy Taunts", // Changed from "Enemies Drop all Items" - SANDRO
- L"High angle Grenade launching",
+ L"High angle Grenade Launching",
L"Allow Real Time Sneaking", // Changed from "Restrict extra Aim Levels" - SANDRO
L"Space selects next Squad",
L"Show Item Shadow",
L"Show Weapon Ranges in Tiles",
- L"Tracer effect for single shot",
- L"Rain noises",
- L"Allow crows",
+ L"Tracer Effect for Single Shot",
+ L"Rain Noises",
+ L"Allow Crows",
L"Show Soldier Tooltips",
- L"Auto save",
+ L"Auto Save",
L"Silent Skyrider",
- L"Low CPU usage",
+ //L"Low CPU usage",
L"Enhanced Description Box",
L"Forced Turn Mode", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase
- L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
- L"Alternate bullet graphics", // Show alternate bullet graphics (tracers)
+ L"Alternate Strategy Map Colors", // Change color scheme of Strategic Map
+ L"Alternate Bullet Graphics", // Show alternate bullet graphics (tracers)
+ L"Use new Change to Hit System", // use NCTH
+ L"Show Face Gear Graphics",
+ L"Show Face Gear Icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3981,14 +4999,17 @@ STR16 zOptionsScreenHelpText[] =
L"When ON, you will hear rain noises when it is raining.",
L"When ON, the crows are present in game.",
L"When ON, a tooltip window is shown when pressing |A|l|t and hovering cursor over an enemy.",
- L"When ON, game will be saved after each players turn.",
+ L"When ON, game will be saved in 2 alternate save slots after each players turn.\nTo load, press |C|t|r|l+|L and then |A|l|t+|A or |A|l|t+|B.",
L"When ON, Skyrider will not talk anymore.",
- L"When ON, game will run with much lower CPU usage.",
+ //L"When ON, game will run with much lower CPU usage.",
L"When ON, enhanced descriptions will be shown for items and weapons.",
- L"When ON and enemy present, Turn Base mode persists untill sector is free (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
+ L"When ON and enemy present, turn base mode persists untill sector is free (|C|t|r|l+|S|h|i|f|t+|A|l|t+|T).", // add forced turn mode
L"When ON, shows character progress towards gaining levels.",
- L"When ON, the Strategic Map will be colored differently based on exploration.",
+ L"When ON, the strategic map will be colored differently based on exploration.",
L"When ON, alternate bullet graphics will be shown when you shoot.",
+ L"When ON, the new chance to hit system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.",
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4841,6 +5862,8 @@ STR16 New113Message[] =
L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
};
STR16 New113HAMMessage[] =
@@ -4922,7 +5945,11 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf: Text from Line 72
L"FW from AIM Server: Message from Rudolf Steiger",
- L"Do you know how many calls I get every day? Every tosser thinks he can call me. ± ± But I'm back, if you have something of interest for me.±",
+ L"Do you know how many calls I get every day? Every tosser thinks he can call me. ± ± But I'm back, if you have something of interest for me.±",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5155,7 +6182,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Multiplayer Chat",
- L"Chat: Press 'ENTER' to send of 'ESC' to cancel.",
+ L"'ENTER' to send, 'ESC' to cancel",
};
// Following strings added - SANDRO
@@ -5361,6 +6388,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 windowed mode requires a color depth of 16bpp or less.",
+
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
+
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5612,8 +6648,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5749,6 +6785,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5798,6 +6838,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5846,6 +6890,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp
index 0e4f7715..5be92053 100644
--- a/Utils/_FrenchText.cpp
+++ b/Utils/_FrenchText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("FRENCH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#ifdef FRENCH
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -110,6 +115,1015 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
*/
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
// TODO.Translate
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
@@ -354,6 +1368,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s's snow camouflage has washed off.",
L"You cannot attach %s to this slot.",
+ L"The %s will not fit in any open slots.",
};
@@ -853,7 +1868,9 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Facility accidents: %d\n",
L"Character:",
- L"Weakening:",
+ L"Weakness:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -875,11 +1892,7 @@ STR16 gzMercSkillText[] =
L"Arts martiaux",
L"Couteau",
L"Tireur isolй",
- L"Camouflage",
- // SANDRO - removed this
- //L"Camouflage (Urban)",
- //L"Camouflage (Desert)",
- //L"Camouflage (Snow)",
+ L"Camouflage",
L"(Expert)",
};
@@ -1318,10 +2331,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"PA pour tir auto.",
L"PA pour recharger",
L"PA pour recharger manuellement",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Facteur de bipied",
L"Nombre de tirs pour 5 PA",
- L"Pйnalitй Rafale/Auto (Moins c'est mieux)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"Pйnalitй Rafale/Auto (Moins c'est mieux)", //23
L"PA pour jeter",
L"PA pour lancer",
L"PA pour poignarder",
@@ -1329,8 +2343,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"Pas de tir en rafale!",
L"Pas de tir auto.!",
L"PA pour frapper",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3885,12 +4898,15 @@ STR16 zOptionsToggleText[] =
L"Show Soldier Tooltips",
L"Sauvegarde auto",
L"Silence Skyrider !",
- L"Faible consommation processeur",
+ //L"Faible consommation processeur",
L"EDB (mod rajoutant info utiles)",
L"Mode tour par tour forcй", // add forced turn mode
L"Report Miss Offsets", // Screen messages showing amount and direction of shot deviation. // TODO.Translate
L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"Activate New CTH system", // use NCTH
+ L"Show Face gear graphics", // TODO.Translate
+ L"Show Face gear icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3986,12 +5002,15 @@ STR16 zOptionsScreenHelpText[] =
L"When ON, a tooltip window is shown when pressing |A|l|t and hovering cursor over an enemy.",
L"Si activй, le jeu est sauvegardй а chaque nouveau tour joueur.",
L"Si activй, les confirmations insistantes de Skyrider cessent.",
- L"Si activй, le jeu restreint l'utilisation du processeur.",
+ //L"Si activй, le jeu restreint l'utilisation du processeur.",
L"Si activй, l'EDB sera affichй pour les armes et objets.",
L"Si cette option est activйe et que des ennemis sont prйsents, \nle mode tour par tour est actif tant qu'il reste \ndes ennemis dans le secteur (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
L"When ON, shows character progress towards gaining levels.", // TODO.Translate
L"When ON, the Strategic Map will be colored differently based on exploration.",
L"When ON, alternate bullet graphics will be shown when you shoot.", // TODO.Translate
+ L"When ON, New CTH system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.", // TODO.Translate
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4845,6 +5864,9 @@ STR16 New113Message[] =
L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
// TODO.Translate
@@ -4927,6 +5949,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"TR du serveur AIM: Message de Rudolf Steiger",
L"Vous savez combien j’ai d’appel par jour ? Tous les branleurs pensent pouvoir m’appeler. ± ± Mais je suis de retour, si vous avez quelque chose d’intйressant pour moi.±",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5158,7 +6184,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Multiplayer Chat",
- L"Chat: Press 'ENTER' to send of 'ESC' to cancel.",
+ L"'ENTER' to send, 'ESC' to cancel",
};
// Following strings added - SANDRO
@@ -5367,6 +6393,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 mode fenкtrй exige une profondeur de couleur de 16 bit ou moins.",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5617,8 +6652,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5754,6 +6789,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5803,6 +6842,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5851,6 +6894,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp
index 68d64289..0a2b7e30 100644
--- a/Utils/_GermanText.cpp
+++ b/Utils/_GermanText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("GERMAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#ifdef GERMAN
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -133,6 +138,1016 @@ Remove any LOOTF comment that has been checked, except maybe for "alt." (alterna
07/2010 LootFragg
*/
+
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
L"Seite 1/2", //0
@@ -156,7 +1171,7 @@ STR16 pCreditsJA2113[] =
L"@T,{;JA2 v1.13 Entwicklungsteam",
L"@T,C144,R134,{;Programmierung",
L"@T,C144,R134,{;Grafiken und Sounds",
- L"@};(Verschiedene weiter Mods!)",
+ L"@};(Verschiedene weitere Mods!)",
L"@T,C144,R134,{;Gegenstдnde",
L"@T,C144,R134,{;Weitere Mitwirkende",
L"@};(Alle weiteren Community-Mitglieder die Ideen und Feedback eingebracht haben!)",
@@ -329,8 +1344,8 @@ CHAR16 Message[][STRING_LENGTH] =
//Ex: You cannot use sun goggles and your gas mask at the same time.
L"Sie kцnnen %s nicht zusammen mit %s benutzen.", //
- L"Der Gegenstand in Ihrem Cursor kann mit anderen Gegenstдnden verbunden werden, indem Sie ihn in einem der vier Slots platzieren.",
- L"Der Gegenstand in Ihrem Cursor kann mit anderen Gegenstдnden verbunden werden, indem Sie ihn in einem der vier Attachment-Slots platzieren. (Aber in diesem Fall sind die Gegenstдnde nicht kompatibel.)",
+ L"Der Gegenstand in Ihrem Cursor kann mit anderen Gegenstдnden verbunden werden, indem Sie ihn in einer der vier Einbaustellen platzieren.",
+ L"Der Gegenstand in Ihrem Cursor kann mit anderen Gegenstдnden verbunden werden, indem Sie ihn in einer der vier Einbaustellen platzieren. (Aber in diesem Fall sind die Gegenstдnde nicht kompatibel.)",
L"Es sind noch Feinde im Sektor!",
L"Geben Sie %s %s",
L"%s am Kopf getroffen!",
@@ -356,17 +1371,18 @@ CHAR16 Message[][STRING_LENGTH] =
L"Der Feind hat keinen Gegenstand in seiner Hand!",
L"%s's Wьstentarnung ist nicht mehr effektiv.",
- L"%s's Wьstentarnung wurde heruntergewaschen.",
+ L"%s's Wьstentarnung wurde herunter gewaschen.",
L"%s's Waldtarnung ist nicht mehr effektiv.",
- L"%s's Waldtarnung wurde heruntergewaschen.",
+ L"%s's Waldtarnung wurde herunter gewaschen.",
L"%s's Stadttarnung ist nicht mehr effektiv.",
- L"%s's Stadttarnung wurde heruntergewaschen.",
+ L"%s's Stadttarnung wurde herunter gewaschen.",
L"%s's Schneetarnung ist nicht mehr effektiv.",
- L"%s's Schneetarnung wurde heruntergewaschen.",
- L"Sie kцnnen %s nicht an diesem Slot anbringen.",
+ L"%s's Schneetarnung wurde herunter gewaschen.",
+ L"Sie kцnnen %s nicht an dieser Einbaustelle anbringen.",
+ L"%s passt in keine freie Einbaustelle.",
};
CHAR16 pTownNames[MAX_TOWNS][MAX_TOWN_NAME_LENGHT] =
@@ -600,8 +1616,8 @@ STR16 pLongAttributeStrings[] =
STR16 pInvPanelTitleStrings[] =
{
L"Rьstung", // the armor rating of the merc
- L"Gewicht", // the weight the merc is carrying
- L"Tarnung", // the merc's camouflage rating
+ L"Gew.", // the weight the merc is carrying
+ L"Tarn.", // the merc's camouflage rating
L"Tarnung:",
L"Rьstung:",
};
@@ -865,6 +1881,8 @@ STR16 pPersonnelRecordsHelpTexts[] =
// 43
L"Charakter:",
L"Schwдchen:",
+
+ L"Persцnlichkeit:", // WANNE: For old traits display instead of "Character:"!
};
@@ -887,15 +1905,11 @@ STR16 gzMercSkillText[] =
L"Messer",
L"Scharfschьtze",
L"Getarnt",
- L"Getarnt (Stadt)",
- L"Getarnt (Wьste)",
- L"Getarnt (Schnee)",
L"(Experte)",
};
//////////////////////////////////////////////////////////
// SANDRO - added this
-
STR16 gzMercSkillTextNew[] =
{
// Major traits
@@ -1139,7 +2153,7 @@ STR16 gpStrategicString[] =
//a system that automatically resolves the combat for the player without having to do anything.
//These strings must be short (two lines -- 6-8 chars per line)
- L"PC-Kampf", //STR_PB_AUTORESOLVE_BTN,
+ L"Autom. Kampf", //STR_PB_AUTORESOLVE_BTN,
L"Gehe zu Sektor", //STR_PB_GOTOSECTOR_BTN,
L"Rьckzug", //STR_PB_RETREATMERCS_BTN,
@@ -1324,10 +2338,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"APs fьr Autofeuer",
L"APs zum Nachladen",
L"APs zum manuellen Nachladen",
- L"", //19
+ L"FeuerstoЯ-Streuung (Niedriger ist besser)", //19
L"Zweibein-Modifikator",
L"Autofeuer: Schьsse je 5 AP",
- L"Burst/Auto-Streuung (Niedriger ist besser)", //22
+ L"Autofeuer-Streuung (Niedriger ist besser)",
+ L"Burst/Auto-Streuung (Niedriger ist besser)", //23
L"APs zum Werfen",
L"APs zum AbschieЯen",
L"APs zum Stechen",
@@ -1335,8 +2350,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"Kein FeuerstoЯ!",
L"Kein Autofeuer!",
L"APs zum Schlagen",
- L"Autofeuer-Streuung (Niedriger ist besser)",
- L"FeuerstoЯ-Streuung (Niedriger ist besser)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -1509,7 +2523,7 @@ CHAR16 gzProsLabel[10] =
CHAR16 gzConsLabel[10] =
{
- L"Kontra:",
+ L"Kont:",
};
//Conversation options a player has when encountering an NPC
@@ -1541,7 +2555,7 @@ STR16 pVehicleStrings[] =
{
L"Eldorado",
L"Hummer", // a hummer jeep/truck -- military vehicle
- L"Eiscreme-Wagen",
+ L"Eisverkaufswagen",
L"Jeep",
L"Panzer",
L"Helikopter",
@@ -1551,7 +2565,7 @@ STR16 pShortVehicleStrings[] =
{
L"Eldor.",
L"Hummer", // the HMVV
- L"Truck",
+ L"Laster",
L"Jeep",
L"Tank",
L"Heli", // the helicopter
@@ -1561,7 +2575,7 @@ STR16 zVehicleName[] =
{
L"Eldorado",
L"Hummer", //a military jeep. This is a brand name.
- L"Truck", // Ice cream truck
+ L"Laster", // Ice cream truck
L"Jeep",
L"Panzer",
L"Heli", //an abbreviation for Helicopter
@@ -1638,7 +2652,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// In the next string, %s is a name
- L"%s wird eskortiert von Trupp %d.",
+ L"%s wird rekrutiert.",
// Here %s is a name and %d is a number
@@ -3587,8 +4601,8 @@ STR16 zSaveLoadText[] =
#endif
- L"Gespeichertes Spiel in Slot #%d wirklich ьberschreiben?",
- L"Wollen Sie das Spiel aus Slot # speichern?",
+ L"Gespeichertes Spiel in Position #%d wirklich ьberschreiben?",
+ L"Wollen Sie das Spiel aus Position # speichern?",
//The first %d is a number that contains the amount of free space on the users hard drive,
//the second is the recommended amount of free space.
@@ -3631,7 +4645,7 @@ STR16 zMarksMapScreenText[] =
// stuff for contracts
L"Sie kцnnen zwar den Vertrag bezahlen, haben aber kein Geld fьr die Lebensversicherung.",
L"%s Lebensversicherungsprдmien kosten %s pro %d Zusatztag(en). Wollen Sie das bezahlen?",
- L"Inventar auswдhlen.",
+ L"Gegenstдnde im Sektor",
L"Sцldner hat Krankenversicherung.",
@@ -3701,7 +4715,7 @@ STR16 zOptionsToggleText[] =
L"Dialoge Pause",
L"Rauch animieren",
L"Blut zeigen",
- L"Meinen Cursor nicht bewegen!",
+ L"Cursor nicht bewegen",
L"Alte Auswahlmethode",
L"Weg vorzeichnen",
L"Fehlschьsse anzeigen",
@@ -3718,7 +4732,7 @@ STR16 zOptionsToggleText[] =
L"Trefferchance anzeigen",
L"GL Burst mit Burst Cursor",
L"Gegner-Spott aktiveren", // Changed from "Enemies Drop all Items" - SANDRO
- L"Hohe Granatwerferflugbahn",
+ L"Hohe Granatwerfer-Flugbahn",
L"Echtzeit-Schleichen aktivieren", // Changed from "Restrict extra Aim Levels" - SANDRO
L"Nдchste Gruppe selektieren",
L"Gegenstдnde mit Schatten",
@@ -3729,12 +4743,15 @@ STR16 zOptionsToggleText[] =
L"Tooltips ьber Gegner",
L"Automatisch speichern",
L"Stummer Skyrider",
- L"Niedrige CPU Belastung",
- L"Erw. Gegenstandsinfo (EDB)",
+ //L"Niedrige CPU Belastung",
+ L"Erw. Gegenstandsinfo",
L"Erzwungener Runden-Modus", // add forced turn mode
L"Status Trainingsfortschritt", // Show progress towards stat increase
L"Alternatives Kartenfarbschema", // Change color scheme of Strategic Map
- L"Alternative Projektilgrafik", // Show alternate bullet graphics (tracers)
+ L"Alternative Projektil-Grafik", // Show alternate bullet graphics (tracers)
+ L"Neues Zielsystem verwenden", // use NCTH
+ L"Gesichtsequipment-Grafiken",
+ L"Gesichtsequipment-Icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Erzwinge BR Lieferung", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3781,7 +4798,7 @@ STR16 zOptionsScreenHelpText[] =
L"Mit dieser Option funktioniert die Auswahl der Sцldner so wie in frьheren JAGGED ALLIANCE-Spielen (also genau andersherum als jetzt).",
//Show movement path
- L"Diese Funktion ANschalten, um die geplanten Wege der Sцldner zum Cursor anzuzeigen\n(oder abgeschaltet lassen und bei gewьnschter Anzeige die |S|H|I|F|T-Taste drьcken).",
+ L"Diese Funktion anschalten, um die geplanten Wege der Sцldner zum Cursor anzuzeigen\n(oder abgeschaltet lassen und bei gewьnschter Anzeige die |S|H|I|F|T-Taste drьcken).",
//show misses
L"Wenn diese Funktion aktiviert ist, folgt die Spielkamera im Rundenmodus der Geschossflugbahn bis zu ihrem Ende. Ausschalten um das Spiel zu beschleunigen.",
@@ -3827,15 +4844,18 @@ STR16 zOptionsScreenHelpText[] =
L"Wenn diese Funktion aktiviert ist, wird auch fьr Einzelschьsse mit Leuchtspurmunition der grafische Effekt dazu angezeigt.",
L"Wenn diese Funktion aktiviert ist, werden Regengerдusche hцrbar, sobald es regnet.",
L"Wenn diese Funktion aktiviert ist, sind Krдhen im Spiel vorhanden und hacken lautstark an manchen Leichen herum, haben aber sonst keine groЯen Auswirkungen auf das Spiel.",
- L"Wenn diese Funktion aktiviert ist, werden mit Druck auf |A|l|t Informationen ьber den Gegner eingeblendet, der unter dem Mauszeiger steht. Hinweis: Wenn nicht anders eingestellt, muss dieser in guter Sichtweite eigener Truppen sein.",
- L"Wenn diese Funktion aktiviert ist, wird nach jeder Runde automatisch in einen speziellen Autosave-Spielstand gespeichert.",
+ L"Wenn diese Funktion aktiviert ist, werden mit Druck auf |A|l|t Informationen ьber den Gegner eingeblendet, auf dem sich der Maus-Cursor befindet.",
+ L"Wenn diese Funktion aktiviert ist, wird nach jeder Runde automatisch abwechselnd in zwei speziellen Autosave-Spielstдnden gespeichert.\nUm zu laden, drьcken Sie |C|t|r|l+|L. Danach |A|l|t+|A bzw. |A|l|t+|B.",
L"Wenn diese Funktion aktiviert ist, wird Skyrider nichts mehr sagen. Verwenden Sie diese Option, wenn er Ihnen auf die Nьsse geht.",
- L"Aktivieren Sie diese Funktion, wenn Ihr Rechner steinalt ist und anderenfalls Probleme auftreten wьrden.",
+ //L"Aktivieren Sie diese Funktion, wenn Ihr Rechner steinalt ist und anderenfalls Probleme auftreten wьrden.",
L"Wenn diese Funktion aktiviert ist, werden erweiterte Beschreibungen und Werte zu den Waffen und Gegenstдnden angezeigt.",
- L"Wenn diese Funktion aktiviert ist und noch Gegner im Sektor sind, bleibt das Spiel im Runden-Modus, bis alle Feinde tot sind (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).",
+ L"Wenn diese Funktion aktiviert ist und noch Gegner im Sektor sind, bleibt das Spiel im Runden-Modus, bis alle Feinde tot sind (|C|t|r|l+|S|h|i|f|t+|A|l|t+|T).",
L"Wenn diese Funktion aktiviert ist, werden die Sцldnerwerte visuell mit ihrem Trainingsfortschritt unterlegt.",
L"Wenn diese Funktion aktiviert ist, wird die Strategische Karte entsprechend Ihres Erkundungsfortschrittes unterschiedlich eingefдrbt.",
- L"Wenn diese Funktion aktiviert ist, werden geschossene Projektile visuell mit Tracereffekten dargestellt.",
+ L"Wenn diese Funktion aktiviert ist, werden geschossene Projektile visuell mit Tracer-Effekten dargestellt.",
+ L"Wenn diese Funktion aktiviert ist, wird das neue Zielsystem und der neue Zielcursor verwendet.",
+ L"Wenn diese Funktion aktiviert ist, sehen sie das Gesichtsequipment Ihrer Sцldner direkt auf dem Portrait.",
+ L"Wenn diese Funktion aktiviert ist, sehen sie Icons fьr das Gesichtsequipment in der rechten unteren Ecke des Portraits.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -3942,7 +4962,7 @@ STR16 gzMPJHelpText[] =
L"ERЦFFNEN",
L"Geben Sie '127.0.0.1' fьr die IP Adresse ein. Die Port Nummer sollte grцЯer als 60000 sein.",
L"Vergewissern Sie sich, dass das Port (UDP, TCP) auf dem Router weitergeleitet wird. Siehe: http://portforward.com",
- L"Sie mьssen Ihre externe IP (http://www.whatismyip.com) und die Port Nummmer an die anderen Spieler schicken (via IRC, ICQ, etc.).",
+ L"Sie mьssen Ihre externe IP (http://www.whatismyip.com) und die Port Nummer an die anderen Spieler schicken (via IRC, ICQ, etc.).",
L"Klicken Sie auf 'Erцffnen', um ein neues Spiel zu erцffnen.",
L"TEILNEHMEN",
@@ -4114,7 +5134,7 @@ STR16 pMessageStrings[] =
L"..\\Spielstдnde", //The name of the directory where games are saved.
L"Tag",
L"Sцldner",
- L"Leerer Slot", //An empty save game slot
+ L"Leere Spiel Position", //An empty save game slot
L"Demo", //Demo of JA2
L"Debug", //State of development of a project (JA2) that is a debug build
L"Verцffentlichung", //Release build for JA2
@@ -4130,8 +5150,8 @@ STR16 pMessageStrings[] =
L"Inzwischen", //Meanwhile
L"%s ist im Sektor %s%s angekommen", //30 //Name/Squad has arrived in sector A9. Order must not change without notifying SirTech
L"Version",
- L"Leerer Quick-Save-Slot",
- L"Dieser Slot ist fьr Quick-Saves aus dem Karten- oder Taktik-Bildschirm reserviert. Speichern mit ALT+S.",
+ L"Leere Quick-Save Position",
+ L"Diese Position ist fьr Quick-Saves aus dem Karten- oder Taktik-Bildschirm reserviert. Speichern mit ALT+S.",
L"offen",
L"zu",
L"Ihr Festplattenspeicher ist knapp. Sie haben lediglich %sMB frei und Jagged Alliance 2 v1.13 benцtigt %sMB.",
@@ -4210,7 +5230,7 @@ STR16 pMessageStrings[] =
L"Verlasse Kampfmodus",
L"Erzwungener Rundenmodus ist aktiv, gehe in Kampfmodus",
#ifdef JA2BETAVERSION
- L"Spiel erfolgreich im Slot End Turn Auto Save gespeichert.", // 83
+ L"Spiel erfolgreich in Position End Turn Auto Save gespeichert.", // 83
#endif
L"..\\Spielstдnde\\MP_Spielstдnde", //The name of the directory where games are saved.
L"Client",
@@ -4285,7 +5305,7 @@ STR16 gzHelpScreenText[] =
STR16 gzNonPersistantPBIText[] =
{
- L"Es tobt eine Schlacht. Sie kцnnen sich nur im Taktikbildschirm zurьckziehen.",
+ L"Es tobt eine Schlacht. Sie kцnnen sich nur im Taktik-Bildschirm zurьckziehen.",
L"Sektor betreten und Kampf fortsetzen (|E).",
L"Kampf durch PC entscheiden (|A).",
L"Sie kцnnen den Kampf nicht vom PC entscheiden lassen, wenn Sie angreifen.",
@@ -4528,7 +5548,7 @@ STR16 gzLateLocalizedString[] =
L"%s hat keinen Erste-Hilfe-Kasten mehr!",
L"%s hat nicht das geringste Talent, jemanden zu verarzten!",
L"%s hat keinen Werkzeugkasten mehr!",
- L"%s ist absolut unfдhig dazu, irgend etwas zu reparieren!",
+ L"%s ist absolut unfдhig dazu, irgendetwas zu reparieren!",
//44
L"Repar. Zeit",
@@ -4536,7 +5556,7 @@ STR16 gzLateLocalizedString[] =
//46-48
L"%ss Gewehrlauf-Verlдngerung fдllt ab!",
- L"Es sind nicht mehr als %d Milizenausbilder in diesem Sektor erlaubt.",
+ L"Es sind nicht mehr als %d Miliz-Ausbilder in diesem Sektor erlaubt.",
L"Sind Sie sicher?", //
//49-50
@@ -4668,12 +5688,15 @@ STR16 New113Message[] =
L"%s wurde erfolgreich operiert.",
L"%s ist am Torso getroffen und verliert einen Punkt maximaler Gesundheit!",
L"%s ist am Torso getroffen und verliert %d Punkte maximaler Gesundheit!",
- L"%s hat einen Punkt an %s wiedergewonnen."
+ L"%s hat einen Punkt an %s wiedergewonnen.",
L"%s hat %d Punkte an %s wiedergewonnen.",
L"Ihre Spдher-Fertigkeit hat Sie davor bewahrt, vom Gegner in einen Hinterhalt gelockt zu werden.",
L"Dank Ihrer Spдher-Fertigkeit haben Sie erfolgreich ein Rudel Bloodcats umgangen.",
L"%s wurde in die Leiste getroffen und windet sich in Schmerzen!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
STR16 New113HAMMessage[] =
@@ -4735,7 +5758,7 @@ STR16 New113AIMMercMailTexts[] =
// Scream
L"Weitergeleitet von AIM-Server: Nachricht von Lennart Vilde",
- L"Vielen Dank fьr Ihre Kontaktaufnahme. Sagen Sie mir bescheid, wenn die nдchste Party steigen kann. Ab sofort erreichen Sie mich ьber die AIM page. ± ± Lennart Vilde.",
+ L"Vielen Dank fьr Ihre Kontaktaufnahme. Sagen Sie mir Bescheid, wenn die nдchste Party steigen kann. Ab sofort erreichen Sie mich ьber die AIM page. ± ± Lennart Vilde.",
// Henning
L"Weitergeleitet von AIM-Server: Nachricht von Henning von Branitz",
@@ -4756,41 +5779,38 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"Weitergeleitet von AIM-Server: Nachricht von Rudolf Steiger",
L"Wissen Sie eigentlich, wieviel Anrufe ich jeden Tag kriege? Jeder Pisser meint, er mьsste hier anrufen. ± ± Aber gut, ich bin jetzt wieder da. Falls Sie einen interessanten Auftrag haben. ±",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"Weitergeleitet von AIM-Server: Nachricht ьber Sцldner Verfьgbarkeit",
+ L"Ich habe Ihre Nachricht erhalten und warte auf Ihren Rьckruf.±",
};
// WANNE: These are the missing skills from the impass.edt file
// INFO: Do not replace the ± characters. They indicate the (-> Newline) from the edt files
STR16 MissingIMPSkillsDescriptions[] =
{
- // Sniper
- //L"Scharfschьtze: Sie haben Augen wie ein Falke. Dadurch kцnnen sie sogar auf die Flьgel einer Fliege aus hunderten von Metern schieЯen! ± ",
- //LOOTF - ersetzt mit:
- L"Scharfschьtze: Sie haben einen scharfen Blick und eine ruhige Hand, neben Ihrem guten Gespьr fьr die Windrichtung die perfekten Voraussetzungen fьr das PrдzisionsschieЯen auf groЯe Entfernung oder eine Partie 'Jenga'. Gut so, bleiben Sie auf Distanz, so ersparen Sie sich spдtere medizinische Betreuung. ± "
-
- // Camouflage
- //L"Tarnung: Neben Ihnen schauen sogar Bьsche synthetisch aus! ± ",
- //LOOTF - ersetzt mit:
- L"Tarnung: Sie haben das Ьberkleistern des eigenen Gesichts mit Tarnfarbe zu einer Kunstform erhoben und erschaffen aus Zwang durchweg wundervolle Illusionen der umgebenden Flora auf Ihrem eher langweiligen Antlitz. Dadurch wirken Sie im цrtlichen ALDI wie ein Wunderling, sind aber als Heckenschьtze im Dschungel nahezu unsichtbar. ± "
-
- // SANDRO - new strings for new traits added
+ // Sniper
+ L"Scharfschьtze: Sie haben Augen wie ein Falke. Dadurch kцnnen sie sogar auf die Flьgel einer Fliege aus hunderten von Metern schieЯen! ± ",
+ // Camouflage
+ L"Tarnung: Neben Ihnen schauen sogar Bьsche synthetisch aus. ± ",
// Ranger
- L"Jдger: Vermutlich lesen Sie diese Nachricht auf einem tragbaren Gerдt von einem Dschungel eines Dritte-Welt-Lands aus und ich ahne, dass Sie dabei nicht einmal aufrecht sitzen. Sie haben eine bemerkenswerte Affinitдt zu schwer passierbarem Gelдnde und Ihre unermьdlichen Beine tragen Sie im Handumdrehen ьber Stock und Stein. Sie scheuen sich auch nicht vor Dreck und so passen Sie sich mehr als alle anderen an Ihre Umgebung an. Setzen Sie diese Qualitдten als Fьhrer ein um Ihr Team auf bestem Wege ans Ziel zu bringen! ± ",
+ L"Jдger: Sie haben eine bemerkenswerte Affinitдt zu schwer passierbarem Gelдnde und Ihre unermьdlichen Beine tragen Sie im Handumdrehen ьber Stock und Stein. ± ",
// Gunslinger
- L"Revolverheld: Ob es an ihrer handlichen Effizienz im Nahkampf liegt oder einfach daran, dass sonst niemand sonst so gut mit ihnen umgehen kann, aber Sie lieben Faustfeuerwaffen, das ist klar. Sie beweisen enormes Talent im Umgang mit Pistolen und Revolvern aller Art und in Ihrem Beruf ist das nicht das Schlechteste. Passen Sie nur auf, dass Sie neben all dem Pistolenrumwirbeln und den coolen Magazintricks auch noch an Ihre Nдchsten denken, falls nach der Waffe noch jemand kommt. ± ",
+ L"Revolverheld: Sie beweisen enormes Talent im Umgang mit Pistolen und Revolvern aller Art. John Wayne lдsst grьЯen. ± ",
// Squadleader
- L"Zugfьhrer: Normalerweise wьrde ich Sie ja wie einen gewцhnlichen (wenn auch den bisherig besten) Kunden behandeln, aber ich sehe ein wenig zu Ihnen auf. Die Rhetorik in Ihrem Fragebogen hat einige hier ganz schцn beeindruckt und Ihre generelle Erscheinung motiviert einfach. Das enorme Wissen ьber die Kunst der Kriegsfьhrung, das Sie sich angeeignet haben, kommt den Ihnen unterstellten Mдnnern und Frauen sicher sehr zugute. In Ihrer Nдhe kann eigentlich nichts schiefgehen. ± ",
+ L"Zugfьhrer: Ihre Rhetorik hat uns ganz schцn beeindruckt und Ihre generelle Erscheinung motiviert einfach. In Ihrer Nдhe kann eigentlich nichts schiefgehen. ± ",
// Technician
- L"Ingenieur: Im Rahmen der Sцldnerevaluierung fьhren wir einen generellen Schnelltest auf handwerkliche und technische Befдhigung durch und kцnnen dabei offenbar nicht die ganze Palette menschlichen Kцnnens abdecken. Die Bilder des von Ihnen gebauten reaktorbetriebenen, dreibeinigen Rasenmдhers, die Sie auf unsere Server geladen haben, fanden wir sehr beeindruckend. Wir wissen also, dass Sie mit Hufeisen und altem Garn so gut wie alles reparieren kцnnen, aber bitte nutzen Sie demnдchst unsere Webprдsenz, statt sich direkt in unser System zu hacken. ± ",
+ L"Ingenieur: Sie kцnnen mit Hufeisen und altem Garn so gut wie alles reparieren, MacGyver wьrde vor Neid erblassen. ± ",
// Doctor
- L"Arzt: Дrzte wie Sie braucht das Land! Es sind immer die besten, die sich in den Krieg stьrzen, aber womцglich kцnnen Sie in rauchenden Trьmmern mehr bewirken als in einem heruntergewirtschafteten und von fetter Dekadenz gezeichneten Gesundheitssystem. Gibt man Ihnen die Ausrьstung, kцnnen Sie auf einem Strohbett Schusswunden operieren und Kranke heilen wie ein junger Jesus. Sollten Sie zurьckkehren, es wartet immer eine Beschдftigung auf Sie! ± ",
+ L"Arzt: Дrzte wie Sie braucht das Land! Sie kцnnen Kranke heilen wie ein junger Jesus. ± ",
// Athletics
- L"Lдufer: Am Anfang waren wir besorgt, Sie wдren der erste beinlose Kunde, der sich ins Ausland wagt, doch offenbar waren die Testwerte einfach nur auЯerhalb des Berechnungsrahmens, also Glьckwunsch, hier sind Sie Rekordhalter. So schnell und ausdauernd wie Sie rennen, mцchte ich annehmen, Sie sind mit dem Wort Marathon vertraut. Ich schlage vor, wenn es Дrger gibt, laufen Sie einfach! Einholen wird Sie eh niemand. ± ",
+ L"Lдufer: So schnell und ausdauernd wie Sie rennen, mцchte ich annehmen, Sie sind mit dem Wort Marathon vertraut. Einholen wird Sie bestimmt keiner. ± ",
// Bodybuilding
- L"Kraftsportler: Manche meinen ja, es ist eine abscheuliche Form der Kцrperkunst, aber Sie scheinen damit recht gut leben zu kцnnen. Durch Ihr intensives Muskeltraining fдllt Ihnen das Schleppen schwerer Gerдtschaften garantiert leicht und so einen Typen wie Sie kriegt man vermutlich nicht einmal mit dem Brecheisen auf die Knie gezwungen. Und hey, ganz so schlimm wie die EU-Verfassung sehen Sie nun auch nicht aus. ± ",
+ L"Kraftsportler: Arnie? Was fьr ein Weichei! Sie kцnnten ihn selbst mit einer gebrochenen Hand zu Boden befцrdern. ± ",
// Demolitions
- L"Sprengmeister: Unsere fachmдnnischen Psychoanalysten meinen, Sie sind als Kind nicht oft genug oder gar nicht von Ihren Eltern daran erinnert worden, dass Messer, Gabel, Plastiksprengstoff und Licht fьr kleine Kinder nicht sind. Machen Sie aus Ihrem verschobenen Weltbild einfach das Beste und nutzen Sie Ihre Begeisterung fьr alles, was mit mehrfacher Schallgeschwindigkeit expandiert um sich im Training mit Granaten und Sprengstoffen hervorzutun. ± ",
+ L"Sprengmeister: Nutzen Sie Ihre Begeisterung fьr alles, was mit mehrfacher Schallgeschwindigkeit expandiert um sich im Training mit Granaten und Sprengstoffen hervorzutun. ± ",
// Scouting
- L"Aufklдrer: Sie sind ьber die MaЯen aufmerksam, haben ein sehr reges Auge und einen nimmermьden Geist. Ihnen entgeht nicht das geringste Detail, vor allem nicht, wenn Sie mit Ihrem alten Feldstecher unterwegs sind. Ihre Prдsenz zahlt sich aus, denn durch die Anzeichen nahender Bedrohung, die nur Sie erkennen, kцnnen Sie Ihre Liebsten oder Ihre Kameraden vor Hinterhalten bewahren. Waren Sie mal bei der Stasi? ± ",
+ L"Aufklдrer: Sie sind ьber die MaЯen aufmerksam, haben ein sehr reges Auge und einen nimmermьden Geist. ± ",
};
STR16 NewInvMessage[] =
@@ -4993,7 +6013,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Mehrspieler Chat",
- L"Chat: Drьcke 'ENTER' zum Senden oder 'ESC' zum Verlassen.",
+ L"Senden mit 'ENTER', Abbrechen mit 'ESC'",
};
// Following strings added - SANDRO
@@ -5131,7 +6151,7 @@ STR16 gzFacilityErrorMessage[]=
L"%s ist betrunken.", // <--- This is a log message string.
L"%s ist ernsthaft krank geworden in Sektor %s und wurde vom Dienst freigestellt.",
L"%s ist ernsthaft krank geworden und kann keine seine Arbeiten in der %s in %s fortsetzen.",
- L"%s wurde veletzt in Sektor %s.", // <--- This is a log message string.
+ L"%s wurde verletzt in Sektor %s.", // <--- This is a log message string.
// 31 - 35
L"%s wurde ernsthaft im Sektor %s verletzt.", //<--- This is a log message string.
@@ -5202,6 +6222,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Fьr die korrekte Arbeit im Fenster-Modus benцtigt Jagged Alliance 2 v1.13 16-bit Farbmodus.", //Jagged Alliance 2 v1.13 windowed mode requires a color depth of 16bpp or less.
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Interner Fehler beim Auslesen der %s Slots des zu ladenden Spielstandes: Die Anzahl der Slots im Spielstand (%d) unterscheidet sich mit den definierten Slots in der Datei ja2_options.ini (%d)",
+ L"Sцldner (MAX_NUMBER_PLAYER_MERCS) / Fahrzeuge (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Gegner (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Monster (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Miliz (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Zivilisten (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5300,29 +6329,29 @@ STR16 sEnemyTauntsGotHit[]=
//////////////////////////////////////////////////////
STR16 gzItemDescTabButtonText[] =
{
- L"Description",
- L"General",
- L"Advanced",
-};
+ L"Beschreibung",
+ L"Allgemein",
+ L"Erweitert",
+ };
STR16 gzItemDescTabButtonShortText[] =
{
- L"Desc",
- L"Gen",
- L"Adv",
+ L"Bes.",
+ L"Allg.",
+ L"Erw.",
};
STR16 gzItemDescGenHeaders[] =
{
- L"Primary",
- L"Secondary",
- L"AP Costs",
- L"Burst / Autofire",
+ L"Primдr",
+ L"Sekundдr",
+ L"AP Kosten",
+ L"FeuerstoЯ/Autofeuer",
};
STR16 gzItemDescGenIndexes[] =
{
- L"Prop.",
+ L"Eigensch.",
L"0",
L"+/-",
L"=",
@@ -5330,373 +6359,386 @@ STR16 gzItemDescGenIndexes[] =
STR16 gzUDBButtonTooltipText[]=
{
- L"|D|e|s|c|r|i|p|t|i|o|n |P|a|g|e:\n \nShows basic textual information about this item.",
- L"|G|e|n|e|r|a|l |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows specific data about this item.",
- L"|A|d|v|a|n|c|e|d| |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows bonuses given by this item.",
+ L"|B|e|s|c|h|r|e|i|b|u|n|g:\n \nZeigt allgemeine Informationen ьber den Gegenstand.",
+ L"|A|l|l|g|e|m|e|i|n|e |E|i|g|e|n|s|c|h|a|f|t|e|n:\n \nZeigt typische Daten ьber den Gegenstand.",
+ L"|E|r|w|e|i|t|e|r|t|e |E|i|g|e|n|s|c|h|a|f|t|e|n:\n \nZeigt Vor-/Nachteile des Gegenstandes.",
};
STR16 gzUDBHeaderTooltipText[]=
{
- L"|P|r|i|m|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nProperties and data related to this item's class\n(Weapon / Armor / etcetera).",
- L"|S|e|c|o|n|d|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nAdditional features of this item,\nand/or possible secondary abilities.",
- L"|A|P |C|o|s|t|s:\n \nVarious Action Point costs to fire\nor manipulate this weapon.",
- L"|B|u|r|s|t |/ |A|u|t|o|f|i|r|e |P|r|o|p|e|r|t|i|e|s:\n \nData related to firing this weapon in\nBurst or Autofire modes.",
+ L"|P|r|i|m|д|r|e |E|i|g|e|n|s|c|h|a|f|t|e|n:\n \nEigenschaften und Daten in Bezug auf die Gegenstandsklasse\n(Waffen / Rьstungen / usw.).",
+ L"|S|e|k|u|n|d|д|r|e |E|i|g|e|n|s|c|h|a|f|t|e|n:\n \nZusдtzliche Eigenschaften des Gegenstands,\nund/oder mцgliche sekundдre Fдhigkeiten.",
+ L"|A|P |K|o|s|t|e|n:\n \nDiverse AP Kosten in Bezug auf Abfeuern\noder Handhabung der Waffe.",
+ L"|F|e|u|e|r|s|t|o|Я|/|A|u|t|o|f|e|u|e|r |E|i|g|e|n|s|c|h|a|f|t|e|n:\n \nMit dem Abfeuern dieser Waffe verbundene Daten fьr\nFeuerstoЯ-/Autofeuermodus.",
};
STR16 gzUDBGenIndexTooltipText[]=
{
- L"|P|r|o|p|e|r|t|y |i|c|o|n\n \nMouse-over to reveal the property's name.",
- L"|B|a|s|i|c |v|a|l|u|e\n \nThe basic value given by this item, excluding any\nbonuses or penalties from attachments or ammo.",
- L"|A|t|t|a|c|h|m|e|n|t |B|o|n|u|s|e|s\n \nBonus or penalty given by ammo, any attachments,\nor low item condition.",
- L"|F|i|n|a|l |V|a|l|u|e\n \nThe final value given by this item, including any\nbonuses/penalties from attachments or ammo.",
+ L"|E|i|g|e|n|s|c|h|a|f|t |S|y|m|b|o|l\n \nMaus-darьber um den Namen der Eigenschaft zu erfahren.",
+ L"|G|r|u|n|d|w|e|r|t\n \nDer normale Wert des Gegenstandes ausschlieЯlich aller\nVor-/Nachteile von Erweiterungen oder Munition.",
+ L"|E|r|w|e|i|t|e|r|u|n|g|s|b|o|n|u|s\n \nVor-/Nachteile von Munition, Erweiterungen, \noder schlechtem Zustand des Gegenstandes.",
+ L"|E|n|d|w|e|r|t\n \nDer endgьltige Wert des Gegenstandes, einschlieЯlich aller \nVor-/Nachteile von Erweiterungen oder Munition.",
};
STR16 gzUDBAdvIndexTooltipText[]=
{
- L"Property icon (mouse-over to reveal name).",
- L"Bonus/penalty given while |s|t|a|n|d|i|n|g.",
- L"Bonus/penalty given while |c|r|o|u|c|h|i|n|g.",
- L"Bonus/penalty given while |p|r|o|n|e.",
- L"Bonus/penalty given",
+ L"Eigenschaft Symbol (Maus-darьber zeigt den Namen).",
+ L"Vor-/Nachteil wenn |s|t|e|h|e|n|d.",
+ L"Vor-/Nachteil wenn |h|o|c|k|e|n|d.",
+ L"Vor-/Nachteil wenn |l|i|e|g|e|n|d.",
+ L"Gegebener Vor-/Nachteil",
};
STR16 szUDBGenWeaponsStatsTooltipText[]=
{
- L"|A|c|c|u|r|a|c|y",
- L"|D|a|m|a|g|e",
- L"|R|a|n|g|e",
- L"|A|l|l|o|w|e|d |A|i|m|i|n|g |L|e|v|e|l|s",
- L"|S|c|o|p|e |M|a|g|n|i|f|i|c|a|t|i|o|n |F|a|c|t|o|r",
- L"|P|r|o|j|e|c|t|i|o|n |F|a|c|t|o|r",
- L"|H|i|d|d|e|n |M|u|z|z|l|e |F|l|a|s|h",
- L"|L|o|u|d|n|e|s|s",
- L"|R|e|l|i|a|b|i|l|i|t|y",
- L"|R|e|p|a|i|r |E|a|s|e",
- L"|M|i|n|. |R|a|n|g|e |f|o|r |A|i|m|i|n|g |B|o|n|u|s",
- L"|T|o|-|H|i|t |M|o|d|i|f|i|e|r",
+ L"|G|e|n|a|u|i|g|k|e|i|t",
+ L"|S|c|h|a|d|e|n",
+ L"|R|e|i|c|h|w|e|i|t|e",
+ L"|E|r|l|a|u|b|t|e |Z|i|e|l|s|t|u|f|e|n",
+ L"|V|e|r|g|r|ц|Я|e|r|u|n|g|s|f|a|k|t|o|r",
+ L"|P|r|o|j|e|k|t|i|o|n|s|f|a|k|t|o|r",
+ L"|U|n|t|e|r|b|u|n|d|e|n|e|s M|ь|n|d|u|n|g|s|f|e|u|e|r",
+ L"|L|a|u|t|s|t|д|r|k|e",
+ L"|Z|u|v|e|r|l|д|s|s|i|g|k|e|i|t",
+ L"|R|e|p|a|r|i|e|r|f|д|h|i|g|k|e|i|t",
+ L"|M|i|n|d|e|s|t |R|e|i|c|h|w|e|i|t|e |f|ь|r |Z|i|e|l|v|o|r|t|e|i|l",
+ L"|T|r|e|f|f|e|r |M|o|d|i|f|i|k|a|t|o|r",
L"", // (12)
- L"|A|P|s |t|o |R|e|a|d|y",
- L"|A|P|s |t|o |A|t|t|a|c|k",
- L"|A|P|s |t|o |B|u|r|s|t",
- L"|A|P|s |t|o |A|u|t|o|f|i|r|e",
- L"|A|P|s |t|o |R|e|l|o|a|d",
- L"|A|P|s |t|o |R|e|c|h|a|m|b|e|r",
- L"|L|a|t|e|r|a|l |R|e|c|o|i|l",
- L"|V|e|r|t|i|c|a|l |R|e|c|o|i|l",
- L"|A|u|t|o|f|i|r|e |B|u|l|l|e|t|s |p|e|r |5 |A|P|s",
+ L"|A|P|s |f|ь|r |A|n|l|e|g|e|n",
+ L"|A|P|s |f|ь|r |S|c|h|u|s|s",
+ L"|A|P|s |f|ь|r |Fe|u|e|r|s|t|o|Я ",
+ L"|A|P|s |f|ь|r |A|u|t|o|f|e|u|e|r",
+ L"|A|P|s |f|ь|r |N|a|c|h|l|a|d|e|n",
+ L"|A|P|s |f|ь|r |R|e|p|e|t|i|e|r|e|n",
+ L"|H|o|r|i|z|o|n|t|a|l|e|r |R|ь|c|k|s|t|o|Я",
+ L"|V|e|r|t|i|k|a|l|e|r |R|ь|c|k|s|t|o|Я",
+ L"|A|u|t|o|f|e|u|e|r |p|r|o |5 |A|P|s",
};
STR16 szUDBGenWeaponsStatsExplanationsTooltipText[]=
{
- L"\n \nDetermines whether bullets fired by\nthis gun will stray far from where\nit is pointed.\n \nScale: 0-100.\nHigher is better.",
- L"\n \nDetermines the average amount of damage done\nby bullets fired from this weapon, before\ntaking into account armor or armor-penetration.\n \nHigher is better.",
- L"\n \nThe maximum distance (in tiles) that\nbullets fired from this gun will travel\nbefore they begin dropping towards the\nground.\n \nHigher is better.",
- L"\n \nThis is the number of Extra Aiming\nLevels you can add when aiming this gun.\n \nThe FEWER aiming levels are allowed, the MORE\nbonus each aiming level gives you. Therefore,\nhaving FEWER levels makes the gun faster to aim,\nwithout making it any less accurate.\n \nLower is better.",
- L"\n \nWhen greater than 1.0, will proportionally reduce\naiming errors at a distance.\n \nRemember that high scope magnification is detrimental\nwhen the target is too close!\n \nA value of 1.0 means no scope is installed.",
- L"\n \nProportionally reduces aiming errors at a distance.\n \nThis effect works up to a given distance,\nthen begins to dissipate and eventually\ndisappears at sufficient range.\n \nHigher is better.",
- L"\n \nWhen this property is in effect, the weapon\nproduces no visible flash when firing.\n \nEnemies will not be able to spot you\njust by your muzzle flash (but they\nmight still HEAR you).",
- L"\n \nWhen firing this weapon, Loudness is the\ndistance (in tiles) that the sound of\ngunfire will travel.\n \nEnemies within this distance will probably\nhear the shot.\n \nLower is better.",
- L"\n \nDetermines how quickly this weapon will degrade\nwith use.\n \nHigher is better.",
- L"\n \nDetermines how difficult it is to repair this weapon.\n \nHigher is better.",
- L"\n \nThe minimum range at which a scope can provide it's aimBonus.",
- L"\n \nTo hit modifier granted by laser sights.",
+ L"\n \nBestimmt ob Kugeln, welche von dieser Waffe gefeuert werden, vom\nZiel abweichen.\n \nMaЯstab: 0-100.\nHцher ist besser.",
+ L"\n \nBestimmt den durchschnittlichen Schaden den von dieser Waffe gefeuerte Kugeln machen,\nbevor Berьcksichtigung von Rьstung oder Rьstungsdurchdringen.\n \nHцher ist besser.",
+ L"\n \nDie gцЯte Entfernung (in Felder) die von dieser Waffe gefeuerte Kugel\nzurьcklegen, bevor sie zu Boden fallen.\n \nHцher ist besser.",
+ L"\n \nDas ist die Anzahl von extra Ziellevel welche Sie erhalten,\nwenn Sie mit der Waffe zielen.\n \nJe weniger Ziellevel erlaubt sind desto mehr\nLevel erhalten Sie. Deshalb, weniger Level zu haben,\nmacht die Waffe schneller ohne an Genauigkeit\nzu verlieren.\n \nNiedriger ist besser.",
+ L"\n \nWenn grцЯer als 1.0, werden Zielfehler\nproportional zur Entfernung reduziert.\n \nZur Erinnernung hohe ZielfernrohrvergrцЯerungen sind schдdlich wenn das Ziel zu nahe ist!\n \n Der Wert von 1.0 bedeutet kein Zielfernrohr wird benutzt.",
+ L"\n \nReduziert Zielfehler proportional zur Entfernung.\n \nDieser Effekt wirkt bis zu einer gegebenen Entfernung,\ndann lцst er sich langsam auf und verschwindet evtl. bei ausreichender Entfernung.\n \nHцher ist besser.",
+ L"\n \nWenn diese Eigenschaft in Kraft ist, dann produziert die Waffe kein sichtbares Mьndungsfeuer\nwenn abgefeuert.\n \nFeinde werden Sie nicht bloЯ beim Mьndungsfeuer ausfindig machen kцnnen\n(aber Sie kцnnen Sie dennoch hцren).",
+ L"\n \nBestimmt die Entfernung (in Felder) der erzeugten Lautstдrke,\nwenn die Waffe geschossen wird.\n \nFeinde innerhalb dieser Entfernung hцren den Schuss, Feinde auЯerhalb nicht.\n \nNiedriger ist besser.",
+ L"\n \nBestimmt, wie schnell sich diese Waffe bei Gebrauch abnutzt.\n \nHцher ist besser.",
+ L"\n \nBestimmt, wie schwierig es ist die Waffe zu reparieren.\n \nHцher ist besser.",
+ L"\n \nDie minimale Entfernung um einen Zielvorteil zu erhalten.",
+ L"\n \nTreffermodifikator den eine Laservorrichtung gewдhrleistet.",
L"", // (12)
- L"\n \nThe number of APs required to bring this\nweapon up to firing stance.\n \nOnce the weapon is raised, you may fire repeatedly\nwithout paying this cost again.\n \nA weapon is automatically 'Unreadied' if its\nwielder performs any action other than\nfiring or turning.\n \nLower is better.",
- L"\n \nThe number of APs required to perform\na single attack with this weapon.\n \nFor guns, this is the cost of firing\na single shot without extra aiming.\n \nIf this icon is greyed-out, single-shots\n are not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to fire\na burst.\n \nThe number of bullets fired in each burst is\ndetermined by the weapon itself, and indicated\nby the number of bullets shown on this icon.\n \nIf this icon is greyed-out, burst fire\nis not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to fire\nan Autofire Volley of three bullets.\n \nIf you wish to fire more than 3 bullets,\nyou will need to pay extra APs.\n \nIf this icon is greyed-out, autofire\nis not possible with this weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to reload\nthis weapon.\n \nLower is better.",
- L"\n \nThe number of APs required to rechamber this weapon\nbetween each and every shot fired.\n \nLower is better.",
- L"\n \nThe distance this weapon's muzzle will shift\nhorizontally between each and every bullet in a\nburst or autofire volley.\n \nPositive numbers indicate shifting to the right.\nNegative numbers indicate shifting to the left.\n \nCloser to 0 is better.",
- L"\n \nThe distance this weapon's muzzle will shift\nvertically between each and every bullet in a\nburst or autofire volley.\n \nPositive numbers indicate shifting upwards.\nNegative numbers indicate shifting downwards.\n \nCloser to 0 is better.",
- L"\n \nIndicates the number of bullets that will be added\nto an autofire volley for every extra 5 APs\nyou spend.\n \nHigher is better.",
+ L"\n \nDie Anzahl von APs nцtig um die Waffe anzulegen.\n \nSobald die Waffe angelegt ist, kцnnen Sie wiederholt feuern ohne diese Kosten erneut zu bezahlen.\n \nEine Waffe ist automatisch abgelegt wenn der Anwender irgendeine andere Aktivitдt ausьbt,\nmit der Ausnahme von schieЯen oder ausrichten.\n \nNiedriger ist besser.",
+ L"\n \nDie Anzahl von APs nцtig um einen einzelnen Angriff mit dieser Waffe durchzufьhren.\n \nFьr Schusswaffen ist dies der Aufwand fьr einen Einzelschuss ohne extra Zielen.\n \nWenn das Symbol 'grau' erscheint sind Einzelschьsse nicht mцglich.\n \nNiedriger ist besser.",
+ L"\n \nDie Anzahl von APs die fьr einen FeuerstoЯ benцtigt werden.\n \nDie Anzahl der Geschosse welche mit jedem FeuerstoЯ abgefeuert werden hдngt von der Waffe selbst ab,\nund ist angedeutet bei der Anzahl der Kugeln neben dem Symbol.\n \nWenn das Symbol 'grau' erscheint ist ein Feuerstoss nicht mцglich.\n \nNiedriger ist besser.",
+ L"\n \nDie Anzahl von APs die fьr eine Autofeuer Salve von genau 3 Kugeln benцtigt werden.\nWenn das Symbol 'grau' erscheint ist Autofeuer nicht mцglich.\n \nNiedriger ist besser.",
+ L"\n \nDie Anzahl von APs die fьr das Nachladen benцtigt werden.\n \nNiedriger ist besser.",
+ L"\n \nDie Anzahl von APs die fьr das repetieren der Waffe benцtigt werden.\n \nNiedriger ist besser.",
+ L"\n \nDie Entfernung in der die Mьndung horizontal nach jeder Salve in Feurstoss- oder Autofeurmodus abweicht.\n \nPositive Zahlen zeigen Abweichungen nach rechts an.\nNegative Zahlen zeigen Abweichungen nach links an.\n \nNдher an 0 ist besser.",
+ L"\n \nDie Entfernung in der die Mьndung vertikal nach jeder Salve in Feurstoss- oder Autofeurmodus abweicht.\n \nPositive Zahlen zeigen Abweichungen nach oben an.\nNegative Zahlen zeigen Abweichungen nach unten an.\n \nNдher an 0 ist besser.",
+ L"\n \nZeigt die Anzahl der Kugeln an, welche zu einer Autofeuer Salve fьr jeweils 5 investierte AP addiert werden.\n \nHцher ist besser.",
};
STR16 szUDBGenArmorStatsTooltipText[]=
{
- L"|P|r|o|t|e|c|t|i|o|n |V|a|l|u|e",
- L"|C|o|v|e|r|a|g|e",
- L"|D|e|g|r|a|d|e |R|a|t|e",
+ L"|S|c|h|u|t|z |W|e|r|t",
+ L"|F|l|д|c|h|e|n|d|e|c|k|u|n|g",
+ L"|Z|e|r|f|a|l|l |R|a|t|e",
};
STR16 szUDBGenArmorStatsExplanationsTooltipText[]=
{
- L"\n \nThis primary armor property defines how much\ndamage the armor will absorb from any attack.\n \nRemember that armor-piercing attacks and\nvarious randomal factors may alter the\nfinal damage reduction.\n \nHigher is better.",
- L"\n \nDetermines how much of the protected\nbodypart is covered by the armor.\n \nIf coverage is below 100%, attacks have\na certain chance of bypassing the armor\ncompletely, causing maximum damage\nto the protected bodypart.\n \nHigher is better.",
- L"\n \nIndicates how quickly this armor's condition\ndrops when it is struck, proportional to\nthe damage caused by the attack.\n \nLower is better.",
+ L"\n \nDiese grundlegende Rьstungseigenschaft bestimmt wie viel\nSchaden abgefangen wird.\nZur Erinnerung: Schutzdurchschlagende Angriffe und einige\nzufдllige Faktoren kцnnen die Schadensreduzierung verдndern.\n \nHцher ist besser.",
+ L"\n \nBestimmt wie viel des geschьtzten\nKцrperteils durch die Rьstung abgedeckt wird.\n \nWenn weniger als 100% verdeckt wird, haben Angriffe\neine gewisse Chance die Rьstung schlichtweg\nzu umgehen, und hцchsten Schaden\nauf das verdeckte Kцrperteil auszuьben.\n \nHцher ist besser.",
+ L"\n \nBestimmt wie schnell der Zustand der Rьstung abfдllt,\nwenn sie getroffen wird, im Verhдltnis zum\nSchaden durch einen Angriff.\n \nNiedriger ist besser.",
};
STR16 szUDBGenAmmoStatsTooltipText[]=
{
- L"|A|r|m|o|r |P|i|e|r|c|i|n|g",
- L"|B|u|l|l|e|t |T|u|m|b|l|e",
- L"|P|r|e|-|I|m|p|a|c|t |E|x|p|l|o|s|i|o|n",
+ L"|R|ь|s|t|u|n|g|s|d|u|r|c|h|s|c|h|l|a|g",
+ L"|K|u|g|e|l|s|t|u|r|z",
+ L"|E|x|p|l|o|s|i|o|n |v|o|r |E|i|n|s|c|h|l|a|g",
};
STR16 szUDBGenAmmoStatsExplanationsTooltipText[]=
{
- L"\n \nThis is the bullet's ability to penetrate\na target's armor.\n \nWhen above 1.0, the bullet proportionally\nreduces the Protection value of any\narmor it hits.\n \nWhen below 1.0, the bullet increases the\nprotection value of the armor instead.\n \nHigher is better.",
- L"\n \nDetermines a proportional increase of damage\npotential once the bullet gets through the\ntarget's armor and hits the bodypart behind it.\n \nWhen above 1.0, the bullet's damage\nincreases after penetrating the armor.\n \nWhen below 1.0, the bullet's damage\npotential decreases after passing through armor.\n \nHigher is better.",
- L"\n \nA multiplier to the bullet's damage potential\nthat is applied immediately before hitting the\ntarget.\n \nValues above 1.0 indicate an increase in damage,\nvalues below 1.0 indicate a decrease.\n \nHigher is better.",
+ L"\n \nDas ist die Fдhigkeit der Kugel, in die Rьstung\neines Ziels einzudringen.\n \nWenn der Wert grцsser als 1.0 ist, reduziert die Kugel \nverhдltnismдЯig den Schutz jeglicher Rьstung auf die sie eintrifft.\n \nIst der Wert kleiner als 1.0, steigert die Kugel den\nSchutz der Rьstung stattdessen.\n \nHцher ist besser.",
+ L"\n \nBestimmt eine verhдltnismдЯige Zunahme des Schadenspotentials,\nsobald die Kugel die Rьstung des Ziels\ndurchbricht und den Kцrper dahinter trifft.\n \nWerte ьber 1.0 erhцhen, Werte unter 1.0 reduzieren das Schadenspotential\nder durchbrochenen Kugel.\n \nHцher ist besser.",
+ L"\n \nEin Multiplikator zum Schadenspotential der Kugel,\nder vor dem Treffen des Zieles angewandt wird.\n \nWerte ьber 1.0 erhцhen, Werte unter 1.0 reduzieren den Schaden.\n \nHцher ist besser.",
};
STR16 szUDBGenExplosiveStatsTooltipText[]=
{
- L"|D|a|m|a|g|e",
- L"|S|t|u|n |D|a|m|a|g|e",
- L"|B|l|a|s|t |R|a|d|i|u|s",
- L"|S|t|u|n |B|l|a|s|t |R|a|d|i|u|s",
- L"|N|o|i|s|e |B|l|a|s|t |R|a|d|i|u|s",
- L"|T|e|a|r|g|a|s |S|t|a|r|t |R|a|d|i|u|s",
- L"|M|u|s|t|a|r|d |G|a|s |S|t|a|r|t |R|a|d|i|u|s",
- L"|L|i|g|h|t |S|t|a|r|t |R|a|d|i|u|s",
- L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
- L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
- L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
- L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
- L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
- L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
- L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
- L"|L|o|u|d|n|e|s|s",
- L"|V|o|l|a|t|i|l|i|t|y",
+ L"|S|c|h|a|d|e|n",
+ L"|B|e|t|д|u|b|u|n|g|s|s|c|h|a|d|e|n",
+ L"|R|a|d|i|u|s|-|D|r|u|c|k|w|e|l|l|e",
+ L"|R|a|d|i|u|s|-|B|e|t|д|u|b|u|n|g|s|s|c|h|a|d|e|n",
+ L"|R|a|d|i|u|s|-|G|e|r|д|u|s|c|h",
+ L"|S|t|a|r|t|r|a|d|i|u|s|-|T|r|д|n|e|n|g|a|s",
+ L"|S|t|a|r|t|r|a|d|i|u|s|-|S|e|n|f|g|a|s",
+ L"|S|t|a|r|t|r|a|d|i|u|s|-|L|i|c|h|t",
+ L"|S|t|a|r|t|r|a|d|i|u|s|-|R|a|u|c|h",
+ L"|S|t|a|r|t|r|a|d|i|u|s|-|F|e|u|e|r",
+ L"|E|n|d|r|a|d|i|u|s|-|T|r|д|n|e|n|g|a|s",
+ L"|E|n|d|r|a|d|i|u|s|-|S|e|n|f|g|a|s",
+ L"|E|n|d|r|a|d|i|u|s|-|L|i|c|h|t",
+ L"|E|n|d|r|a|d|i|u|s|-|R|a|u|c|h",
+ L"|E|n|d|r|a|d|i|u|s|-|F|e|u|e|r ",
+ L"|Z|e|i|t|d|a|u|e|r",
+ L"|L|a|u|t|s|t|д|r|k|e",
+ L"|U|n|b|e|s|t|д|n|d|i|g|k|e|i|t",
};
STR16 szUDBGenExplosiveStatsExplanationsTooltipText[]=
{
- L"\n \nThe amount of damage caused by this explosive.\n \nNote that blast-type explosives deliver this damage\nonly once (when they go off), while prolonged effect\nexplosives deliver this amount of damage every turn until the\neffect dissipates.\n \nHigher is better.",
- L"\n \nThe amount of non-lethal (stun) damage caused\nby this explosive.\n \nNote that blast-type explosives deliver their damage\nonly once (when they go off), while prolonged effect\nexplosives deliver this amount of stun damage every\nturn until the effect dissipates.\n \nHigher is better.",
- L"\n \nThis is the radius of the explosive blast caused by\nthis explosive item.\n \nTargets will suffer less damage the further they are\nfrom the center of the explosion.\n \nHigher is better.",
- L"\n \nThis is the radius of the stun-blast caused by\nthis explosive item.\n \nTargets will suffer less damage the further they are\nfrom the center of the blast.\n \nHigher is better.",
- L"\n \nThis is the distance that the noise from this\ntrap will travel. Soldiers within this distance\nare likely to hear the noise and be alerted.\n \nHigher is better.",
- L"\n \nThis is the starting radius of the tear-gas\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the mustard-gas\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the light\nemitted by this explosive item.\n \nTiles close to the center of the effect will become\nvery bright, while tiles nearer the edge\nwill only be a little brighter than normal.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nAlso remember that unlike other explosives with\ntimed effects, the light effect gets SMALLER\nover time, until it disappears.\n \nHigher is better.",
- L"\n \nThis is the starting radius of the smoke\nreleased by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn\n(if any), unless wearing a gas mask. More importantly,\nanyone inside the cloud becomes extremely difficult to spot,\nand also loses a large chunk of sight-range themselves.\n \nAlso note the end radius and duration\nof the effect (displayed below).\n \nHigher is better.",
- L"\n \nThis is the starting radius of the flames\ncaused by this explosive item.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn.\n \nAlso note the end radius and duration of the effect\n(displayed below).\n \nHigher is better.",
- L"\n \nThis is the final radius of the tear-gas released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the mustard-gas released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn,\nunless wearing a gas mask.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the light emitted\nby this explosive item before it dissipates.\n \nTiles close to the center of the effect will become\nvery bright, while tiles nearer the edge\nwill only be a little brighter than normal.\n \nAlso note the start radius and duration\nof the effect.\n \nAlso remember that unlike other explosives with\ntimed effects, the light effect gets SMALLER\nover time, until it disappears.\n \nHigher is better.",
- L"\n \nThis is the final radius of the smoke released\nby this explosive item before it dissipates.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn\n(if any), unless wearing a gas mask. More importantly,\nanyone inside the cloud becomes extremely difficult to spot,\nand also loses a large chunk of sight-range themselves.\n \nAlso note the start radius and duration\nof the effect.\n \nHigher is better.",
- L"\n \nThis is the final radius of the flames caused\nby this explosive item before they dissipate.\n \nEnemies caught within the radius will suffer\nthe listed damage and stun-damage each turn.\n \nAlso note the start radius and duration of the effect.\n \nHigher is better.",
- L"\n \nThis is the duration of the explosive effect.\n \nEach turn, the radius of the effect will grow by\none tile in every direction, until reaching\nthe listed End Radius.\n \nOnce the duration has been reached, the effect\ndissipates completely.\n \nNote that light-type explosives become SMALLER\nover time, unlike other effects.\n \nHigher is better.",
- L"\n \nThis is the distance (in Tiles) within which\nsoldiers and mercs will hear the explosion when\nit goes off.\n \nEnemies hearing the explosion will be alerted to your\npresence.\n \nLower is better.",
- L"\n \nThis value represents a chance (out of 100) for this\nexplosive to spontaneously explode whenever it is damaged\n(for instance, when other explosions go off nearby).\n \nCarrying highly-volatile explosives into combat\nis therefore extremely risky and should be avoided.\n \nScale: 0-100.\nLower is better.",
+ L"\n \nDer Schaden der durch diesen Sprengstoff\nverursacht wird.\n \nAnmerkung: Sprengstoffe die in einer Druckwelle explodieren liefern\nnur einmal Schaden (dann wenn Sie explodieren), wдhrend anhaltend wirkende\nSprengstoffe rundenьbergreifend Schaden bis die Wirkung nachlдsst.\n \nHцher ist besser.",
+ L"\n \nDer Betдubungschaden (nicht tцdlich) der durch diesen\nSprengstoff verursacht wird.\n \nAnmerkung: Sprengstoffe die in einer Druckwelle explodieren liefern\nnur einmal Schaden (dann wenn Sie explodieren), wдhrend anhaltend wirkende\nSprengstoffe rundenьbergreifend Schaden bis die Wirkung nachlдsst.\n \nHцher ist besser.",
+ L"\n \nDas ist der Radius der Explosionswelle den dieser\nSprengstoff hervorruft.\n \nZiele werden weniger Schaden erleiden desto weiter entfernt\nsie von der Mitte der Explosion sind.\n \nHцher ist besser.",
+ L"\n \nDas ist der Radius des Betдubungsschlags den dieser\nSprengstoff hervorruft.\n \nZiele werden weniger Schaden erleiden desto weiter entfernt\nsie von der Mitte der Explosion sind.\n \nHцher ist besser.",
+ L"\n \nDie Entfernung die das Gerдusch der Explosion\nzurьcklegen wird. Soldaten innerhalb der Entfernung \nsind fдhig das Gerдusch zu hцren und werden gewarnt.\n \nHцher ist besser.",
+ L"\n \nDas ist der Startradius des Trдnengas\nder durch diesen Sprengstoff freigesetzt wird.\n \nFeinde die innerhalb des Radius erfasst werden erleiden\nden angegebenen Betдubungsschaden jeden Zug,\nbis Sie Gasmasken tragen.\n \nAchte auf Endradius und Dauer der Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Startradius des Senfgas\nder durch diesen Sprengstoff freigesetzt wird.\n \nFeinde die innerhalb des Radius erfasst werden erleiden\nden angegebenen Schaden jeden Zug,\nbis Sie Gasmasken tragen.\n \nAchte auf Endradius und Dauer der Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Startradius des Lichts\nder durch den Sprengstoff freigesetzt wird.\n \nFelder in der Nдhe der Wirkung leuchten \nsehr hell, Felder nahe zum Rand\nsind nur ein weniger heller als normal.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nZur Erinnerung: Im Unterschied zu anderen Sprengstoffen mit\nzietlich festgelegter Wirkung, wird die Wirkung des Lichts nach einiger\nZeit weniger, bis es verschwindet.\n \nHцher ist besser.",
+ L"\n \nDas ist der Startradius des Rauchs\nder durch diesen Sprengstoff freigesetzt wird.\n \nJeder innerhalb der Rauchwolke wird sehr schwer zu erkennen,\nund verliert ein ganzes Stьck Sichtweite.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Startradius der Flammen\ndie durch den Sprengstoff freigesetzt werden.\n \nFeinde die innerhalb des Radius erfasst werden erleiden\nden angegebenen Schaden jeden Zug.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Endradius den das Trдnengas durch den\nSprengstoff vor dem Verschwinden freisetzt.\n \nFeinde die innerhalb des Radius erfasst werden erleiden\nden angegebenen Betдubungsschaden jeden Zug,\nbis Sie Gasmasken tragen.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Endradius den das Senfgas durch den\nSprengstoff vor dem Verschwinden freisetzt.\n \nFeinde die innerhalb des Radius erfasst werden erleiden\nden angegebenen Schaden jeden Zug,\nbis Sie Gasmasken tragen.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Endradius des Lichts der durch\nden Sprengstoff freigesetzt wird bevor er verschwindet.\n \nFelder in der Nдhe der Wirkung leuchten \nsehr hell, Felder nah zum Rand\nsind nur ein weniger heller als normal.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nZur Erinnerung: Im Unterschied zu anderen Sprengstoffen mit\nzietlich festgelegter Wirkung, wird die Wirkung des Lichts nach einiger\nZeit weniger, bis es verschwindet.\n \nHцher ist besser.",
+ L"\n \nDas ist der Endradius den das Rauchs durch den\nSprengstoff vor dem Verschwinden freisetzt.\n \nJeder innerhalb der Rauchwolke ist sehr schwer zu erkennen,\nund verliert ein ganzes Stьck Sichtweite.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist der Endradius den die Flammen dieses\nSprengstoffs einnehmen, bevor sie verschwinden.\n \nFeinde, die innerhalb des Radius erfasst werden erleiden\nden angegebenen Schaden jede Runde.\n \nAchte auf Endradius und Dauer\nder Wirkung.\n \nHцher ist besser.",
+ L"\n \nDas ist die Wirkungsdauer des Sprengstoffs.\n \nJeden Zug wird der Wirkungsradius wachsen, \nein Feld in jede Richtung, bis\nder angegebene Endradius erreicht ist.\n \nWird die maximale Dauer erreicht, verschwindet\ndie Wirkung vollstдndig.\n \nLicht freigesetzt durch Sprengstoffe\nnimmt ab, im Unterschied zu anderen Wirkungen.\n \nHцher ist besser.",
+ L"\n \nDie Reichweite in Feldern\nin der Feinde und Sцldner die Explosion wahrnehmen.\n \nFeinde die die Explosion hцren werden alarmiert.\n \nNiedriger ist besser.",
+ L"\n \nDieser Wert (auЯerhalb von 100) stellt eine Mцglichkeit fьr den\nSprengstoff dar, spontan zu explodieren wenn er Schaden nimmt\n(z.B. durch Explosionen in der Nдhe).\n \nDas Mitfьhren empfindlicher Sprengstoffe innerhalb des Kampfs\nist deshalb extrem riskant und sollte vermieden werden.\n \nSkala: 0-100.\nNiedriger ist besser.",
};
STR16 szUDBGenSecondaryStatsTooltipText[]=
{
- L"|T|r|a|c|e|r |A|m|m|o",
- L"|A|n|t|i|-|T|a|n|k |A|m|m|o",
- L"|I|g|n|o|r|e|s |A|r|m|o|r",
- L"|A|c|i|d|i|c |A|m|m|o",
- L"|L|o|c|k|-|B|u|s|t|i|n|g |A|m|m|o",
- L"|R|e|s|i|s|t|a|n|t |t|o |E|x|p|l|o|s|i|v|e|s",
- L"|W|a|t|e|r|p|r|o|o|f",
- L"|E|l|e|c|t|r|o|n|i|c",
- L"|G|a|s |M|a|s|k",
- L"|N|e|e|d|s |B|a|t|t|e|r|i|e|s",
- L"|C|a|n |P|i|c|k |L|o|c|k|s",
- L"|C|a|n |C|u|t |W|i|r|e|s",
- L"|C|a|n |S|m|a|s|h |L|o|c|k|s",
- L"|M|e|t|a|l |D|e|t|e|c|t|o|r",
- L"|R|e|m|o|t|e |T|r|i|g|g|e|r",
- L"|R|e|m|o|t|e |D|e|t|o|n|a|t|o|r",
- L"|T|i|m|e|r |D|e|t|o|n|a|t|o|r",
- L"|C|o|n|t|a|i|n|s |G|a|s|o|l|i|n|e",
- L"|T|o|o|l |K|i|t",
- L"|T|h|e|r|m|a|l |O|p|t|i|c|s",
- L"|X|-|R|a|y |D|e|v|i|c|e",
- L"|C|o|n|t|a|i|n|s |D|r|i|n|k|i|n|g |W|a|t|e|r",
- L"|C|o|n|t|a|i|n|s |A|l|c|o|h|o|l",
- L"|F|i|r|s|t |A|i|d |K|i|t",
- L"|M|e|d|i|c|a|l |K|i|t",
- L"|L|o|c|k |B|o|m|b",
+ L"|L|e|u|c|h|t|s|p|u|r|m|u|n|i|t|i|o|n",
+ L"|A|n|t|i|-|P|a|n|z|e|r M|u|n|i|t|i|o|n",
+ L"|I|g|n|o|r|i|e|r|t |S|c|h|u|t|z",
+ L"|S|д|u|r|e|h|a|l|t|i|g|e |M|u|n|i|t|i|o|n",
+ L"|T|ь|r|z|e|r|s|c|h|l|a|g|e|n|d|e |M|u|n|i|t|i|o|n",
+ L"|W|i|d|e|r|s|t|a|n|d|s|f|д|h|i|g|k|e|i|t |g|e|g|e|n |S|p|r|e|n|g|s|t|o|f|f|e",
+ L"|W|a|s|s|e|r|s|i|c|h|e|r",
+ L"|E|le|k|t|r|o|n|i|k",
+ L"|G|a|s|m|a|s|k|e",
+ L"|B|e|n|ц|t|i|g|t |B|a|t|t|e|r|i|e|n",
+ L"|K|a|n|n |S|c|h|l|ц|s|s|e|r |K|n|a|c|k|e|n",
+ L"|K|a|n|n |D|r|a|h|t |d|u|r|c|h|t|r|e|n|n|e|n",
+ L"|K|a|n|n |S|c|h|l|ц|s|s|e|r |z|e|r|b|r|e|c|h|e|n",
+ L"|M|e|t|a|l|l|d|e|t|e|k|t|o|r",
+ L"|F|e|r|n|a|u|s|l|ц|s|e|r",
+ L"|F|e|r|n|z|ь|n|d|e|r",
+ L"|Z|e|i|t|z|ь|n|d|e|r",
+ L"|E|n|t|h|д|l|t |B|e|n|z|i|n",
+ L"|W|e|r|k|z|e|u|g|k|a|s|t|e|n",
+ L"|W|д|r|m|e|s|i|c|h|t",
+ L"|R|ц|n|t|g|e|n|g|e|r|д|t",
+ L"|E|n|t|h|д|l|t |D|r|i|n|k|w|a|s|s|e|r",
+ L"|E|n|t|h|д|l|t |A|l|k|o|h|o|l",
+ L"|E|r|s|t|e|-|H|i|l|f|e|-|K|a|s|t|e|n",
+ L"|A|r|z|t|t|a|s|c|h|e",
+ L"|T|ь|r|s|p|r|e|n|g|s|a|t|z",
};
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
{
- L"\n \nThis ammo creates a tracer effect when firedin\nfull-auto or burst mode.\n \nTracer fire helps keep the volley accurate\nand thus deadly despite the gun's recoil.\n \nAlso, tracer bullets create paths of light that\ncan reveal a target in darkness. However, they\nalso reveal the shooter to the enemy!\n \nTracer Bullets automatically disable any\nMuzzle Flash Suppression items installed on the\nsame weapon.",
- L"\n \nThis ammo can damage the armor on a tank.\n \nAmmo WITHOUT this property will do no damage\nat all to tanks.\n \nEven with this property, remember that most guns\ndon't cause enough damage anyway, so don't\nexpect too much.",
- L"\n \nThis ammo ignores armor completely.\n \nWhen fired at an armored target, it will behave\nas though the target is completely unarmored,\nand thus transfer all its damage potential to the target!",
- L"\n \nWhen this ammo strikes the armor on a target,\n \nit will cause that armor to degrade rapidly.\n \nThis can potentially strip a target of its\narmor!",
- L"\n \nThis type of ammo is exceptional at breaking locks.\n \nFire it directly at a locked door or container\nto cause massive damage to the lock.",
- L"\n \nThis armor is three times more resistant\nagainst explosives than it should be, given\nits Protection value.\n \nWhen an explosion hits the armor, its Protection\nvalue is considered three times higher than\nthe listed value.",
- L"\n \nThis item is imprevious to water. It does not\nreceive damage from being submerged.\n \nItems WITHOUT this property will gradually deteriorate\nif the person carrying them goes for a swim.",
- L"\n \nThis item is electronic in nature, and contains\ncomplex circuitry.\n \nElectronic items are inherently more difficult\nto repair, at least without the ELECTRONICS skill.",
- L"\n \nWhen this item is worn on a character's face,\nit will protect them from all sorts of noxious gasses.\n \nNote that some gasses are corrosive, and might eat\nright through the mask...",
- L"\n \nThis item requires batteries. Without batteries,\nyou cannot activate its primary abilities.\n \nTo use a set of batteries, attach them to\nthis item as you would a scope to a rifle.",
- L"\n \nThis item can be used to pick open locked\ndoors or containers.\n \nLockpicking is silent, although it requires\nsubstantial mechanical skill to pick anything\nbut the simplest locks.",
- L"\n \nThis item can be used to cut through wire fences.\n \nThis allows a character to rapidly move through\nfenced areas, possibly outflanking the enemy!",
- L"\n \nThis item can be used to smash open locked\ndoors or containers.\n \nLock-smashing requires substantial strength,\ngenerates a lot of noise, and can easily\ntire a character out. However, it is a good\nway to get through locks without superior skills or\ncomplicated tools.",
- L"\n \nThis item can be used to detect metallic objects\nunder the ground.\n \nNaturally, its primary function is to detect\nmines without the necessary skills to spot them\nwith the naked eye.\n \nMaybe you'll find some buried treasure too.",
- L"\n \nThis item can be used to detonate a bomb\nwhich has been set with a remote detonator.\n \nPlant the bomb first, then use the\nRemote Trigger item to set it off when the\ntime is right.",
- L"\n \nWhen attached to an explosive device and set up\nin the right position, this detonator can be triggered\nby a (separate) remote device.\n \nRemote Detonators are great for setting traps,\nbecause they only go off when you tell them to.\n \nAlso, you have plenty of time to get away!",
- L"\n \nWhen attached to an explosive device and set up\nin the right position, this detonator will count down\nfrom the set amount of time, and explode once the\ntimer expires.\n \nTimer Detonators are cheap and easy to install,\nbut you'll need to time them just right to give\nyourself enough chance to get away!",
- L"\n \nThis item contains gasoline (fuel).\n \nIt might come in handy if you ever\nneed to fill up a gas tank...",
- L"\n \nThis item contains various tools that can\nbe used to repair other items.\n \nA toolkit item is always required when setting\na character to repair duty.",
- L"\n \nWhen worn in a face-slot, this item provides\nthe ability to spot enemies through walls,\nthanks to their heat signature.",
- L"\n \nThis powerful device can be used to scan\nfor enemies using X-rays.\n \nIt will reveal all enemies within a certain radius\nfor a short period of time.\n \nKeep away from reproductive organs!",
- L"\n \nThis item contains fresh drinking water.\nUse when thirsty.",
- L"\n \nThis item contains liquor, alcohol, booze,\nwhatever you fancy calling it.\n \nUse with caution. Do not drink and drive.\nMay cause cirrhosis of the liver.",
- L"\n \nThis is a basic field medical kit, containing\nitems required to provide basic medical aid.\n \nIt can be used to bandage wounded characters\nand prevent bleeding.\n \nFor actual healing, use a proper Medical Kit\nand/or plenty of rest.",
- L"\n \nThis is a proper medical kit, which can\nbe used in surgery and other serious medicinal\npurposes.\n \nMedical Kits are always required when setting\na character to Doctoring duty.",
- L"\n \nThis item can be used to blast open locked\ndoors and containers.\n \nExplosives skill is required to avoid\npremature detonation.\n \nBlowing locks is a relatively easy way of quickly\ngetting through locked doors. However,\nit is very loud, and dangerous to most characters.",
+ L"\n \nDiese Munition lдsst eine Leuchtwirkung entstehen wenn sie abgefeuert wird.\n \nLeuchtfeuer hilft Salven genauer zu kontrollieren.\n \nLeuchtpatronen geben die Position bei Tag/Nacht preis\n \nund deaktivieren Gegenstдnde\ndie Mьndungsfeuer unterdrьcken.",
+ L"\n \nDiese Munition kann einen Panzer beschдdigen.\n \nMunition ohne diese Eigenschaft bewirkt keinen Schaden\nan Panzern.",
+ L"\n \nDiese Munition ignoriert die Rьstung vollstдndig.\n \nDas bewirkt das eine geschьtzte Person\nbehandelt wird als hдtte sie keine Rьstung!",
+ L"\n \nWenn diese Munition auf ein Ziel trifft,\n \nwird dessen Schutz dadurch schnell verschlechtert.\n \nMцglicherweise wird ein Ziel dadurch durch seinen eigenen Schutz getrennt!",
+ L"\n \nDiese Munitionstyp ist ausnahmslos im zerstцren von Schlцssern.\n \nDirekt auf eine verschlossene Tьr oder einen Behдlter\ngefeuert richtet er enormen Schaden an.",
+ L"\n \nDieser Schutz ist dreifach resistent\ngegen Sprengstoffe als es durch seinen gegebenen\nSchutzwert ersichtlich ist.\n \nWenn ein Sprengstoff den Schutz trifft, wird sein Schutzwert verdreifach.",
+ L"\n \nDieser Gegenstand ist gegen Wasser immun. Nicht aber,\nwenn er Schaden nimmt und untertaucht.\n \nGegenstдnde ohne diese Eigenschaft verschlechtern sich allmдhlich,\nwenn die Person sie zum Schwimmen mitnimmt.",
+ L"\n \nDieser Gegenstand ist Elektronik pur und beinhaltet\nkomplexe Schaltungen.\n \nElektronische Gegenstдnde sind von Natur aus schwer\nzu reparieren noch schwieriger ohne elektronische Fдhigkeiten.",
+ L"\n \nWenn dieser Gegenstand am Gesicht der Person getragen wird,\nwird Sie von allen schдdlichen Gasen beschьtzt.\n \nEinige Gase sind дtzend und kцnnen sich\ndurch die Gasmaske fressen!",
+ L"\n \nDieser Gegenstand benцtigt Batterien. Ohne Batterien,\nkцnnen seine primдren Fдhigkeiten nicht aktiviert werden.\n \nUm seine Fдhigkeiten zu aktivieren\nbefestige Batterien an ihm.",
+ L"\n \nDieser Gegenstand kann kann dazu benutzt werden verschlossene\nTьren oder Behдlter zu цffnen.\n \nSchlцsser knacken ist leise, doch es benцtigt\nreichlich technische Fдhigkeiten \nauch fьr die einfachsten Schlцsser.",
+ L"\n \nDieser Gegenstand kann dazu benutzt werden Zдune zu zertrennen.\n \nDas ermцglicht einer Person schnell in abgezдuntes Gebiet\neinzudringen und den Feind mцglicherweise zu ьberraschen!",
+ L"\n \nDieser Gegenstand kann kann zum zerschlagen von verschlossenen\nTЬren oder Behдlter benutzt werden.\n \nDas Zerschlagen von Schlцssern benцtigt reichlich Stдrke,\nerzeugt eine Menge Lдrm und bringt\neine Person schnell zur Ermьdung. Jedoch ist eine guter\nWeg hinter verschlossenes zu gelagen ohne\nhцhere Fertigkeiten oder\nkomplizierte Werkzeuge zu besitzen.",
+ L"\n \nDieser Gegenstand kann metallische Objekte\nim Boden aufspьren.\n \nSeine Funktion ist das aufspьren\nvon Minen ohne die nцtigen Fдhigkeiten zu besitzen diese\nmit blosen Auge zu erkennen.\n \nVielleicht finden Sie aber auch vergrabene Schдtze.",
+ L"\n \nDieser Gegenstand kann dazu benutzt werden eine Bombe\nwelche mit einem Fernzьnder versehen wurde zu zьnden.\n \nZu erst setzt die Bombe, dann benutze den\nFernauslцer um sie zu zьnden wenn\ndie richtige Zeit ist.",
+ L"\n \nWenn an einer Sprengstoffeinheit angebracht und eingestellt\n kann der Zьnder durch eine\n separate Fernsteuerung ausgelцst werden.\n \nFernzьnder sind bestens geeignet um Fallen zu stellen,\nweil Sie erst dann explodieren wenn sie es sollen.\n \nDarьber hinaus hat man genьge Zeit in Deckung zu gehen!",
+ L"\n \nWenn an einer Sprengstoffeinheit angebracht und eingestellt\n zдhlt der Zьnder von der eingegeben\nMenge an Zeit nach unten und explodiert \nwenn die Zeit abgelaufen ist.\n \nZeitzьnder sind billig und einfach zu Installieren,\naber sie mьssen so eingestellt werden umd\nsich selbst rechtzeitig in Deckung zu bringen!",
+ L"\n \nDieser Gegenstand enthдlt Benzin.\n \nEs kцnnte praktisch sein\nwenn man einen Benzintank findet.",
+ L"\n \nDieser Gegenstand enthдlt verschiedene Gerдtschaften die dazu\nbenutzt werden kцnnen andere Gegenstдnde zu reparieren.\n \nEin Werkzeugkasten wird dafьr benцtigt, wenn \neinem Sцldner die Aufgabe Reparieren zugewiesen wird.",
+ L"\n \nWenn ans Gesicht angebracht, bietet der Gegenstand die Mцglichkeit\nPersonen durch Wдnde zu sehen,\ndank ihrer Wдrmestrahlung.",
+ L"\n \nDieses mдchtige Gerдt kann dazu benutzt werden\nnach Personen zu suchen.\n \nEs zeigt alle Personen innerhalb eines bestimmten Radius\nfьr einen kurzen Zeitraum.\n \nVon Geschlechtsorganen fernhalten!",
+ L"\n \nDieser Gegenstand enthдlt frisches Wasser.\nGebrauchen Sie es wenn Sie durstig sind.",
+ L"\n \nDieser Gegenstand enthдlt Spirituosen, Alkohol, Schnaps\noder was immer Sie sich einbilden.\n \nMit Vorischt zu genieЯen! Kein Alkohol am Steuer!\nKann ihrer Leber schaden!",
+ L"\n \nDas ist ein Erste-Hilfe-Kasten der\nGegenstдnde enthдlt die einfache medizinische Hilfe bieten.\n \nEr kann dazu benutzt werden verwundetet Personen zu bandagieren\nund Blutungen zu stoppen.\n \nFьr richtige Heilung, benutze eine Arzttasche\nund/oder reichlich Ruhe.",
+ L"\n \nDas ist eine Arzttasche, die fьr\nOperationen und andere gravierende medizinische\nZwecke genutzt werden kann.\n \nEine Arzttasche wird dazu benцtigt\neinem Sцldner die Aufgabe Doktor zu geben.",
+ L"\n \nDieser Gegenstand kann dazu benutzt werden verschlossene\nTьren/Behдlter zu sprengen.\n \nExplosionsfertigkeit ist erforderlich um\nvorzeitige Detonationen zu vermeiden.\n \nSchlцsser zu sprengen ist der einfache Weg um schnell\ndurch verschlossene Tьren/Behдlter zu kommen. Wie auch immer,\nes ist Laut und fьr die meisten Personen gefдhrlich.",
};
STR16 szUDBAdvStatsTooltipText[]=
{
- L"|A|c|c|u|r|a|c|y |M|o|d|i|f|i|e|r",
- L"|F|l|a|t |S|n|a|p|s|h|o|t |M|o|d|i|f|i|e|r",
- L"|P|e|r|c|e|n|t |S|n|a|p|s|h|o|t |M|o|d|i|f|i|e|r",
- L"|F|l|a|t |A|i|m|i|n|g |M|o|d|i|f|i|e|r",
- L"|P|e|r|c|e|n|t |A|i|m|i|n|g |M|o|d|i|f|i|e|r",
- L"|A|l|l|o|w|e|d |A|i|m|i|n|g |L|e|v|e|l|s |M|o|d|i|f|i|e|r",
- L"|A|i|m|i|n|g |C|a|p |M|o|d|i|f|i|e|r",
- L"|G|u|n |H|a|n|d|l|i|n|g |M|o|d|i|f|i|e|r",
- L"|D|r|o|p |C|o|m|p|e|n|s|a|t|i|o|n |M|o|d|i|f|i|e|r",
- L"|T|a|r|g|e|t |T|r|a|c|k|i|n|g |M|o|d|i|f|i|e|r",
- L"|D|a|m|a|g|e |M|o|d|i|f|i|e|r",
- L"|M|e|l|e|e |D|a|m|a|g|e |M|o|d|i|f|i|e|r",
- L"|R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|S|c|o|p|e |M|a|g|n|i|f|i|c|a|t|i|o|n |F|a|c|t|o|r",
- L"|P|r|o|j|e|c|t|i|o|n |F|a|c|t|o|r",
- L"|L|a|t|e|r|a|l |R|e|c|o|i|l |M|o|d|i|f|i|e|r",
- L"|V|e|r|t|i|c|a|l |R|e|c|o|i|l |M|o|d|i|f|i|e|r",
- L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e |M|o|d|i|f|i|e|r",
- L"|C|o|u|n|t|e|r|-|F|o|r|c|e |A|c|c|u|r|a|c|y |M|o|d|i|f|i|e|r",
- L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y |M|o|d|i|f|i|e|r",
- L"|T|o|t|a|l |A|P |M|o|d|i|f|i|e|r",
- L"|A|P|-|t|o|-|R|e|a|d|y |M|o|d|i|f|i|e|r",
- L"|S|i|n|g|l|e|-|a|t|t|a|c|k |A|P |M|o|d|i|f|i|e|r",
- L"|B|u|r|s|t |A|P |M|o|d|i|f|i|e|r",
- L"|A|u|t|o|f|i|r|e |A|P |M|o|d|i|f|i|e|r",
- L"|R|e|l|o|a|d |A|P |M|o|d|i|f|i|e|r",
- L"|M|a|g|a|z|i|n|e |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|B|u|r|s|t |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|H|i|d|d|e|n |M|u|z|z|l|e |F|l|a|s|h",
- L"|L|o|u|d|n|e|s|s |M|o|d|i|f|i|e|r",
- L"|I|t|e|m |S|i|z|e |M|o|d|i|f|i|e|r",
- L"|R|e|l|i|a|b|i|l|i|t|y |M|o|d|i|f|i|e|r",
- L"|W|o|o|d|l|a|n|d |C|a|m|o|u|f|l|a|g|e",
- L"|U|r|b|a|n |C|a|m|o|u|f|l|a|g|e",
- L"|D|e|s|e|r|t |C|a|m|o|u|f|l|a|g|e",
- L"|S|n|o|w |C|a|m|o|u|f|l|a|g|e",
- L"|S|t|e|a|l|t|h |M|o|d|i|f|i|e|r",
- L"|H|e|a|r|i|n|g |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|G|e|n|e|r|a|l |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|N|i|g|h|t|-|t|i|m|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|D|a|y|-|t|i|m|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
- L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|G|e|n|a|u|i|g|k|e|i|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|M|o|m|e|n|t|a|u|f|n|a|h|m|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|M|o|m|e|n|t|a|u|f|n|a|h|m|e|-|P|r|o|z|e|n|t|u|e|l|l",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|Z|i|e|l|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|Z|i|e|l|e|n|-|P|r|o|z|e|n|t|u|e|l|l",
+ L"|M|o|d|i|f|i|k|a|t|o|r |- |E|r|l|a|u|b|t|e |Z|i|e|l|g|e|n|a|u|i|g|k|e|i|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|Z|i|e|l|k|a|p|a|z|i|t|д|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r |- |W|a|f|f|e|n|h|a|n|d|h|a|b|u|n|g",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|b|s|e|n|k|u|n|g|s|k|o|m|p|e|n|s|i|e|r|u|n|g",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|Z|i|e|l|a|u|f|s|p|ь|r|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|c|h|a|d|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|M|e|s|s|e|r|s|c|h|a|d|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|E|n|t|f|e|r|nu|n|g",
+ L"|F|a|k|t|o|r|-|V|e|r|g|ц|Я|e|r|u|n|g",
+ L"|F|a|k|t|o|r|-|V|e|r|b|r|e|i|t|e|r|u|n|g",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|R|ь|c|k|s|t|o|Я|-|H|o|r|i|z|o|n|t|a|l",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|R|ь|c|k|s|t|o|Я |- |V|e|r|t|i|k|a|l",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|G|e|g|e|n|w|i|r|k|e|n|-|M|a|x|i|m|u|m",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|G|e|g|e|n|w|i|r|k|e|n|-|G|e|n|a|u|i|g|k|e|i|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|G|e|g|e|n|w|i|r|k|e|n|-|H|д|u|f|i|g|k|e|i|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|T|o|t|a|l",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|A|n|l|e|g|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|E|i|n|z|e|l|s|c|h|u|s|s",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|F|e|u|e|r|s|t|o|Я",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|A|u|t|o|f|e|u|e|r",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|A|P|-|N|a|c|h|l|a|d|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|M|a|g|a|z|i|n|g|r|ц|Я|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|F|e|u|e|r|s|t|o|Я|g|r|ц|Я|e",
+ L"|U|n|t|e|r|d|r|ь|c|k|t|e|s |M|ь|n|d|u|n|g|s|f|e|u|e|r",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|L|a|u|t|s|t|д|r|k|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|G|e|g|e|n|s|t|a|n|d|g|r|ц|Я|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|Z|u|v|e|r|l|д|s|s|i|g|k|e|i|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|T|a|r|n|u|n|g|-|W|a|l|d",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|T|a|r|n|u|n|g|-|S|t|a|d|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|T|a|r|n|u|n|g|-|W|ь|s|t|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|T|a|r|n|u|n|g|-|S|c|h|n|e|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|c|h|l|e|i|c|h|e|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|H|ц|r|w|e|i|t|e",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|i|c|h|t|w|e|i|t|e|-|A|l|l|g|e|m|e|i|n",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|i|c|h|t|w|e|i|t|e|-|N|a|c|h|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|i|c|h|t|w|e|i|t|e|-|T|a|g",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|i|c|h|t|w|e|i|t|e|-|H|e|l|l|e|s |L|i|c|h|t",
+ L"|M|o|d|i|f|i|k|a|t|o|r|-|S|i|c|h|t|w|e|i|t|e|-|U|n|t|e|r|g|r|u|n|d",
+ L"|T|u|n|n|e|l|s|i|c|h|t",
+ L"|G|e|g|e|n|w|i|r|k|e|n|-|M|a|x|i|m|u|m",
+ L"|G|e|g|e|n|w|i|r|k|e|n|-|H|д|u|f|i|g|k|e|i|t",
+ L"|T|r|e|f|f|e|r|b|o|n|u|s",
+ L"|Z|i|e|l|b|o|n|u|s",
};
-// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
+// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
STR16 szUDBAdvStatsExplanationsTooltipText[]=
{
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Accuracy value.\n \nIncreased accuracy allows the gun to hit targets\nat longer ranges more often, assuming it is\nalso well-aimed.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the shooter's accuracy\nfor ANY shot with a ranged weapon by the\nlisted amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the shooter's accuracy\nfor ANY shot with a ranged weapon by the\nlisted percentage, based on their original accuracy.\n \nHigher is better.",
- L"\n \nThis item modifies the accuracy gained from each\nextra aiming level you pay for, when aiming\na ranged weapon, by the\nlisted amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis item modifies the accuracy gained from each\nextra aiming level you pay for, when aiming\na ranged weapon, by the\nlisted percentage based on the original value.\n \nHigher is better.",
- L"\n \nThis item modifies the number of extra aiming\nlevels this gun can take.\n \nReducing the number of allowed aiming levels\nmeans that each level adds proportionally\nmore accuracy to the shot.\nTherefore, the FEWER aiming levels are allowed,\nthe faster you can aim this gun, without losing\naccuracy!\n \nLower is better.",
- L"\n \nThis item modifies the shooter's maximum accuracy\nwhen using ranged weapons, as a percentage\nof their original maximum accuracy.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Handling difficulty.\n \nBetter handling makes the gun more accurate to fire,\nwith or without extra aiming.\n \nNote that this is based on the gun's original\nGun Handling factor, which is higher for rifles and\nheavy weapons, and lower for pistols and small\nweapons.\n \nLower is better.",
- L"\n \nThis item modifies the difficulty of\ncompensating for shots beyond a weapon's range.\n \nA high bonus here can increase a weapon's\nnatural Maximum Range by at least a few tiles.\n \nHigher is better.",
- L"\n \nThis item modifies the difficulty of hitting\na moving target with a ranged weapon.\n \nA high bonus here can help hitting\nfast-moving targets, even at a distance.\n \nHigher is better.",
- L"\n \nThis item modifies the damage output of\nyour weapon, by the listed amount.\n \nHigher is better.",
- L"\n \nThis item modifies the damage output of\nyour melee weapon, by the listed amount.\n \nThis applies only to melee weapons, both sharp\nand blunt.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies its maximum effective range.\n \nMaximum Range mainly dictates how far a bullet\nfired from the weapon can fly before it begins\ndropping sharply towards the ground.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nprovides extra magnification, making shots at a distance\ncomparatively easier to make.\n \nNote that a high Magnification Factor is detrimental\nwhen used at targets CLOSER than the\noptimal distance.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nprojects a dot on the target, making it easier to hit.\n \nThe projection effect is only useful up to a given\ndistance, beyond which it begins to diminish and\neventually disappears.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon capable\nof Burst or Autofire modes, this item modifies\nthe weapon's Horizontal Recoil\nby the listed percentage.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable\nof Burst or Autofire modes, this item modifies\nthe weapon's Vertical Recoil\nby the listed percentage.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis item modifies the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nWhen high, this can help a shooter to control\nguns with powerful recoil, even if the shooter\nhas low Strength.\n \nHigher is better.",
- L"\n \nThis item modifies the shooter's ability to\naccurately apply counter-force against a gun's\nrecoil, during Burst or Autofire volleys.\n \nA high bonus helps the shooter bring the gun's muzzle\nprecisely towards the target, even at longer ranges,\nmaking volleys more accurate as a result.\n \nHigher is better.",
- L"\n \nThis item modifies the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nHigher frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nHigher is better.",
- L"\n \nThis item directly modifies the amount of\nAPs the character gets at the start of each turn.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifiest the AP cost to bring the weapon to\n'Ready' mode.\n \nLower is better.",
- L"\n \nWhen attached to any weapon, this item\nmodifies the AP cost to make a single attack with\nthat weapon.\n \nNote that for Burst/Auto-capable weapons, the\ncost of using these modes is directly influenced\nby this modifier as well!\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable of\nBurst-fire mode, this item modifies the AP cost\nof firing a Burst.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon capable of\nAuto-fire mode, this item modifies the AP cost\nof firing an Autofire Volley.\n \nNote that it does NOT modify the extra AP\ncost for adding bullets to the volley, only\nthe initial cost for starting the volley.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the AP cost of reloading the weapon.\n \nLower is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nchanges the size of magazines that can be loaded\ninto the weapon.\n \nThat weapon will now accept larger or smaller\nmagazines of the same caliber.\n \nHigher is better.",
- L"\n \nWhen attached to a ranged weapon, this item\nmodifies the amount of bullets fired\nby the weapon in Burst mode.\n \nIf the weapon was not initially Burst-Capable, and the\nmodifier is positive, attaching it to the weapon\nwill enable burst-fire mode.\n \nConversely, if the weapon is initially Burst-Capable,\na high-enough negative modifier here can disable\nburst mode completely.\n \nHigher is USUALLY better. Of course, part of the\npoint in Burst Mode is to conserve bullets...",
- L"\n \nWhen attached to a ranged weapon, this item\nwill hide the weapon's muzzle flash.\n \nThis makes sure that enemies cannot spot the shooter\nif he is firing while hidden, and is especially\nimportant at night.",
- L"\n \nWhen attached to a weapon, this item modifies\nthe range at which firing the weapon can be\nheard by both enemies and mercs.\n \nIf this modifier drops the weapon's Loudness value\nto 0, the weapon becomes completely silent.\n \nLower is better.",
- L"\n \nThis item modifies the size of any item it\nis attached to.\n \nSize is important when using the New Inventory system,\nwhere pockets only accept items of specific sizes and shapes.\n \nIncreasing an item's size makes it too big for some pockets\nit used to fit into.\n \nConversely, making an item smaller means it will fit into\nmore pockets, and pockets will be able to contain\nmore of it.\n \nLower is generall better.",
- L"\n \nWhen attached to any weapon, this item modifies\nthat weapon's Reliability value.\n \nIf positive, the weapon's condition will deteriorate\nslower when used in combat. Otherwise, the\nweapon deteriorates faster.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nwoodland backgrounds.\n \nTo make good on a positive Woodland Camo modifier, the\nwearer needs to stay close to trees or tall grass.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nurban backgrounds.\n \nTo make good on a positive Urban Camo modifier, the\nwearer needs to stay close to asphalt or concrete.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\ndesert backgrounds.\n \nTo make good on a positive Desert Camo modifier, the\nwearer needs to stay close to sand, gravel, or\ndesert vegetation.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's camouflage in\nsnowy backgrounds.\n \nTo make good on a positive Snow Camo modifier, the\nwearer needs to stay close to snowy tiles.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's stealth ability by\nmaking it more difficult to HEAR the character moving\nwhile in Sneaking mode.\n \nNote that this does NOT change a character's visibility,\nonly the amount of noise they make while sneaking.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Hearing Range by the\nlisted number of tiles.\n \nA positive bonus makes it possible to hear noises\nfrom a greater distance.\n \nConversely, a negative modifier impairs the wearer's hearing.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis General modifier works in all conditions.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Night-Vision modifier works only when light\nlevels are sufficiently low.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Day-Vision modifier works only when light\nlevels are average or higher.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
- L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Gegenstand verдndert den Genauigkeitswert.\n \nEine erhцhte Genauigkeit lдsst die Schusswaffe Ziele auf eine grцЯere Entfernung цfter treffen,\nangenommen es wird auch gut gezielt.\n \nMaЯstab: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Genauigkeit\nfьr jede Art von Feuermodus fьr diese Fernwaffe um den angegebenen Wert.\n \nMaЯstab: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Genauigkeit\nfьr jede Art von Feuermodus fьr diese Fernwaffe um den angegebenen Prozentsatz mit Bezug auf die ursprьnglichen Genauigkeit.\n \nMaЯstab: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Genauigkeit,\nwelche die Waffe mit jedem zusдtzlichen Punkt durch genaueres Zielen erhдlt um den genannten Wert.\n \nMaЯstab: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Genauigkeit,\ndie die Waffe mit jedem zusдtzlichen Punkt durch genaueres Zielen erhдlt um den genannten Prozentsatz der ursprьnglichen Genauigkeit.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Anzahl der mцglichen zusдtzlichen Zielpunkte dieser Waffe. \n \nEine niedrigere Anzahl von mцglichen zusдtzlichen Zielpunkten bedeutet,\n daЯ jeder Zielpunkt proportional mehr Genauigkeit zum Schuss beitrдgt.\n\nDies bedeutet, das weniger mцgliche zusдtzliche Zielpunkte ein schnelleres Zielen mit dieser Waffen erlauben, ohne die Genauigkeit zu reduzieren!\n \nNiedriger ist besser.",
+ L"\n \nDieser Gengenstand verдndert den Hцchstwert fьr Genauigkeit des Schьtzen mit Fernwaffen\num den angegebenen Prozentsatz seiner ursprьnglichen maximalen Genauigkeit.\n \nHцher ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Gegenstand verдndert die Schwierigkeit der Handhabung der Waffe.\nEine bessere Handhabung macht die Waffe genauer zu feuern; mit oder ohne zusдtzliches Zielen.\n Der Wert bezieht sich dabei auf den ursprьngliche Handhabungs-Wert der Waffe,\nwelcher hцher ist fьr Gewehre und schwere Waffen,\nund niedriger bei Pistolen und leichten Waffen.\n \nNiedriger ist besser",
+ L"\n \nDieser Gegenstand verдndert die Schwierigkeit,\nmit einer Waffe auch jenseits ihrer effektiven Reichweite zu treffen.\n \nEin hoher Wert kann durchaus\ndie tatsдchliche effektive Reichweite dieser Waffe\num einige Felder verlдngern.\nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Schwierigkeit,\nein sich bewegendes Ziel zu treffen.\nEin hoher Wert kann es einfacher machen,\nsich bewegende Ziele auch in groЯer Entfernung zu treffen.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert den Schaden,\nwelchen diese Waffe anrichtet.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert den Schaden,\nden eine Handwaffe anrichtet, um den angegebenen Wert.\n \n Dies bezieht sich sowohl auf Klingen als auch auf Schlagwaffen.\n \nHцher ist besser",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Gegenstand verдndert die grцЯte effektive Reichweite.\n \nDie grцЯte effektive Reichweite bestimmt,\nwie weit eine Kugel fliegt, bevor sie schnell in Richtung Boden fдllt.\n \nHцher ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Gegenstand bietet eine zusдtzlich ZielvergrцЯerung an,\nwas Schьsse auf groЯe Entfernung vergleichsweise einfacher macht.\n \nEin hoher VergrцЯerungsfaktor wirkt sich allerdings nachteilig aus\nbei Zielen, die nдher als die optimale Entfernung sind.\n\nHцher ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Gegenstand blendet einen Punkt ьber das Ziel ein,\nwas das Treffen deutlich vereinfacht.\n\nDieser Effekt ist nur bis zu einer bestimmten Entfernung nьtzlich, darьber hinaus vermindert und schlieЯlich verschwindet der Effekt.\n \nHцher ist besser.",
+ L"\n \nWenn befestigt an FeuerstoЯ oder Dauerfeuer fдhigen Fernwaffen dieser Gegenstand verдndert den horizontalen RьckstoЯ um den genannten Prozentsatz.\n\n Ein geringerer RьckstoЯ macht es einfacher, die Waffe im Dauerfeuer auf das Ziel gerichtet zu halten.\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an FeuerstoЯ oder Dauerfeuer fдhigen Fernwaffen dieser Gegenstand verдndert den vertikalen RьckstoЯ um den genannten Prozentsatz.\n\n Ein geringerer RьckstoЯ macht es einfacher, die Waffe im Dauerfeuer auf das Ziel gerichtet zu halten.\n \nNiedriger ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Fдhigkeit des Schьtzen,\nseine Waffe im FeuerstoЯ oder Dauerfeuer unter Kontrolle zu behalten.\n\n Ein hoher Wert kann auch kцrperlich schwachen Schьtzen helfen, Waffen mit starkem RьckstoЯ zu kontrollieren. \n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Fдhigkeit des Schьtzen,\ndem RьckstoЯ der Waffe im FeuerstoЯ oder Dauerfeuer wirksam entgegenzuwirken.\n\n Ein hoher Wert erlaubt dem Schьtzen,\n die Waffe besser auf das Ziel auszurichten,\n was im Ergebnis die Genauigkeit von FeuerstцЯen erhцht. \n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Fдhigkeit des Schьtzen,\ndie Kraft, welche er benцtigt, um dem RьckstoЯ im FeuerstoЯ oder Dauerfeuer entgegenzuwirken, цfter anzupassen.\n\n Ein hцherer Wert macht FeuerstцЯe generell genauer,\n insbesondere lange FeuerstцЯe,\nvorausgesetzt, der Schьtze kann dem RьckstoЯ wirksam entgegenwirken. \n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand verдndert die Anzahl der Aktionspunkte,\nwelche der Charakter zu Beginn jeder Runde bekommt. \n \nHцher ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe dieser Genestand verдndert die Anzahl der Aktionspunkte,\ndie benцtigt werden,\num die Waffe in Anschlag zu bringen.\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an irgendeiner Waffe dieser Gegenstand verдndert die Anzahl der Aktionspunkte,\ndie fьr einen Angriff mit der Waffe benцtigt werden.\n\n Dies bezieht sich auch auf FeuerstoЯ oder Dauerfeuer fдhige Waffen.\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an FeuerstoЯ oder Dauerfeuer fдhigen Fernwaffen dieser Gegenstand verдndert die Anzahl der Aktionspunkte,\ndie fьr die Abgabe eines FeuerstoЯes benцtigt werden.\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an FeuerstoЯ oder Dauerfeuer fдhigen Fernwaffen dieser Gegenstand verдndert die Anzahl der Aktionspunkte,\ndie fьr das SchieЯen im Dauerfeuer Modus benцtigt werden.\n\n Dies bezieht sich allerdings nicht auf die AP, die benцtigt werden,\num zusдtzliche Schьsse im FeuerstoЯ abzugeben. .\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe, dieser Gegenstand verдndert die Anzahl der Aktionspunkte,\ndie benцtigt werden, um die Waffe zu laden.\n \nNiedriger ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe, dieser Gegenstand verдndert die Magazinkapazitдt von Magazinen welche in die Waffe geladen werden kцnnen. \n \nHцher ist besser.",
+ L"\n \nWenn befestigt an einer Fernwaffe, dieser Gegenstand verдndert die Anzahl der Kugeln,\ndie pro FeuerstoЯ abgegeben werden.\n\n Wenn die Waffe ursprьnglich nicht fьr FeuerstцЯe angelegt war,\nkann ein positiver Faktor die Abgabe von FeuerstцЯen ermцglichen.\n\nIm Gegensatz kann eine Waffe mit einer solchen Funktion diese bei einem entsprechend negativem Faktor verlieren. \n \nHцher ist - gewцhnlich – besser. Allerdings ist Munitionssparen ein Grund fьr kontrollierte FeuerstцЯe.",
+ L"\n \nAn die Waffe angebracht beeinflusst der Gegenstand\nein Verbergen des Mьndungsfeuers.\n \nDadruch wird es schwieriger den Schьtzen zu entdecken.",
+ L"\n \nAn die Waffe angebracht beeinflusst der Gegenstand\ndie Lautstдrke der Waffe.\n \nNiedriger ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die GrцЯe des Gegenstands\nan den er angebracht ist.\n \nDie GrцЯe des Gegenstands bestimmt wie oft und worin er\nbefцrdert werden kann.\n \nNiedriger ist besser.",
+ L"\n \nAn die Waffe angebracht beeinflusst der Gegenstand\nden Zuverlдssigkeitswert.\n \nEin positiver Wert bewirkt ein verlangsamte,\nein negativer Wert eine verschnellert Verschlechterung.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Tarnung\nin Waldgebieten, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Tarnung\nin Stadtgebieten, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Tarnung\nin Wьstenebieten, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Tarnung\nin Schneegebieten, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst das Schleichen\n, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Hцrweite\n, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die allgemeine\nSichtweite, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Sichtweite\nbei Nacht, wenn er getragen oder\nan einen getragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Sichtweite\nbei Tag, wenn er getragen oder\nan einen getragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Sichtweite\nbei hellem Licht (Knick-Licht),\nwenn er getragen oder an einen getragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Sichtweite\nunter Tage, wenn er getragen oder\nan einen getragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Sichtbreite,\nwenn er getragen oder\nan einen getragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDie Fдhigkeit des Schьtzen RьckstoЯ\nwдhrend FeuerstoЯ-/Autofeuersalven zu bewдltigen.\n \nHцher ist besser.",
+ L"\n \nDie Fдhigkeit des Schьtzen einzuschдtzen\nwieviel Kraft er wдhrend FeuerstoЯ-/Autofeuersalven\nbenцtigt um den RьckstoЯ auszugleichen.\n \nNiedriger ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst die Trefferchance\n, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
+ L"\n \nDieser Gegenstand beeinflusst den Zielbonus\n, wenn er getragen oder an einen\ngetragenen Gegenstand angebracht wird.\n \nHцher ist besser.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
{
- L"\n \nThis weapon's accuracy is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased accuracy allows the gun to hit targets\nat longer ranges more often, assuming it is\nalso well-aimed.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies its shooter's accuracy\nwith ANY shot by the listed amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies its shooter's accuracy\nwith ANY shot by the listed percentage\nbased on the shooter's original accuracy.\n \nHigher is better.",
- L"\n \nThis weapon modifies the amount of accuracy\ngained from each extra aiming level you\npay for by the listed amount.\n \nScale: -100 to +100.\nHigher is better.",
- L"\n \nThis weapon modifies the amount of accuracy\ngained from each extra aiming level you\npay for by the listed percentage, based\non the shooter's original accuracy.\n \nHigher is better.",
- L"\n \nThe number of Extra Aiming Levels allowed\nfor this gun has been modified by its ammo,\nattachments, or built-in attributes.\nIf the number of levels is being reduced, the gun is\nfaster to aim without being any less accurate.\n \nConversely, if the number of levels is increased,\nthe gun becomes slower to aim without being\nmore accurate.\n \nLower is better.",
- L"\n \nThis weapon modifies the shooter's maximum\naccuracy, as a percentage of the shooter's original\nmaximum accuracy.\n \nHigher is better.",
- L"\n \nThis weapon's attachments or inherent abilities\nmodify the weapon's Handling difficulty.\n \nBetter handling makes the gun more accurate to fire,\nwith or without extra aiming.\n \nNote that this is based on the gun's original\nGun Handling factor, which is higher for rifles and\nheavy weapons, and lower for pistols and small\nweapons.\n \nLower is better.",
- L"\n \nThis weapon's ability to compensate for shots\nbeyond its maximum range is being modified by\nattachments or the weapon's inherent abilities.\n \nA high bonus here can increase a weapon's\nnatural Maximum Range by at least a few tiles.\n \nHigher is better.",
- L"\n \nThis weapon's ability to hit moving targets\nat a distance is being modified by attachments\nor the weapon's inherent abilities.\n \nA high bonus here can help hitting\nfast-moving targets, even at a distance.\n \nHigher is better.",
- L"\n \nThis weapon's damage output is being modified\nby its ammo, attachments, or inherent abilities.\n \nHigher is better.",
- L"\n \nThis weapon's melee-combat damage output is being\nmodified by its ammo, attachments, or inherent abilities.\n \nThis applies only to melee weapons, both sharp\nand blunt.\n \nHigher is better.",
- L"\n \nThis weapon's maximum range has been increased\nor decreased thanks to its ammo, attachments,\nor inherent abilities.\n \nMaximum Range mainly dictates how far a bullet\nfired from the weapon can fly before it begins\ndropping sharply towards the ground.\n \nHigher is better.",
- L"\n \nThis weapon is equipped with optical magnification,\nmaking shots at a distance comparatively easier to make.\n \nNote that a high Magnification Factor is detrimental\nwhen used at targets CLOSER than the\noptimal distance.\n \nHigher is better.",
- L"\n \nThis weapon is equipped with a projection device\n(possibly a laser), which projects a dot on\nthe target, making it easier to hit.\n \nThe projection effect is only useful up to a given\ndistance, beyond which it begins to diminish and\neventually disappears.\n \nHigher is better.",
- L"\n \nThis weapon's horizontal recoil strength is being\nmodified by its ammo, attachments, or inherent\nabilities.\n \nThis has no effect if the weapon lacks both\nBurst and Auto-Fire modes.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis weapon's vertical recoil strength is being\nmodified by its ammo, attachments, or inherent\nabilities.\n \nThis has no effect if the weapon lacks both\nBurst and Auto-Fire modes.\n \nReducing recoil makes it easier to keep the gun's\nmuzzle pointed at the target during a volley.\n \nLower is better.",
- L"\n \nThis weapon modifies the shooter's ability to\ncope with recoil during Burst or Autofire volleys,\ndue to its attachments, ammo, or inherent abilities.\n \nWhen high, this can help a shooter to control\nguns with powerful recoil, even if the shooter\nhas low Strength.\n \nHigher is better.",
- L"\n \nThis weapon modifies the shooter's ability to\naccurately apply counter-force against its\nrecoil, due to its attachments, ammo, or inherent abilities.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nA high bonus helps the shooter bring the gun's muzzle\nprecisely towards the target, even at longer ranges,\nmaking volleys more accurate as a result.\n \nHigher is better.",
- L"\n \nThis weapon modifies the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, due to its\nattachments, ammo, or inherent abilities.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nHigher frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nHigher is better.",
- L"\n \nWhen held in hand, this weapon modifies the amount of\nAPs its user gets at the start of each turn.\n \nHigher is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to bring this weapon to 'Ready' mode has\nbeen modified.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to make a single attack with this\nweapon has been modified.\n \nNote that for Burst/Auto-capable weapons, the\ncost of using these modes is directly influenced\nby this modifier as well!\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to fire a Burst with this weapon has\nbeen modified.\n \nNaturally, this has no effect if the weapon is not\ncapable of Burst fire.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost to fire an Autofire Volley with this weapon\nhas been modified.\n \nNaturally, this has no effect if the weapon is not\ncapable of Auto Fire.\n \nNote that it does NOT modify the extra AP\ncost for adding bullets to the volley, only\nthe initial cost for starting the volley.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe AP cost of reloading this weapon has been modified.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe size of magazines that can be loaded into this\nweapon has been modified.\n \nThe weapon will now accept larger or smaller\nmagazines of the same caliber.\n \nHigher is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthe amount of bullets fired by this weapon in Burst mode\nhas been modified.\n \nIf the weapon was not initially Burst-Capable, and the\nmodifier is positive, then this is what\ngives the weapon its burst-fire capability.\n \nConversely, if the weapon was initially Burst-Capable,\na high-enough negative modifier here may have\ndisabled burst mode entirely for this weapon.\n \nHigher is USUALLY better. Of course, part of the\npoint in Burst Mode is to conserve bullets...",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon produces no muzzle flash.\n \nThis makes sure that enemies cannot spot the shooter\nif he is firing while hidden, and is especially\nimportant at night.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's loudness has been modified. The distance\nat which enemies and mercs can hear the weapon being\nused has subsequently changed.\n \nIf this modifier drops the weapon's Loudness value\nto 0, the weapon becomes completely silent.\n \nLower is better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's size category has changed.\n \nSize is important when using the New Inventory system,\nwhere pockets only accept items of specific sizes and shapes.\n \nIncreasing an item's size makes it too big for some pockets\nit used to fit into.\n \nConversely, making an item smaller means it will fit into\nmore pockets, and pockets will be able to contain\nmore of it.\n \nLower is generall better.",
- L"\n \nDue to its attachments, ammo or inherent abilities,\nthis weapon's reliability has been modified.\n \nIf positive, the weapon's condition will deteriorate\nslower when used in combat. Otherwise, the\nweapon deteriorates faster.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in woodland backgrounds.\n \nTo make good on a positive Woodland Camo modifier, the\nwearer needs to stay close to trees or tall grass.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in urban backgrounds.\n \nTo make good on a positive Urban Camo modifier, the\nwearer needs to stay close to asphalt or concrete.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in desert backgrounds.\n \nTo make good on a positive Desert Camo modifier, the\nwearer needs to stay close to sand, gravel, or\ndesert vegetation.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's camouflage in snowy backgrounds.\n \nTo make good on a positive Snow Camo modifier, the\nwearer needs to stay close to snowy tiles.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's stealth ability by making it\nmore or less difficult to HEAR the character moving\nwhile in Sneaking mode.\n \nNote that this does NOT change a character's visibility,\nonly the amount of noise they make while sneaking.\n \nHigher is better.",
- L"\n \nWhen this weapon is held in hand, it modifies the\nsoldier's Hearing Range by the listed number of tiles.\n \nA positive bonus makes it possible to hear noises\nfrom a greater distance.\n \nConversely, a negative modifier impairs the wearer's hearing.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis General modifier works in all conditions.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Night-Vision modifier works only when light\nlevels are sufficiently low.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Day-Vision modifier works only when light\nlevels are average or higher.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
- L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nDie Genauigkeit wurde verдndert durch\nMunition, Erweiterungen oder inhдrenter Fдhigkeiten.\n \nErhцhte Genauigkeit erlaubt es Ziele die weiter entfernt sind\nцfter zu treffen, sofern \ngut gezielt wird.\n \nSkala: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDie Waffe verдndert die Genauigkeit des Schьtzen\nmit jedem Schuss durch den angegebenen Wert.\n \nSkala: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDie Waffe verдndert die Genauigkeit des Schьtzen\nmit jedem Schuss prozentual zur \nursprьnglichen Genauigkeit des Schьtzen.\n \nHцher ist besser.",
+ L"\n \nDie Waffe verдndert den Betrag an Genauigkeit\ndurch jedes zusдtzlich investierte Ziellevel.\n \nSkala: -100 bis +100.\nHцher ist besser.",
+ L"\n \nDie Waffe verдndert den Betrag an Genauigkeit\ndurch jedes zusдtzlich investierte Ziellevel\nprozentual zur\nursprьnglichen Genauigkeit des Schьtzen.\n \nHцher ist besser.",
+ L"\n \nDie Anzahl an zusдtzlich erlaubter Ziellevel\nfьr diese Waffe wurden geдndert durch Munition,\nErweiterungen oder inhдrenter Fдhigkeiten.\nWird die Anzahl an Ziellevel reduziert, is das Zielen mit\nder Waffe schneller bei gleicher Genauigkeit.\n \nGleiches gilt fьr die Erhцhung der Anzahl an Ziellevel.\n \nNiedriger ist besser.",
+ L"\n \nDie Waffe дndert die maximale Genauigkeit des Schьtzen\nprozentual zu der ursprьnglichen Genauigkeit des Schьtzen.\n \nHцher ist besser.",
+ L"\n \nErweiterungen oder inhдrente Fдhigkeiten der Waffe\nverдndern ihr Handhabung.\n \nLeichtere Handhabung lдsst die Waffe genauer werden.\n \nNiedriger ist besser.",
+ L"\n \nDie Fдhigkeit Schьsse auЯerhalb\nder maximalen Reichweite zu gewдhrleisten wurde durch Erweiterungen\n oder inhдrenter Fдhigkeiten geдndert.\n \nHцher ist besser.",
+ L"\n \nDie Fдhigkeit entfernte, bewegende Ziele zu treffen\nwurde durch Erweiterungen\noder inhдrenter Fдhigkeiten geдndert.\n \nHцher ist besser.",
+ L"\n \nDas Schadensergebnis wurde durch\nMunition oder Erweiterungen geдndert.\n \nHцher ist besser.",
+ L"\n \nDer Messerschaden wurde durch\nErweiterungen oder inhдrente Fдhigkeiten geдndert.\n \nHцher ist besser.",
+ L"\n \nDie maximale Reichweite wurde verbessert/verschlechtert durch Munition,\nErweiterungen oder inhдrenter Fдhigkeiten.\n \nHцher ist besser.",
+ L"\n \nWurde durch optische VergrцЯerungen ausgerьstet,\num entfernte Ziele leichter zu treffen.\n \nZielen mit hoher VergrцЯerungen auЯerhalb der optimalen Entfernung ist schдdlich.\n \nHцher ist besser.",
+ L"\n \nMit einem Projektionsgerдt ausgestattet\ndas einen Punkt (innerhalb der Reichweite) auf das Ziel projiziert\nund somit das Treffen erleichtert.\n \nHцher ist besser.",
+ L"\n \nDer horizontale RьckstoЯ wurde geдndert\ndurch Munition, Erweiterungen oder inhдrenter\nFдhigkeiten.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nEin reduzierter RьckstoЯ erleichtert es bei einer Salve die\nMьndung auf das Ziel zu richten!\n \nNiedriger ist besser.",
+ L"\n \nDer vertikale RьckstoЯ wurde geдndert\ndurch Munition, Erweiterungen oder inhдrenter\nFдhigkeiten.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nEin reduzierter RьckstoЯ erleichtert es bei einer Salve die\nMьndung auf das Ziel zu richten!.\n \nNiedriger ist besser.",
+ L"\n \nДndert die Fertigkeit des Schьtzen, RьckstoЯ bei\nFeuerstoЯ-/Autofeuer zu bewдltigen.\n \nEin hoher Wert hilft dem Schьtzen seine Waffe bei starkem RьckstoЯ\nzu kontrollieren selbst dann, wenn er wenig Kraft besitzt.\n \nHцher ist besser.",
+ L"\n \nДndert die Fertigkeit des Schьtzen\nRьckstцЯe genauer auszugleichen.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nEin hoher Wert hilft dem Schьtzen die Mьndung der Waffe\nbei Salven genauer auf das Ziel zu richten.\n \nHцher ist besser.",
+ L"\n \nДndert die Fertigkeit des Schьtzen\neinzuschдtzen wie viel Kraft zum ausgleichen des RьckstoЯes benцtigt wird.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nHцhere Frequenzen machen Salven im ganzen genauer,\nlдngere Salven werden genauer sofern\nder Schьtze den RьckstoЯ bewдltigen kann.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, дndert die Waffe die Menge an AP\ndie der Soldat zu Anfang einer Runde bekommt.\n \nHцher ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurden die AP-Kosten zum Anlegen der Waffe\ngeдndert.\n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurden die AP-Kosten fьr einen Einzelangriff\ngeдndert.\n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurden die AP-Kosten fьr einen FeuerstoЯ\ngeдndert.\n \nDies hat keine Wirkung bei Einzelschьssen!.\n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterung oder inhдrenter Fдhigkeiten,\nwurden die AP-Kosten fьr eine Salve geдndert.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurden die AP-Kosten fьr Nachladen geдndert.\n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurde die grцЯe der fassbaren Magazine geдndert.\n \nHцher ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurde die Anzahl der Patronen die abgefeuert werden\nkцnnen geдndert.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nentsteht kein Mьndungsfeuer.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurde die Lautstдrke geдndert. \n \nNiedriger ist besser.",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurde die WaffengrцЯe geдndert. Die grцЯe des Gegenstands bestimmt wie oft und worin er\nbefцrdert werden kann",
+ L"\n \nDurch Munition, Erweiterungen oder inhдrenter Fдhigkeiten,\nwurde die Zuverlдssigkeit geдndert.\n \nEin positiver Wert bewirkt ein verlangsamte,\nein negativer Wert eine vergrцbert Verschlechterung.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Tarnung des Soldaten in Waldgebieten.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Tarnung des Soldaten in Stadtgebieten.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Tarnung des Soldaten in Wьstengebieten.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Tarnung des Soldaten in Schneegebieten.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Fдhigkeit des Soldaten sich leise zu bewegen.\n \nHцher ist besser.",
+ L"\n \nWenn in der Hand gehalten, verдndert sich\ndie Hцrfдhigkeit (in Felder) des Soldaten.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich\ndie Sichtweite des Benutzers\nin der angegebenen Anzahl der Felder.\n \nFunktioniert unter allen Bedingungen.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich die Sichtweite des Benutzers\nin der angegebenen Anzahl der Felder,\ndank der Erweiterungen oder inhдrenter Fдhigkeiten.\nFunktioniert nur bei ausreichend geringen Lichtlevel.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich die Sichtweite des Benutzers\nin der angegebenen Anzahl der Felder,\ndank der Erweiterungen oder inhдrenter Fдhigkeiten.\nFunktioniert nur bei Durch-/Ьberdurchschnittlich Lichtlevel.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich die Sichtweite des Benutzers\nin der angegebenen Anzahl der Felder,\ndank der Erweiterungen oder inhдrenter Fдhigkeiten.\nFunktioniert nur bei sehr hellem Lichtlevel.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich die Sichtweite des Benutzers\nin der angegebenen Anzahl der Felder,\ndank der Erweiterungen oder inhдrenter Fдhigkeiten.\nFunktioniert nur bei dunkelheit oder unter Tage.\n \nHцher ist besser.",
+ L"\n \nWenn angelegt, verдndert sich das Sichtfeld\ndes Benutzers.\n \nEin verengtes Sichtfeld verringert\ndie Sichtweite horizontal.\n \nNiedriger ist besser.",
+ L"\n \nDas ist die Fдhigkeit des Schьtzen RьckstoЯ\nwдhrend der FeuerstoЯ-/Autofeuersalven zu bewдltigen.\n \nHцher ist besser.",
+ L"\n \nDas ist die Fдhigkeit des Schьtzen RьckstцЯe\ngenauer auszugleichen.\n \nDies hat keine Wirkung bei Einzelschьssen!\n \nEin hoher Wert hilft dem Schьtzen die Mьndung der Waffe\nbei Salven genauer auf das Ziel zu richten.\n \nNiedriger ist besser.",
+ L"\n \nDer Treffer Modifikator wird verдndert durch\nMunition, Erweiterungen oder eingebauter Attribute.\n \nEin erhцhter Treffer Modifikator erlaubt es entfernte Ziele\n цfter zu treffen sofern\nanstдndig gezielt wird.\n \nHцher ist besser.",
+ L"\n \nDer Zielbonus wird verдndert durch\nMunition, Erweiterungen oder eingebauter Attribute.\n \nEin erhцhter Zielbonus erlaubt es entfernte Ziele\n цfter zu treffen sofern\nanstдndig gezielt wird.\n \nHцher ist besser.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
STR16 gzNCTHlabels[]=
{
- L"SINGLE",
+ L"EINZEL",
L"AP",
};
//////////////////////////////////////////////////////
// HEADROCK HAM 4: End new UDB texts and tooltips
//////////////////////////////////////////////////////
+
#endif //GERMAN
diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp
index abda82be..4f01b505 100644
--- a/Utils/_ItalianText.cpp
+++ b/Utils/_ItalianText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("ITALIAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#if defined( ITALIAN )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -110,6 +115,1015 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
*/
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
// TODO.Translate
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
@@ -345,6 +1359,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s's snow camouflage has washed off.",
L"You cannot attach %s to this slot.",
+ L"The %s will not fit in any open slots.",
};
@@ -847,7 +1862,9 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Facility accidents: %d\n",
L"Character:",
- L"Weakening:",
+ L"Weakness:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -870,10 +1887,6 @@ STR16 gzMercSkillText[] =
L"Coltelli",
L"Sniper",
L"Camuffato",
- // SANDRO - removed this
- //L"Camuffato (Urban)",
- //L"Camuffato (Desert)",
- //L"Camuffato (Snow)",
L"(Esperto)",
};
@@ -1310,10 +2323,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"APs to fire Auto",
L"APs to Reload",
L"APs to Reload Manually",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Bipod Modifier",
L"Autofire shots per 5 AP",
- L"Burst/Auto Penalty (Lower is better)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"Burst/Auto Penalty (Lower is better)", //23
L"APs to Throw",
L"APs to Launch",
L"APs to Stab",
@@ -1321,8 +2335,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"No Burst Mode!",
L"No Auto Mode!",
L"APs to Bash",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3872,12 +4885,15 @@ STR16 zOptionsToggleText[] =
L"Show Soldier Tooltips",
L"Auto save",
L"Silent Skyrider",
- L"Low CPU usage",
+ //L"Low CPU usage",
L"Enhanced Description Box",
L"Forced Turn Mode", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase // TODO.Translate
L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"Activate New CTH system", // use NCTH
+ L"Show Face gear graphics", // TODO.Translate
+ L"Show Face gear icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3973,12 +4989,15 @@ STR16 zOptionsScreenHelpText[] =
L"When ON, a tooltip window is shown when pressing |A|l|t and hovering cursor over an enemy.",
L"When ON, game will be saved after each players turn.",
L"When ON, Skyrider will not talk anymore.",
- L"When ON, game will run with much lower CPU usage.",
+ //L"When ON, game will run with much lower CPU usage.",
L"When ON, enhanced descriptions will be shown for items and weapons.",
L"When ON and enemy present, Turn Base mode persists untill sector is free (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
L"When ON, shows character progress towards gaining levels.", // TODO.Translate
L"When ON, the Strategic Map will be colored differently based on exploration.",
L"When ON, alternate bullet graphics will be shown when you shoot.", // TODO.Translate
+ L"When ON, New CTH system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.", // TODO.Translate
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4840,6 +5859,9 @@ STR16 New113Message[] =
L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
// TODO.Translate
@@ -4923,6 +5945,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"FW from AIM Server: Message from Rudolf Steiger",
L"Rudolf here. Call me back.",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5154,7 +6180,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Multiplayer Chat",
- L"Chat: Press 'ENTER' to send of 'ESC' to cancel.",
+ L"'ENTER' to send, 'ESC' to cancel",
};
// Following strings added - SANDRO
@@ -5363,6 +6389,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 modalitа finestra richiede una profonditа di colore di 16bpp o meno.",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5613,8 +6648,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5750,6 +6785,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5799,6 +6838,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5847,6 +6890,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp
index fc96a143..9f2687aa 100644
--- a/Utils/_Ja25ChineseText.cpp
+++ b/Utils/_Ja25ChineseText.cpp
@@ -1,4 +1,6 @@
-п»ї//#pragma setlocale("CHINESE")
+п»ї// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
+//#pragma setlocale("CHINESE")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Englishtext.h"
@@ -19,60 +21,26 @@ void this_is_the_Ja25ChineseText_public_symbol(void){;}
STR16 zNewTacticalMessages[]=
{
- /*
- L"Range to target: %d tiles, Brightness: %d/%d",
- L"Attaching the transmitter to your laptop computer.",
- L"You cannot afford to hire %s",
- L"For a limited time, the above fee covers the cost of the entire mission and includes the equipment listed below.",
- L"Hire %s now and take advantage of our unprecedented 'one fee covers all' pricing. Also included in this unbelievable offer is the mercenary's personal equipment at no charge.",
- */
//L"з›®ж ‡зљ„и·ќз¦»: %dж ј, дє®еє¦: %d/%d",
L"将发报机装到笔记本电脑上。",
L"дЅ ж— жі•ж”Їд»й›‡дЅЈ%sзљ„иґ№з”Ё",
L"在限定时间内,以上的费用包括了整个行动和下列装备的花费。",
L"现在就雇请%s吧。您可以享受我们提供的空前的“一次д»иґ№пјЊе…ЁйѓЁжњЌеЉЎвЂќзљ„дјжѓ д»·ж јгЂ‚ењЁиї™дёЄйљѕд»ҐзЅ®дїЎзљ„е‡єд»·й‡ЊпјЊдЅЈе…µзљ„йљЏиє«иЈ…е¤‡жЇе…Ќиґ№зљ„哦。",
- /*
- L"Fee",
- L"There is someone else in the sector...",
- L"Gun Range: %d tiles, Chance to hit: %d percent",
- L"Display Cover",
- L"Line of Sight",
- */
L"иґ№з”Ё",
L"在本分区发现有人……",
//L"жћЄзљ„е°„зЁ‹: %dж јпјЊ е‘ЅдёзЋ‡: %dпј…",
L"жѕз¤єи¦†з›–物",
L"视距",
-
-/*
- L"New Recruits cannot arrive there.",
- L"Since your laptop has no transmitter, you won't be able to hire new team members. Perhaps this would be a good time to load a saved game or start over!",
- L"%s hears the sound of crumpling metal coming from underneath Jerry's body. It sounds disturbingly like your laptop antenna being crushed.", //the %s is the name of a merc. @@@ Modified
- L"After scanning the note left behind by Deputy Commander Morris, %s senses an oppurtinity. The note contains the coordinates for launching missiles against different towns in Arulco. It also gives the coodinates of the origin - the missile facility.",
- L"Noticing the control panel, %s figures the numbers can be reveresed, so that the missile might destroy this very facility. %s needs to find an escape route. The elevator appears to offer the fastest solution...",
-*/
L"ж–°й›‡иЇ·зљ„дЅЈе…µж— жі•е€°иѕѕй‚Јй‡ЊгЂ‚",
L"з”±дєЋдЅ зљ„з¬”и®°жњ¬з”µи„‘жІЎжњ‰еЏ‘жЉҐжњєпјЊдЅ ж— жі•й›‡иЇ·ж–°зљ„йџе‘гЂ‚д№џи®ёдЅ еѕ—иЇ»еЏ–ежЎЈж€–иЂ…й‡Ќж–°ејЂе§‹жёёж€ЏпјЃ",
L"%sеђ¬е€°дє†Jerryзљ„иє«дЅ“дё‹йќўдј жќҐй‡‘е±ћзљ„з ґзўЋзљ„еЈ°йџігЂ‚еђ¬иµ·жќҐд»¤дєєдёЌе®‰пјЊдјјд№ЋдЅ зљ„з¬”и®°жњ¬з”µи„‘зљ„е¤©зєїиў«еЋ‹ж–дє†гЂ‚",
L"зњ‹е®Ње‰ЇжЊ‡жЊҐе®Morris留下的备еїеЅ•еђЋпјЊ%s觉得有机会了。备еїеЅ•й‡Њжњ‰еђ‘Arulcoеђ„дёЄеџЋй•‡еЏ‘е°„еЇјеј№зљ„еџєењ°зљ„еќђж ‡гЂ‚е®ѓиїз»™е‡єдє†иї™дёЄзЅЄжЃ¶и®Ўе€’зљ„еЏ‘жєђењ°зљ„еќђж ‡ —— еЇјеј№е·ҐеЋ‚гЂ‚",
L"зњ‹е€°дє†жЋ§е€¶йќўжќїеђЋпјЊ %sеЏ‘зЋ°е®ѓжЈењЁеЂ’и®Ўж—¶пјЊе› ж¤еЇјеј№дјљжЉЉиї™дёЄе·ҐеЋ‚з‚ёжЇЃгЂ‚%s得找出个脱逃的路线。使用电梯看起来жЇжњЂеї«зљ„еЉћжі•...",
-/*
- L"This is an IRON MAN game and you cannot save when enemies are around.", // @@@ new text
- L"(Cannot save during combat)", //@@@@ new text
- L"The current campaign name is greater than 30 characters.", // @@@ new text
- L"The current campaign cannot be found.", // @@@ new text
- L"Campaign: Default ( %S )", // @@@ new text
-*/
L"现在您在铁人模式进行游戏,周围有敌人的时候不能ежЎЈгЂ‚",
L"(дёЌиѓЅењЁж€ж–—ж—¶ез›)",
L"еЅ“е‰Ќзљ„ж€еЅ№еђЌз§°и¶…иї‡дє†30дёЄе—符。",
L"ж— жі•ж‰ѕе€°еЅ“е‰Ќзљ„ж€еЅ№гЂ‚", // @@@ new text
L"ж€еЅ№: й»и®¤ ( %S )", // @@@ new text
-/*
- L"Campaign: %S", // @@@ new text
- L"You have selected the campaign %S. This campaign is a player-modified version of the original Unfinished Business campaign. Are you sure you wish to play the %S campaign?", // @@@ new text
- L"In order to use the editor, please select a campaign other than the default.", ///@@new
-*/
L"ж€еЅ№: %S", // @@@ new text
L"дЅ йЂ‰ж‹©дє†%Sж€еЅ№гЂ‚ иЇҐж€еЅ№жЇеЋџз‰€UBж€еЅ№зљ„зЋ©е®¶и‡Єе®љд№‰жёёж€Џз‰€жњ¬гЂ‚дЅ зЎ®и®¤дЅ и¦ЃењЁ %S ж€еЅ№дё‹иї›иЎЊжёёж€Џеђ—?",
L"е¦‚жћњдЅ и¦ЃдЅїз”Ёзј–иѕ‘е™Ёзљ„иЇќпјЊиЇ·йЂ‰ж‹©дёЂдёЄж€еЅ№пјЊдёЌи¦Ѓз”Ёй»и®¤ж€еЅ№гЂ‚",
@@ -83,6 +51,7 @@ STR16 zNewTacticalMessages[]=
//these strings match up with the defines in IMP Skill trait.cpp
STR16 gzIMPSkillTraitsText[]=
{
+ // made this more elegant
L"ејЂй”Ѓ", //"Lock picking",
L"еѕ’ж‰‹ж јж–—", //"Hand to hand combat",
L"з”µеђ", //"Electronics",
@@ -101,377 +70,378 @@ STR16 gzIMPSkillTraitsText[]=
L"ж— ", //"None",
L"I.M.P дё“е±ћжЉЂиѓЅ", //"I.M.P. Specialties",
L"(Expert)",
+
};
//added another set of skill texts for new major traits
STR16 gzIMPSkillTraitsTextNewMajor[]=
{
- L"Auto Weapons",
- L"Heavy Weapons",
- L"Marksman",
- L"Hunter",
- L"Gunslinger",
- L"Hand to Hand",
- L"Deputy",
- L"Technician",
- L"Paramedic",
+ L"и‡ЄеЉЁж¦е™Ё",// L"Auto Weapons",
+ L"й‡Ќж¦е™Ё",// L"Heavy Weapons",
+ L"射手",// L"Marksman",
+ L"猎手",// L"Hunter",
+ L"枪手",// L"Gunslinger",
+ L"ж јж–—е®¶",// L"Hand to Hand",
+ L"йў†еЇј",// L"Deputy",
+ L"жЉЂеё€",// L"Technician",
+ L"ж•‘жЉ¤е…µ",// L"Paramedic",
- L"None",
- L"I.M.P. Major Traits",
+ L"ж— ",// L"None",
+ L"I.M.P 主要特殊技能",// L"I.M.P. Major Traits",
// second names
- L"Machinegunner",
- L"Bombardier",
- L"Sniper",
- L"Ranger",
- L"Gunfighter",
- L"Martial Arts",
- L"Squadleader",
- L"Engineer",
- L"Doctor",
+ L"机枪手",// L"Machinegunner",
+ L"з‚®еј№дё“е®¶",// L"Bombardier",
+ L"狙击手",// L"Sniper",
+ L"жёёдѕ ",// L"Ranger",
+ L"жћЄж€е¤§её€",// L"Gunfighter",
+ L"ж¦жњЇе¤§её€",// L"Martial Arts",
+ L"е№ІйѓЁ",// L"Squadleader",
+ L"е·Ґе…µ",// L"Engineer",
+ L"еЊ»з”џ",// L"Doctor",
};
//added another set of skill texts for new minor traits
STR16 gzIMPSkillTraitsTextNewMinor[]=
{
- L"Ambidextrous",
- L"Melee",
- L"Throwing",
- L"Night Ops",
- L"Stealthy",
- L"Athletics",
- L"Bodybuilding",
- L"Demolitions",
- L"Teaching",
- L"Scouting",
+ L"左右互搏之术",// L"Ambidextrous",
+ L"иї‘ж€",// L"Melee",
+ L"жЉ•жЋ·",// L"Throwing",
+ L"е¤њж€",// L"Night Ops",
+ L"е°ѕиЎЊ",// L"Stealthy",
+ L"дЅ“иѓЅи®з»ѓ",// L"Athletics",
+ L"肌肉男",// L"Bodybuilding",
+ L"з€†з ґ",// L"Demolitions",
+ L"ж•™е¦",// L"Teaching",
+ L"дѕ¦еЇџ",// L"Scouting",
- L"None",
- L"I.M.P. Minor Traits",
+ L"ж— ",// L"None",
+ L"I.M.P е‰ЇжЉЂиѓЅ",// L"I.M.P. Minor Traits",
};
//these texts are for help popup windows, describing trait properties
STR16 gzIMPMajorTraitsHelpTextsAutoWeapons[]=
{
- L"+%d%s Chance to Hit with Assault Rifles\n",
- L"+%d%s Chance to Hit with SMGs\n",
- L"+%d%s Chance to Hit with LMGs\n",
- L"-%d%s APs needed to fire with LMGs\n",
- L"-%d%s APs needed to ready light machine guns\n",
- L"Auto fire/burst chance to hit penalty is reduced by %d%s\n",
- L"Reduced chance for shooting unwanted bullets on autofire\n",
+ L"突击жҐжћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with Assault Rifles\n",
+ L"е†Ій”‹жћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with SMGs\n",
+ L"иЅ»жњєжћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with LMGs\n",
+ L"轻机枪射击所需行动点 -%d%s\n",//L"-%d%s APs needed to fire with LMGs\n",
+ L"з«Їиµ·иЅ»жњєжћЄж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",//L"-%d%s APs needed to ready light machine guns\n",
+ L"и‡ЄеЉЁ/з‚№е°„зљ„е‘ЅдёзЋ‡жѓ©зЅље‡ЏеЋ» %d%s\n",//L"Auto fire/burst chance to hit penalty is reduced by %d%s\n",
+ L"й™ЌдЅЋжµЄиґ№еђеј№зљ„е‡ зЋ‡\n",//L"Reduced chance for shooting unwanted bullets on autofire\n",
};
STR16 gzIMPMajorTraitsHelpTextsHeavyWeapons[]=
{
- L"-%d%s APs needed to fire grenade launchers\n",
- L"-%d%s APs needed to fire rocket launchers\n",
- L"+%d%s chance to hit with grenade launchers\n",
- L"+%d%s chance to hit with rocket launchers\n",
- L"-%d%s APs needed to fire mortar\n",
- L"Reduce penalty for mortar CtH by %d%s\n",
- L"+%d%s damage to tanks with heavy weapons, grenades and explosives\n",
- L"+%d%s damage to other targets with heavy weapons\n",
+ L"发射榴弹所需行动点 -%d%s\n",// L"-%d%s APs needed to fire grenade launchers\n",
+ L"еЏ‘е°„зЃ«з®ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to fire rocket launchers\n",
+ L"榴弹命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with grenade launchers\n",
+ L"зЃ«з®е‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with rocket launchers\n",
+ L"发射迫击炮所需行动点 -%d%s\n",// L"-%d%s APs needed to fire mortar\n",
+ L"й™ЌдЅЋ %d%s 迫击炮命дёзЋ‡жѓ©зЅљ\n",// L"Reduce penalty for mortar CtH by %d%s\n",
+ L"з€†з ґз‰©, 手榴弹和重ж¦е™ЁеЇ№еќ¦е…‹зљ„йўќе¤–дј¤е®і +%d%s\n",// L"+%d%s damage to tanks with heavy weapons, grenades and explosives\n",
+ L"й‡Ќж¦е™ЁеЇ№е…¶д»–з›®ж ‡зљ„дј¤е®і +%d%s\n",// L"+%d%s damage to other targets with heavy weapons\n",
};
STR16 gzIMPMajorTraitsHelpTextsSniper[]=
{
- L"+%d%s Chance to Hit with Rifles\n",
- L"+%d%s Chance to Hit with Sniper Rifles\n",
- L"-%d%s effective range to target with all weapons\n",
- L"+%d%s aiming bonus per aim click (except for handguns)\n",
- L"+%d%s damage on shot",
- L" plus",
- L" per every aim click",
- L" after first",
- L" after second",
- L" after third",
- L" after fourth",
- L" after fifth",
- L" after sixth",
- L" after seventh",
- L"-%d%s APs needed to chamber a round with bolt-action rifles \n",
- L"Adds one more aim click for rifle-type guns\n",
- L"Adds %d more aim clicks for rifle-type guns\n",
+ L"жҐжћЄе‘ЅдёзЋ‡ +%d%s\n",
+ L"狙击жҐжћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with Sniper Rifles\n",
+ L"ж‹‰иї‘е’Њз›®ж ‡ %d%s 的有效距离\n",// L"-%d%s effective range to target with all weapons\n",
+ L"жЇЏж¬ЎзІѕзЎ®зћ„е‡†зљ„йўќе¤–зћ„е‡†еЉ ж€ђ +%d%s (手枪除外)\n",// L"+%d%s aiming bonus per aim click (except for handguns)\n",
+ L"жЇЏеЏ‘дј¤е®і +%d%s",// L"+%d%s damage on shot",
+ L"еЉ дёЉ",// L" plus",
+ L"жЇЏж¬ЎзІѕзћ„",// L" per every aim click",
+ L"第一次精瞄后",// L" after first",
+ L"第二次精瞄后",// L" after second",
+ L"第三次精瞄后",// L" after third",
+ L"第四次精瞄后",// L" after fourth",
+ L"第五次精瞄后",// L" after fifth",
+ L"第е…ж¬ЎзІѕзћ„еђЋ",// L" after sixth",
+ L"第七次精瞄后",// L" after seventh",
+ L"手动枪机式жҐжћЄж‹‰жћЄж “ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s \n",// L"-%d%s APs needed to chamber a round with bolt-action rifles \n",
+ L"жҐжћЄзІѕзЎ®зћ„е‡†ж¬Ўж•°еўћеЉ 1ж¬Ў\n",// L"Adds one more aim click for rifle-type guns\n",
+ L"жҐжћЄзІѕзЎ®зћ„е‡†ж¬Ўж•°еўћеЉ %d\n",// L"Adds %d more aim clicks for rifle-type guns\n",
};
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
{
- L"+%d%s Chance to Hit with Rifles\n",
- L"+%d%s Chance to Hit with Shotguns\n",
- L"-%d%s APs needed to pump Shotguns\n",
- L"+%d%s group travelling speed between sectors if traveling by foot\n",
- L"+%d%s group travelling speed between sectors if traveling in vehicle (except helicopter)\n",
- L"-%d%s less energy spent for travelling between sectors\n",
- L"-%d%s weather penalties\n",
- L"+%d%s camouflage effectiveness\n",
- L"-%d%s worn out speed of camouflage by water or time\n",
+ L"жҐжћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with Rifles\n",
+ L"йњ°еј№жћЄе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s Chance to Hit with Shotguns\n",
+ L"泵动式霰弹上膛所需行动点 -%d%s \n",// L"-%d%s APs needed to pump Shotguns\n",
+ L"йџдјЌењЁеЊєеџџй—ґжҐиЎЊз§»еЉЁзљ„йЂџеє¦ +%d%s\n",// L"+%d%s group travelling speed between sectors if traveling by foot\n",
+ L"йџдјЌењЁеЊєеџџй—ґд№иЅ¦з§»еЉЁзљ„йЂџеє¦(直升机除外) +%d%s \n",// L"+%d%s group travelling speed between sectors if traveling in vehicle (except helicopter)\n",
+ L"еЊєеџџй—ґз§»еЉЁж—¶ж¶€иЂ—зљ„дЅ“еЉ› -%d%s\n",// L"-%d%s less energy spent for travelling between sectors\n",
+ L"天气效果的惩罚 -%d%s\n",// L"-%d%s weather penalties\n",
+ L"иї·еЅ©ж¶‚иЈ…ж•€жћњ +%d%s\n",// L"+%d%s camouflage effectiveness\n",
+ L"иї·еЅ©ж¶‚иЈ…йЂЂи‰Ізљ„йЂџеє¦ -%d%s\n",// L"-%d%s worn out speed of camouflage by water or time\n",
};
STR16 gzIMPMajorTraitsHelpTextsGunslinger[]=
{
- L"-%d%s APs needed to fire with pistols and revolvers\n",
- L"+%d%s effective range with pistols and revolvers\n",
- L"+%d%s chance to hit with pistols and revolvers\n",
- L"+%d%s chance to hit with machine pistols",
- L" (on single shots only)",
- L"+%d%s aiming bonus per click with pistols, machine pistols and revolvers\n",
- L"-%d%s APs needed to raise pistols and revolvers\n",
- L"-%d%s APs needed to reload pistols, machine pistols and revolvers\n",
- L"Adds %d more aim click for pistols, machine pistols and revolvers\n",
- L"Adds %d more aim clicks for pistols, machine pistols and revolvers\n",
+ L"发射手枪和左轮所需行动点 -%d%s\n",// L"-%d%s APs needed to fire with pistols and revolvers\n",
+ L"手枪和左轮的有效射程 +%d%s\n",// L"+%d%s effective range with pistols and revolvers\n",
+ L"手枪和左轮的命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with pistols and revolvers\n",
+ L"冲锋手枪的命дёзЋ‡ +%d%s",// L"+%d%s chance to hit with machine pistols",
+ L"(еЏЄй™ђеЌ•еЏ‘)",// L" (on single shots only)",
+ L"手枪, е·¦иЅ®е’Ње†Ій”‹ж‰‹жћЄжЇЏж¬ЎзІѕзЎ®зћ„е‡†зљ„зћ„е‡†еЉ ж€ђ +%d%s\n",// L"+%d%s aiming bonus per click with pistols, machine pistols and revolvers\n",
+ L"手枪和左轮抬枪瞄准所需行动点 -%d%s\n",// L"-%d%s APs needed to raise pistols and revolvers\n",
+ L"手枪, 冲锋手枪和左轮装填弹药所需行动点-%d%s\n",// L"-%d%s APs needed to reload pistols, machine pistols and revolvers\n",
+ L"手枪, е·¦иЅ®е’Ње†Ій”‹ж‰‹жћЄзљ„зІѕзЎ®зћ„е‡†ж¬Ўж•°еўћеЉ %d\n",// L"Adds %d more aim click for pistols, machine pistols and revolvers\n",
+ L"手枪, е·¦иЅ®е’Ње†Ій”‹ж‰‹жћЄзљ„зІѕзЎ®зћ„е‡†ж¬Ўж•°еўћеЉ %d\n",// L"Adds %d more aim clicks for pistols, machine pistols and revolvers\n",
};
STR16 gzIMPMajorTraitsHelpTextsMartialArts[]=
{
- L"-%d%s AP cost of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"+%d%s chance to hit with hand to hand attacks with bare hands\n",
- L"+%d%s chance to hit with hand to hand attacks with brass knuckles\n",
- L"+%d%s damage of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"+%d%s breath damage of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"Enemy knocked out due to your HtH attacks takes slightly longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes much longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes very long to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes extremely long to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes long hours to recuperate\n",
- L"Enemy knocked out due to your HtH attacks probably never stand up\n",
- L"Focused (aimed) punch deals +%d%s more damage\n",
- L"Your special spinning kick deals +%d%s more damage\n",
- L"+%d%s change to dodge hand to hand attacks\n",
- L"+%d%s on top chance to dodge HtH attacks with bare hands",
- L" or brass knuckles",
- L" (+%d%s with brass knuckles)",
- L"+%d%s on top chance to dodge HtH attacks with brass knuckles\n",
- L"+%d%s chance to dodge attacks by any melee weapon\n",
- L"-%d%s APs needed to steal weapon from enemy hands\n",
- L"-%d%s APs needed to change state (stand, crouch, lie down), turn around, climb on/off roof and jump obstacles\n",
- L"-%d%s APs needed to change state (stand, crouch, lie down)\n",
- L"-%d%s APs needed to turn around\n",
- L"-%d%s APs needed to climb on/off roof and jump obstacles\n",
- L"+%d%s chance to kick doors\n",
- L"You gain special animations for hand to hand combat\n",
+ L"肉搏攻击所需行动点 -%d%s(空手或戴铜拳套)\n",// L"-%d%s AP cost of hand to hand attacks(bare hands or with brass knuckles)\n",
+ L"肉搏命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with hand to hand attacks with bare hands\n",
+ L"铜拳套命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with hand to hand attacks with brass knuckles\n",
+ L"肉搏攻击伤害 +%d%s(空手或戴铜拳套)\n",// L"+%d%s damage of hand to hand attacks(bare hands or with brass knuckles)\n",
+ L"肉搏攻击的体力伤害 +%d%s(空手或戴铜拳套)\n",// L"+%d%s breath damage of hand to hand attacks(bare hands or with brass knuckles)\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦Ѓе–息片刻才能站起来\n",// L"Enemy knocked out due to your HtH attacks takes slightly longer to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦Ѓдј‘жЃЇз‰‡е€»ж‰ЌиѓЅе›ћиї‡зҐћжќҐ\n",// L"Enemy knocked out due to your HtH attacks takes longer to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦ЃдёЂжіЎе°їзљ„еЉџе¤«ж‰ЌиѓЅз€¬иµ·жќҐ\n",// L"Enemy knocked out due to your HtH attacks takes much longer to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦ЃдёЂз›ЏиЊ¶зљ„еЉџе¤«ж‰ЌиѓЅжЃўе¤ЌзџҐи§‰\n",// L"Enemy knocked out due to your HtH attacks takes very long to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦ЃдёЂйЎїйҐзљ„功夫才能清醒过来\n",// L"Enemy knocked out due to your HtH attacks takes extremely long to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєи¦ЃжЏиї·дёЉе‡ дёЄе°Џж—¶\n",// L"Enemy knocked out due to your HtH attacks takes long hours to recuperate\n",
+ L"иў«дЅ еѕ’ж‰‹е‡»еЂ’зљ„ж•Њдєєдё‹еЌЉиѕ€еђе°±жЇж¤Ќз‰©дєє\n",// L"Enemy knocked out due to your HtH attacks probably never stand up\n",
+ L"зћ„е‡†дє†зљ„и‚‰жђЏж”»е‡»йЂ ж€ђ+%d%s更多的伤害\n",// L"Focused (aimed) punch deals +%d%s more damage\n",
+ L"дЅ зљ„з‹¬й—Ёи…їеЉџйЂ ж€ђ+%d%s更多的伤害\n",// L"Your special spinning kick deals +%d%s more damage\n",
+ L"иєІйЃїи‚‰жђЏж”»е‡»зљ„е‡ зЋ‡+%d%s\n",// L"+%d%s change to dodge hand to hand attacks\n",
+ L"空手状态下获得%d%sйўќе¤–зљ„иєІйЃїе‡ зЋ‡",// L"+%d%s on top chance to dodge HtH attacks with bare hands",
+ L"或只戴铜拳套",// L" or brass knuckles",
+ L"(戴铜拳套时 +%d%s)",// L" (+%d%s with brass knuckles)",
+ L"戴铜拳套时获得 %d%s йўќе¤–зљ„иєІйЃїе‡ зЋ‡\n",// L"+%d%s on top chance to dodge HtH attacks with brass knuckles\n",
+ L"иєІйЃїе†·е…µе™Ёж”»е‡»зљ„е‡ зЋ‡ +%d%s\n",// L"+%d%s chance to dodge attacks by any melee weapon\n",
+ L"从敌人手里夺枪所需行动点 -%d%s\n",// L"-%d%s APs needed to steal weapon from enemy hands\n",
+ L"站立, 下蹲, 卧倒, 转身, 爬上爬下和越过障碍所需行动点 -%d%s\n",// L"-%d%s APs needed to change state (stand, crouch, lie down), turn around, climb on/off roof and jump obstacles\n",
+ L"з«™з«‹, дё‹и№Іе’ЊеЌ§еЂ’ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to change state (stand, crouch, lie down)\n",
+ L"иЅ¬иє«ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to turn around\n",
+ L"дёЉ/дё‹ж€їйЎ¶ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to climb on/off roof and jump obstacles\n",
+ L"иёўй—Ёж€ђеЉџзЋ‡ +%d%s\n",// L"+%d%s chance to kick doors\n",
+ L"дЅ зљ„и‚‰жђЏж”»е‡»е°†жњ‰з‰№ж®Љзљ„еЉЁз”»ж•€жћњ\n",// L"You gain special animations for hand to hand combat\n",
};
STR16 gzIMPMajorTraitsHelpTextsSquadleader[]=
{
- L"+%d%s APs per round of other mercs in vicinity\n",
- L"+%d effective exp level of other mercs in vicinity, which have lesser level than the %s\n",
- L"+%d effective exp level to count as a standby when counting friends' bonus for suppression\n",
- L"+%d%s total suppression tolerance of other mercs in vicinity and %s himself\n",
- L"+%d morale gain of other mercs in vicinity\n",
- L"-%d morale loss of other mercs in vicinity\n",
- L"The vicinity for bonuses is %d tiles",
- L" (%d tiles with extended ears)",
- L"(Max simultaneous bonuses for one soldier is %d)\n",
- L"+%d%s fear resistence of %s\n",
- L"Drawback: %dx morale loss for %s's death for all other mercs\n",
+ L"所在区域其他雇佣兵的最大行动点 +%d%s\n",// L"+%d%s APs per round of other mercs in vicinity\n",
+ L"жњ‰ж•€з‰зє§ +%d, %s ж‰ЂењЁеЊєеџџз‰зє§дЅЋдєЋи‡Єе·±зљ„雇佣兵 (зЁ‹еєЏеЏ‚ж•°й—®йўеЏЄиѓЅз”Ёиї™дёЄиЇеєЏ)\n",// L"+%d effective exp level of other mercs in vicinity, which have lesser level than the %s\n",
+ L"计算友军火力压制奖励时, +%dжњ‰ж•€з»ЏйЄЊз‰зє§\n",// L"+%d effective exp level to count as a standby when counting friends' bonus for suppression\n",
+ L"+%d%s 所在区域内其他雇佣兵和%sи‡Єе·±зљ„жњЂй«зЃ«еЉ›еЋ‹е€¶ж‰їеЏ—еЉ›\n",// L"+%d%s total suppression tolerance of other mercs in vicinity and %s himself\n",
+ L"ж‰ЂењЁеЊєеџџе…¶д»–й›‡дЅЈе…µзљ„еЈ«ж°”еўћеЉ йЂџеє¦ +%d \n",// L"+%d morale gain of other mercs in vicinity\n",
+ L"所在区域其他雇佣兵的士气降低速度 -%d \n",// L"-%d morale loss of other mercs in vicinity\n",
+ L"еҐ–еЉ±иЊѓе›ґжЇ %d ж ј",// L"The vicinity for bonuses is %d tiles",
+ L"(иЈ…е¤‡еЉ©еђ¬е™ЁеђЋеҐ–еЉ±иЊѓе›ґеўћеЉ е€° %d ж ј)",// L" (%d tiles with extended ears)",
+ L"(еЏ еЉ ж•€жћњжњЂе¤љжЇ %d ж¬Ў)\n",// L"(Max simultaneous bonuses for one soldier is %d)\n",
+ L"+%d%s %sзљ„жЃђжѓ§жЉµжЉ—еЉ› (зЁ‹еєЏеЏ‚ж•°й—®йўеЏЄиѓЅз”Ёиї™дёЄиЇеєЏ)\n",// L"+%d%s fear resistence of %s\n",
+ L"зјєй™·: дјљз»™е…¶д»–дєєйЂ ж€ђ %d еЂЌзљ„еЈ«ж°”дё‹й™Ќ, 如果 %s зљ„йµдєЎзљ„иЇќ (зЁ‹еєЏеЏ‚ж•°й—®йўеЏЄиѓЅз”Ёиї™дёЄиЇеєЏ)\n",// L"Drawback: %dx morale loss for %s's death for all other mercs\n",
};
STR16 gzIMPMajorTraitsHelpTextsTechnician[]=
{
- L"+%d%s to repairing speed\n",
- L"+%d%s to lockpicking (normal/electronic locks)\n",
- L"+%d%s to disarming electronic traps\n",
- L"+%d%s to attaching special items and combining things\n",
- L"+%d%s to unjamming a gun in combat\n",
- L"Reduce penalty to repair electronic items by %d%s\n",
- L"Increased chance to detect traps and mines (+%d detect level)\n",
- L"+%d%s CtH of robot controlled by the %s\n",
- L"%s trait grants you the ability to repair the robot\n",
- L"Reduced penalty to repair speed of the robot by %d%s\n",
+ L"维修速度 +%d%s \n",// L"+%d%s to repairing speed\n",
+ L"ејЂй”Ѓж€ђеЉџзЋ‡ +%d%s(ж™®йЂљ/з”µеђй”Ѓ)\n",// L"+%d%s to lockpicking (normal/electronic locks)\n",
+ L"е‡ зЋ‡и§Јй™¤з”µй™·й± +%d%s\n",// L"+%d%s to disarming electronic traps\n",
+ L"组装物品和组合特殊物品成功率 +%d%s\n",// L"+%d%s to attaching special items and combining things\n",
+ L"ж€ж–—дёжЋ’除枪械故障的成功率 +%d%s\n",// L"+%d%s to unjamming a gun in combat\n",
+ L"дї®зђ†з”µеђз‰©е“Ѓзљ„жѓ©зЅљй™ЌдЅЋ %d%s\n",// L"Reduce penalty to repair electronic items by %d%s\n",
+ L"еўћеЉ еЏ‘зЋ°й™·й±е’Њењ°й›·зљ„е‡ зЋ‡ ( +%d жґћеЇџз‰зє§)\n",// L"Increased chance to detect traps and mines (+%d detect level)\n",
+ L"+%d%s зљ„е‘ЅдёзЋ‡, з”±%sжЋ§е€¶зљ„жњєе™Ёдєє (зЁ‹еєЏеЏ‚ж•°й—®йўеЏЄиѓЅз”Ёиї™дёЄиЇеєЏ)\n",// L"+%d%s CtH of robot controlled by the %s\n",
+ L"只有 %s 可以修理机器人\n",// L"%s trait grants you the ability to repair the robot\n",
+ L"дї®зђ†жњєе™Ёдєєзљ„йЂџеє¦жѓ©зЅљй™ЌдЅЋ %d%s\n",// L"Reduced penalty to repair speed of the robot by %d%s\n",
};
STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
{
- L"Has ability to make surgical intervention by using medical bag on wounded soldier\n",
- L"Surgery instantly returns %d%s of lost health back.",
- L" (This drains the medical bag a lot.)",
- L"Can heal lost stats (from critical hits) by the",
- L" surgery or",
- L" doctor assignment.\n",
- L"+%d%s effectiveness on doctor-patient assignment\n",
- L"+%d%s bandaging speed\n",
- L"+%d%s natural regeneration speed of all soldiers in the same sector",
- L" (max %d these bonuses per sector)",
+ L"用医疗包包扎时可以给伤者进行手术\n",// L"Has ability to make surgical intervention by using medical bag on wounded soldier\n",
+ L"手术会立即回复 %d%s 损失的生命值.",// L"Surgery instantly returns %d%s of lost health back.",
+ L"(同时大量消耗医疗包.)",// L" (This drains the medical bag a lot.)",
+ L"еЏЇжІ»з–—еЏ€и‡ґе‘ЅдёЂе‡»йЂ ж€ђзљ„жЌџе¤±зљ„е±ћжЂ§з‚№, йЂљиї‡",// L"Can heal lost stats (from critical hits) by the",
+ L"手术",// L" surgery or",
+ L"ж€–жЊ‡жґѕе…¶дёєеЊ»з”џ.\n",// L" doctor assignment.\n",
+ L"з–—дј¤ж•€зЋ‡ +%d%s\n",// L"+%d%s effectiveness on doctor-patient assignment\n",
+ L"еЊ…ж‰ЋйЂџеє¦ +%d%s\n",// L"+%d%s bandaging speed\n",
+ L"ж‰ЂењЁеЊєеџџи‡Єз„¶е›ће¤Ќз”џе‘ЅеЂјйЂџеє¦ +%d%s",// L"+%d%s natural regeneration speed of all soldiers in the same sector",
+ L"(иї™з§Ќж•€жћњжњЂе¤љеЏ еЉ %d ж¬Ў)",// L" (max %d these bonuses per sector)",
};
STR16 gzIMPMajorTraitsHelpTextsNone[]=
{
- L"No bonuses",
+ L"ж— еҐ–еЉ±",// L"No bonuses",
};
STR16 gzIMPMinorTraitsHelpTextsAmbidextrous[]=
{
- L"Reduce penalty to shoot dual weapons by %d%s\n",
- L"+%d%s speed of reloading guns with magazines\n",
- L"+%d%s speed of reloading guns with loose rounds\n",
- L"-%d%s APs needed to pickup items\n",
- L"-%d%s APs needed to work backpack\n",
- L"-%d%s APs needed to handle doors\n",
- L"-%d%s APs needed to plant/remove bombs and mines\n",
- L"-%d%s APs needed to attach items\n",
+ L"еЏЊжЊЃж¦е™Ёзљ„жѓ©зЅљй™ЌдЅЋ %d%s\n",// L"Reduce penalty to shoot dual weapons by %d%s\n",
+ L"еј№еЊЈз±»ж¦е™ЁдёЉеј№йЂџеє¦ +%d%s\n",// L"+%d%s speed of reloading guns with magazines\n",
+ L"й›¶ж•Јеј№иЌЇиЈ…еЎ«йЂџеє¦ +%d%s\n",// L"+%d%s speed of reloading guns with loose rounds\n",
+ L"拾物品所需行动点 -%d%s\n",// L"-%d%s APs needed to pickup items\n",
+ L"使用大背包所需行动点 -%d%s\n",// L"-%d%s APs needed to work backpack\n",
+ L"ејЂе…ій—Ёж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to handle doors\n",
+ L"安置/拆除炸弹和地雷所需行动点 -%d%s\n",// L"-%d%s APs needed to plant/remove bombs and mines\n",
+ L"组装物品所需行动点 -%d%s\n",// L"-%d%s APs needed to attach items\n",
};
STR16 gzIMPMinorTraitsHelpTextsMelee[]=
{
- L"-%d%s APs needed to attack by blades\n",
- L"+%d%s chance to hit with blades\n",
- L"+%d%s chance to hit with blunt melee weapons\n",
- L"+%d%s damage of blades\n",
- L"+%d%s damage of blunt melee weapons\n",
- L"Aimed attack by any melee weapon deals +%d%s damage\n",
- L"+%d%s chance to dodge attack by melee blades\n",
- L"+%d%s on top chance to dodge melee blades if having a blade in hands\n",
- L"+%d%s chance to dodge attack by blunt melee weapons\n",
- L"+%d%s on top chance to dodge blunt melee weapons if having a blade in hands\n",
+ L"дЅїз”Ёе€Ђе…·ж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to attack by blades\n",
+ L"е€Ђе…·е‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with blades\n",
+ L"й’ќе™Ёе‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with blunt melee weapons\n",
+ L"е€Ђе…·зљ„жќЂдј¤еЉ› +%d%s\n",// L"+%d%s damage of blades\n",
+ L"й’ќе™Ёзљ„жќЂдј¤еЉ› +%d%s\n",// L"+%d%s damage of blunt melee weapons\n",
+ L"瞄准了的近ж€ж¦е™Ёж”»е‡»йЂ ж€ђ +%d%sдј¤е®і\n",// L"Aimed attack by any melee weapon deals +%d%s damage\n",
+ L"иєІйЃїе€Ђе…·ж”»е‡»зљ„е‡ зЋ‡ +%d%s\n",// L"+%d%s chance to dodge attack by melee blades\n",
+ L"жЊЃе€ЂзЉ¶жЂЃдё‹, +%d%s йўќе¤–зљ„е€Ђе…·иєІйЃїзЋ‡\n",// L"+%d%s on top chance to dodge melee blades if having a blade in hands\n",
+ L"иєІйЃїй’ќе™Ёж”»е‡»зљ„е‡ зЋ‡+%d%s\n",// L"+%d%s chance to dodge attack by blunt melee weapons\n",
+ L"жЊЃе€ЂзЉ¶жЂЃдё‹, +%d%s йўќе¤–зљ„й’ќе™ЁиєІйЃїзЋ‡\n",// L"+%d%s on top chance to dodge blunt melee weapons if having a blade in hands\n",
};
STR16 gzIMPMinorTraitsHelpTextsThrowing[]=
{
- L"-%d%s basic APs needed to throw blades\n",
- L"+%d%s max range when throwing blades\n",
- L"+%d%s chance to hit when throwing blades\n",
- L"+%d%s chance to hit when throwing blades per aim click\n",
- L"+%d%s damage of throwing blades\n",
- L"+%d%s damage of throwing blades per aim click\n",
- L"+%d%s chance to inflict critical hit by throwing blade if not seen or heard\n",
- L"+%d critical hit by throwing blade multiplier\n",
- L"Adds %d more aim click for throwing blades\n",
- L"Adds %d more aim clicks for throwing blades\n",
+ L"жЉ•жЋ·йЈће€Ђж‰ЂйњЂеџєзЎЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s basic APs needed to throw blades\n",
+ L"飞刀的投掷最远距离 +%d%s\n",// L"+%d%s max range when throwing blades\n",
+ L"йЈће€Ђзљ„е‘ЅдёзЋ‡ +%d%s\n",// L"+%d%s chance to hit when throwing blades\n",
+ L"жЉ•жЋ·йЈће€Ђж—¶жЇЏж¬ЎзІѕзћ„ +%d%s е‘ЅдёзЋ‡\n",// L"+%d%s chance to hit when throwing blades per aim click\n",
+ L"йЈће€Ђзљ„дј¤е®і +%d%s\n",// L"+%d%s damage of throwing blades\n",
+ L"жЉ•жЋ·йЈће€Ђж—¶жЇЏж¬ЎзІѕзћ„ +%d%s дј¤е®і\n",// L"+%d%s damage of throwing blades per aim click\n",
+ L"在没被敌人察觉的情况下, +%d%s 飞刀致命一击率\n",// L"+%d%s chance to inflict critical hit by throwing blade if not seen or heard\n",
+ L"飞刀致命一击的额外伤害为 %d 倍\n",// L"+%d critical hit by throwing blade multiplier\n",
+ L"йЈће€Ђзљ„жњЂе¤§зІѕзћ„ж¬Ўж•°еўћеЉ %d\n",// L"Adds %d more aim click for throwing blades\n",
+ L"йЈће€Ђзљ„жњЂе¤§зІѕзћ„ж¬Ўж•°еўћеЉ %d\n",// L"Adds %d more aim clicks for throwing blades\n",
};
STR16 gzIMPMinorTraitsHelpTextsNightOps[]=
{
- L"+%d to effective sight range in dark\n",
- L"+%d to general effective hearing range\n",
- L"+%d to effective hearing range in dark on top\n",
- L"+%d to interrupts modifier in dark\n",
- L"-%d need to sleep\n",
+ L"й»‘жљ—дёи§†и·ќ +%d\n",// L"+%d to effective sight range in dark\n",
+ L"综合听力范围 +%d\n",// L"+%d to general effective hearing range\n",
+ L"й»‘жљ—дёйўќе¤– +%d 听力范围\n",// L"+%d to effective hearing range in dark on top\n",
+ L"й»‘жљ—дёдёж–зЋ‡ +%d\n",// L"+%d to interrupts modifier in dark\n",
+ L"зќЎзњ зљ„йњЂж±‚ -%d\n",// L"-%d need to sleep\n",
};
STR16 gzIMPMinorTraitsHelpTextsStealthy[]=
{
- L"-%d%s APs needed to move quietly\n",
- L"+%d%s chance to move quietly\n",
- L"+%d%s stealth (being 'invisible' if unnoticed)\n",
- L"Reduced cover penalty for movement by %d%s\n",
+ L"жЅњиЎЊж‰ЂйњЂиЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed to move quietly\n",
+ L"жЅњиЎЊдїќжЊЃж— еЈ°зљ„е‡ зЋ‡ +%d%s\n",// L"+%d%s chance to move quietly\n",
+ L"йљђи”ЅжЂ§ +%d%s (жІЎиў«еЏ‘зЋ°ж—¶е°±жЇвЂњйљђеЅўвЂќзЉ¶жЂЃ)\n",// L"+%d%s stealth (being 'invisible' if unnoticed)\n",
+ L"й™ЌдЅЋз§»еЉЁз»™йљђи”ЅзЁ‹еє¦ %d%s зљ„жѓ©зЅљ\n",// L"Reduced cover penalty for movement by %d%s\n",
};
STR16 gzIMPMinorTraitsHelpTextsAthletics[]=
{
- L"-%d%s APs needed for moving (running, walking, swatting, crawling, swimming, etc.)\n",
- L"-%d%s energy spent for movement, roof-climbing, obstacle-jumping, swimming, etc.\n",
+ L"跑,走,蹲走,爬,游泳з‰еЉЁдЅњж‰ЂйњЂзљ„иЎЊеЉЁз‚№ -%d%s\n",// L"-%d%s APs needed for moving (running, walking, swatting, crawling, swimming, etc.)\n",
+ L"移动,游泳,爬й«з‰еЉЁдЅњж‰Ђж¶€иЂ—зљ„дЅ“иѓЅ -%d%s\n",// L"-%d%s energy spent for movement, roof-climbing, obstacle-jumping, swimming, etc.\n",
};
STR16 gzIMPMinorTraitsHelpTextsBodybuilding[]=
{
- L"Has %d%s damage resistance\n",
- L"+%d%s effective strength for carrying weight capacity \n",
- L"Reduced energy lost when hit by HtH attack by %d%s\n",
- L"Increased damage needed to fall down if hit to legs by %d%s\n",
+ L"жњ‰ %d%s зљ„дј¤е®іжЉµжЉ—еЉ›\n",// L"Has %d%s damage resistance\n",
+ L"有效力量 +%d%s, 作为最大携带重量\n",// L"+%d%s effective strength for carrying weight capacity \n",
+ L"иў«еѕ’ж‰‹ж”»е‡»йЂ ж€ђзљ„дЅ“еЉ›жЌџе¤±й™ЌдЅЋ %d%s\n",// L"Reduced energy lost when hit by HtH attack by %d%s\n",
+ L"дЅїи§’и‰Іи·ЊеЂ’ж‰ЂйњЂзљ„и…їйѓЁдј¤е®іеўћеЉ %d%s\n",// L"Increased damage needed to fall down if hit to legs by %d%s\n",
};
STR16 gzIMPMinorTraitsHelpTextsDemolitions[]=
{
- L"-%d%s APs needed to throw grenades\n",
- L"+%d%s max range when throwing grenades\n",
- L"+%d%s chance to hit when throwing grenades\n",
- L"+%d%s damage of set bombs and mines\n",
- L"+%d%s to attaching detonators check\n",
- L"+%d%s to planting/removing bombs check\n",
- L"Decreases chance enemy will detect your bombs and mines (+%d bomb level)\n",
- L"Increased chance shaped charge will open the doors (damage multiplied by %d)\n",
+ L"投掷手榴弹所需行动点 -%d%s\n",// L"-%d%s APs needed to throw grenades\n",
+ L"手榴弹最远投掷距离 +%d%s\n",// L"+%d%s max range when throwing grenades\n",
+ L"手榴弹的命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit when throwing grenades\n",
+ L"安置的炸弹和地雷的伤害 +%d%s\n",// L"+%d%s damage of set bombs and mines\n",
+ L"з»„еђ€з‚ёеј№зљ„ж€ђеЉџзЋ‡ +%d%s\n",// L"+%d%s to attaching detonators check\n",
+ L"安置/拆除炸弹成功率 +%d%s\n",// L"+%d%s to planting/removing bombs check\n",
+ L"й™ЌдЅЋж•ЊдєєеЏ‘зЋ°дЅ зљ„з‚ёеј№е’Њењ°й›·зљ„е‡ зЋ‡ (з‚ёеј№з‰зє§+%d)\n",// L"Decreases chance enemy will detect your bombs and mines (+%d bomb level)\n",
+ L"жЏђй«е®љеђ‘з‚ёиЌЇз ґй—Ёе‡ зЋ‡ (дј¤е®ід№д»Ґ %d)\n",// L"Increased chance shaped charge will open the doors (damage multiplied by %d)\n",
};
STR16 gzIMPMinorTraitsHelpTextsTeaching[]=
{
- L"+%d%s bonus to train militia\n",
- L"+%d%s bonus to effective leadership for determining militia training\n",
- L"+%d%s bonus to teaching other mercs\n",
- L"Skill value counts to be +%d higher for being able to teach this skill to other mercs\n",
- L"+%d%s bonus to train stats through self-practising assignment\n",
+ L"и®з»ѓж°‘е…µйЂџеє¦ +%d%s\n",// L"+%d%s bonus to militia training speed\n",
+ L"и®з»ѓж°‘е…µж—¶пјЊ жњ‰ж•€йў†еЇјиѓЅеЉ› +%d%s\n",// L"+%d%s bonus to effective leadership for determining militia training\n",
+ L"и®з»ѓе…¶д»–雇佣兵的效率 +%d%s\n",// L"+%d%s bonus to teaching other mercs\n",
+ L"и®з»ѓе…¶д»–дєєжџђйЎ№е±ћжЂ§ж—¶, ж•™е®и‡Єиє«зљ„иЇҐйЎ№иѓЅеЉ›жњ‰ж•€еЂј +%d\n",// L"Skill value counts to be +%d higher for being able to teach this skill to other mercs\n",
+ L"自我锻炼的效率 +%d%s\n",// L"+%d%s bonus to train stats through self-practising assignment\n",
};
STR16 gzIMPMinorTraitsHelpTextsScouting[]=
{
- L"+%d to effective sight range with scopes on weapons\n",
- L"+%d to effective sight range with binoculars (and scopes separated from weapons)\n",
- L"-%d tunnel vision with binoculars (and scopes separated from weapons)\n",
- L"If in sector, adjacent sectors will show exact number of enemies\n",
- L"If in sector, adjacent sectors will show presence of enemies if any\n",
- L"Prevents the enemy to ambush your squad\n",
- L"Prevents the bloodcats to ambush your squad\n",
+ L"ж¦е™ЁдёЉзљ„瞄准镜 +%d 有效视距\n",// L"+%d to effective sight range with scopes on weapons\n",
+ L"望远镜和拆卸下来的瞄准镜 +%d 有效视距\n",// L"+%d to effective sight range with binoculars (and scopes separated from weapons)\n",
+ L"远镜和拆卸下来的瞄准镜的з‹йљи§†й‡Ће‡Џе°‘ %d\n",// L"-%d tunnel vision with binoculars (and scopes separated from weapons)\n",
+ L"жѕз¤єй‚»иї‘区域敌人的准确数量\n",// L"If in sector, adjacent sectors will show exact number of enemies\n",
+ L"жѕз¤єй‚»иї‘еЊєеџџж•Њдєєзљ„еењЁ\n",// L"If in sector, adjacent sectors will show presence of enemies if any\n",
+ L"йІжўж•ЊдєєеЃ·иўдЅ зљ„йџдјЌ\n",// L"Prevents the enemy to ambush your squad\n",
+ L"йІжўиЎЂзЊ«еЃ·иўдЅ зљ„йџдјЌ\n",// L"Prevents the bloodcats to ambush your squad\n",
};
STR16 gzIMPMinorTraitsHelpTextsNone[]=
{
- L"No bonuses",
+ L"ж— еҐ–еЉ±",// L"No bonuses",
};
STR16 gzIMPOldSkillTraitsHelpTexts[]=
{
- L"+%d%s bonus to lockpicking\n", // 0
- L"+%d%s hand to hand chance to hit\n",
- L"+%d%s hand to hand damage\n",
- L"+%d%s chance to dodge hand to hand attacks\n",
- L"Eliminates the penalty to repair and handle\nelectronic things (locks, traps, rem. detonators, robot, etc.)\n",
- L"+%d to effective sight range in dark\n",
- L"+%d to general effective hearing range\n",
- L"+%d to effective hearing range in dark on top\n",
- L"+%d to interrupts modifier in dark\n",
- L"-%d need to sleep\n",
- L"+%d%s max range when throwing anything\n", // 10
- L"+%d%s chance to hit when throwing anything\n",
- L"+%d%s chance to instantly kill by throwing knife if not seen or heard\n",
- L"+%d%s bonus to train militia and instruct other mercs\n",
- L"+%d%s effective leadership for militia training calculations\n",
- L"+%d%s chance to hit with rocket/greande launchers and mortar\n",
- L"Auto fire/burst chance to hit penalty is divided by %d\n",
- L"Reduced chance for shooting unwanted bullets on autofire\n",
- L"+%d%s chance to move quietly\n",
- L"+%d%s stealth (being 'invisible' if unnoticed)\n",
- L"Eliminates the CtH penalty for second hand when firing two weapons at once\n", // 20
- L"+%d%s chance to hit with melee blades\n",
- L"+%d%s chance to dodge attacks by melee blades if having blade in hands\n",
- L"+%d%s chance to dodge attacks by melee blades if having anything else in hands\n",
- L"+%d%s chance to dodge hand to hand attacks if having blade in hands\n",
- L"-%d%s effective range to target with all weapons\n",
- L"+%d%s aiming bonus per aim click\n",
- L"Provides permanent camouflage\n",
- L"+%d%s hand to hand chance to hit\n",
- L"+%d%s hand to hand damage\n",
- L"+%d%s chance to dodge hand to hand attacks if having empty hands\n", // 30
- L"+%d%s chance to dodge hand to hand attacks if not having empty hands\n",
- L"+%d%s chance to dodge attacks by melee blades\n",
- L"Can perform spinning kick attack on weakened enemies to deal double damage\n",
- L"You gain special animations for hand to hand combat\n",
- L"No bonuses",
+ L"ејЂй”Ѓж€ђеЉџзЋ‡ +%d%s\n",// L"+%d%s bonus to lockpicking\n", // 0
+ L"肉搏命дёзЋ‡ +%d%s\n",// L"+%d%s hand to hand chance to hit\n",
+ L"肉搏伤害 +%d%s\n",// L"+%d%s hand to hand damage\n",
+ L"肉搏攻击躲避率 +%d%s\n",// L"+%d%s chance to dodge hand to hand attacks\n",
+ L"消除修理和使用电еђи®ѕе¤‡зљ„жѓ©зЅљпј€й”ЃпјЊ й™·й±пјЊ 遥控引爆器, жњєе™Ёдєєз‰пј‰\n",// L"Eliminates the penalty to repair and handle\nelectronic things (locks, traps, rem. detonators, robot, etc.)\n",
+ L"й»‘жљ—дёи§†и·ќ +%d\n",// L"+%d to effective sight range in dark\n",
+ L"综合听力范围 +%d\n",// L"+%d to general effective hearing range\n",
+ L"й»‘жљ—дёйўќе¤– +%d 听力范围\n",// L"+%d to effective hearing range in dark on top\n",
+ L"й»‘жљ—дёдёж–зЋ‡ +%d\n",// L"+%d to interrupts modifier in dark\n",
+ L"зќЎзњ зљ„йњЂж±‚ -%d\n",// L"-%d need to sleep\n",
+ L"投掷任何物体的最远距离 +%d%s\n",// L"+%d%s max range when throwing anything\n", // 10
+ L"投掷任何物体的命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit when throwing anything\n",
+ L"未被察觉时飞刀的一击必杀率 +%d%s\n",// L"+%d%s chance to instantly kill by throwing knife if not seen or heard\n",
+ L"и®з»ѓж°‘е…µе’Ње…¶д»–дЅЈе…µзљ„йЂџеє¦ +%d%s\n",// L"+%d%s bonus to militia training and other mercs instructing speed\n",
+ L"и®з»ѓж°‘е…µж—¶зљ„жњ‰ж•€йў†еЇјиѓЅеЉ› +%d%s\n",// L"+%d%s effective leadership for militia training calculations\n",
+ L"зЃ«з®пјЊ 榴弹和迫击炮的命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with rocket/greande launchers and mortar\n",
+ L"и‡ЄеЉЁ/з‚№е°„жЁЎејЏе‘Ѕдёжѓ©зЅљй™¤д»Ґ %d\n",// L"Auto fire/burst chance to hit penalty is divided by %d\n",
+ L"й™ЌдЅЋжµЄиґ№еђеј№зљ„е‡ зЋ‡\n",// L"Reduced chance for shooting unwanted bullets on autofire\n",
+ L"жЅњиЎЊдїќжЊЃж— еЈ°зљ„е‡ зЋ‡+%d%s\n",// L"+%d%s chance to move quietly\n",
+ L"+%d%s йљђи”ЅжЂ§(жІЎиў«еЏ‘зЋ°е°±з›ёеЅ“дєЋйљђиє«зљ„зЉ¶жЂЃ)\n",// L"+%d%s stealth (being 'invisible' if unnoticed)\n",
+ L"消除双持ж¦е™Ёж—¶зљ„е‘Ѕдёжѓ©зЅљ\n",// L"Eliminates the CtH penalty when firing two weapons at once\n", // 20
+ L"刀具攻击的命дёзЋ‡ +%d%s\n",// L"+%d%s chance to hit with melee blades\n",
+ L"жЊЃе€ЂзЉ¶жЂЃдё‹ +%d%sиєІе€Ђе‡ зЋ‡\n",// L"+%d%s chance to dodge attacks by melee blades if having blade in hands\n",
+ L"持其他物品状态下 +%d%sиєІе€Ђе‡ зЋ‡\n",// L"+%d%s chance to dodge attacks by melee blades if having anything else in hands\n",
+ L"жЊЃе€ЂзЉ¶жЂЃдё‹ +%d%sиєІж‹іе‡ зЋ‡\n",// L"+%d%s chance to dodge hand to hand attacks if having blade in hands\n",
+ L"ж‰Ђжњ‰ж¦е™Ёзљ„жњ‰ж•€е°„зЁ‹ -%d%s\n",// L"-%d%s effective range to target with all weapons\n",
+ L"жЇЏж¬ЎзІѕзћ„ +%d%sзћ„е‡†еЉ ж€ђ\n",// L"+%d%s aiming bonus per aim click\n",
+ L"жЏђдѕ›ж°ёд№…зљ„иї·еЅ©ж¶‚иЈ…\n",// L"Provides permanent camouflage\n",
+ L"肉搏命дёзЋ‡ +%d%s\n",// L"+%d%s hand to hand chance to hit\n",
+ L"肉搏伤害 +%d%s\n",// L"+%d%s hand to hand damage\n",
+ L"空手状态下 +%d%sзљ„е‡ зЋ‡иєІйЃїи‚‰жђЏж”»е‡»\n",// L"+%d%s chance to dodge hand to hand attacks if having empty hands\n", // 30
+ L"非空手状态下 +%d%sзљ„е‡ зЋ‡иєІйЃїи‚‰жђЏж”»е‡»\n",// L"+%d%s chance to dodge hand to hand attacks if not having empty hands\n",
+ L"иєІйЃїе€Ђе…·ж”»е‡»зљ„е‡ зЋ‡ +%d%s\n",// L"+%d%s chance to dodge attacks by melee blades\n",
+ L"可向虚弱的敌人施展回旋踢, йЂ ж€ђеЏЊеЂЌзљ„и‚‰жђЏдј¤е®і\n",// L"Can perform spinning kick attack on weakened enemies to deal double damage\n",
+ L"дЅ е°†еѕ—е€°з‰№е€«зљ„еѕ’ж‰‹жђЏе‡»еЉЁз”»ж•€жћњ\n",// L"You gain special animations for hand to hand combat\n",
+ L"ж— еҐ–еЉ±",// L"No bonuses",
};
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
- L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
- L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
- L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
- L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
- L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
- L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
- L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
+ L"дјз‚№пјљж— .\nзјєз‚№пјљж— .",// L"A: No advantage.\nD: No disadvantage.",
+ L"дјз‚№пјљиє«иѕ№жњ‰е¤љдёЄй›‡дЅЈе…µж—¶иЎЁзЋ°жњЂдЅі.\nзјєз‚№пјље¤еЌ•дёЂдєєж—¶еЈ«ж°”дёЌдјљдёЉеЌ‡.",// L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"дјз‚№пјљз‹¬и‡ЄиЎЊеЉЁж—¶иЎЁзЋ°жњЂеҐЅ.\nзјєз‚№пјљењЁе›ўйџдёеЈ«ж°”дёЌдјљдёЉеЌ‡.",// L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
+ L"дјз‚№пјљеЈ«ж°”дёЉеЌ‡еѕ—еї«пјЊдё‹й™Ќеѕ—ж…ў.\nзјєз‚№пјљеЏ‘зЋ°ењ°й›·е’Њй™·й±зљ„е‡ зЋ‡й™ЌдЅЋдє†.",// L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
+ L"дјз‚№пјљж›ґе–„дєЋи®з»ѓж°‘兵和跟别人交流.\nзјєз‚№пјљеЈ«ж°”дёЌдјље› дёєе…¶д»–йџе‘зљ„иЎЊдёєиЂЊдёЉеЌ‡.",// L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
+ L"дјз‚№пјљи‡Єж€‘й”»з‚јж€–е¦д№ ж•€зЋ‡з•Ґй«.\nзјєз‚№пјље‡Џе°‘еЇ№жЃђжѓ§е’ЊзЃ«еЉ›еЋ‹е€¶зљ„ж‰їеЏ—еЉ›.",// L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
+ L"дјз‚№пјље‡Џе°‘一切行动的体能消耗(除了医疗, дї®зђ†пјЊ и®з»ѓж°‘е…µе’Ње¦д№ жџђз§ЌжЉЂиѓЅпј‰.\nзјєз‚№пјљж™єеЉ›пјЊ йў†еЇјиѓЅеЉ›пјЊ з€†з ґпјЊ дї®зђ†е’ЊеЊ»з–—жЉЂжњЇжЏђй«еѕ—ж…ўдёЂдє›.",// L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"дјз‚№пјљз‚№е°„/и‡ЄеЉЁжЁЎејЏдё‹е‘ЅдёзЋ‡пјЊ иї‘ж€жќЂдј¤еЉ›е’Њж¶€зЃж•Њдєєж‰Ђеѕ—的时期更й«.\nзјєз‚№пјљ йњЂи¦ЃиЂђеїѓзљ„иЎЊдёєдјљеѕ—е€°ж•€зЋ‡жѓ©зЅљпјЊ 比如修理, ејЂй”ЃпјЊ 解除陷й±пјЊ еЊ»жІ»е’Њи®з»ѓж°‘е…µ.",// L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"дјз‚№пјљйњЂи¦ЃиЂђеїѓзљ„工作会得到效率奖励, 比如修理, ж’¬й”ЃпјЊ 解除陷й±пјЊ еЊ»жІ»е’Њи®з»ѓж°‘е…µ.\nзјєз‚№пјљ з•Ґеѕ®й™ЌдЅЋдёж–зЋ‡.",// L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
+ L"дјз‚№пјљеўћеЉ еЇ№зЃ«еЉ›еЋ‹е€¶е’ЊжЃђжѓ§зљ„ж‰їеЏ—еЉ›пјЊ\n负伤其他雇佣兵йµдєЎеЇ№д»–зљ„еЈ«ж°”еЅ±е“Ќзљ„д№џжЇ”иѕѓе°Џ.\nзјєз‚№пјљ е®№ж“ж€ђдёєж•Њдєєзљ„з§»еЉЁйќ¶.",// L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"дјз‚№пјљиї›иЎЊйќћж€ж–—任务时士气会提升(除了и®з»ѓж°‘е…µпј‰.\nзјєз‚№пјљ жќЂдєєдёЌеўћеЉ еЈ«ж°”.",// L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
+ L"дјз‚№пјљж”»е‡»жњ‰ж›ґй«зљ„е‡ зЋ‡иѓЅйЂ ж€ђеЏ—е®іиЂ…е±ћжЂ§еЂјй™ЌдЅЋпјЊе’Њж›ґдёҐй‡Ќзљ„е€›дј¤пјЊ еђЊж—¶жЏђй«и‡Єе·±зљ„еЈ«ж°”.\nзјєз‚№пјљ дёЋе…¶д»–дєєдє¤жµЃжЇдёЄй—®йўпјЊи„±з¦»ж€ж–—еђЋеЈ«ж°”д№џдјљеї«йЂџдё‹жІ‰.",// L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"дјз‚№пјљй™„近有异性雇佣兵时表现更佳.\nзјєз‚№пјљ 附近所有同性雇佣兵士气提升得慢.",// L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
STR16 gzIMPDisabilitiesHelpTexts[]=
{
- L"No effects.",
- L"Has problems with breathing and reduced overall performance if in tropical or desert sectors.",
- L"Can suffer panic attack if left alone in certain situations.",
- L"His overall performance is reduced if underground.",
- L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
- L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"жІЎжњ‰ж•€жћњ.",// L"No effects.",
+ L"ењЁзѓеё¦е’ЊжІ™жј ењ°еЊєе‘јеђёе›°йљѕ, й™ЌдЅЋз»јеђ€иЎЁзЋ°",// L"Has problems with breathing and reduced overall performance if in tropical or desert sectors.",
+ L"在某些情况下е¤еЌ•дёЂдєєдјљйЂ ж€ђжЃђж…Њ.",// L"Can suffer panic attack if left alone in certain situations.",
+ L"иї›е…Ґењ°дё‹дјљй™ЌдЅЋд»–зљ„з»јеђ€иЎЁзЋ°.",// L"His overall performance is reduced if underground.",
+ L"жёёжііж—¶дјљиЅ»ж“зљ„жєєж°ґ.",// L"If trying to swim he can easily drown.",
+ L"看到大虫еђдѕїе…зҐћж— дё». ењЁзѓеё¦ењ°еЊєд№џдјљй™ЌдЅЋд»–зљ„з»јеђ€иЎЁзЋ°",// L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"еЃ¶е°”дјљеїи®°д»–手头的任务, ж€ж–—дёдјљжЌџе¤±иЎЊеЉЁз‚№.",// L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
+ L"偶尔发疯并且把手里的ж¦е™Ёи®ѕењЁи‡ЄеЉЁз„¶еђЋд№±е–·\n如果ж¦е™ЁдёЌиѓЅи‡ЄеЉЁе°„击将会打击他的士气.",// L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
};
@@ -479,19 +449,18 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
STR16 gzIMPProfileCostText[]=
{
- L"The profile cost is %d$. Do you authorize the payment? ",
+ L"先生您消费 %d$. 要打包吗?",//L"The profile cost is %d$. Do you authorize the payment? ",
};
STR16 zGioNewTraitsImpossibleText[]=
{
- L"You cannot choose the New Trait System with PROFEX utility deactivated. Check your JA2_Options.ini for entry: READ_PROFILE_DATA_FROM_XML.",
+ L"дЅ ењЁPROFEXз»„д»¶иў«е…ій—зљ„жѓ…е†µдё‹ж— жі•йЂ‰ж‹©ж–°жЉЂиѓЅзі»з»џгЂ‚иЇ·ењЁJA2_Options.iniдёжЈЂжџҐREAD_PROFILE_DATA_FROM_XMLи®ѕе®љгЂ‚",
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//@@@: New string as of March 3, 2000.
STR16 gzIronManModeWarningText[]=
{
-// L"You have chosen IRON MAN mode. This setting makes the game considerably more challenging as you will not be able to save your game when in a sector occupied by enemies. This setting will affect the entire course of the game. Are you sure want to play in IRON MAN mode?",
L"дЅ йЂ‰ж‹©дє†й“ЃдєєжЁЎејЏгЂ‚иї™е°†дјљжёёж€ЏеЏеѕ—з›ёеЅ“жњ‰жЊ‘ж€жЂ§пјЊе› дёєдЅ ж— жі•ењЁж•ЊдєєеЌ жЌ®зљ„е€†еЊєежЎЈгЂ‚ иї™дёЄи®ѕзЅ®дјљеЅ±е“Ќжёёж€Џзљ„ж•ґдёЄиї›зЁ‹гЂ‚дЅ зЎ®и®¤дЅ и¦ЃењЁй“ЃдєєжЁЎејЏдё‹иї›иЎЊжёёж€Џеђ—?",
};
@@ -499,6 +468,7 @@ STR16 gzDisplayCoverText[]=
{
L"йљђи”ЅзЁ‹еє¦: %d/100 %s, е…‰дє®еє¦: %d/100",
L"ж¦е™Ёе°„зЁ‹: %d/%d ж ј, е‘ЅдёзЋ‡: %d/100",
+ L"ж¦е™Ёе°„зЁ‹: %d/%d ж ј, жћЄеЏЈзЁіе®љжЂ§: %d/100",
L"е…ій—йљђи”ЅзЁ‹еє¦жѕз¤є",
L"жѕз¤єдЅЈе…µзљ„视线",
L"жѕз¤єдЅЈе…µзљ„йљђи”ЅзЁ‹еє¦",
@@ -510,5 +480,4 @@ STR16 gzDisplayCoverText[]=
L"" // yes empty for now
};
-
#endif
diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp
index 1f09d656..630ab94e 100644
--- a/Utils/_Ja25DutchText.cpp
+++ b/Utils/_Ja25DutchText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("DUTCH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Dutchtext.h"
@@ -415,17 +417,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -437,9 +439,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do so with given weapon.",
};
@@ -466,6 +468,7 @@ STR16 gzDisplayCoverText[]=
{
L"Cover: %d/100 %s, Brightness: %d/100",
L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
+ L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabling cover display",
L"Showing mercenary view",
L"Showing danger zones for mercenary",
diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp
index 8d47a040..8d9e22d3 100644
--- a/Utils/_Ja25EnglishText.cpp
+++ b/Utils/_Ja25EnglishText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("ENGLISH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Englishtext.h"
@@ -415,17 +417,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -437,9 +439,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do that so given weapon.",
};
@@ -466,6 +468,7 @@ STR16 gzDisplayCoverText[]=
{
L"Cover: %d/100 %s, Brightness: %d/100",
L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
+ L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabling cover display",
L"Showing mercenary view",
L"Showing danger zones for mercenary",
diff --git a/Utils/_Ja25EnglishText.h b/Utils/_Ja25EnglishText.h
index b0175964..aaf91910 100644
--- a/Utils/_Ja25EnglishText.h
+++ b/Utils/_Ja25EnglishText.h
@@ -84,6 +84,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp
index b841bcbc..6ae11189 100644
--- a/Utils/_Ja25FrenchText.cpp
+++ b/Utils/_Ja25FrenchText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("FRENCH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Frenchtext.h"
@@ -414,17 +416,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -436,9 +438,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do so with given weapon.",
};
@@ -465,6 +467,7 @@ STR16 gzDisplayCoverText[]=
{
L"Cover: %d/100 %s, Brightness: %d/100",
L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
+ L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabling cover display",
L"Showing mercenary view",
L"Showing danger zones for mercenary",
diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp
index 098a736a..14a84d2d 100644
--- a/Utils/_Ja25GermanText.cpp
+++ b/Utils/_Ja25GermanText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("GERMAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25GermanText.h"
@@ -440,7 +442,6 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Ertrдgt den Anblick groЯer Insekten nicht und\nzeigt verringerte Leistung in tropischen Sektoren.",
L"Vergisst manchmal seine Befehle und verliert dadurch im Kampf einen Teil seiner APs.",
L"Dreht im Umgang mit Waffen manchmal durch und gibt Dauerfeuer.\nIst ihm das mit seiner Waffe nicht mцglich, kann das zu Moralabzьgen fьhren.",
-
};
@@ -452,7 +453,7 @@ STR16 gzIMPProfileCostText[]=
STR16 zGioNewTraitsImpossibleText[]=
{
- L"Sie kцnnen das neue Fertigkeitensystem nicht ohne aktivierte PROFEX-Utility benutzen. Suchen Sie in Ihrer JA2_Options.ini den Eintrag: READ_PROFILE_DATA_FROM_XML.",
+ L"Sie kцnnen das neue Fertigkeitensystem nicht ohne aktiviertem PROFEX-Utility benutzen. Suchen Sie in Ihrer ja2_options.ini den Eintrag: READ_PROFILE_DATA_FROM_XML.",
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -466,7 +467,8 @@ STR16 gzIronManModeWarningText[]=
STR16 gzDisplayCoverText[]=
{
L"Deckung: %d/100 %s, Helligkeit: %d/100",
- L"Waffen-Rchwt.: %d/%d Felder, Trefferwahrsch.: %d/100",
+ L"Waffen-Reichweite: %d/%d Felder, Trefferwahrscheinlichkeit: %d/100",
+ L"Waffen-Reichweite: %d/%d Felder, Lauf-Genauigkeit: %d/100",
L"Deckungsanzeige ausschalten",
L"Zeige Ansicht fьr Sцldner",
L"Zeige Gefahrenbereich fьr Sцldner",
@@ -474,7 +476,7 @@ STR16 gzDisplayCoverText[]=
L"Stadt",
L"Wьste",
L"Schnee", // NOT USED!!!
- L"Wald and Wьste",
+ L"Wald und Wьste",
L"" // yes empty for now
};
diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp
index 9be815c3..38850d6c 100644
--- a/Utils/_Ja25ItalianText.cpp
+++ b/Utils/_Ja25ItalianText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("ITALIAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Italiantext.h"
@@ -413,17 +415,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -435,9 +437,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do so with given weapon.",
};
@@ -464,6 +466,7 @@ STR16 gzDisplayCoverText[]=
{
L"Copertura: %d/100 %s, Luminositа: %d/100",
L"Gittata dell'arma: %d/%d tiles, Probabilitа di colpire: %d/100",
+ L"Gittata dell'arma: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabilita visualizzazione copertura",
L"Mostra visuale del mercenario",
L"Mostra zone di pericolo per il mercenario",
diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp
index 5f16f196..d4915ea0 100644
--- a/Utils/_Ja25PolishText.cpp
+++ b/Utils/_Ja25PolishText.cpp
@@ -1,4 +1,6 @@
-//#pragma setlocale("POLISH")
+// WANNE: Yes we need this here exclusivly in Polish version, because we do not have a codepage in the code like for other versions.
+#pragma setlocale("POLISH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Polishtext.h"
@@ -414,17 +416,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -436,9 +438,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do so with given weapon.",
};
@@ -465,6 +467,7 @@ STR16 gzDisplayCoverText[]=
{
L"Cover: %d/100 %s, Brightness: %d/100",
L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
+ L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabling cover display",
L"Showing mercenary view",
L"Showing danger zones for mercenary",
diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp
index 801ec076..de826ac7 100644
--- a/Utils/_Ja25RussianText.cpp
+++ b/Utils/_Ja25RussianText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("RUSSIAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25RussianText.h"
@@ -53,7 +55,7 @@ STR16 gzIMPSkillTraitsText[]=
L"Взлом замков",
L"Рукопашный бой",
L"Электроника",
- L"Ночные операции",
+ L"Ночник",
L"Метание",
L"Инструктор",
L"Тяжелое оружие",
@@ -103,7 +105,7 @@ STR16 gzIMPSkillTraitsTextNewMinor[]=
L"Ловкач", //Ambidextrous
L"Мастер клинка", //Melee
L"Мастер по метанию", //Throwing
- L"Человек ночи", //Night Ops
+ L"Ночник", //Night Ops
L"Бесшумный убийца", //Stealthy
L"Спортсмен", //Athletics
L"Культурист", //Bodybuilding
@@ -155,7 +157,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
L" после пятого",
L" после шестого",
L" после седьмого",
- L"-%d%s ОД на передёргивание затвора у полуавтоматических винтовок\n",
+ L"-%d%s ОД на передёргивание затвора магазинных винтовок\n",
L"Плюс 1 клик-прицеливания к оружию типа винтовки\n",
L"Плюс %d клик-прицеливания к оружию типа винтовки\n",
@@ -189,80 +191,80 @@ STR16 gzIMPMajorTraitsHelpTextsGunslinger[]=
};
STR16 gzIMPMajorTraitsHelpTextsMartialArts[]=
{
- L"-%d%s AP cost of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"+%d%s chance to hit with hand to hand attacks with bare hands\n",
- L"+%d%s chance to hit with hand to hand attacks with brass knuckles\n",
- L"+%d%s damage of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"+%d%s breath damage of hand to hand attacks(bare hands or with brass knuckles)\n",
- L"Enemy knocked out due to your HtH attacks takes slightly longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes much longer to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes very long to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes extremely long to recuperate\n",
- L"Enemy knocked out due to your HtH attacks takes long hours to recuperate\n",
- L"Enemy knocked out due to your HtH attacks probably never stand up\n",
- L"Focused (aimed) punch deals +%d%s more damage\n",
- L"Your special spinning kick deals +%d%s more damage\n",
- L"+%d%s change to dodge hand to hand attacks\n",
- L"+%d%s on top chance to dodge HtH attacks with bare hands",
- L" or brass knuckles",
- L" (+%d%s with brass knuckles)",
- L"+%d%s on top chance to dodge HtH attacks with brass knuckles\n",
- L"+%d%s chance to dodge attacks by any melee weapon\n",
- L"-%d%s APs needed to steal weapon from enemy hands\n",
- L"-%d%s APs needed to change stance (stand, crouch, lie down), turn around, climb on/off roof and jump obstacles\n",
- L"-%d%s APs needed to change stance (stand, crouch, lie down)\n",
- L"-%d%s APs needed to turn around\n",
- L"-%d%s APs needed to climb on/off roof and jump obstacles\n",
- L"+%d%s chance to kick doors in\n",
- L"You gain special animations for hand to hand combat\n",
+ L"-%d%s ОД на рукопашые атаки (кулаками и кастетом)\n",
+ L"+%d%s к шансу на результативный удар рукой\n",
+ L"+%d%s к шансу на результативный удар кастетом\n",
+ L"+%d%s к урону в рукопашных атаках (кулаками и кастетом)\n",
+ L"+%d%s к урону выносливости в рукопашных атаках (кулаками и кастетом)\n",
+ L"Враг, сваленный вашими ударами, немного дольше приходит в себя\n",
+ L"Враг, сваленный вашими ударами, дольше приходит в себя\n",
+ L"Враг, сваленный вашими ударами, намного дольше приходит в себя\n",
+ L"Враг, сваленный вашими ударами, очень долго приходит в себя\n",
+ L"Враг, сваленный вашими ударами, надолго теряет сознание\n",
+ L"Враг, сваленный вашими ударами, теряет сознание на много часов\n",
+ L"Враг, сваленный вашими ударами, вероятно больше не очнётся\n",
+ L"Прицельный удар наносит на %d%s больше урона\n",
+ L"Удар ногой с разворота наносит на %d%s больше урона\n",
+ L"+%d%s к шансу увернуться от удара\n",
+ L"+%d%s к шансу увернуться от удара рукой",
+ L" или кастетом",
+ L" (+%d%s с кастетом)",
+ L"+%d%s к шансу увернуться от удара кастетом\n",
+ L"+%d%s к шансу увернуться от атаки любым холодным оружием\n",
+ L"нужно на %d%s ОД меньше чтобы выхватить оружие из рук противника\n",
+ L"нужно на %d%s ОД меньше чтобы сменить положение (стоя, сидя, лежа), повернуться, слезть/залезть на крышу и перепрыгнуть препятствие\n",
+ L"нужно на %d%s ОД меньше чтобы сменить положение (стоя, сидя, лежа)\n",
+ L"нужно на %d%s ОД меньше чтобы повернуться\n",
+ L"нужно на %d%s ОД меньше чтобы слезть/залезть на крышу и перепрыгнуть препятствие\n",
+ L"+%d%s к шансу выбить дверь ногой\n",
+ L"Вы получаете специальные движения для атак в ближнем бою\n",
};
STR16 gzIMPMajorTraitsHelpTextsSquadleader[]=
{
- L"+%d%s APs per round of other mercs in vicinity\n",
- L"+%d effective exp level of other mercs in vicinity, which have lesser level than the %s\n",
- L"+%d effective exp level to count as a standby when counting friends' bonus for suppression\n",
- L"+%d%s total suppression tolerance for other mercs in the vicinity and %s himself\n",
- L"+%d morale gain for other mercs in the vicinity\n",
- L"-%d morale loss for other mercs in the vicinity\n",
- L"The vicinity for bonuses is %d tiles",
- L" (%d tiles with extended ears)",
- L"(Max simultaneous bonuses for one soldier is %d)\n",
- L"+%d%s fear resistence of %s\n",
- L"Drawback: %dx morale loss for %s's death for all other mercs\n",
+ L"+%d%s ОД на каждый ход рядом находящимся наёмникам\n",
+ L"+%d к эффективному уровню рядом находящихся наёмников, у которых уровень ниже чем у %s\n",
+ L"+%d к уровню опыта союзников при подсчете бонуса подавления для их огня\n",
+ L"на +%d%s труднее подавить %s и наёмников рядом с ним\n",
+ L"+%d к боевому духу рядом находящихся наёмников\n",
+ L"-%d к потере боевого духа для рядом находящихся наёмников\n",
+ L"Радиус влияния лидера на других наёмников %d клеток",
+ L" (%d клеток с усилителем звука)",
+ L"(Максимальное количество одновременных бонусов для одного солдата %d)\n",
+ L"+%d%s сопротивление страху у %s\n",
+ L"Недостаток: %dx кратное ухудшение боевого духа у наёмников если погибает %s\n",
};
STR16 gzIMPMajorTraitsHelpTextsTechnician[]=
{
- L"+%d%s to repairing speed\n",
- L"+%d%s to lockpicking (normal/electronic locks)\n",
- L"+%d%s to disarming electronic traps\n",
- L"+%d%s to attaching special items and combining things\n",
- L"+%d%s to unjamming a gun in combat\n",
- L"Reduce penalty to repair electronic items by %d%s\n",
- L"Increased chance to detect traps and mines (+%d detect level)\n",
- L"+%d%s CtH of robot controlled by the %s\n",
- L"%s trait grants you the ability to repair the robot\n",
- L"Reduced penalty to repair speed of the robot by %d%s\n",
+ L"+%d%s к скорости ремонта\n",
+ L"+%d%s к умению взлома замков (обычных/электронных)\n",
+ L"+%d%s к умению отключать электронные ловушки\n",
+ L"+%d%s к умению сборки вещей и присоединению особых деталей\n",
+ L"+%d%s к умению привести оружие в рабочее состояние в бою если оно отказало\n",
+ L"Понижен штраф на ремонт электронных предметов на %d%s\n",
+ L"Повышен шанс обнаружить электронные ловушки и мины (+%d к уровню обнаружения)\n",
+ L"+%d%s к шансу поразить цель роботу управляемому %s\n",
+ L"%s даёт возможность ремонтировать робота\n",
+ L"Понижен штраф на ремонт робота на %d%s\n",
};
STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
{
- L"Has ability to perform surgical intervention by using medical bag on wounded soldier\n",
- L"Surgery instantly returns %d%s of lost health back.",
- L" (This drains the medical bag a lot.)",
- L"Can heal lost stats (from critical hits) by the",
- L" surgery or",
- L" doctor assignment.\n",
- L"+%d%s effectiveness on doctor-patient assignment\n",
- L"+%d%s bandaging speed\n",
- L"+%d%s natural regeneration speed for all soldiers in the same sector",
- L" (max %d of these bonuses per sector stack)",
+ L"Может выполнять хирургические операции при наличии медицинской сумки\n",
+ L"Хирургическая операция возвращает %d%s единиц потерянного здоровья.",
+ L" (Требует значительного расхода содержимого мед. сумки.)",
+ L"Может вернуть ухудшившиеся навыки (в следствии критического ранения) путём",
+ L" хирургического вмешательства или",
+ L" обычным лечением.\n",
+ L"+%d%s к эффективности при связке доктор-пациент\n",
+ L"+%d%s к скорости перевязки\n",
+ L"+%d%s к природной скорости регенерации для всех солдат в том же секторе",
+ L" (максимум %d бонуса на находящихся в секторе)",
};
STR16 gzIMPMajorTraitsHelpTextsNone[]=
{
- L"Нет преимуществ", //No bonuses
+ L"Нет преимуществ",
};
STR16 gzIMPMinorTraitsHelpTextsAmbidextrous[]=
@@ -278,30 +280,30 @@ STR16 gzIMPMinorTraitsHelpTextsAmbidextrous[]=
};
STR16 gzIMPMinorTraitsHelpTextsMelee[]=
{
- L"-%d%s APs needed to attack by blades\n",
- L"+%d%s chance to hit with blades\n",
- L"+%d%s chance to hit with blunt melee weapons\n",
- L"+%d%s damage with blades\n",
- L"+%d%s damage with blunt melee weapons\n",
- L"Aimed attack with any melee weapon deals +%d%s damage\n",
- L"+%d%s chance to dodge attack by melee blades\n",
- L"+%d%s on top chance to dodge melee blades if holding a blade\n",
- L"+%d%s chance to dodge attack by blunt melee weapons\n",
- L"+%d%s on top chance to dodge blunt melee weapons if holding a blade\n",
+ L"-%d%s от ОД на атаку клинковым оружием\n",
+ L"+%d%s к шансу поразить клинковым оружием\n",
+ L"+%d%s к шансу поразить бьющим холодным оружием\n",
+ L"+%d%s к урону от клинкогово оружия\n",
+ L"+%d%s к урону от бьющего холодного оружия\n",
+ L"Урон от прицельной отаки любым холодным оружием повышается на +%d%s\n",
+ L"+%d%s к шансу уклониться от атаки клинковым оружием\n",
+ L"+%d%s к шансу уклониться от атаки клинковым оружием если в руках нож\n",
+ L"+%d%s к шансу уклониться от атаки бьющим холодным оружием\n",
+ L"+%d%s к шансу уклониться от атаки бьющим холодным оружием если в руках нож\n",
};
STR16 gzIMPMinorTraitsHelpTextsThrowing[]=
{
- L"-%d%s basic APs needed to throw blades\n",
- L"+%d%s max range when throwing blades\n",
- L"+%d%s chance to hit when throwing blades\n",
- L"+%d%s chance to hit when throwing blades per aim click\n",
- L"+%d%s damage with throwing blades\n",
- L"+%d%s damage with throwing blades per aim click\n",
- L"+%d%s chance to inflict critical hit with throwing blade if not seen or heard\n",
- L"+%d critical hit with throwing blade multiplier\n",
- L"Adds %d more aim click for throwing blades\n",
- L"Adds %d more aim clicks for throwing blades\n",
+ L"-%d%s от базовых ОД нужных на бросок ножа\n",
+ L"+%d%s к максимальной эффективной дальности броска ножа\n",
+ L"+%d%s к шансу поразить цель при метании ножа\n",
+ L"+%d%s к шансу поразить цель при метании ножа прицельно\n",
+ L"+%d%s к урону метательного ножа\n",
+ L"+%d%s к урону метательного ножа при прицельном броске\n",
+ L"+%d%s к шансу нанести критический удар при броске ножа, если вас не слышали и не видели\n",
+ L"+%d к множителю на критический удар при броске ножа\n",
+ L"Добавляет %d щелчёк мыши на прицеливание к броску ножа\n",
+ L"Добавляет %d щелчков мыши на прицеливание к броску ножа\n",
};
STR16 gzIMPMinorTraitsHelpTextsNightOps[]=
@@ -336,110 +338,97 @@ STR16 gzIMPMinorTraitsHelpTextsBodybuilding[]=
};
STR16 gzIMPMinorTraitsHelpTextsDemolitions[]=
{
- L"-%d%s APs needed to throw grenades\n",
- L"+%d%s max range when throwing grenades\n",
- L"+%d%s chance to hit when throwing grenades\n",
- L"+%d%s damage of set bombs and mines\n",
- L"+%d%s to attaching detonators check\n",
- L"+%d%s to planting/removing bombs check\n",
- L"Decreases chance enemy will detect your bombs and mines (+%d bomb level)\n",
- L"Increased chance shaped charge will open the doors (damage multiplied by %d)\n",
+ L"-%d%s от ОД на бросок гранаты\n",
+ L"+%d%s к максимальной дальности броска гранаты\n",
+ L"+%d%s к точности броска гранаты\n",
+ L"+%d%s к урону от установленных бомб и мин\n",
+ L"+%d%s к у мению устанавливать детонатор\n",
+ L"+%d%s к установке/разминированию бомб\n",
+ L"Уменьшает шанс обнаружения противником установленных юомб и мин (+%d к уровню бомб)\n",
+ L"Повышает вероятность вскрытия замка формовым зарядом (множитель повреждений %d)\n",
};
STR16 gzIMPMinorTraitsHelpTextsTeaching[]=
{
- L"+%d%s bonus to militia training speed\n",
- L"+%d%s bonus to effective leadership for determining militia training\n",
- L"+%d%s bonus to teaching other mercs\n",
- L"Skill value counts to be +%d higher for being able to teach this skill to other mercs\n",
- L"+%d%s bonus to train stats through self-practising assignment\n",
+ L"+%d%s к скорости обучения ополчения\n",
+ L"+%d%s к эффективной скорости обучения ополчения\n",
+ L"+%d%s к скорости обучения других наёмников\n",
+ L"Значение уровня умения быдет выше на +%d при обучении другого бойца этому умению\n",
+ L"+%d%s к скорости самостоятельного обучения/тренировке\n",
};
STR16 gzIMPMinorTraitsHelpTextsScouting[]=
{
- L"+%d to effective sight range with scopes on weapons\n",
- L"+%d to effective sight range with binoculars (and scopes separated from weapons)\n",
- L"-%d tunnel vision with binoculars (and scopes separated from weapons)\n",
- L"If in sector, adjacent sectors will show exact number of enemies\n",
- L"If in sector, adjacent sectors will show presence of enemies, if any\n",
- L"Prevents enemy ambushes on your squad\n",
- L"Prevents bloodcat ambushes on your squad\n",
+ L"+%d к эффективной прицельной видимости для оружия с оптическими прицелами\n",
+ L"+%d к эффективной дальности видимости для биноклей (и оптических прицелов отсоединённых от оружия)\n",
+ L"-%d от туннельного зрения для биноклей (и оптических прицелов отсоединённых от оружия)\n",
+ L"Если в секторе, в смежных секторах будет показано точное количество врагов\n",
+ L"Если в секторе, в смежных секторах будет показано наличие врагов\n",
+ L"Предотвращает попадание отряда во вражеские засады\n",
+ L"Предотвращает попадание отряда в засады кошек-убийц\n",
};
STR16 gzIMPMinorTraitsHelpTextsNone[]=
{
- L"Нет преимуществ", //No bonuses
+ L"Нет преимуществ",
};
STR16 gzIMPOldSkillTraitsHelpTexts[]=
{
- L"+%d%s bonus to lockpicking\n",
- L"+%d%s hand to hand chance to hit\n",
- L"+%d%s hand to hand damage\n",
- L"+%d%s chance to dodge hand to hand attacks\n",
- L"Eliminates the penalty to repair and handle\nelectronic things (locks, traps, rem. detonators, robot, etc.)\n",
- L"+%d to effective sight range in the dark\n",
- L"+%d to general effective hearing range\n",
- L"+%d extra hearing range in the dark\n",
- L"+%d to interrupts modifier in the dark\n",
- L"-%d need to sleep\n",
- L"+%d%s max range when throwing anything\n",
- L"+%d%s chance to hit when throwing anything\n",
- L"+%d%s chance to instantly kill by throwing knife if not seen or heard\n",
- L"+%d%s bonus to militia training and other mercs instructing speed\n",
- L"+%d%s effective leadership for militia training calculations\n",
- L"+%d%s chance to hit with rocket/greande launchers and mortar\n",
- L"Auto fire/burst chance to hit penalty is divided by %d\n",
- L"Reduced chance for shooting unwanted bullets on autofire\n",
- L"+%d%s chance to move quietly\n",
- L"+%d%s stealth (being 'invisible' if unnoticed)\n",
- L"Eliminates the CtH penalty when firing two weapons at once\n",
- L"+%d%s chance to hit with melee blades\n",
- L"+%d%s chance to dodge attacks by melee blades if having blade in hands\n",
- L"+%d%s chance to dodge attacks by melee blades if having anything else in hands\n",
- L"+%d%s chance to dodge hand to hand attacks if having blade in hands\n",
- L"-%d%s effective range to target with all weapons\n",
- L"+%d%s aiming bonus per aim click\n",
- L"Provides permanent camouflage\n",
- L"+%d%s hand to hand chance to hit\n",
- L"+%d%s hand to hand damage\n",
- L"+%d%s chance to dodge hand to hand attacks if having empty hands\n",
- L"+%d%s chance to dodge hand to hand attacks if not having empty hands\n",
- L"+%d%s chance to dodge attacks by melee blades\n",
- L"Can perform spinning kick attack on weakened enemies to deal double damage\n",
- L"You gain special animations for hand to hand combat\n",
- L"Нет преимуществ", //No bonuses
+ L"+%d%s бонус к взлому замков\n",
+ L"+%d%s к точности удара в рукопашной схватке\n",
+ L"+%d%s к повреждениям в рукопашной схватке\n",
+ L"+%d%s к шансу уклониться от удара кулака в рукопашной схватке\n",
+ L"Нет штрафа для ремонта и использования электронных устройств \n(замков, ловушек, детонаторов, робота и т.д.)\n",
+ L"+%d к зрению в темноте\n",
+ L"+%d к дальности слуха\n",
+ L"+%d дополнительно к слуху в темноте\n",
+ L"+%d к вероятности перехвата хода в ночи\n",
+ L"-%d к нужде в сне\n",
+ L"+%d%s к максимальному радиусу дальности при метании\n",
+ L"+%d%s к точности при метании\n",
+ L"+%d%s шанс мгновенно убить метательным ножом, чтобы это никто не заметил и не услышал\n",
+ L"+%d%s к скорости обучения ополчения или других наемников\n",
+ L"+%d%s к эффективной скорости обучения ополчения\n",
+ L"+%d%s к шансу поразить из гранатомёта, реактивного гранатомёта и из миномёта\n",
+ L"Штраф на вероятность поражения цели при стрельбе очередью понижен на %d\n",
+ L"Понижен шанс лишних выстрелов при автоматической стрельбе\n",
+ L"+%d%s к бесшумному передвижению\n",
+ L"+%d%s к скрытности (незаметный для врага, пока вас не обнаружили)\n",
+ L"Нет штарафа на шанс поразить цель при стрельбе с двух рук\n",
+ L"+%d%s к шансу поразить холодным оружием\n",
+ L"+%d%s к шансу уклониться от удара холодным оружием, если в руках есть нож\n",
+ L"+%d%s к шансу уклониться от удара холодным оружием, если в руках не нож\n",
+ L"+%d%s к шансу уклониться от удара в рукопашную, если в руках есть нож\n",
+ L"-%d%s к эффективной дальность до цели для всего вида оружия\n",
+ L"+%d%s к бонусу прицеливания на каджый щелчок мыши\n",
+ L"Несмываемый камуфляж.\n",
+ L"+%d%s к шансу поразить в рукопашном бою\n",
+ L"+%d%s к повреждениям в рукопашном бою\n",
+ L"+%d%s к шансу уклониться от атаки в рукопашном бою если в руках ничего нет\n",
+ L"+%d%s к шансу уклониться от атаки в рукопашном бою если руки заняты\n",
+ L"+%d%s к шансу уклониться от атаки холодным оружием\n",
+ L"Способен нанести удар 'вертушка' в прыжке по слабейшему противнику с нанесением двойного урона\n",
+ L"У вас будет особая анимация при рукопашной битве.\n",
+ L"Нет преимуществ",
};
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
//I.M.P. Character Traits help text
-//Neutral
- L"плюсы: Нет преимуществ.\n \nминусы: Без изъян.",
-//Sociable
- L"плюсы: Лучше работает в команде.\n \nминусы: Боевой дух не растёт, когда наёмник работает один.",
-//Loner
- L"плюсы: Лучше работает в одиночестве.\n \nминусы: Боевой дух не растёт в присутствии других бойцов.",
-//Optimist
- L"плюсы: Боевой дух растет быстрее, а снижается медленнее обычного.\n \nминусы: Шанс обнаружить мины и ловушки ниже среднего.",
-//Assertive
- L"плюсы: Лучше ладит с людьми и тренирует ополчение.\n \nминусы: Действия других бойцов не влияют на его боевой дух.",
-//Intellectual
- L"плюсы: Немного быстрее обучается.\n \nминусы: Обладает меньшим сопротивлением страху и подавлению.",
-//Primitive
- L"плюсы: Устаёт медленнее других, если не работает как врач, ремонтник, тренер или ученик.\n \nминусы: Его мудрость, лидерство, взрывное дело, механика и медицина растут медленнее обычного.",
-//Aggressive
- L"плюсы: Имеет бонус к стрельбе очередями и урону в рукопашной. \nПри убийстве врага боевой дух растёт больше, чем у других.\n \nминусы: Хуже исполняет обязанности, для которых требуется терпение: \nремонт, вскрытие замков, снятие ловушек, лечение, тренировка ополчения.",
-//Phlegmatic
- L"плюсы: Лучше исполняет обязанности, требующие терпения: \nремонт, вскрытие замков, снятие ловушек, лечение, тренировка ополчения.\n \nминусы: Имеет меньший шанс перехватить ход врага.",
-//Dauntless
- L"плюсы: Имеет повышенное сопротивление подавлению и страху. \nБоевой дух при ранениях и гибели товарищей понижается медленнее, чем у других.\n \nминусы: Может быть с большей вероятностью поражен во время движения.",
-//Pacifist
- L"плюсы: Боевой дух повышается при выполнении небоевых заданий (кроме тренировки ополчения).\n \nминусы: Убийство врагов не повышает боевой дух.",
-//Malicious
- L"плюсы: Имеет больший шанс нанести болезненные раны и травмы, приводящие к ухудшению параметров.\n \nминусы: Имеет проблемы в общении и быстро теряет боевой дух, если не сражается.",
-//Show-off
- L"плюсы: Лучше работает в компании представителей противоположного пола.\n \nминусы: Боевой дух бойцов того же пола в его присутствии растёт медленнее.",
+ L"плюсы: Нет преимуществ.\n \nминусы: Без изъян.", //Neutral
+ L"плюсы: Лучше работает в команде.\n \nминусы: Боевой дух не растёт, когда наёмник работает один.", //Sociable
+ L"плюсы: Лучше работает в одиночестве.\n \nминусы: Боевой дух не растёт в присутствии других бойцов.", //Loner
+ L"плюсы: Боевой дух растет быстрее, а снижается медленнее обычного.\n \nминусы: Шанс обнаружить мины и ловушки ниже среднего.", //Optimist
+ L"плюсы: Лучше ладит с людьми и тренирует ополчение.\n \nминусы: Действия других бойцов не влияют на его боевой дух.", //Assertive
+ L"плюсы: Немного быстрее обучается.\n \nминусы: Обладает меньшим сопротивлением страху и подавлению.", //Intellectual
+ L"плюсы: Устаёт медленнее других, если не работает как врач, ремонтник, тренер или ученик.\n \nминусы: Его мудрость, лидерство, взрывное дело, механика и медицина растут медленнее обычного.", //Primitive
+ L"плюсы: Имеет бонус к стрельбе очередями и урону в рукопашной. \nПри убийстве врага боевой дух растёт больше, чем у других.\n \nминусы: Хуже исполняет обязанности, для которых требуется терпение: \nремонт, вскрытие замков, снятие ловушек, лечение, тренировка ополчения.", //Aggressive
+ L"плюсы: Лучше исполняет обязанности, требующие терпения: \nремонт, вскрытие замков, снятие ловушек, лечение, тренировка ополчения.\n \nминусы: Имеет меньший шанс перехватить ход врага.", //Phlegmatic
+ L"плюсы: Имеет повышенное сопротивление подавлению и страху. \nБоевой дух при ранениях и гибели товарищей понижается медленнее, чем у других.\n \nминусы: Может быть с большей вероятностью поражен во время движения.", //Dauntless
+ L"плюсы: Боевой дух повышается при выполнении небоевых заданий (кроме тренировки ополчения).\n \nминусы: Убийство врагов не повышает боевой дух.", //Pacifist
+ L"плюсы: Имеет больший шанс нанести болезненные раны и травмы, приводящие к ухудшению параметров.\n \nминусы: Имеет проблемы в общении и быстро теряет боевой дух, если не сражается.", //Malicious
+ L"плюсы: Лучше работает в компании представителей противоположного пола.\n \nминусы: Боевой дух бойцов того же пола в его присутствии растёт медленнее.", //Show-off
};
STR16 gzIMPDisabilitiesHelpTexts[]=
@@ -462,7 +451,7 @@ STR16 gzIMPProfileCostText[]=
STR16 zGioNewTraitsImpossibleText[]=
{
- L"Нельзя выбрать новые умения IMP персонажа с отключенным PROFEX. Проверьте значение файла настроек JA2_Options.ini, ключ: READ_PROFILE_DATA_FROM_XML.", //You cannot choose the New Trait System with PROFEX utility deactivated. Check your JA2_Options.ini for entry: READ_PROFILE_DATA_FROM_XML.
+ L"Нельзя выбрать новые умения IMP персонажа с отключенным PROFEX. Проверьте значение файла настроек JA2_Options.ini, ключ: READ_PROFILE_DATA_FROM_XML.",
};
//@@@: New string as of March 3, 2000.
@@ -475,6 +464,7 @@ STR16 gzDisplayCoverText[]=
{
L"Местность: %d/100 %s, Освещённость: %d/100",
L"Дальнобойность оружия: %d/%d ед., шанс попасть: %d/100",
+ L"Дальнобойность оружия: %d/%d ед., Muzzle Stability: %d/100",
L"Отключено выделение видимых зон наёмника и врага",
L"Видимые зоны наёмнка",
L"Опасные зоны для наёмника",
diff --git a/Utils/_Ja25TaiwaneseText.cpp b/Utils/_Ja25TaiwaneseText.cpp
index b5163b09..e3df4307 100644
--- a/Utils/_Ja25TaiwaneseText.cpp
+++ b/Utils/_Ja25TaiwaneseText.cpp
@@ -1,3 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
+//#pragma setlocale("TAIWANESE")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "_Ja25Taiwanesetext.h"
@@ -414,17 +417,17 @@ STR16 gzIMPOldSkillTraitsHelpTexts[]=
STR16 gzIMPNewCharacterTraitsHelpTexts[]=
{
L"A: No advantage.\nD: No disadvantage.",
- L"A: Has better performance when couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
+ L"A: Has better performance when a couple of mercs are nearby.\nD: Gains no morale when no other merc is nearby.",
L"A: Has better performance when no other merc is nearby.\nD: Gains no morale when in a group.",
L"A: His morale sinks a little slower and grows faster than normal.\nD: Has lesser chance to detect traps and mines.",
L"A: Has bonus on training militia and is better at communication with people.\nD: Gains no morale for actions of other mercs.",
L"A: Slightly faster learning when assigned on practicing or as a student.\nD: Has lesser suppression and fear resistance.",
- L"A: His energy goes down a bit slower except on assignments as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
- L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which needs patience like repairing items, picking locks, removing traps, doctoring, training militia.",
- L"A: Has bonus for actions which needs patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupts chance is slightly lowered.",
- L"A: Incresed resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
+ L"A: His energy goes down a bit slower except on assignments such as doctor, repairman, militia trainer or if learning certain skills.\nD: His wisdom, leadership, explosives, mechanical and medical skills improve slightly slower.",
+ L"A: Has slightly better chance to hit on burst/autofire and inflicts slightly bigger damage in close combat\n Gains a little more morale for killing.\nD: Has penalty for actions which need patience like repairing items, picking locks, removing traps, doctoring, training militia.",
+ L"A: Has bonus for actions which need patience like repairing items, picking locks, removing traps, doctoring and training militia.\nD: His interrupt chance is slightly lowered.",
+ L"A: Increased resistance to suppression and fear.\n Morale loss for taking damage and companions deaths is lower for him.\nD: Can be hit easier and enemy penalty for moving target is lesser in his case.",
L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
- L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
+ L"A: Has greater chance of inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
};
@@ -436,9 +439,9 @@ STR16 gzIMPDisabilitiesHelpTexts[]=
L"Can suffer panic attack if left alone in certain situations.",
L"His overall performance is reduced if underground.",
L"If trying to swim he can easily drown.",
- L"A look at large insects can make a big problems\nand being in tropical sectors also reduce his performance a bit.",
+ L"A look at large insects can cause big problems\nand being in tropical sectors also reduce his performance a bit.",
L"Sometimes forgets what orders he got and therefore loses some APs if in combat.",
- L"He can go psycho and shoot like mad once per a while\nand can lose morale if unable to do that with given weapon.",
+ L"He can go psycho and shoot like mad once in a while\nand can lose morale if unable to do so with given weapon.",
};
@@ -465,6 +468,7 @@ STR16 gzDisplayCoverText[]=
{
L"Cover: %d/100 %s, Brightness: %d/100",
L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
+ L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
L"Disabling cover display",
L"Showing mercenary view",
L"Showing danger zones for mercenary",
diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp
index c61f30a3..1d48128c 100644
--- a/Utils/_PolishText.cpp
+++ b/Utils/_PolishText.cpp
@@ -1,4 +1,6 @@
-//#pragma setlocale("POLISH")
+// WANNE: Yes we need this here exclusivly in Polish version, because we do not have a codepage in the code like for other versions.
+#pragma setlocale("POLISH")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#if defined( POLISH )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -110,6 +115,1015 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
*/
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Usuс",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Przeі№cz wyњwietlanie graczy", //0
+ L"Przeі№cz wyњwietlanie wrogуw",
+ L"Przeі№cz wyњwietlanie zwierz№t",
+ L"Przeі№cz wyњwietlanie rebeliantуw",
+ L"Przeі№cz wyњwietlanie cywili",
+
+ L"Gracz",
+ L"Wrуg",
+ L"Stworzenia",
+ L"Rebelianci",
+ L"Cywile",
+
+ L"Szczegуіy", //10
+ L"Tryb informacji ogуlnych",
+ L"Tryb fizyczny",
+ L"Tryb atrybutуw",
+ L"Tryb wyposaїenia",
+ L"Tryb profilu",
+ L"Tryb planowania",
+ L"Tryb planowania",
+ L"Usuс",
+ L"Usuс zaznaczonego najemnika (DEL).",
+ L"Kolejny", //20
+ L"Znajdџ nastкpnego najemnika (SPACE).",
+ L"Wі№cz priorytet egzystencji",
+ L"Postaж ma dostкp do wszystkich zamkniкtych drzwi.",
+
+ //Orders
+ L"STACJONARNY",
+ L"CZUJNY",
+ L"NA STRAЇY",
+ L"SZUKAJ WROGA",
+ L"BLISKI PATROL",
+ L"DALEKI PATROL",
+ L"PKT PATROL.",//30
+ L"LOS PKT PATR.",
+
+ //Attitudes
+ L"OBRONA",
+ L"DZIELNY SOLO",
+ L"DZIELNY POMOC",
+ L"AGRESYWNA",
+ L"SPRYTNY SOLO",
+ L"SPRYTNY POMOC",
+
+ L"Set merc to face %s",
+
+ L"Znaj",
+
+ L"MARNE", //40
+ L"SЈABE",
+ L"ЊREDNIE",
+ L"DOBRE",
+ L"ЊWIETNE",
+
+ L"MARNE",
+ L"SЈABE",
+ L"ЊREDNIE",
+ L"DOBRE",
+ L"ЊWIETNE",
+
+ L"Poprzedni zbiуr kolorуw",//"Previous color set", //50
+ L"Nastкpny zbiуr kolorуw",//"Next color set",
+
+ L"Poprzednia budowa ciaіa",//"Previous body type",
+ L"Nastкpna budowa ciaіa",//"Next body type",
+
+ L"Ustaw niezgodnoњж czasu (+ or - 15 minut)",
+ L"Ustaw niezgodnoњж czasu (+ or - 15 minut)",
+ L"Ustaw niezgodnoњж czasu (+ or - 15 minut)",
+ L"Ustaw niezgodnoњж czasu (+ or - 15 minut)",
+
+ L"Brak akcji",
+ L"Brak akcji",
+ L"Brak akcji", //60
+ L"Brak akcji",
+
+ L"Czyњж zadanie",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"DACHY", //0
+ L"ЊCIANY",
+ L"DANE POM.",
+
+ L"Rozmieњж њciany, uїywaj№c metody wyboru",
+ L"Rozmieњж drzwi, uїywaj№c metody wyboru",
+ L"Rozmieњж dachy, uїywaj№c metody wyboru",
+ L"Rozmieњж okna, uїywaj№c metody wyboru",
+ L"Rozmieњж uszkodzone њciany, uїywaj№c metody wyboru",
+ L"Rozmieњж meble, uїywaj№c metody wyboru",
+ L"Rozmieњж tekstury њcian, uїywaj№c metody wyboru",
+ L"Rozmieњж podіogi, uїywaj№c metody wyboru", //10
+ L"Rozmieњж generyczne meble, uїywaj№c metody wyboru",
+ L"Rozmieњж њciany, uїywaj№c metody domyњlnej",
+ L"Rozmieњж drzwi, uїywaj№c metody domyњlnej",
+ L"Rozmieњж okna, uїywaj№c metody domyњlnej",
+ L"Rozmieњж uszkodzone њciany, uїywaj№c metody domyњlnej",
+ L"Zablokuj drzwi, lub umieњж puіapkк na drzwiach",
+
+ L"Dodaj nowe pomieszczenie",
+ L"Edytuj њciany jaskini.",
+ L"Usuс obszar z istniej№cego budynku.",
+ L"Usuс budynek", //20
+ L"Dodaj/zast№p dach budynku nowym pіaskim dachem.",
+ L"kopiuj budynek",
+ L"Przesuс budynek",
+ L"Rysuj numer pomieszczenia",
+ L"Usuс numer pomieszczenia",
+
+ L"Przeі№cz tryb wymazywania",
+ L"Cofnij ostatni№ zmianк",
+ L"Wybierz rozmiar pкdzla",
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Broс", //0
+ L"Amun.",
+ L"Pancerz",
+ L"LBE",
+ L"Mat.Wyb.",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Wі№czniki",
+ L"Klucze",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Dodaj џrуdіo њwiatіa z otoczenia", //0
+ L"Przeі№cz faіszywe њwiatіa z otoczenia.",
+ L"Dodaj pola wyjњcia (p-klik, aby usun№ж istniej№ce).",
+ L"Wybierz rozmiar pкdzla",
+ L"Cofnij ostatni№ zmianк",
+ L"Przeі№cz tryb wymazywania",
+ L"Okreњl punkt pуіnocny dla celуw potwierdzenia.",
+ L"Okreњl punkt zachodu dla celуw potwierdzenia.",
+ L"Okreњl punkt wschodu dla celуw potwierdzenia.",
+ L"Okreњl punkt poіudnia dla celуw potwierdzenia.",
+ L"Okreњl punkt њrodka dla celуw potwierdzenia.", //10
+ L"Okreњl odosobniony punkt dla celуw potwierdzenia.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"Nowa mapa", //0
+ L"Nowa piwnica",
+ L"Nowy poziom jaskini",
+ L"Zapisz mapк",
+ L"Wczytaj mapк",
+ L"Wybierz zestaw",
+ L"Wyjdџ z trybu edycji do trybu gry",
+ L"Wyjdџ z trybu edycji.",
+ L"Utwуrz mapк radaru",
+ L"Kiedy zaznaczone, mapa bкdzie zapisana w oryginalnym formacie JA2.\nTa opcja jest waїna przy normalnych wielkoњciach map, ktуrych numery siatki nie s№ (siatki wyjњcia) > 25600.",
+ L"Kiedy zaznaczone, wczytana mapa lub nowa, bкdzie powiкkszona automatycznie do wybranych rozmiarуw.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Rysuj tekstury terenu", //0
+ L"Ustaw tekstury terenu mapy",
+ L"Umieњж brzegi i urwiska",
+ L"Rysuj drogi",
+ L"Rysuj gruzy",
+ L"Umieњж drzewa i krzewy",
+ L"Umieњж skaіy",
+ L"Umieњж beczki i inne њmieci",
+ L"Wypeіnij teren",
+ L"Cofnij ostatni№ zmianк",
+ L"Przeі№cz tryb wymazywania", //10
+ L"Wybierz rozmiar pкdzla",
+ L"Zwiкksz gкstoњж pкdzla",
+ L"Zmniejsz gкstoњж pкdzla",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Teren", //0
+ L"Budynki",
+ L"Przedmioty",
+ L"Najemnicy",
+ L"Dane mapy",
+ L"Opcje",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"Pуіnocny pkt wejњcja", //0
+ L"Zachodni pkt wejњcja",
+ L"Wschodni pkt wejњcja",
+ L"Poіudniowy pkt wejњcja",
+ L"Њrodkowy pkt wejњcja",
+ L"Odizolowany pkt wejњcja",
+
+ L"Brzask",
+ L"Noc",
+ L"24h",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Wі№cznik Paniki1", //0
+ L"Wі№cznik Paniki2",
+ L"Wі№cznik Paniki3",
+ L"Wі№cznik%d",
+
+ L"Akcja nacisku",
+ L"Akcja Paniki1",
+ L"Akcja Paniki2",
+ L"Akcja Paniki3",
+ L"Akcja%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"Niezablokowane (ID)", //0
+ L"Puіapka eksploduj№ca",
+ L"Puіapka elektryczna",
+ L"Cicha puіapka",
+ L"Cichy alarm",
+ L"Super-Elektryczna Puіapka", //5
+ L"Alarm domu publicznego",
+ L"Poziom puіapki %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Zapisz stary format mapy JA2 (v1.12) Version: 5.00 / 25", //0
+ L"Brak mapy.",
+ L"Plik: %S, Aktualny zestaw: %s",
+ L"Powiкksz istniej№c№ mapк lub now№.",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"PRZEЈҐCZ", //0
+ L"WIDOKI",
+ L"METODA WYBORU",
+ L"METODA DOMYЊLNA",
+ L"METODA BUDOWANIA",
+ L"Pomieszczenia", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Edytuj atrybuty zamka na mapie (siatka) %d.",
+ L"Typ blokady (ID)",
+ L"Typ puіapki",
+ L"Poziom puіapki",
+ L"Zablokowane",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Akcja nacisku", //0
+ L"Akcja Paniki1",
+ L"Akcja Paniki2",
+ L"Akcja Paniki3",
+ L"Akcja%d",
+
+ L"Wі№cznik Paniki1", //5
+ L"Wі№cznik Paniki2",
+ L"Wі№cznik Paniki3",
+ L"Wі№cznik%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Brzask",
+ L"Noc",
+ L"24h", //5
+
+ L"Promieс",
+
+ L"Pod ziemi№",
+ L"Poziom њwiatіa",
+
+ L"Ter. Otw.",
+ L"Piwnica", //10
+ L"Jaskinia",
+
+ L"Ograniczenie",
+ L"Scroll ID",
+
+ L"Cel",
+ L"Sektor", //15
+ L"Cel",
+ L"Poziom piw.",
+ L"Cel",
+ L"Њiatka",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"Brak akcji",
+ L"Zablokuj drzwi",
+ L"Odblokuj drzwi",
+ L"Otwуrz drzwi",
+ L"Zamknij drzwi",
+ L"Idџ do siatki",
+ L"Opуњж sektor",
+ L"Wejdџ do sektora",
+ L"Pozostaс w sektorze",
+ L"Idџ spaж",
+ L"Zignoruj to!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Zdrowie",
+ L"Akt. zdrowie",
+ L"Siіa",
+ L"Zwinnoњж",
+ L"Sprawnoњж",
+ L"Charyzma",
+ L"M№droњж",
+ L"Celnoњж",
+ L"Mat. Wybuchowe",
+ L"Medycyna",
+ L"Scientific",
+ L"Poz. doњw.",
+};
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Nazwa najemnika:", //0
+ L"Rozkaz:",
+ L"Postawa walki:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Kolor najemnika", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Losowy", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Czoіg", //5
+ L"NW Czoіg",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Nieuzbrojony robot",
+ L"Larwa", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Dziki kot",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ROZKAZY=-- ", //0
+ L"--=POSTAWA=--",
+
+ L"RELATIVE",
+ L"ATRYBUTY",
+
+ L"RELATIVE",
+ L"WYPOSAЇENIA",
+
+ L"RELATIVE",
+ L"ATRYBUTY",
+
+ L"Armia",
+ L"Admin.",
+ L"Gwardia", //10
+
+ L"Poz. doњw.",
+ L"Zdrowie",
+ L"Akt. zdrowie",
+ L"Celnoњж",
+ L"Siіa",
+ L"Zwinnoњж",
+ L"Sprawnoњж",
+ L"Inteligencja",
+ L"Zdol. dowodzenia",
+ L"Mat. wybuchowe", //20
+ L"Zdol. medyczne",
+ L"Zdol. mechaniczne",
+ L"Morale",
+
+ L"Kolor wіosуw:",
+ L"Kolor skуry:",
+ L"Kolor kamizelki:",
+ L"Kolor spodni:",
+
+ L"LOSOWY",
+ L"LOSOWY",
+ L"LOSOWY", //30
+ L"LOSOWY",
+
+ L"Podaj index profilu i naciњnij ENTER. ",
+ L"Wszystkie informacje (statystyki, itd.) bкd№ pobrane z pliku Prof.dat lub MercStartingGear.xml. ",
+ L"Jeњli nie chcesz uїyж profilu, to zostaw pole puste i naciњnij ENTER. ",
+ L"Nie podawaj wartoњci '200'! Wartoњж '200' nie moїe byж profilem! ",
+ L"Wybierz profil od 0 do ",
+
+ L"Aktualny Profil: brak ",
+ L"Aktualny Profil: %s",
+
+ L"STACJONARNY",
+ L"CZUJNY", //40
+ L"NA STRAЇY",
+ L"SZUKAJ WROGA",
+ L"BLISKI PATROL",
+ L"DALEKI PATROL",
+ L"PKT PATROL.",
+ L"LOS PKT PATR.",
+
+ L"Akcja",
+ L"Czas",
+ L"V",
+ L"Siatka 1", //50
+ L"Siatka 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"zablokuj",
+ L"odblokuj",
+ L"otwуrz",
+ L"zamknij",
+
+ L"Kliknij na siatkк przylegaj№c№ do drzwi (%s).", //60
+ L"Kliknij na siatkк, gdzie chcesz siк przemieњciж gdy drzwi s№ otwarte\\zamkniкte (%s).",
+ L"Kliknij na siatkк, gdzie chciaіbyњ siк przemieњciж.",
+ L"Kliknij na siatkк, gdzie chciaіbyњ spaж. Postaж po obudzeniu siк automatycznie wrуci do oryginalnej pozycji.",
+ L" Naciњnij ESC, by wyjњж z trybu edycji planu.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Rozkaz patrolu bez punktуw poњrednich",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"Brak akcji",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Umiejscowienie nie zostaіo skopiowane, gdyї їadne nie zostaіo wybrane.",
+ L"Umiejscowienie skopiowane.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Umiejscowienie nie zostaіo wklejone, gdyї їadne umiejscowienie nie jest zapisane w buforze.",
+ L"Umiejscowienie wklejone.",
+ L"Umiejscowienie nie zostaіo wklejone, gdyї maksymalna liczba umiejscowieс dla tej druїyny jest juї wykorzystana.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Czy chcesz wyjњж z trybu edytora do trybu gry ?",
+ L"Czy chcesz zakoсczyж pracк edytora ?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Czy jesteњ pewny, їe chcesz usun№ж wszystkie њwiatіa?", //0
+ L"Czy jesteњ pewny, їe chcesz cofn№ж plany?",
+ L"Czy jesteњ pewny, їe chcesz usun№ж wszystkie plany?",
+
+ L"Wі№czono rozmieszczanie elementуw przez kilkniкcie",
+ L"Wyі№czono rozmieszczanie elementуw przez kilkniкcie",
+
+ L"Wі№czono rysowanie wysokiego podіoїa", //5
+ L"Wyі№czono rysowanie wysokiego podіoїa",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Wі№czono losowe rozmieszczanie",
+ L"Wyі№czono losowe rozmieszczanie",
+
+ L"Usuс korony drzew", //10
+ L"Pokaї korony drzew",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Utworzono mape radaru dla %S", //0
+
+ L"Usun№ж aktualn№ mapк i rozpocz№ж nowy poziom piwnicy ?",
+ L"Usun№ж aktualn№ mapк i rozpocz№ж nowy poziom jaskini ?",
+ L"Usun№ж aktualn№ mapк i rozpocz№ж nowy poziom na wolnym powietrzu ?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Przeі№cz faіszywe њwiatіa z otoczenia ON/OFF",
+
+ L"INSERT",
+ L"Przeі№cz tryb wypeіnienia ON/OFF",
+
+ L"BKSPC",
+ L"Usuс ostatni№ zmianк",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Wyjdџ z edytora",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"Wyњwietl ekran pomocy",
+
+ L"F10",
+ L"Zapisz mapк",
+
+ L"F11",
+ L"Wczytaj mapк",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Wybierz wielkoњж pкdzla",
+
+ L"d",
+ L"Rysuj њmieci",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Rysuj skaіy",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Rysuj tekstury ziemi",
+
+ L"w",
+ L"Rysuj њciany budunkуw",
+
+ L"e",
+ L"Przeі№cz tryb wymazywania ON/OFF",
+
+ L"h", //40
+ L"Przeі№cz tryb dachуw ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] =
+{
+ L"Mina klaksonowa",
+ L"Mina oњwietlaj№ca",
+ L"Eksplozja gazu Јzaw.",
+ L"Eksplozja granatu Oszaіam.",
+ L"Eksplozja granatu dymnego",
+ L"Gaz musztardowy",
+ L"Mina przeciwpiechotna",
+ L"Otwуrz drzwi",
+ L"Zamknij drzwi",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Maіa eksplozja",
+ L"Њrednia eksplozja",
+ L"Duїa eksplozja",
+ L"Otwуrz/Zamknij drzwi",
+ L"Przeі№cz wszystkie Akcje1",
+ L"Przeі№cz wszystkie Akcje2",
+ L"Przeі№cz wszystkie Akcje3",
+ L"Przeі№cz wszystkie Akcje4",
+ L"Wejњcie do burdelu",
+ L"Wyjњcie z burdelu",
+ L"Alarm Kingpin'a",
+ L"Seks z prostytutk№",
+ L"Pokaї pokуj",
+ L"Alarm lokalny",
+ L"Alarm globalny",
+ L"Dџwiкk klaksonu",
+ L"Odbezpiecz drzwi",
+ L"Przeі№cz blokadк (drzwi)",
+ L"Usuс puіapkк (drzwi)",
+ L"Tog pressure items",
+ L"Alarm w Museum",
+ L"Alarm dzikich kotуw",
+ L"Duїy gaz іzawi№cy",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Chowanie flagi", //0
+ L"Brak wybranego przedmiotu.",
+ L"Slot dostкpny dla",
+ L"losowej generacji.",
+ L"Nie moїna edytowaж kluczy.",
+ L"Profil identifikacyjny wіaњciciela",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Stan",
+ L"Naboje",
+ L"Poziom puіapki", //10
+ L"Iloњж",
+ L"Poziom puіapki",
+ L"Stan",
+ L"Poziom puіapki",
+ L"Stan",
+ L"Iloњж",
+ L"Poziom puіapki",
+ L"Dolary",
+ L"Stan",
+ L"Poziom puіapki", //20
+ L"Poziom puіapki",
+ L"Tolerancja",
+ L"Wyzwalacz alarmu",
+ L"Istn. szansa",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Przedmiot bкdzie wyњwietlany w trybie Sci-Fi i realistycznym. (|B)", //0
+ L"Przedmiot bкdzie wyњwietlany tylko |w trybie realistycznym.",
+ L"Przedmiot bкdzie wyњwietlany tylko |w trybie Sci-Fi.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"TЈUMIK", //0
+ L"CEL. SNAJP",
+ L"CEL. LSER.",
+ L"DWУJNУG",
+ L"KACZY DZIУB",
+ L"GRANATNIK", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"PЈYTKI CERAM.", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Ok", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"WCZYTAJ",
+ L"ZAPISZ",
+ L"Aktual.",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Zestaw: %s", //0
+ L"Wersja: Podsumowanie: 1.%02d, Map: %1.2f / %02d",
+ L"Iloњж przedmiotуw: %d",
+ L"Iloњж њwiateі: %d",
+ L"Iloњж punktуw wyjњcia: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Iloњж pomieszczeс: %d",
+ L"Caіkowita populacja : %d",
+ L"Wrуg: %d",
+ L"Admin.: %d",
+
+ L"(%d szczegуіowych, profile : %d -- %d maj№ priorytet egzystencji)",
+ L"Їoіnierze: %d",
+
+ L"(%d szczegуіowych, profile : %d -- %d maj№ priorytet egzystencji)",
+ L"Gwardia: %d",
+
+ L"(%d szczegуіowych, profile : %d -- %d maj№ priorytet egzystencji)",
+ L"Cywile: %d", //20
+
+ L"(%d szczegуіowych, profile : %d -- %d maj№ priorytet egzystencji)",
+
+ L"Ludzie: %d",
+ L"Krowy: %d",
+ L"Dzikie koty: %d",
+
+ L"Zwierzкta: %d",
+
+ L"Stworzenia: %d",
+ L"Dzikie koty: %d",
+
+ L"Iloњж zablokowanych drzwi oraz puіapki zamontowane na drzwiach: %d",
+ L"Zablokowane: %d",
+ L"Puіapki: %d", //30
+ L"Zablokowane i puіapki: %d",
+
+ L"Cywile z planami: %d",
+
+ L"Zbyt wiele wyjњж (siatki) (wiкcej niї 4)...",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : %d (%d dalekie miejsce docelowe)",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : brak",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : poziom 1 uїywane miejsca %d siatki",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : poziom 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : poziom 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"Siatka wejњcia-wyjњcia (piwnice itd.) : poziom 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d marne, %d sіabe, %d њrednie, %d dobre, %d њwietne (%+d Caіkowity)", //40
+ L"Enemy Relative Equipment: %d marne, %d sіabe, %d њrednie, %d dobre, %d њwietne (%+d Caіkowity)",
+ L"%d umiejscowienie maj№ rozkazy patrolu bez їadnego zdefiniowanego punktu poњredniego.",
+ L"%d umiejscowienia maj№ punkty poњrednie, ale bez їadnych rozkazуw.",
+ L"%d siatki maj№ niejasne numery pokoju.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Wrуg",
+
+ L"ZBYT WIELE PRZEDMIOTУW DO WYЊWIETLENIA!",
+
+ L"Paniki1",
+ L"Paniki2",
+ L"Paniki3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Akcje nacisku",
+
+ L"ZBYT WIELE PRZEDMIOTУW DO WYЊWIETLENIA!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"Nic",
+
+ L"ZBYT WIELE PRZEDMIOTУW DO WYЊWIETLENIA!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"ZBYT WIELE PRZEDMIOTУW DO WYЊWIETLENIA!",
+ L"Nic",
+ L"ZBYT WIELE PRZEDMIOTУW DO WYЊWIETLENIA!",
+ L"BЈҐD: Nie moїna wczytaж przedmiotуw dla tej mapy. Powуd nieznany.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"EDYTOR KAMPANII -- %s Version 1.%02d", //0
+ L"(NIE WCZYTANO MAPY).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"Aktualnie nie ma wybranego sektora.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", poziom na powietrzu",
+ L", podziemny poziom 1",
+ L", podziemny poziom 2",
+ L", podziemny poziom 3",
+ L", alternatywny poziom G",
+ L", alternatywny poziom 1",
+ L", alternatywny poziom 2",
+ L", alternatywny poziom 3",
+
+ L"SZCZEGУЈY PRZEDMIOTУW -- sektor %s",
+ L"Podsumowanie informacji dla sektora %s:", //20
+
+ L"Podsumowanie informacji dla sektora %s",
+ L"nie egzystuj№.",
+
+ L"Podsumowanie informacji dla sektora %s",
+ L"nie egzystuj№.",
+
+ L"Brak informacji o egzystencji dla sektora %s.",
+
+ L"Brak informacji o egzystencji dla sektora %s.",
+
+ L"PLIK: %s",
+
+ L"PLIK: %s",
+
+ L"Override READONLY",
+ L"Nadpisz plik", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Czy chcesz to teraz zrobiж (y/n)?",
+
+ L"Brak informacji o podsumowaniu. Anulowano tworzenie.",
+
+ L"Siatka",
+ L"Postкp", //40
+ L"Use Alternate Maps",
+
+ L"Podsumowanie",
+ L"Przedmioty",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analizujк mapк: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Wczytujк mapк: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generuje informacjк o mapiк",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generujк podsumowanie mapy",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] pochodzi z domyњlnego zestawu %s (%S)",
+ L"Plik: %S, podindeks: %d (%S)",
+ L"Aktualny zestaw: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Maіy",
+ L"Њredni",
+ L"Duїy",
+ L"B.Duїy",
+ L"Szerokoњж: xx",
+ L"Obszar"
+ };
+
+//---
+
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
L"Str. 1/2", //0
@@ -353,6 +1367,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s: kamuflaї zimowy siк zmyі.",
L"Niemoїesz przydzieliж %s do tego slotu.",
+ L"The %s will not fit in any open slots.",
};
@@ -856,6 +1871,8 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Charakter:",
L"Niepeіnosprawnoњж:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -878,10 +1895,6 @@ STR16 gzMercSkillText[] =
L"Broс biaіa",
L"Snajper", //JA25: modified
L"Kamuflaї", //JA25: modified
- // SANDRO - removed this
- //L"Kamuflaї (miasto)",
- //L"Kamuflaї (pustynia)",
- //L"Kamuflaї (њnieg)",
L"(Eksp.)",
};
@@ -1318,10 +2331,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"AP za Auto",
L"AP/przeіaduj",
L"AP/przeіaduj rкcznie",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Modf. dwуjnogu",
L"Auto/5AP",
- L"PA: (mniej - lepiej)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"PA: (mniej - lepiej)", //23
L"AP za rzut",
L"AP za strzaі",
L"AP/cios-nуї",
@@ -1329,8 +2343,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"Wyі. seriк!",
L"Wyі. auto!",
L"AP/cios-іom",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3884,12 +4897,15 @@ STR16 zOptionsToggleText[] =
L"Show Soldier Tooltips",
L"Automatyczny zapis",
L"Cichy Skyrider",
- L"Niskie obci№їenie procesora",
+ //L"Niskie obci№їenie procesora",
L"Rozszerzone Okno Opisu (EDB)", //Enhanced Description Box
L"Wymuњ tryb turowy", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase // TODO.Translate
L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"Activate New CTH system", // use NCTH
+ L"Show Face gear graphics", // TODO.Translate
+ L"Show Face gear icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3986,11 +5002,14 @@ STR16 zOptionsScreenHelpText[] =
L"Jeњli WЈҐCZONE, gra bкdzie zapisywana kaїdorazowo po zakoсczeniu tury gracza.",
L"Jeњli WЈҐCZONE, Skyrider nie bкdzie nic mуwiі.",
L"Jeњli WЈҐCZONE, gra bкdzie obci№їaіa procesor w mniejszym stopniu.",
- L"Jeњli WЈҐCZONE, rozszerzone opisy bкd№ pokazane dla przedmiotуw i broni.",
+ //L"Jeњli WЈҐCZONE, rozszerzone opisy bкd№ pokazane dla przedmiotуw i broni.",
L"Jeњli WЈҐCZONE i wrуg jest obecny, \ntryb turowy jest wі№czony, \ndopуki sektor nie zostanie oczyszczony (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
L"Gdy WЈҐCZONE, pokazuje postкp w doњwiadczeniu postaci.",
L"When ON, the Strategic Map will be colored differently based on exploration.",
L"Gdy WЈҐCZONE, zastкpuje star№ animacjк pocisku now№.",
+ L"When ON, New CTH system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.", // TODO.Translate
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Wymuњ wszystkie oczekiwane dostawy od Bobby Ray's.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4016,8 +5035,8 @@ STR16 gzGIOScreenText[] =
L"S-F",
L"Platynowy", //Placeholder English
L"Opcje broni",
- L"Mnуstwo broni",
- L"Standardowe uzbrojenie",
+ L"Mnуstwo",
+ L"Standardowe",
L"Stopieс trudnoњci",
L"Nowicjusz",
L"Doњwiadczony",
@@ -4025,9 +5044,9 @@ STR16 gzGIOScreenText[] =
L"SZALONY",
L"Start", // TODO.Translate
L"Anuluj",
- L"Rozszerzony poziom trudnoњci",
- L"Zapis gry w dowolnym momencie",
- L"CZЈOWIEK ZE STALI",
+ L"Zapis gry",
+ L"Zawsze",
+ L"W czasie pokoju",
L"Nie dziaіa w wersji demo",
L"Wyposaїenie Bobby Ray's",
L"Normalne",
@@ -4842,6 +5861,9 @@ STR16 New113Message[] =
L"Twoja umiejкtnoњж zwiadowcy pozwoliіa ci omin№ж stado krwawych kotуw!",
L"%s zostaі trafiony w pachwinк i pada na ziemiк!",
//////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
STR16 New113HAMMessage[] =
@@ -4924,6 +5946,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"PD z Serwera AIM: Wiadomoњж od - Rudolf Steiger",
L"Wiesz, ile telefonуw odbieram kaїdego dnia? Co drugi baran myњli, їe moїe do mnie wydzwaniaж. ± ± W kaїdym razie juї jestem, jeњli masz dla mnie coњ ciekawego.±",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5367,6 +6393,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 trybie okienkowym wymaga gікbi koloru 16-bitowego lub mniej.",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5617,8 +6652,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5754,6 +6789,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5803,6 +6842,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5851,6 +6894,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp
index 9778c13b..213812bd 100644
--- a/Utils/_RussianText.cpp
+++ b/Utils/_RussianText.cpp
@@ -1,4 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
//#pragma setlocale("RUSSIAN")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -6,6 +8,9 @@
#if defined( RUSSIAN )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -109,6 +114,1016 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
SirTech uses the "@@@" notation.
*/
+
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
L"Cтp. 1/2", //0
@@ -351,6 +1366,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s: арктический камуфляж смыт.",
L"Нельзя установить навеску %s на это место.",
+ L"The %s will not fit in any open slots.",
};
@@ -854,6 +1870,8 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Характер:",
L"Недостаток:",
+
+ L"По жизни:", //Attitudes For old traits display instead of "Character:"!
};
@@ -876,9 +1894,6 @@ STR16 gzMercSkillText[] =
L"Холодное оружие",
L"Снайпер",
L"Камуфляж",
- //L"Камуфляж (Город)",
- //L"Камуфляж (Пустыня)",
- //L"Камуфляж (Снег)",
L"(Эксперт)",
};
@@ -901,7 +1916,7 @@ STR16 gzMercSkillTextNew[] =
L"Ловкач", //Ambidextrous
L"Мастер клинка", //Melee
L"Мастер по метанию", //Throwing
- L"Человек ночи", //Night Ops
+ L"Ночник", //Night Ops
L"Бесшумный убийца", //Stealthy
L"Спортсмен", //Athletics
L"Культурист", //Bodybuilding
@@ -1315,10 +2330,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"ОД на огонь очередью", //APs to fire Auto
L"ОД на замену магазина", //APs to Reload
L"ОД на досылку патрона", //APs to Reload Manually
- L"", //19
+ L"Штраф за отдачу при\nстрельбе очередью c отсечкой\n(чем меньше, тем лучше)", //19 //Burst Penalty (Lower is better)
L"Бонус от сошек\n(при стрельбе лёжа)", //Bipod Modifier
L"Выстрелов в автоматическом\nрежиме за 5 ОД", //Autofire shots per 5 AP
- L"Штраф за отдачу при\nстрельбе очередью\n(c отсечкой/без) (чем меньше, тем лучше)", //Burst/Auto Penalty //22
+ L"Штраф за отдачу при \nстрельбе очередью \n(чем меньше, тем лучше)", //Autofire Penalty (Lower is better)
+ L"Штраф за отдачу при\nстрельбе очередью\n(c отсечкой/без) (чем меньше, тем лучше)", //Burst/Auto Penalty //23
L"ОД на бросок", //APs to Throw
L"ОД на выстрел", //APs to Launch
L"ОД на удар ножом", //APs to Stab
@@ -1326,8 +2342,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"Нет отсечки патрона!", //No Burst Mode!
L"Нет автоматического режима!", //No Auto Mode!
L"ОД на удар", //APs to Bash
- L"Штраф за отдачу при \nстрельбе очередью \n(чем меньше, тем лучше)", //Autofire Penalty (Lower is better)
- L"Штраф за отдачу при\nстрельбе очередью c отсечкой\n(чем меньше, тем лучше)", //Burst Penalty (Lower is better)
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -1450,8 +2465,8 @@ STR16 gConditionDesc[] =
L"ОТЛИЧНОМ",
L"ХОРОШЕМ", //GOOD
L"НОРМАЛЬНОМ", //FAIR
- L"УДОВЛЕТВОРИТЕЛЬНОМ", //POOR
- L"ПЛОХОМ", //BAD
+ L"ПЛОХОМ", //POOR
+ L"УЖАСНОМ", //BAD
L"НЕРАБОЧЕМ",
L" состоянии."
};
@@ -3871,17 +4886,20 @@ STR16 zOptionsToggleText[] =
L"Подсказки над солдатами", //Show Soldier Tooltips
L"Автосохранение каждый ход",
L"Молчаливый пилот вертолёта",
- L"Низкая загрузка процессора",
+ //L"Низкая загрузка процессора",
L"Подробное описание предметов", //Enhanced Description Box
L"Только пошаговый режим", // add forced turn mode
L"Подсветить навык к повышению", //Stat Progress Bars // Show progress towards stat increase
L"Новая расцветка стратег. карты", //Alternate Strategy-Map Colors //Change color scheme of Strategic Map
L"Заметная летящая пуля", // Show alternate bullet graphics (tracers)
+ L"Новая система прицеливания", // use NCTH
+ L"Показать снаряжение на голове", //Show Face gear graphics
+ L"Показать иконки снаряжения",
L"--Читерские настройки--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Ускорить доставку Бобби Рэя", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
L"--Настройки отладочной версии--", // an example options screen options header (pure text)
- L"Сообщать координаты промахов", //Report Miss Offsets // Screen messages showing amount and direction of shot deviation. // TODO.Translate
+ L"Сообщать координаты промахов", //Report Miss Offsets // Screen messages showing amount and direction of shot deviation.
L"Сброс всех игровых настроек", // failsafe show/hide option to reset all options
L"В самом деле хотите этого?", // a do once and reset self option (button like effect)
L"Отладочные настройки везде", //Debug Options in other builds // allow debugging in release or mapeditor
@@ -3962,7 +4980,7 @@ STR16 zOptionsScreenHelpText[] =
L"Если включено, очередь из гранатомета\nиспользует курсор стрельбы очередями.",
L"Если включено, враг иногда будет комментировать свои действия.",
L"Если включено, гранатомёты выстреливают \nзаряд под большим углом к горизонту (|Q).",
- L"Если включено, игра не переходит в пошаговый режим \nпри обнаружении противника (если враг вас не видит). \nРучной вход в пошаговый режим - |C|t|r+|X.", //When ON, the turn based mode will not be entered when sneaking unnoticed and seeing an enemy unless pressing |C|t|r+|X.
+ L"Если включено, игра не переходит в пошаговый режим \nпри обнаружении противника (если враг вас не видит). \nРучной вход в пошаговый режим - |C|t|r+|X.",
L"Если включено, |П|р|о|б|е|л выделяет следующий отряд.",
L"Если включено, показываются тени предметов в инвентаре.",
L"Если включено, дальность оружия \nпоказывается в игровых квадратах.",
@@ -3972,14 +4990,17 @@ STR16 zOptionsScreenHelpText[] =
L"Если включено, при нажатии кнопки |A|l|t \nи наведении курсора мыши на вражеского солдата \nбудет показана дополнительная информация.",
L"Если включено, игра будет автоматически \nсохраняться после каждого хода игрока.",
L"Если включено, Небесный Всадник\nне будет вас раздражать болтливостью.",
- L"Если включено, игра будет использовать\nменьше процессорного времени.",
+ //L"Если включено, игра будет использовать\nменьше процессорного времени.",
L"Если включено, будет задействовано\nподробное описание предметов.",
- L"Если включено и в секторе присутствует враг, \nпошаговый режим будет задействован \nдо полной зачистки сектора (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
+ L"Если включено и в секторе присутствует враг, \nпошаговый режим будет задействован \nдо полной зачистки сектора (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).",
L"Если включено, навык, \nкоторый вскоре повысится будет подсвечен.",
- L"Если включено, стратегическая карта будет окрашена \nразными цветами, основываясь на информации разведки.", //When ON, the Strategic Map will be colored differently based on exploration.
+ L"Если включено, необследованные сектрора \nна стратегической карте будут чёрно-белыми.",
L"Если включено, летящая пуля будет более заметной.",
+ L"Если включено, будет задействована новая система прицеливания \nи новый курсор прицеливания.",
+ L"Если включено, на портрете наёмника будет отображено одетое головное снаряжение.",
+ L"Если включено, в правом нижнем углу \nна портрете наёмника будут отображены иконки \nодетого головного снаряжения.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
- L"Если включено, \nзаказанный груз у Бобби Рэя \nприбудет немедленно.", //Force all pending Bobby Ray shipments
+ L"Выберите этот пункт чтобы груз Бобби Рэя прибыл немедленно.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
L"(text not rendered)TOPTION_DEBUG_MODE_OPTIONS_HEADER", // an example options screen options header (pure text)
L"|H|A|M |4 |D|e|b|u|g: When ON, will report the distance each bullet deviates from the\ncenter of the target, taking all NCTH factors into account.",
@@ -4821,9 +5842,13 @@ STR16 New113Message[] =
L"%s пропустил(а) удар в грудную клетку и теряет %d максимального значения здоровья!", //%s is hit in the chest and loses %d points of maximum health!
L"%s восстановил(а) одну единицу потерянного %s.", //%s has regained one point of lost %s
L"%s восстановил(а) %d единиц потерянного %s.", //%s has regained %d points of lost %s
- L"Ваши навыки скаута сорвали засаду противника.", //Your scouting skills prevented an ambush by the enemy!
- L"Благодаря вашим навыкам скаута вы успешно избежали встречи с кошками-убицами!", //Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!
- L"%s получает удар в пах и падает на землю в адской боли!", //%s is hit to groin and falls down in pain!
+ L"Ваши навыки разведчика сорвали засаду противника.",
+ L"Благодаря вашим навыкам разведчика вы успешно избежали встречи с кошками-убицами!",
+ L"%s получает удар в пах и падает на землю в адской боли!",
+/////
+ L"Внимание: враг обнаружил труп!!!",
+ L"%s [%d патр.]\n%s %1.1f %s",
+
};
STR16 New113HAMMessage[] =
@@ -4831,7 +5856,7 @@ STR16 New113HAMMessage[] =
// 0 - 5
L"%s в страхе пытается укрыться!", //%s cowers in fear! %s съёжился от испуга!
L"%s прижат(а) к земле вражеским огнём!", //%s is pinned down!
- L"%s выпускает больше пуль, чем запланировано!", //%s fires more rounds than intended!
+ L"%s дал более длинную очередь!", //%s fires more rounds than intended!
L"Вы не можете тренировать ополчение в этом секторе.", //You cannot train militia in this sector.
L"Ополченец подобрал %s.", //Militia picks up %s.
L"Невозможно тренировать ополчение когда в секторе враг!", //Cannot train militia with enemies present!
@@ -4906,6 +5931,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"FW с сервера A.I.M.: Письмо от Рудольфа Штайгера",
L"Ты знаешь, сколько звонков я получаю каждый день? Любой придурок считает, что может позвонить мне. ± ± Но я вернулся, если тебе есть чем меня заинтересовать.±",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW с сервера A.I.M.: Наёмник доступен",
+ L"Я на месте. Жду звонка чтобы обсудить условия контракта.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5344,6 +6373,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Для запуска Jagged Alliance 2 v1.13 в оконном режиме требуется установить 16-битное качество цветопередачи экрана",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
STR16 sEnemyTauntsFireGun[]=
@@ -5387,7 +6425,7 @@ STR16 sEnemyTauntsThrow[]=
STR16 sEnemyTauntsChargeKnife[]=
{
- L"Я сниму тебе скальп, лошара!",
+ L"Твой скальп мой, лошара!",
L"Иди к папочке.",
L"Сейчас посмотрим на твои кишечки!",
L"Порву, как Тузик грелку!",
@@ -5441,28 +6479,28 @@ STR16 sEnemyTauntsGotHit[]=
STR16 gzItemDescTabButtonText[] =
{
L"Информация",
- L"Общая",
- L"Дополнительная",
+ L"Параметры",
+ L"Дополнительно",
};
STR16 gzItemDescTabButtonShortText[] =
{
L"Инфо.",
- L"Общ.",
+ L"Пар.",
L"Доп.",
};
STR16 gzItemDescGenHeaders[] =
{
- L"Primary",
- L"Secondary",
- L"AP Costs",
- L"Burst / Autofire",
+ L"Основное",
+ L"Дополнительное",
+ L"Затраты ОД",
+ L"Стрельба очередью",
};
STR16 gzItemDescGenIndexes[] =
{
- L"Prop.",
+ L"Парам.",
L"0",
L"+/-",
L"=",
@@ -5470,34 +6508,34 @@ STR16 gzItemDescGenIndexes[] =
STR16 gzUDBButtonTooltipText[]=
{
- L"|D|e|s|c|r|i|p|t|i|o|n |P|a|g|e:\n \nShows basic textual information about this item.",
- L"|G|e|n|e|r|a|l |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows specific data about this item.",
- L"|A|d|v|a|n|c|e|d| |P|r|o|p|e|r|t|i|e|s |P|a|g|e:\n \nShows bonuses given by this item.",
+ L"|И|н|ф|о|р|м|а|ц|и|о|н|н|а|я |ч|а|с|т|ь:\n \nЗдесь вы сможете ознакомиться \nс общим описанием предмета.",
+ L"|П|а|р|а|м|е|т|р|ы:\n \nЗдесь вы сможете ознакомиться \nс индивидуальными свойствами и параметрами предмета.",
+ L"|Д|о|п|о|л|н|и|т|е|л|ь|н|а|я| |и|н|ф|о|р|м|а|ц|и|я:\n \nЗдесь вы сможете ознакомиться \nс бонусами, дающимися данным предметом.",
};
STR16 gzUDBHeaderTooltipText[]=
{
- L"|P|r|i|m|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nProperties and data related to this item's class\n(Weapon / Armor / etcetera).",
- L"|S|e|c|o|n|d|a|r|y |P|r|o|p|e|r|t|i|e|s:\n \nAdditional features of this item,\nand/or possible secondary abilities.",
- L"|A|P |C|o|s|t|s:\n \nVarious Action Point costs to fire\nor manipulate this weapon.",
- L"|B|u|r|s|t |/ |A|u|t|o|f|i|r|e |P|r|o|p|e|r|t|i|e|s:\n \nData related to firing this weapon in\nBurst or Autofire modes.",
+ L"|О|с|н|о|в|н|ы|е |п|а|р|а|м|е|т|р|ы:\n \nСвойства и данные этого предмета\n(Оружие / Броня / и другое).",
+ L"|Д|о|п|о|л|н|и|т|е|л|ь|н|ы|е| |п|а|р|а|м|е|т|р|ы:\n \nДополнительные свойства \nи/или возможные вторичные характеристики.",
+ L"|З|а|т|р|а|т|ы| |О|Д:\n \nКоличество Очков Действия необходимых \nна стрельбу и другие действия с оружием.",
+ L"|С|т|р|е|л|ь|б|а| |о|ч|е|р|е|д|ь|ю| |- |п|а|р|а|м|е|т|р|ы|:\n \nПараметры данного оружия, \nкасающиеся стрельбы очередью.",
};
STR16 gzUDBGenIndexTooltipText[]=
{
- L"|P|r|o|p|e|r|t|y |i|c|o|n\n \nMouse-over to reveal the property's name.",
- L"|B|a|s|i|c |v|a|l|u|e\n \nThe basic value given by this item, excluding any\nbonuses or penalties from attachments or ammo.",
- L"|A|t|t|a|c|h|m|e|n|t |B|o|n|u|s|e|s\n \nBonus or penalty given by ammo, any attachments,\nor low item condition.",
- L"|F|i|n|a|l |V|a|l|u|e\n \nThe final value given by this item, including any\nbonuses/penalties from attachments or ammo.",
+ L"|С|и|м|в|о|л|ь|н|о|е| |о|б|о|з|н|а|ч|е|н|и|е| |п|а|р|а|м|е|т|р|о|в\n \nУкажите курсором на символ \nчтобы увидеть что он значит.",
+ L"|С|т|а|н|д|а|р|т|н|о|е |з|н|а|ч|е|н|и|е\n \nСтандартное значение праметров предмета \n(без штрафов и бонусов навески и аммуниции).",
+ L"|Б|о|н|у|с|ы| |н|а|в|е|с|к|и\n \nБонусы или штрафы, обусловленные \nнавеской, аммуницией или повреждениями вещи.",
+ L"|С|у|м|м|а|р|н|о|е| |з|н|а|ч|е|н|и|е\n \nСуммарное значение параметров предмета, \nучитывая все бонусы/штрафы навески и аммуниции.",
};
STR16 gzUDBAdvIndexTooltipText[]=
{
- L"Property icon (mouse-over to reveal name).",
- L"Bonus/penalty given while |s|t|a|n|d|i|n|g.",
- L"Bonus/penalty given while |c|r|o|u|c|h|i|n|g.",
- L"Bonus/penalty given while |p|r|o|n|e.",
- L"Bonus/penalty given",
+ L"Символьное обозначение параметров \n(укажите курсором на символ \nчтобы увидеть что он значит ).",
+ L"Бонус/штраф если |с|т|о|и|ш|ь.",
+ L"Бонус/штраф при |г|у|с|и|н|о|м| |ш|а|г|е.",
+ L"Бонус/штраф если |п|о|л|з|ё|ш|ь.",
+ L"Даден бонус/штраф",
};
STR16 szUDBGenWeaponsStatsTooltipText[]=
@@ -5593,8 +6631,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5730,6 +6768,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5779,6 +6821,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5827,6 +6873,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp
index 5cd3edc1..cd57d676 100644
--- a/Utils/_TaiwaneseText.cpp
+++ b/Utils/_TaiwaneseText.cpp
@@ -1,3 +1,6 @@
+// WANNE: Yes, this should be disabled, otherwise we get weird behavior when running the game with a VS 2005 build!
+//#pragma setlocale("TAIWANESE")
+
#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#else
@@ -5,6 +8,9 @@
#if defined( TAIWANESE )
#include "text.h"
#include "Fileman.h"
+ #include "Scheduling.h"
+ #include "EditorMercs.h"
+ #include "Item Statistics.h"
#endif
#endif
@@ -109,6 +115,1015 @@ FAST HELP TEXT -- Explains how the syntax of fast help text works.
*/
+// Editor
+//Editor Taskbar Creation.cpp
+STR16 iEditorItemStatsButtonsText[] =
+{
+ L"Delete",
+};
+
+STR16 FaceDirs[8] =
+{
+ L"north",
+ L"northeast",
+ L"east",
+ L"southeast",
+ L"south",
+ L"southwest",
+ L"west",
+ L"northwest"
+};
+
+STR16 iEditorMercsToolbarText[] =
+{
+ L"Toggle viewing of players", //0
+ L"Toggle viewing of enemies",
+ L"Toggle viewing of creatures",
+ L"Toggle viewing of rebels",
+ L"Toggle viewing of civilians",
+
+ L"Player",
+ L"Enemy",
+ L"Creature",
+ L"Rebels",
+ L"Civilian",
+
+ L"DETAILED PLACEMENT", //10
+ L"General information mode",
+ L"Physical appearance mode",
+ L"Attributes mode",
+ L"Inventory mode",
+ L"Profile ID mode",
+ L"Schedule mode",
+ L"Schedule mode",
+ L"DELETE",
+ L"Delete currently selected merc (DEL).",
+ L"NEXT", //20
+ L"Find next merc (SPACE).",
+ L"Toggle priority existance",
+ L"Toggle whether or not placement has/naccess to all doors.",
+
+ //Orders
+ L"STATIONARY",
+ L"ON GUARD",
+ L"ON CALL",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL", //30
+ L"RND PT PATROL",
+
+ //Attitudes
+ L"DEFENSIVE",
+ L"BRAVE SOLO",
+ L"BRAVE AID",
+ L"AGGRESSIVE",
+ L"CUNNING SOLO",
+ L"CUNNING AID",
+
+ L"Set merc to face %s",
+
+ L"Find",
+ L"BAD", //40
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"BAD",
+ L"POOR",
+ L"AVERAGE",
+ L"GOOD",
+ L"GREAT",
+
+ L"Previous color set", //50
+ L"Next color set",
+
+ L"Previous body type",
+ L"Next body type",
+
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+ L"Toggle time variance (+ or - 15 minutes)",
+
+ L"No action",
+ L"No action",
+ L"No action", //60
+ L"No action",
+
+ L"Clear Schedule",
+
+ L"Find selected merc",
+};
+
+STR16 iEditorBuildingsToolbarText[] =
+{
+ L"ROOFS", //0
+ L"WALLS",
+ L"ROOM INFO",
+
+ L"Place walls using selection method",
+ L"Place doors using selection method",
+ L"Place roofs using selection method",
+ L"Place windows using selection method",
+ L"Place damaged walls using selection method.",
+ L"Place furniture using selection method",
+ L"Place wall decals using selection method",
+ L"Place floors using selection method", //10
+ L"Place generic furniture using selection method",
+ L"Place walls using smart method",
+ L"Place doors using smart method",
+ L"Place windows using smart method",
+ L"Place damaged walls using smart method",
+ L"Lock or trap existing doors",
+
+ L"Add a new room",
+ L"Edit cave walls.",
+ L"Remove an area from existing building.",
+ L"Remove a building", //20
+ L"Add/replace building's roof with new flat roof.",
+ L"Copy a building",
+ L"Move a building",
+ L"Draw room number",
+ L"Erase room numbers",
+
+ L"Toggle erase mode",
+ L"Undo last change",
+ L"Cycle brush size",
+
+};
+
+STR16 iEditorItemsToolbarText[] =
+{
+ L"Weapons", //0
+ L"Ammo",
+ L"Armour",
+ L"LBE",
+ L"Exp",
+ L"E1",
+ L"E2",
+ L"E3",
+ L"Triggers",
+ L"Keys",
+};
+
+STR16 iEditorMapInfoToolbarText[] =
+{
+ L"Add ambient light source", //0
+ L"Toggle fake ambient lights.",
+ L"Add exit grids (r-clk to query existing).",
+ L"Cycle brush size",
+ L"Undo last change",
+ L"Toggle erase mode",
+ L"Specify north point for validation purposes.",
+ L"Specify west point for validation purposes.",
+ L"Specify east point for validation purposes.",
+ L"Specify south point for validation purposes.",
+ L"Specify center point for validation purposes.", //10
+ L"Specify isolated point for validation purposes.",
+};
+
+STR16 iEditorOptionsToolbarText[]=
+{
+ L"New map", //0
+ L"New basement",
+ L"New cave level",
+ L"Save map",
+ L"Load map",
+ L"Select tileset",
+ L"Leave Editor mode",
+ L"Exit game.",
+ L"Create radar map",
+ L"When checked, the map will be saved in original JA2 map format.\nThis option is only valid on 'normal' size maps that do not reference grid numbers (e.g: exit grids) > 25600.",
+ L"When checked and you load a map, the map will be enlarged automatically depending on the selected Rows and Cols.",
+};
+
+STR16 iEditorTerrainToolbarText[] =
+{
+ L"Draw ground textures", //0
+ L"Set map ground textures",
+ L"Place banks and cliffs",
+ L"Draw roads",
+ L"Draw debris",
+ L"Place trees & bushes",
+ L"Place rocks",
+ L"Place barrels & other junk",
+ L"Fill area",
+ L"Undo last change",
+ L"Toggle erase mode", //10
+ L"Cycle brush size",
+ L"Raise brush density",
+ L"Lower brush density",
+};
+
+STR16 iEditorTaskbarInternalText[]=
+{
+ L"Terrain", //0
+ L"Buildings",
+ L"Items",
+ L"Mercs",
+ L"Map Info",
+ L"Options",
+};
+
+//Editor Taskbar Utils.cpp
+
+STR16 iRenderMapEntryPointsAndLightsText[] =
+{
+ L"North Entry Point", //0
+ L"West Entry Point",
+ L"East Entry Point",
+ L"South Entry Point",
+ L"Center Entry Point",
+ L"Isolated Entry Point",
+
+ L"Prime",
+ L"Night",
+ L"24Hour",
+};
+
+STR16 iBuildTriggerNameText[] =
+{
+ L"Panic Trigger1", //0
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+
+ L"Pressure Action",
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+};
+
+STR16 iRenderDoorLockInfoText[]=
+{
+ L"No Lock ID", //0
+ L"Explosion Trap",
+ L"Electric Trap",
+ L"Siren Trap",
+ L"Silent Alarm",
+ L"Super Electric Trap", //5
+ L"Brothel Siren Trap",
+ L"Trap Level %d",
+};
+
+STR16 iRenderEditorInfoText[]=
+{
+ L"Save map in vanilla JA2 (v1.12) map format (Version: 5.00 / 25)", //0
+ L"No map currently loaded.",
+ L"File: %S, Current Tileset: %s",
+ L"Enlarge map on loading",
+};
+//EditorBuildings.cpp
+STR16 iUpdateBuildingsInfoText[] =
+{
+ L"TOGGLE", //0
+ L"VIEWS",
+ L"SELECTION METHOD",
+ L"SMART METHOD",
+ L"BUILDING METHOD",
+ L"Room#", //5
+};
+
+STR16 iRenderDoorEditingWindowText[] =
+{
+ L"Editing lock attributes at map index %d.",
+ L"Lock ID",
+ L"Trap Type",
+ L"Trap Level",
+ L"Locked",
+};
+
+//EditorItems.cpp
+
+STR16 pInitEditorItemsInfoText[] =
+{
+ L"Pressure Action", //0
+ L"Panic Action1",
+ L"Panic Action2",
+ L"Panic Action3",
+ L"Action%d",
+
+ L"Panic Trigger1", //5
+ L"Panic Trigger2",
+ L"Panic Trigger3",
+ L"Trigger%d",
+};
+
+STR16 pDisplayItemStatisticsTex[] =
+{
+ L"Status Info Line 1",
+ L"Status Info Line 2",
+ L"Status Info Line 3",
+ L"Status Info Line 4",
+ L"Status Info Line 5",
+};
+
+//EditorMapInfo.cpp
+STR16 pUpdateMapInfoText[] =
+{
+ L"R", //0
+ L"G",
+ L"B",
+
+ L"Prime",
+ L"Night",
+ L"24Hrs", //5
+
+ L"Radius",
+
+ L"Underground",
+ L"Light Level",
+
+ L"Outdoors",
+ L"Basement", //10
+ L"Caves",
+
+ L"Restricted",
+ L"Scroll ID",
+
+ L"Destination",
+ L"Sector", //15
+ L"Destination",
+ L"Bsmt. Level",
+ L"Dest.",
+ L"GridNo",
+};
+//EditorMercs.cpp
+CHAR16 gszScheduleActions[ 11 ][20] =
+{
+ L"No action",
+ L"Lock door",
+ L"Unlock door",
+ L"Open door",
+ L"Close door",
+ L"Move to gridno",
+ L"Leave sector",
+ L"Enter sector",
+ L"Stay in sector",
+ L"Sleep",
+ L"Ignore this!"
+};
+
+STR16 zDiffNames[5] =
+{
+ L"Wimp",
+ L"Easy",
+ L"Average",
+ L"Tough",
+ L"Steroid Users Only"
+};
+
+STR16 EditMercStat[12] =
+{
+ L"Max Health",
+ L"Cur Health",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Charisma",
+ L"Wisdom",
+ L"Marksmanship",
+ L"Explosives",
+ L"Medical",
+ L"Scientific",
+ L"Exp Level",
+};
+
+
+STR16 EditMercOrders[8] =
+{
+ L"Stationary",
+ L"On Guard",
+ L"Close Patrol",
+ L"Far Patrol",
+ L"Point Patrol",
+ L"On Call",
+ L"Seek Enemy",
+ L"Random Point Patrol",
+};
+
+STR16 EditMercAttitudes[6] =
+{
+ L"Defensive",
+ L"Brave Loner",
+ L"Brave Buddy",
+ L"Cunning Loner",
+ L"Cunning Buddy",
+ L"Aggressive",
+};
+
+STR16 pDisplayEditMercWindowText[] =
+{
+ L"Merc Name:", //0
+ L"Orders:",
+ L"Combat Attitude:",
+};
+
+STR16 pCreateEditMercWindowText[] =
+{
+ L"Merc Colors", //0
+ L"Done",
+
+ L"Previous merc standing orders",
+ L"Next merc standing orders",
+
+ L"Previous merc combat attitude",
+ L"Next merc combat attitude", //5
+
+ L"Decrease merc stat",
+ L"Increase merc stat",
+};
+
+STR16 pDisplayBodyTypeInfoText[] =
+{
+ L"Random", //0
+ L"Reg Male",
+ L"Big Male",
+ L"Stocky Male",
+ L"Reg Female",
+ L"NE Tank", //5
+ L"NW Tank",
+ L"Fat Civilian",
+ L"M Civilian",
+ L"Miniskirt",
+ L"F Civilian", //10
+ L"Kid w/ Hat",
+ L"Humvee",
+ L"Eldorado",
+ L"Icecream Truck",
+ L"Jeep", //15
+ L"Kid Civilian",
+ L"Domestic Cow",
+ L"Cripple",
+ L"Unarmed Robot",
+ L"Larvae", //20
+ L"Infant",
+ L"Yng F Monster",
+ L"Yng M Monster",
+ L"Adt F Monster",
+ L"Adt M Monster", //25
+ L"Queen Monster",
+ L"Bloodcat",
+};
+
+STR16 pUpdateMercsInfoText[] =
+{
+ L" --=ORDERS=-- ", //0
+ L"--=ATTITUDE=--",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"RELATIVE",
+ L"EQUIPMENT",
+
+ L"RELATIVE",
+ L"ATTRIBUTES",
+
+ L"Army",
+ L"Admin",
+ L"Elite", //10
+
+ L"Exp. Level",
+ L"Life",
+ L"LifeMax",
+ L"Marksmanship",
+ L"Strength",
+ L"Agility",
+ L"Dexterity",
+ L"Wisdom",
+ L"Leadership",
+ L"Explosives", //20
+ L"Medical",
+ L"Mechanical",
+ L"Morale",
+
+ L"Hair color:",
+ L"Skin color:",
+ L"Vest color:",
+ L"Pant color:",
+
+ L"RANDOM",
+ L"RANDOM",
+ L"RANDOM", //30
+ L"RANDOM",
+
+ L"By specifying a profile index, all of the information will be extracted from the profile ",
+ L"and override any values that you have edited. It will also disable the editing features ",
+ L"though, you will still be able to view stats, etc. Pressing ENTER will automatically ",
+ L"extract the number you have typed. A blank field will clear the profile. The current ",
+ L"number of profiles range from 0 to ",
+
+ L"Current Profile: n/a ",
+ L"Current Profile: %s",
+
+ L"STATIONARY",
+ L"ON CALL", //40
+ L"ON GUARD",
+ L"SEEK ENEMY",
+ L"CLOSE PATROL",
+ L"FAR PATROL",
+ L"POINT PATROL",
+ L"RND PT PATROL",
+
+ L"Action",
+ L"Time",
+ L"V",
+ L"GridNo 1", //50
+ L"GridNo 2",
+ L"1)",
+ L"2)",
+ L"3)",
+ L"4)",
+
+ L"lock",
+ L"unlock",
+ L"open",
+ L"close",
+
+ L"Click on the gridno adjacent to the door that you wish to %s.", //60
+ L"Click on the gridno where you wish to move after you %s the door.",
+ L"Click on the gridno where you wish to move to.",
+ L"Click on the gridno where you wish to sleep at. Person will automatically return to original position after waking up.",
+ L" Hit ESC to abort entering this line in the schedule.",
+};
+
+CHAR16 pRenderMercStringsText[][100] =
+{
+ L"Slot #%d",
+ L"Patrol orders with no waypoints",
+ L"Waypoints with no patrol orders",
+};
+
+STR16 pClearCurrentScheduleText[] =
+{
+ L"No action",
+};
+
+STR16 pCopyMercPlacementText[] =
+{
+ L"Placement not copied because no placement selected.",
+ L"Placement copied.",
+};
+
+STR16 pPasteMercPlacementText[] =
+{
+ L"Placement not pasted as no placement is saved in buffer.",
+ L"Placement pasted.",
+ L"Placement not pasted as the maximum number of placements for this team is already used.",
+};
+
+//editscreen.cpp
+STR16 pEditModeShutdownText[] =
+{
+ L"Exit editor?",
+};
+
+STR16 pHandleKeyboardShortcutsText[] =
+{
+ L"Are you sure you wish to remove all lights?", //0
+ L"Are you sure you wish to reverse the schedules?",
+ L"Are you sure you wish to clear all of the schedules?",
+
+ L"Clicked Placement Enabled",
+ L"Clicked Placement Disabled",
+
+ L"Draw High Ground Enabled", //5
+ L"Draw High Ground Disabled",
+
+ L"Number of edge points: N=%d E=%d S=%d W=%d",
+
+ L"Random Placement Enabled",
+ L"Random Placement Disabled",
+
+ L"Removing Treetops", //10
+ L"Showing Treetops",
+
+ L"World Raise Reset",
+
+ L"World Raise Set Old",
+ L"World Raise Set",
+};
+
+STR16 pPerformSelectedActionText[] =
+{
+ L"Creating radar map for %S", //0
+
+ L"Delete current map and start a new basement level?",
+ L"Delete current map and start a new cave level?",
+ L"Delete current map and start a new outdoor level?",
+
+ L" Wipe out ground textures? ",
+};
+
+STR16 pWaitForHelpScreenResponseText[] =
+{
+ L"HOME", //0
+ L"Toggle fake editor lighting ON/OFF",
+
+ L"INSERT",
+ L"Toggle fill mode ON/OFF",
+
+ L"BKSPC",
+ L"Undo last change",
+
+ L"DEL",
+ L"Quick erase object under mouse cursor",
+
+ L"ESC",
+ L"Exit editor",
+
+ L"PGUP/PGDN", //10
+ L"Change object to be pasted",
+
+ L"F1",
+ L"This help screen",
+
+ L"F10",
+ L"Save current map",
+
+ L"F11",
+ L"Load map as current",
+
+ L"+/-",
+ L"Change shadow darkness by .01",
+
+ L"SHFT +/-", //20
+ L"Change shadow darkness by .05",
+
+ L"0 - 9",
+ L"Change map/tileset filename",
+
+ L"b",
+ L"Change brush size",
+
+ L"d",
+ L"Draw debris",
+
+ L"o",
+ L"Draw obstacle",
+
+ L"r", //30
+ L"Draw rocks",
+
+ L"t",
+ L"Toggle trees display ON/OFF",
+
+ L"g",
+ L"Draw ground textures",
+
+ L"w",
+ L"Draw building walls",
+
+ L"e",
+ L"Toggle erase mode ON/OFF",
+
+ L"h", //40
+ L"Toggle roofs ON/OFF",
+};
+
+STR16 pAutoLoadMapText[] =
+{
+ L"Map data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+ L"Schedule data has just been corrupted. Don't save, don't quit, get Kris! If he's not here, save the map using a temp filename and document everything you just did, especially your last action!",
+};
+
+STR16 pShowHighGroundText[] =
+{
+ L"Showing High Ground Markers",
+ L"Hiding High Ground Markers",
+};
+
+//Item Statistics.cpp
+CHAR16 gszActionItemDesc[ 34 ][ 30 ] = // NUM_ACTIONITEMS = 34
+{
+ L"Klaxon Mine",
+ L"Flare Mine",
+ L"Teargas Explosion",
+ L"Stun Explosion",
+ L"Smoke Explosion",
+ L"Mustard Gas",
+ L"Land Mine",
+ L"Open Door",
+ L"Close Door",
+ L"3x3 Hidden Pit",
+ L"5x5 Hidden Pit",
+ L"Small Explosion",
+ L"Medium Explosion",
+ L"Large Explosion",
+ L"Toggle Door",
+ L"Toggle Action1s",
+ L"Toggle Action2s",
+ L"Toggle Action3s",
+ L"Toggle Action4s",
+ L"Enter Brothel",
+ L"Exit Brothel",
+ L"Kingpin Alarm",
+ L"Sex with Prostitute",
+ L"Reveal Room",
+ L"Local Alarm",
+ L"Global Alarm",
+ L"Klaxon Sound",
+ L"Unlock door",
+ L"Toggle lock",
+ L"Untrap door",
+ L"Tog pressure items",
+ L"Museum alarm",
+ L"Bloodcat alarm",
+ L"Big teargas",
+};
+
+STR16 pUpdateItemStatsPanelText[] =
+{
+ L"Toggle hide flag", //0
+ L"No item selected.",
+ L"Slot available for",
+ L"random generation.",
+ L"Keys not editable.",
+ L"ProfileID of owner",
+ L"Item class not implemented.",
+ L"Slot locked as empty.",
+ L"Status",
+ L"Rounds",
+ L"Trap Level", //10
+ L"Quantity",
+ L"Trap Level",
+ L"Status",
+ L"Trap Level",
+ L"Status",
+ L"Quantity",
+ L"Trap Level",
+ L"Dollars",
+ L"Status",
+ L"Trap Level", //20
+ L"Trap Level",
+ L"Tolerance",
+ L"Alarm Trigger",
+ L"Exist Chance",
+ L"B",
+ L"R",
+ L"S",
+};
+
+STR16 pSetupGameTypeFlagsText[] =
+{
+ L"Item appears in both Sci-Fi and Realistic modes. (|B)", //0
+ L"Item appears in |Realistic mode only.",
+ L"Item appears in |Sci-Fi mode only.",
+};
+
+STR16 pSetupGunGUIText[] =
+{
+ L"SILENCER", //0
+ L"SNIPERSCOPE",
+ L"LASERSCOPE",
+ L"BIPOD",
+ L"DUCKBILL",
+ L"G-LAUNCHER", //5
+};
+
+STR16 pSetupArmourGUIText[] =
+{
+ L"CERAMIC PLATES", //0
+};
+
+STR16 pSetupExplosivesGUIText[] =
+{
+ L"DETONATOR",
+};
+
+STR16 pSetupTriggersGUIText[] =
+{
+ L"If the panic trigger is an alarm trigger,\nenemies won't attempt to use it if they\nare already aware of your presence.",
+};
+
+//Sector Summary.cpp
+
+STR16 pCreateSummaryWindowText[]=
+{
+ L"Okay", //0
+ L"A",
+ L"G",
+ L"B1",
+ L"B2",
+ L"B3", //5
+ L"LOAD",
+ L"SAVE",
+ L"Update",
+};
+
+STR16 pRenderSectorInformationText[] =
+{
+ L"Tileset: %s", //0
+ L"Version Info: Summary: 1.%02d, Map: %1.2f / %02d",
+ L"Number of items: %d",
+ L"Number of lights: %d",
+ L"Number of entry points: %d",
+
+ L"N",
+ L"E",
+ L"S",
+ L"W",
+ L"C",
+ L"I", //10
+
+ L"Number of rooms: %d",
+ L"Total map population: %d",
+ L"Enemies: %d",
+ L"Admins: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Troops: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Elites: %d",
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+ L"Civilians: %d", //20
+
+ L"(%d detailed, %d profile -- %d have priority existance)",
+
+ L"Humans: %d",
+ L"Cows: %d",
+ L"Bloodcats: %d",
+
+ L"Creatures: %d",
+
+ L"Monsters: %d",
+ L"Bloodcats: %d",
+
+ L"Number of locked and/or trapped doors: %d",
+ L"Locked: %d",
+ L"Trapped: %d", //30
+ L"Locked & Trapped: %d",
+
+ L"Civilians with schedules: %d",
+
+ L"Too many exit grid destinations (more than 4)...",
+ L"ExitGrids: %d (%d with a long distance destination)",
+ L"ExitGrids: none",
+ L"ExitGrids: 1 destination using %d exitgrids",
+ L"ExitGrids: 2 -- 1) Qty: %d, 2) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d",
+ L"ExitGrids: 3 -- 1) Qty: %d, 2) Qty: %d, 3) Qty: %d, 4) Qty: %d",
+ L"Enemy Relative Attributes: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)", //40
+ L"Enemy Relative Equipment: %d bad, %d poor, %d norm, %d good, %d great (%+d Overall)",
+ L"%d placements have patrol orders without any waypoints defined.",
+ L"%d placements have waypoints, but without any patrol orders.",
+ L"%d gridnos have questionable room numbers. Please validate.",
+
+};
+
+STR16 pRenderItemDetailsText[] =
+{
+ L"R", //0
+ L"S",
+ L"Enemy",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"Panic1",
+ L"Panic2",
+ L"Panic3",
+ L"Norm1",
+ L"Norm2",
+ L"Norm3",
+ L"Norm4", //10
+ L"Pressure Actions",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+
+ L"PRIORITY ENEMY DROPPED ITEMS",
+ L"None",
+
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"NORMAL ENEMY DROPPED ITEMS",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"None",
+ L"TOO MANY ITEMS TO DISPLAY!",
+ L"ERROR: Can't load the items for this map. Reason unknown.", //20
+};
+
+STR16 pRenderSummaryWindowText[] =
+{
+ L"CAMPAIGN EDITOR -- %s Version 1.%02d", //0
+ L"(NO MAP LOADED).",
+ L"You currently have %d outdated maps.",
+ L"The more maps that need to be updated, the longer it takes. It'll take ",
+ L"approximately 4 minutes on a P200MMX to analyse 100 maps, so",
+ L"depending on your computer, it may vary.",
+ L"Do you wish to regenerate info for ALL these maps at this time (y/n)?",
+
+ L"There is no sector currently selected.",
+
+ L"Entering a temp file name that doesn't follow campaign editor conventions...",
+
+ L"You need to either load an existing map or create a new map before being",
+ L"able to enter the editor, or you can quit (ESC or Alt+x).", //10
+
+ L", ground level",
+ L", underground level 1",
+ L", underground level 2",
+ L", underground level 3",
+ L", alternate G level",
+ L", alternate B1 level",
+ L", alternate B2 level",
+ L", alternate B3 level",
+
+ L"ITEM DETAILS -- sector %s",
+ L"Summary Information for sector %s:", //20
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"Summary Information for sector %s",
+ L"does not exist.",
+
+ L"No information exists for sector %s.",
+
+ L"No information exists for sector %s.",
+
+ L"FILE: %s",
+
+ L"FILE: %s",
+
+ L"Override READONLY",
+ L"Overwrite File", //30
+
+ L"You currently have no summary data. By creating one, you will be able to keep track",
+ L"of information pertaining to all of the sectors you edit and save. The creation process",
+ L"will analyse all maps in your \\MAPS directory, and generate a new one. This could",
+ L"take a few minutes depending on how many valid maps you have. Valid maps are",
+ L"maps following the proper naming convention from a1.dat - p16.dat. Underground maps",
+ L"are signified by appending _b1 to _b3 before the .dat (ex: a9_b1.dat). ",
+
+ L"Do you wish to do this now (y/n)?",
+
+ L"No summary info. Creation denied.",
+
+ L"Grid",
+ L"Progress", //40
+ L"Use Alternate Maps",
+
+ L"Summary",
+ L"Items",
+};
+
+STR16 pUpdateSectorSummaryText[] =
+{
+ L"Analyzing map: %s...",
+};
+
+STR16 pSummaryLoadMapCallbackText[] =
+{
+ L"Loading map: %s",
+};
+
+STR16 pReportErrorText[] =
+{
+ L"Skipping update for %s. Probably due to tileset conflicts...",
+};
+
+STR16 pRegenerateSummaryInfoForAllOutdatedMapsText[] =
+{
+ L"Generating map information",
+};
+
+STR16 pSummaryUpdateCallbackText[] =
+{
+ L"Generating map summary",
+};
+
+STR16 pApologizeOverrideAndForceUpdateEverythingText[] =
+{
+ L"MAJOR VERSION UPDATE",
+ L"There are %d maps requiring a major version update.",
+ L"Updating all outdated maps",
+};
+
+//selectwin.cpp
+STR16 pDisplaySelectionWindowGraphicalInformationText[] =
+{
+ L"%S[%d] is from default tileset %s (%S)",
+ L"File: %S, subindex: %d (%S)",
+ L"Current Tileset: %s",
+};
+
+//Cursor Modes.cpp
+STR16 wszSelType[6] = {
+ L"Small",
+ L"Medium",
+ L"Large",
+ L"XLarge",
+ L"Width: xx",
+ L"Area"
+ };
+
+//---
+
// TODO.Translate
CHAR16 gszAimPages[ 6 ][ 20 ] =
{
@@ -352,6 +1367,7 @@ CHAR16 Message[][STRING_LENGTH] =
L"%s's snow camouflage has washed off.",
L"You cannot attach %s to this slot.",
+ L"The %s will not fit in any open slots.",
};
@@ -854,7 +1870,9 @@ STR16 pPersonnelRecordsHelpTexts[] =
L"Facility accidents: %d\n",
L"Character:",
- L"Weakening:",
+ L"Weakness:",
+
+ L"Attitudes:", // WANNE: For old traits display instead of "Character:"!
};
@@ -876,11 +1894,7 @@ STR16 gzMercSkillText[] =
L"Martial Arts",
L"Knifing",
L"Sniper",
- L"Camouflage", //JA25: modified
- // SANDRO - removed this
- //L"Camouflage (Urban)",
- //L"Camouflage (Desert)",
- //L"Camouflage (Snow)",
+ L"Camouflage", //JA25: modified
L"(Expert)",
};
@@ -1318,10 +2332,11 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"APs to fire Auto",
L"APs to Reload",
L"APs to Reload Manually",
- L"", //19
+ L"Burst Penalty (Lower is better)", //19
L"Bipod Modifier",
L"Autofire shots per 5 AP",
- L"Burst/Auto Penalty (Lower is better)", //22
+ L"Autofire Penalty (Lower is better)",
+ L"Burst/Auto Penalty (Lower is better)", //23
L"APs to Throw",
L"APs to Launch",
L"APs to Stab",
@@ -1329,8 +2344,7 @@ STR16 gzWeaponStatsFasthelpTactical[ 32 ] =
L"No Burst Mode!",
L"No Auto Mode!",
L"APs to Bash",
- L"Autofire Penalty (Lower is better)",
- L"Burst Penalty (Lower is better)",
+ L"",
};
STR16 gzAmmoStatsFasthelp[ 20 ] =
@@ -3852,7 +4866,7 @@ STR16 zOptionsToggleText[] =
{
L"Speech",
L"Mute Confirmations",
- L"SubTitles",
+ L"Subtitles",
L"Pause Text Dialogue",
L"Animate Smoke",
L"Blood n Gore",
@@ -3884,12 +4898,15 @@ STR16 zOptionsToggleText[] =
L"Show Soldier Tooltips",
L"Auto save",
L"Silent Skyrider",
- L"Low CPU usage",
+ //L"Low CPU usage",
L"Enhanced Description Box",
L"Forced Turn Mode", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase // TODO.Translate
L"Alternate Strategy-Map Colors", // Change color scheme of Strategic Map
L"Alternate bullet graphics", // Show alternate bullet graphics (tracers) // TODO.Translate
+ L"Activate New CTH system", // use NCTH
+ L"Show Face gear graphics", // TODO.Translate
+ L"Show Face gear icons",
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Force Bobby Ray shipments", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3985,12 +5002,15 @@ STR16 zOptionsScreenHelpText[] =
L"When ON, a tooltip window is shown when pressing |A|l|t and hovering cursor over an enemy.",
L"When ON, game will be saved after each players turn.",
L"When ON, Skyrider will not talk anymore.",
- L"When ON, game will run with much lower CPU usage.",
+ //L"When ON, game will run with much lower CPU usage.",
L"When ON, enhanced descriptions will be shown for items and weapons.",
L"When ON and enemy present, Turn Base mode persists untill sector is free (|C|T|R|L+|S|H|I|F|T+|A|L|T+|T).", // add forced turn mode
L"When ON, shows character progress towards gaining levels.", // TODO.Translate
L"When ON, the Strategic Map will be colored differently based on exploration.",
L"When ON, alternate bullet graphics will be shown when you shoot.", // TODO.Translate
+ L"When ON, New CTH system and cursor is used.",
+ L"When ON, you will see the equiped face gear on the merc portraits.", // TODO.Translate
+ L"When ON, you will see icons for the equiped face gear on the merc portraits in the lower right corner.",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_HEADER",
L"Force all pending Bobby Ray shipments",
L"(text not rendered)TOPTION_CHEAT_MODE_OPTIONS_END",
@@ -4846,6 +5866,9 @@ STR16 New113Message[] =
L"Thanks to your scouting skills you have successfuly avoided a pack of bloodcats!",
L"%s is hit to groin and falls down in pain!",
//////////////////////////////////////////////////////////////////////////////////////
+ L"Warning: enemy corpse found!!!",
+ L"%s [%d rnds]\n%s %1.1f %s",
+
};
// TODO.Translate
@@ -4929,6 +5952,10 @@ STR16 New113AIMMercMailTexts[] =
// Rudolf
L"FW from AIM Server: Message from Rudolf Steiger",
L"Rudolf here. Call me back.",
+
+ // WANNE: Generic mail, for additional merc made by modders, index >= 178
+ L"FW from AIM Server: Message about merc availability",
+ L"I got your message. Waiting for your call.±",
};
// WANNE: These are the missing skills from the impass.edt file
@@ -5160,7 +6187,7 @@ STR16 gzMPChatToggleText[] =
STR16 gzMPChatboxText[] =
{
L"Multiplayer Chat",
- L"Chat: Press 'ENTER' to send of 'ESC' to cancel.",
+ L"'ENTER' to send, 'ESC' to cancel",
};
// Following strings added - SANDRO
@@ -5370,6 +6397,15 @@ STR16 gzFacilityAssignmentStrings[]=
STR16 Additional113Text[]=
{
L"Jagged Alliance 2 v1.13 windowed mode requires a color depth of 16bpp or less.",
+
+ // TODO.Translate
+ // WANNE: Savegame slots validation against INI file
+ L"Internal error in reading %s slots from Savegame: Number of slots in Savegame (%d) differs from defined slots in ja2_options.ini settings (%d)",
+ L"Mercenary (MAX_NUMBER_PLAYER_MERCS) / Vehicle (MAX_NUMBER_PLAYER_VEHICLES)",
+ L"Enemy (MAX_NUMBER_ENEMIES_IN_TACTICAL)",
+ L"Creature (MAX_NUMBER_CREATURES_IN_TACTICAL)",
+ L"Militia (MAX_NUMBER_MILITIA_IN_TACTICAL)",
+ L"Civilian (MAX_NUMBER_CIVS_IN_TACTICAL)",
};
// SANDRO - Taunts (here for now, xml for future, I hope)
@@ -5620,8 +6656,8 @@ STR16 szUDBGenExplosiveStatsTooltipText[]=
L"|S|m|o|k|e |S|t|a|r|t |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |S|t|a|r|t |R|a|d|i|u|s",
L"|T|e|a|r|g|a|s |E|n|d |R|a|d|i|u|s",
- L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|M|u|s|t|a|r|d |G|a|s |E|n|d |R|a|d|i|u|s",
+ L"|L|i|g|h|t |E|n|d |R|a|d|i|u|s",
L"|S|m|o|k|e |E|n|d |R|a|d|i|u|s",
L"|I|n|c|e|n|d|i|a|r|y |E|n|d |R|a|d|i|u|s",
L"|E|f|f|e|c|t |D|u|r|a|t|i|o|n",
@@ -5757,6 +6793,10 @@ STR16 szUDBAdvStatsTooltipText[]=
L"|B|r|i|g|h|t|-|L|i|g|h|t |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|C|a|v|e |V|i|s|i|o|n |R|a|n|g|e |M|o|d|i|f|i|e|r",
L"|T|u|n|n|e|l |V|i|s|i|o|n",
+ L"|M|a|x|i|m|u|m |C|o|u|n|t|e|r|-|F|o|r|c|e",
+ L"|C|o|u|n|t|e|r|-|F|o|r|c|e |F|r|e|q|u|e|n|c|y",
+ L"|T|o|-|H|i|t |B|o|n|u|s",
+ L"|A|i|m |B|o|n|u|s",
};
// Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular.
@@ -5806,6 +6846,10 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]=
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it modifies the wearer's Vision Range by the\nlisted number of tiles.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this item is worn, or attached to a worn\nitem, it changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \n\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil, during Burst\nor Autofire volleys.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's CTH value.\n \nIncreased CTH allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nWhen attached to a ranged weapon, this item\nmodifies the weapon's Aim Bonus.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
@@ -5854,6 +6898,10 @@ STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Bright-Vision modifier works only when light\nlevels are very high, for example when looking\ninto tiles lit by Break-Lights or at high noon.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit modifies the wearer's Vision Range by the\nlisted number of tiles, thanks to attachments or\ninherent properties of the weapon.\n \nThis Cave-Vision modifier works only in the dark\nand only underground.\n \nHigher is better.",
L"\n \nWhen this weapon is raised to the shooting position,\nit changes the wearer's field-of-view.\n \nNarrowing the field of view shortens sightrange to\neither side.\n \nLower is better.",
+ L"\n \nThis is the shooter's ability to\ncope with recoil during Burst or Autofire volleys.\n \nHigher is better.",
+ L"\n \nThis is the shooter's ability to\nfrequently reasses how much counter-force they\nneed to apply against a gun's recoil.\n \nNaturally, this has no effect if the weapon lacks\nboth Burst and Auto-Fire modes.\n \nLower frequency makes volleys more accurate on the whole,\nand also makes longer volleys more accurate assuming\nthe shooter can overcome recoil correctly.\n \nLower is better.",
+ L"\n \nThis weapon's to-hit is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased To-Hit allows the gun to hit targets\nmore often, assuming it is also well-aimed.\n \nHigher is better.",
+ L"\n \nThis weapon's Aim Bonus is being modified by\nan ammo, attachment, or built-in attributes.\n \nIncreased Aim Bonus allows the gun to hit\ntargets at longer ranges more often, assuming\nit is also well-aimed.\n \nHigher is better.",
};
// HEADROCK HAM 4: Text for the new CTH indicator.
diff --git a/ext/libpng/projects/visualc71/zlib_VS2005.vcproj b/ext/libpng/projects/visualc71/zlib_VS2005.vcproj
index 0a43a4bb..412863fb 100644
--- a/ext/libpng/projects/visualc71/zlib_VS2005.vcproj
+++ b/ext/libpng/projects/visualc71/zlib_VS2005.vcproj
@@ -37,7 +37,7 @@
/>
0 )
Sleep(sleeptime);
}
+ */
if ( is_networked )
{
diff --git a/gamescreen.cpp b/gamescreen.cpp
index 43e182e2..d9324f36 100644
--- a/gamescreen.cpp
+++ b/gamescreen.cpp
@@ -596,10 +596,12 @@ UINT32 MainGameScreenHandle(void)
if ( gfTacticalDoHeliRun )
{
gfGameScreenLocateToSoldier = FALSE;
- InternalLocateGridNo( gMapInformation.sNorthGridNo, TRUE );
+ //InternalLocateGridNo( gMapInformation.sNorthGridNo, TRUE );
+ InternalLocateGridNo( gGameExternalOptions.iInitialMercArrivalLocation, TRUE );
// Start heli Run...
- StartHelicopterRun( gMapInformation.sNorthGridNo );
+ //StartHelicopterRun( gMapInformation.sNorthGridNo );
+ StartHelicopterRun( gGameExternalOptions.iInitialMercArrivalLocation );
// Update clock by one so that our DidGameJustStatrt() returns now false for things like LAPTOP, etc...
SetGameTimeCompressionLevel( TIME_COMPRESS_X1 );
diff --git a/ja2_VS2005.sln b/ja2_VS2005.sln
index c2d75f54..6661f33f 100644
--- a/ja2_VS2005.sln
+++ b/ja2_VS2005.sln
@@ -263,14 +263,10 @@ Global
{C63466D6-49B5-4C54-AA0D-864F6171FD9B}.Release|Win32.ActiveCfg = Release|Win32
{C63466D6-49B5-4C54-AA0D-864F6171FD9B}.Release|Win32.Build.0 = Release|Win32
{3E43B70D-A22F-4240-B00D-32BD14523335}.Debug|Win32.ActiveCfg = Debug|Win32
- {3E43B70D-A22F-4240-B00D-32BD14523335}.Debug|Win32.Build.0 = Debug|Win32
{3E43B70D-A22F-4240-B00D-32BD14523335}.MapEditor|Win32.ActiveCfg = Release|Win32
{3E43B70D-A22F-4240-B00D-32BD14523335}.MapEditorD|Win32.ActiveCfg = Release|Win32
- {3E43B70D-A22F-4240-B00D-32BD14523335}.MapEditorD|Win32.Build.0 = Release|Win32
{3E43B70D-A22F-4240-B00D-32BD14523335}.Release_WithDebugInfo|Win32.ActiveCfg = Release|Win32
- {3E43B70D-A22F-4240-B00D-32BD14523335}.Release_WithDebugInfo|Win32.Build.0 = Release|Win32
{3E43B70D-A22F-4240-B00D-32BD14523335}.Release|Win32.ActiveCfg = Release|Win32
- {3E43B70D-A22F-4240-B00D-32BD14523335}.Release|Win32.Build.0 = Release|Win32
{9AD14886-DB5C-4EFF-AE17-35F9BD684692}.Debug|Win32.ActiveCfg = Debug|Win32
{9AD14886-DB5C-4EFF-AE17-35F9BD684692}.Debug|Win32.Build.0 = Debug|Win32
{9AD14886-DB5C-4EFF-AE17-35F9BD684692}.MapEditor|Win32.ActiveCfg = MapEditor|Win32
diff --git a/ja2_VS2005.vcproj b/ja2_VS2005.vcproj
index 3a63c714..05e688d6 100644
--- a/ja2_VS2005.vcproj
+++ b/ja2_VS2005.vcproj
@@ -41,7 +41,7 @@
/>
false
bin\VS2010\$(Configuration)\
build\VS2010\$(ProjectName)_$(Configuration)\
- JA2_EN_Release.exe
+ JA2_PO_Release.exe
@@ -183,7 +183,7 @@
true
Multiplayer\raknet;%(AdditionalLibraryDirectories)
Winmm.lib;RakNetLibStatic.lib;ws2_32.lib;DbgHelp.lib;%(AdditionalDependencies)
- $(OutDir)\JA2_EN_Release.exe
+ $(OutDir)\JA2_PO_Release.exe
diff --git a/lua/lua_VS2005.vcproj b/lua/lua_VS2005.vcproj
index eb1212ed..dca6c1a7 100644
--- a/lua/lua_VS2005.vcproj
+++ b/lua/lua_VS2005.vcproj
@@ -39,7 +39,7 @@
/>