*************************************************************************

** Merged source code from development (MP+BMP) trunk (Revision: 3352) **
** https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP    **
*************************************************************************

1 (Rev. 3343)
Changes:
	Control hardcoded list of unclickable ("bad") sectors via XML file. (by Realist)
	On the strategic map, the player cannot click or highlight specific
	sectors (e.g. A4, A5). Introduce a <BadSector> tag in MovementCosts.xml
	that flags a sector as "bad". (<BadSector>1</BadSector>)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Map Screen Interface Map.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Strategic Movement Costs.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/mapscreen.cpp
	/branches/Wanne/JA2 1.13 MP/GameDir/Data/TableData/Map
	/branches/Wanne/JA2 1.13 MP/GameDir/Data/TableData/Map/MovementCosts.xml
	/branches/Wanne/JA2 1.13 MP/GameDir/Data-1.13/TableData/Map
	/branches/Wanne/JA2 1.13 MP/GameDir/Data-1.13/TableData/Map/MovementCosts.xml

2 (Rev. 3344)
Changes:
	Move hardcoded underground sectors initialization to Lua script file. (by Realist)
	Locate "initunderground.lua" at data-xyz\scripts ("xyz" subject to change).
	Lua script allows easily adding underground sectors at arbitrary locations and defining enemy garrisons and creature population.
	Also enables underground bloodcat population.
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Campaign Init.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Campaign Types.h
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Queen Command.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Strategic AI.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Strategic_2005Express.vcproj
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Strategic_VS2008.vcproj
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/UndergroundInit.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/UndergroundInit.h
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/strategicmap.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Soldier Init List.cpp
	/branches/Wanne/JA2 1.13 MP/GameDir/Data/Scripts
	/branches/Wanne/JA2 1.13 MP/GameDir/Data/Scripts/initunderground.lua
	/branches/Wanne/JA2 1.13 MP/GameDir/Data-1.13/Scripts
	/branches/Wanne/JA2 1.13 MP/GameDir/Data-1.13/Scripts/initunderground.lua

3 (Rev. 3345)
Changes:
	Bugfix: In Method CreateDestroyMouseRegionsForFacilityAssignmentMenu() (by Headrock)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Assignments.cpp

4 (Rev. 3346)
Changes:
	Changed order of properties in GameSettings.cpp (by Headrock)
	HAM 3.6 fixes (by Headrock)
	Sorted Data-1.13\ja2_options.ini (by Headrock)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/GameSettings.cpp
	/branches/Wanne/JA2 1.13 MP/Build/GameSettings.h
	/branches/Wanne/JA2 1.13 MP/Build/Laptop/BobbyRGuns.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Assignments.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/MilitiaSquads.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Strategic Mines.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Strategic/Town Militia.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Campaign.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Interface Enhanced.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Interface Items.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Items.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Items.h
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Overhead.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Soldier Control.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Soldier Profile.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Weapons.cpp
	/branches/Wanne/JA2 1.13 MP/Build/TileEngine/Explosion Control.cpp
	/branches/Wanne/JA2 1.13 MP/GameDir/Data-1.13/Ja2_Options.INI
	/branches/Wanne/JA2 1.13 MP/GameDir/INIEditorJA2Options.xml

5 (Rev. 3347)
Changes:
	Bugfix: Turns out that the program is saving the number of used Placement Slots to the temp file fine, 
	but if that number is equal to the limit of how many enemies/civvies are allowed in a sector by the INI settings, 
	it leads to an assertion error instead when trying to re-load that sector. (by Headrock)
	Re-ordered Data/Ja2_Options.INI (by Headrock)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Enemy Soldier Save.cpp
	/branches/Wanne/JA2 1.13 MP/GameDir/Data/Ja2_Options.INI

6 (Rev. 3348)
Changes:
	Translated missing HAM 3.6 German Texts (by systemfehler)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Utils/_GermanText.cpp

7 (Rev. 3351)
Changes:
	PlusAI 1.0 Patch (by Headrock)
Files:
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Points.cpp
	/branches/Wanne/JA2 1.13 MP/Build/Tactical/Points.h
	/branches/Wanne/JA2 1.13 MP/Build/TacticalAI/Attacks.cpp
	/branches/Wanne/JA2 1.13 MP/Build/TacticalAI/DecideAction.cpp
	/branches/Wanne/JA2 1.13 MP/Build/TacticalAI/FindLocations.cpp
	/branches/Wanne/JA2 1.13 MP/Build/TacticalAI/ai.h

8 (Rev. 3352)
Changes:
	Bugfix: The DEBUG only setting "fEnableInventoryPoolQ" is now only enabled in a DEBUG version. In all other builds it is set to FALSE.
Files:
	/branches/Wanne/JA2 1.13 MP/Build/GameSettings.cpp

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@3354 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Wanne
2010-03-07 11:37:32 +00:00
parent 107704922c
commit 09ad70f868
42 changed files with 1414 additions and 986 deletions
+679 -622
View File
File diff suppressed because it is too large Load Diff
+16 -20
View File
@@ -54,9 +54,9 @@ enum
TOPTION_SILENT_SKYRIDER,
TOPTION_LOW_CPU_USAGE,
TOPTION_ENHANCED_DESC_BOX,
// arynn
TOPTION_TOGGLE_TURN_MODE,
TOPTION_TOGGLE_TURN_MODE,
// HEADROCK HAM 3.6:
TOPTION_STAT_PROGRESS_BARS,
@@ -85,7 +85,6 @@ enum
TOPTION_HIDE_BULLETS,
TOPTION_TRACKING_MODE,
NUM_ALL_GAME_OPTIONS,
};
@@ -252,11 +251,11 @@ typedef struct
BOOLEAN gfVSync;
//Animation settings
UINT32 gubPlayerTurnSpeedUpFactor;
UINT32 gubEnemyTurnSpeedUpFactor;
UINT32 gubCreatureTurnSpeedUpFactor;
UINT32 gubMilitiaTurnSpeedUpFactor;
UINT32 gubCivilianTurnSpeedUpFactor;
FLOAT giPlayerTurnSpeedUpFactor;
FLOAT giEnemyTurnSpeedUpFactor;
FLOAT giCreatureTurnSpeedUpFactor;
FLOAT giMilitiaTurnSpeedUpFactor;
FLOAT giCivilianTurnSpeedUpFactor;
//Sound settings
UINT32 guiWeaponSoundEffectsVolume;
@@ -280,7 +279,7 @@ typedef struct
UINT32 guiAllowMilitiaGroupsDelay;
UINT32 guiTrainVeteranMilitiaDelay;
UINT32 guiCreateEachNHours;
UINT32 guiDivOfOriginalMilitia;
UINT32 guiNumMobileMilitiaTrained;
// HEADROCK HAM 3.6: These settings are REDUNDANT.
//UINT32 guiMinMilitiaSquadSize;
//UINT32 guiMaxMilitiaSquadSize;
@@ -334,7 +333,7 @@ typedef struct
UINT32 ubGameProgressPortionIncome;
UINT32 ubGameProgressPortionVisited;
UINT32 ubGameProgressMinimum;
UINT32 ubGameProgressIncrement;
INT32 bGameProgressModifier;
// WDS - Advanced start
//UINT32 ubIMPStartingLevel; // removed - SANDRO
@@ -356,9 +355,9 @@ typedef struct
//Gameplay settings
UINT32 ubExplosivesDamageMultiplier;
UINT32 ubGunDamageMultiplier;
UINT32 ubMeleeDamageMultiplier;
INT32 iExplosivesDamageModifier;
INT32 iGunDamageModifier;
INT32 iMeleeDamageModifier;
UINT32 ubEasyEnemyStartingAlertLevel;
UINT32 ubNormalEnemyStartingAlertLevel;
@@ -513,7 +512,7 @@ BOOLEAN gbBulletTracer;
INT32 iEnhancedDescriptionBox;
// WANNE: Always use "prof.dat".
BOOLEAN fAlwaysUseProfDat;
BOOLEAN fUseDifficultyBasedProfDat;
// CPT: Cover System Settings
UINT8 ubStealthTraitCoverValue;
@@ -556,7 +555,7 @@ BOOLEAN gbBulletTracer;
UINT8 ubAimPenaltyPerTargetShock;
// HEADROCK HAM B2.3: It is now possible for "cowering" to increase a target's suppression.
UINT16 usCowerEffectOnSuppression;
UINT8 ubCowerEffectOnSuppression;
// HEADROCK HAM B2.5: Turn on Realistic Tracers. 0 = off (regular tracers). 1 = Fully realistic tracers. 2 = Tracer Bump + 1.13 Autofire Penalty Reduction
UINT8 ubRealisticTracers;
@@ -668,11 +667,8 @@ BOOLEAN gbBulletTracer;
// HEADROCK HAM 3.1: This is a suppression tool that not everyone will like. It gives an on-screen message when any character has been suppressed so much he's lost his next turn completely!
BOOLEAN fShowSuppressionShutdown;
// HEADROCK HAM 3.1: Set whether you'd like to determine yourself which mine (if any) will shut down during the campaign.
BOOLEAN fManuallySelectMineShutdown;
// HEADROCK HAM 3.1: Select which mine will run out. 0 = no mine. 1 = San Mona (unused), 2 = Drassen, 3 = Alma, 4 = Cambria, 5 = Chitzena, 6 = Grumm.
UINT8 ubWhichMineRunsOut;
// HEADROCK HAM 3.1: Select which mine will run out. -1 = Random selection. 0 = no mine. 1 = San Mona (unused), 2 = Drassen, 3 = Alma, 4 = Cambria, 5 = Chitzena, 6 = Grumm.
INT8 bWhichMineRunsOut;
// HEADROCK HAM 3.1: Can the Humvee go off-road?
BOOLEAN fHumveeOffroad;
+4 -4
View File
@@ -13,12 +13,12 @@
#ifdef JA2EDITOR
//MAP EDITOR BUILD VERSION
CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.3342" };
CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.3353" };
#elif defined JA2BETAVERSION
//BETA/TEST BUILD VERSION
CHAR16 zVersionLabel[256] = { L"Debug v1.13.3342" };
CHAR16 zVersionLabel[256] = { L"Debug v1.13.3353" };
#elif defined CRIPPLED_VERSION
@@ -28,11 +28,11 @@ CHAR16 zVersionLabel[256] = { L"Beta v. 0.98" };
#else
//RELEASE BUILD VERSION
CHAR16 zVersionLabel[256] = { L"Release v1.13.3342" };
CHAR16 zVersionLabel[256] = { L"Release v1.13.3353" };
#endif
CHAR8 czVersionNumber[16] = { "Build 10.03.01" }; //YY.MM.DD
CHAR8 czVersionNumber[16] = { "Build 10.03.07" }; //YY.MM.DD
CHAR16 zTrackingNumber[16] = { L"Z" };
+21 -7
View File
@@ -1901,11 +1901,15 @@ UINT16 DisplayDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
if ( Item[ usIndex ].usItemClass == IC_GUN || Item[ usIndex ].usItemClass == IC_LAUNCHER )
{
gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
// HEADROCK HAM 3.6: Can now take a negative modifier
gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ usIndex ].ubImpact );
//gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
}
else
{
gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
// HEADROCK HAM 3.6: Can now take a negative modifier
gunDamage = (UINT16)GetModifiedMeleeDamage( Weapon[ usIndex ].ubImpact );
//gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
}
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_DAMAGE], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
@@ -2409,7 +2413,9 @@ void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNum
//Info for weapons
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
{
UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
// HEADROCK HAM 3.6: Can now take a negative modifier.
//UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
UINT16 gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ pItemNumbers[ i ] ].ubImpact );
UINT16 readyAPs = (UINT16)(( Weapon[ pItemNumbers[ i ] ].ubReadyTime * (100 - Item[ pItemNumbers[ i ] ].percentreadytimeapreduction)) / 100);
//Calculate AP's
@@ -2563,7 +2569,9 @@ void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNum
//Info for weapons
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
{
UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
// HEADROCK HAM 3.6: Can now take a negative modifier.
UINT16 gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ pItemNumbers[ i ] ].ubImpact );
//UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
swprintf( pStr, L"%s\n%s %d\n%s %d\n%s %d\n%s %s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
@@ -2587,7 +2595,9 @@ void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNum
case IC_THROWING_KNIFE:
case IC_PUNCH:
{
UINT16 meleeDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
// HEADROCK HAM 3.6: Can now take a negative modifier
//UINT16 meleeDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
UINT16 meleeDamage = (UINT16)GetModifiedMeleeDamage( Weapon[ pItemNumbers[ i ] ].ubImpact );
swprintf( pStr, L"%s\n%s %d\n%s %s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
@@ -2640,8 +2650,12 @@ void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNum
// explosives
//if ( (Item[ pItemNumbers[ i ] ].usItemClass == IC_GRENADE)||(Item[ pItemNumbers[ i ] ].usItemClass == IC_BOMB) )
{
UINT16 explDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
UINT16 explStunDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
// HEADROCK HAM 3.6: Can now use negative modifier.
//UINT16 explDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.bExplosivesDamageModifier );
//UINT16 explStunDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
UINT16 explDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage );
UINT16 explStunDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage );
swprintf( pStr, L"%s\n%s %d\n%s %d\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
+5 -4
View File
@@ -14828,7 +14828,8 @@ void CreateDestroyMouseRegionsForFacilityAssignmentMenu( void )
}
if (!fFoundVehicle)
{
uiMenuLine++; // Skip this line, it'll always be shaded anyway.
// WANNE: This is a fix by Headrock
//uiMenuLine++; // Skip this line, it'll always be shaded anyway.
}
}
else if ( iCounter == FAC_REPAIR_ROBOT )
@@ -15032,21 +15033,21 @@ void FacilityAssignmentMenuBtnCallback ( MOUSE_REGION * pRegion, INT32 iReason )
break;
case FAC_REPAIR_ITEMS:
MakeSureToolKitIsInHand( pSoldier );
ChangeSoldiersAssignment( pSoldier, REPAIR );
pSoldier->flags.fFixingRobot = FALSE;
pSoldier->bVehicleUnderRepairID = -1;
ChangeSoldiersAssignment( pSoldier, REPAIR );
break;
case FAC_REPAIR_VEHICLE:
MakeSureToolKitIsInHand( pSoldier );
ChangeSoldiersAssignment( pSoldier, REPAIR );
pSoldier->flags.fFixingRobot = FALSE;
pSoldier->bVehicleUnderRepairID = (INT8)ubVehicleID;
ChangeSoldiersAssignment( pSoldier, REPAIR );
break;
case FAC_REPAIR_ROBOT:
MakeSureToolKitIsInHand( pSoldier );
ChangeSoldiersAssignment( pSoldier, REPAIR );
pSoldier->flags.fFixingRobot = TRUE;
pSoldier->bVehicleUnderRepairID = -1;
ChangeSoldiersAssignment( pSoldier, REPAIR );
break;
case FAC_DOCTOR:
MakeSureMedKitIsInHand( pSoldier );
+37 -29
View File
@@ -23,6 +23,8 @@
#include "VFS/vfs.h"
#include "XMLWriter.h"
#include "UndergroundInit.h"
extern BOOLEAN InitStrategicMovementCosts();
void InitKnowFacilitiesFlags( );
@@ -432,6 +434,15 @@ void BuildUndergroundSectorInfoList()
TrashUndergroundSectorInfo();
if (LetLuaBuildUndergroundSectorInfoList())
// lua script succeeded
return;
// If lua script had any errors
// reset whatever the script may have done
// and use hardcoded underground initialization.
TrashUndergroundSectorInfo();
//********************
//* BASEMENT LEVEL 1 *
//********************
@@ -476,7 +487,6 @@ void BuildUndergroundSectorInfoList()
curr = NewUndergroundNode( 3, 15, 1 );
curr->ubNumTroops = (UINT8)(6 + gGameOptions.ubDifficultyLevel*2 + Random( 3 ));
curr->ubNumElites = (UINT8)(4 + gGameOptions.ubDifficultyLevel + Random( 2 ));
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//P3
curr = NewUndergroundNode( 3, 16, 1 );
@@ -495,99 +505,97 @@ void BuildUndergroundSectorInfoList()
curr->ubNumElites = 20;
break;
}
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//Do all of the mandatory underground mine sectors
//Drassen's mine
//D13_B1
curr = NewUndergroundNode( 13, 4, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//E13_B1
curr = NewUndergroundNode( 13, 5, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//E13_B2
curr = NewUndergroundNode( 13, 5, 2 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//F13_B2
curr = NewUndergroundNode( 13, 6, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR | SOUTH_ADJACENT_SECTOR;
//G13_B2
curr = NewUndergroundNode( 13, 7, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//G13_B3
curr = NewUndergroundNode( 13, 7, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//F13_B3
curr = NewUndergroundNode( 13, 6, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//Cambria's mine
//H8_B1
curr = NewUndergroundNode( 8, 8, 1 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//H9_B1
curr = NewUndergroundNode( 9, 8, 1 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//H9_B2
curr = NewUndergroundNode( 9, 8, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//H8_B2
curr = NewUndergroundNode( 8, 8, 2 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//H8_B3
curr = NewUndergroundNode( 8, 8, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//I8_B3
curr = NewUndergroundNode( 8, 9, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR | SOUTH_ADJACENT_SECTOR;
//J8_B3
curr = NewUndergroundNode( 8, 10, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//Alma's mine
//I14_B1
curr = NewUndergroundNode( 14, 9, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//J14_B1
curr = NewUndergroundNode( 14, 10, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//J14_B2
curr = NewUndergroundNode( 14, 10, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//J13_B2
curr = NewUndergroundNode( 13, 10, 2 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//J13_B3
curr = NewUndergroundNode( 13, 10, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//K13_B3
curr = NewUndergroundNode( 13, 11, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//Grumm's mine
//H3_B1
curr = NewUndergroundNode( 3, 8, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//I3_B1
curr = NewUndergroundNode( 3, 9, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//I3_B2
curr = NewUndergroundNode( 3, 9, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//H3_B2
curr = NewUndergroundNode( 3, 8, 2 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR | EAST_ADJACENT_SECTOR;
//H4_B2
curr = NewUndergroundNode( 4, 8, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
curr->uiFlags |= SF_PENDING_ALTERNATE_MAP;
//H4_B3
curr = NewUndergroundNode( 4, 8, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//G4_B3
curr = NewUndergroundNode( 4, 7, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
}
// Lesh: this function creates randomized world
+2 -1
View File
@@ -475,7 +475,8 @@ typedef struct UNDERGROUND_SECTORINFO
//a sector.
UINT32 uiTimeCurrentSectorWasLastLoaded; //Specifies the last time the player was in the sector
struct UNDERGROUND_SECTORINFO *next;
UINT8 ubAdjacentSectors; //mask containing which sectors are adjacent
UINT8 ubNumBloodcats; // Bloodcat population
UINT8 ubCreatureHabitat; //determines how creatures live in this sector (see creature spreading.c)
UINT8 ubElitesInBattle, ubTroopsInBattle, ubAdminsInBattle, ubCreaturesInBattle;
-43
View File
@@ -3871,49 +3871,6 @@ BOOLEAN IsTheCursorAllowedToHighLightThisSector( INT16 sSectorX, INT16 sSectorY
}
}
void SetUpBadSectorsList( void )
{
// initalizes all sectors to highlighable and then the ones non highlightable are marked as such
INT8 bY;
memset( &sBadSectorsList, 0, sizeof( sBadSectorsList ) );
// the border regions
for( bY = 0; bY < WORLD_MAP_X; bY++ )
{
sBadSectorsList[ 0 ][ bY ] = sBadSectorsList[ WORLD_MAP_X - 1 ][ bY ] = sBadSectorsList[ bY ][ 0 ] = sBadSectorsList[ bY ][ WORLD_MAP_X - 1 ] = TRUE;
}
sBadSectorsList[ 4 ][ 1 ] = TRUE;
sBadSectorsList[ 5 ][ 1 ] = TRUE;
sBadSectorsList[ 16 ][ 1 ] = TRUE;
sBadSectorsList[ 16 ][ 5 ] = TRUE;
sBadSectorsList[ 16 ][ 6 ] = TRUE;
sBadSectorsList[ 16 ][ 10 ] = TRUE;
sBadSectorsList[ 16 ][ 11 ] = TRUE;
sBadSectorsList[ 16 ][ 12 ] = TRUE;
sBadSectorsList[ 16 ][ 13 ] = TRUE;
sBadSectorsList[ 16 ][ 14 ] = TRUE;
sBadSectorsList[ 16 ][ 15 ] = TRUE;
sBadSectorsList[ 16 ][ 16 ] = TRUE;
sBadSectorsList[ 15 ][ 13 ] = TRUE;
sBadSectorsList[ 15 ][ 14 ] = TRUE;
sBadSectorsList[ 15 ][ 15 ] = TRUE;
sBadSectorsList[ 15 ][ 16 ] = TRUE;
sBadSectorsList[ 14 ][ 14 ] = TRUE;
sBadSectorsList[ 14 ][ 15 ] = TRUE;
sBadSectorsList[ 14 ][ 16 ] = TRUE;
sBadSectorsList[ 13 ][ 14 ] = TRUE;
return;
}
void RestoreBackgroundForMapGrid( INT16 sMapX, INT16 sMapY )
{
+1 -1
View File
@@ -167,7 +167,7 @@ void GenerateMilitiaSquad(INT16 sMapX, INT16 sMapY, INT16 sTMapX, INT16 sTMapY,
// Upgrade points for replacing militia with better ones.
UINT8 ubUpgradePoints;
// Calculate default number of militia to place in Target Sector.
UINT8 ubMilitiaToTrain = gGameExternalOptions.iMaxMilitiaPerSector / gGameExternalOptions.guiDivOfOriginalMilitia;
UINT8 ubMilitiaToTrain = gGameExternalOptions.guiNumMobileMilitiaTrained;
// Percentage of troops that should be of any one type:
UINT8 ubTargetElitePercent = 0;
UINT8 ubTargetRegularPercent = 0;
+36 -28
View File
@@ -1224,40 +1224,48 @@ void ProcessQueenCmdImplicationsOfDeath( SOLDIERTYPE *pSoldier )
}
break;
case SOLDIER_CLASS_CREATURE:
#ifdef JA2BETAVERSION
if( ubTotalEnemies <= (UINT32)iMaxEnemyGroupSize && pSector->ubNumCreatures != pSector->ubCreaturesInBattle ||
!pSector->ubNumCreatures || !pSector->ubCreaturesInBattle ||
pSector->ubNumCreatures > gGameExternalOptions.ubGameMaximumNumberOfCreatures || pSector->ubCreaturesInBattle > gGameExternalOptions.ubGameMaximumNumberOfCreatures )
if (pSoldier->ubBodyType == BLOODCAT)
{
DoScreenIndependantMessageBox( L"Underground sector creature counters are bad. What were the last 2-3 things to die, and how? Save game and send to KM with info!!!", MSG_BOX_FLAG_OK, NULL );
if( pSector->ubNumBloodcats > 0 )
pSector->ubNumBloodcats--;
}
#endif
if( pSector->ubNumCreatures )
else
{
pSector->ubNumCreatures--;
}
if( pSector->ubCreaturesInBattle )
{
pSector->ubCreaturesInBattle--;
}
#ifdef JA2BETAVERSION
if( ubTotalEnemies <= (UINT32)iMaxEnemyGroupSize && pSector->ubNumCreatures != pSector->ubCreaturesInBattle ||
!pSector->ubNumCreatures || !pSector->ubCreaturesInBattle ||
pSector->ubNumCreatures > gGameExternalOptions.ubGameMaximumNumberOfCreatures || pSector->ubCreaturesInBattle > gGameExternalOptions.ubGameMaximumNumberOfCreatures )
{
DoScreenIndependantMessageBox( L"Underground sector creature counters are bad. What were the last 2-3 things to die, and how? Save game and send to KM with info!!!", MSG_BOX_FLAG_OK, NULL );
}
#endif
if( pSector->ubNumCreatures )
{
pSector->ubNumCreatures--;
}
if( pSector->ubCreaturesInBattle )
{
pSector->ubCreaturesInBattle--;
}
if( !pSector->ubNumCreatures && gWorldSectorX != 9 && gWorldSectorY != 10 )
{ //If the player has successfully killed all creatures in ANY underground sector except J9
//then cancel any pending creature town attack.
DeleteAllStrategicEventsOfType( EVENT_CREATURE_ATTACK );
}
if( !pSector->ubNumCreatures && gWorldSectorX != 9 && gWorldSectorY != 10 )
{ //If the player has successfully killed all creatures in ANY underground sector except J9
//then cancel any pending creature town attack.
DeleteAllStrategicEventsOfType( EVENT_CREATURE_ATTACK );
}
// a monster has died. Post an event to immediately check whether a mine has been cleared.
AddStrategicEventUsingSeconds( EVENT_CHECK_IF_MINE_CLEARED, GetWorldTotalSeconds() + 15, 0);
// a monster has died. Post an event to immediately check whether a mine has been cleared.
AddStrategicEventUsingSeconds( EVENT_CHECK_IF_MINE_CLEARED, GetWorldTotalSeconds() + 15, 0);
if( pSoldier->ubBodyType == QUEENMONSTER )
{
//Need to call this, as the queen is really big, and killing her leaves a bunch
//of bad tiles in behind her. Calling this function cleans it up.
InvalidateWorldRedundency();
//Now that the queen is dead, turn off the creature quest.
EndCreatureQuest();
EndQuest( QUEST_CREATURES, gWorldSectorX, gWorldSectorY );
if( pSoldier->ubBodyType == QUEENMONSTER )
{
//Need to call this, as the queen is really big, and killing her leaves a bunch
//of bad tiles in behind her. Calling this function cleans it up.
InvalidateWorldRedundency();
//Now that the queen is dead, turn off the creature quest.
EndCreatureQuest();
EndQuest( QUEST_CREATURES, gWorldSectorX, gWorldSectorY );
}
}
break;
}
-14
View File
@@ -3673,20 +3673,6 @@ BOOLEAN LoadStrategicAI( HWFILE hFile )
pSector->ubNumTroops -= 2;
}
}
if( ubSAIVersion < 16 )
{
UNDERGROUND_SECTORINFO *pSector;
pSector = FindUnderGroundSector( 3, 15, 1 );
if( pSector )
{
pSector->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
}
pSector = FindUnderGroundSector( 3, 16, 1 );
if( pSector )
{
pSector->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
}
}
if( ubSAIVersion < 17 )
{ //Patch all groups that have this flag set
gubNumGroupsArrivedSimultaneously = 0;
+8 -12
View File
@@ -204,17 +204,14 @@ void InitializeMines( void )
} while (gMineStatus[ubDepletedMineIndex].fEmpty || (ubDepletedMineIndex == MINE_ALMA));
// HEADROCK HAM 3.1: We can now select which mine runs out, or disable mine shutdown.
if (gGameExternalOptions.fManuallySelectMineShutdown)
// Make sure selection isn't 0 (no mine runs out) or invalid (San Mona, Alma)
if (gGameExternalOptions.bWhichMineRunsOut > 0 &&
gGameExternalOptions.bWhichMineRunsOut < MAX_NUMBER_OF_MINES &&
gGameExternalOptions.bWhichMineRunsOut-1 != MINE_SAN_MONA &&
gGameExternalOptions.bWhichMineRunsOut-1 != MINE_ALMA )
{
// Make sure selection isn't 0 (no mine runs out) or invalid (San Mona, Alma)
if (gGameExternalOptions.ubWhichMineRunsOut > 0 &&
gGameExternalOptions.ubWhichMineRunsOut < MAX_NUMBER_OF_MINES &&
gGameExternalOptions.ubWhichMineRunsOut-1 != MINE_SAN_MONA &&
gGameExternalOptions.ubWhichMineRunsOut-1 != MINE_ALMA )
{
// Set depleted mine index.
ubDepletedMineIndex = (gGameExternalOptions.ubWhichMineRunsOut-1);
}
// Set depleted mine index.
ubDepletedMineIndex = (gGameExternalOptions.bWhichMineRunsOut-1);
}
for( ubMineIndex = 0; ubMineIndex < MAX_NUMBER_OF_MINES; ubMineIndex++ )
@@ -222,8 +219,7 @@ void InitializeMines( void )
pMineStatus = &(gMineStatus[ ubMineIndex ]);
// HEADROCK HAM 3.1: We can disable mine shutdown, so make sure the settings aren't telling us to do so.
if (!(gGameExternalOptions.fManuallySelectMineShutdown && gGameExternalOptions.ubWhichMineRunsOut == 0) &&
(ubMineIndex == ubDepletedMineIndex))
if (gGameExternalOptions.bWhichMineRunsOut != 0 && ubMineIndex == ubDepletedMineIndex)
{
if ( ubDepletedMineIndex == MINE_DRASSEN )
{
+13
View File
@@ -11,6 +11,9 @@
#include "Debug Control.h"
#include "Tactical Save.h"
#endif
#include "Map Screen Interface Map.h"
extern BOOLEAN sBadSectorsList[ WORLD_MAP_X ][ WORLD_MAP_X ];
typedef enum
{
@@ -115,6 +118,11 @@ smctableStartElementHandle(void *userData, const XML_Char *name, const XML_Char
pData->maxReadDepth++; //we are not skipping this element
//fprintf (outfile, "Entering Traversal Rating\n");
}
else if(strcmp(name, "BadSector") == 0 && pData->curElement == SMCTABLE_ELEMENT_SECTOR)
{
pData->curElement = SMCTABLE_ELEMENT_TRAVELTYPE;
pData->maxReadDepth++; //we are not skipping this element
}
pData->szCharData[0] = '\0';
}
pData->currentDepth++;
@@ -317,6 +325,11 @@ smctableEndElementHandle(void *userData, const XML_Char *name)
{
pData->travHere = trav_type;
}
else if(strcmp(name, "BadSector") == 0)
{
bool fBadSector = atoi(pData->szCharData) > 0;
sBadSectorsList[pData->uiColNumber][pData->uiRowNumber] = fBadSector;
}
else
{
// Bogus Traversal Reference
+8
View File
@@ -510,6 +510,10 @@
RelativePath=".\Town Militia.h"
>
</File>
<File
RelativePath=".\UndergroundInit.h"
>
</File>
</Filter>
<Filter
Name="Source Files"
@@ -692,6 +696,10 @@
RelativePath=".\Town Militia.cpp"
>
</File>
<File
RelativePath=".\UndergroundInit.cpp"
>
</File>
<File
RelativePath=".\XML_Army.cpp"
>
+8
View File
@@ -511,6 +511,10 @@
RelativePath="Town Militia.h"
>
</File>
<File
RelativePath=".\UndergroundInit.h"
>
</File>
</Filter>
<Filter
Name="Source Files"
@@ -691,6 +695,10 @@
RelativePath="Town Militia.cpp"
>
</File>
<File
RelativePath=".\UndergroundInit.cpp"
>
</File>
<File
RelativePath="XML_Army.cpp"
>
+2 -2
View File
@@ -1965,7 +1965,7 @@ UINT8 CalcNumMilitiaTrained(UINT8 ubBestLeadership, BOOLEAN fMobile)
else
{
// Default Squad Size for Mobiles, read from INI.
ubMilitiaToTrain = (gGameExternalOptions.iMaxMilitiaPerSector / gGameExternalOptions.guiDivOfOriginalMilitia);
ubMilitiaToTrain = gGameExternalOptions.guiNumMobileMilitiaTrained;
// Is affected by Leadership?
if (gGameExternalOptions.fLeadershipAffectsMobileMilitiaQuantity &&
@@ -1993,7 +1993,7 @@ UINT8 CalcNumMilitiaTrained(UINT8 ubBestLeadership, BOOLEAN fMobile)
// exceeding the range (latter shouldn't happen) will train a full squad. Others will train less. If
// leadership was the minimum required, only 3 militia are trained.
ubMilitiaToTrain = ((ubBestLeadership * ubMilitiaToTrain) / ubLeadershipRange) + 1;
ubMilitiaToTrain = __min(ubMilitiaToTrain, gGameExternalOptions.iMaxMilitiaPerSector / gGameExternalOptions.guiDivOfOriginalMilitia);
ubMilitiaToTrain = __min(ubMilitiaToTrain, gGameExternalOptions.guiNumMobileMilitiaTrained);
ubMilitiaToTrain = __max(3, ubMilitiaToTrain);
}
}
+161
View File
@@ -0,0 +1,161 @@
#include <iostream>
#include <string>
#include <sstream>
#include "UndergroundInit.h"
#include "Campaign Init.h"
#include "Campaign Types.h"
#include "FileMan.h"
#include "GameSettings.h"
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
extern UNDERGROUND_SECTORINFO* NewUndergroundNode( UINT8 ubSectorX, UINT8 ubSectorY, UINT8 ubSectorZ );
static int l_addSector(lua_State *L);
static int lh_getIntegerFromTable(lua_State *L, char * fieldname);
static std::string lh_getStringFromTable(lua_State *L, char * fieldname);
static std::wstring lh_getWStringFromTable(lua_State *L, char * fieldname);
static bool locationStringToCoordinates(std::string loc, UINT8* x, UINT8* y, UINT8* z);
using namespace std;
BOOLEAN LetLuaBuildUndergroundSectorInfoList()
{
char * filename = "scripts\\initunderground.lua";
UINT32 size, bytesRead;
char* buffer;
HWFILE file = FileOpen(filename, FILE_ACCESS_READ, FALSE);
if (!file)
return false;
size = FileSize(filename);
buffer = new char[size+1];
buffer[size] = 0;
FileRead(file, buffer, size, &bytesRead);
FileClose(file);
lua_State *L = lua_open();
luaL_openlibs(L);
lua_register(L, "addSector", l_addSector);
lua_pushinteger(L, gGameOptions.ubDifficultyLevel);
lua_setglobal(L, "difficultyLevel");
lua_pushinteger(L, gGameOptions.ubGameStyle);
lua_setglobal(L, "gameStyle");
if (luaL_dostring(L, buffer))
{
// oh noes, error
// TODO: write to log or something
return false;
}
lua_close(L);
delete[] buffer;
return true;
}
static int l_addSector(lua_State *L)
{
UNDERGROUND_SECTORINFO* curr = NULL;
std::string sector_id = lh_getStringFromTable(L, "location");
UINT8 x, y, z;
if (locationStringToCoordinates(sector_id, &x, &y, &z))
{
curr = NewUndergroundNode(x, y, z);
curr->ubNumAdmins = lh_getIntegerFromTable(L, "numAdmins");
curr->ubNumTroops = lh_getIntegerFromTable(L, "numTroops");
curr->ubNumElites = lh_getIntegerFromTable(L, "numElites");
curr->ubCreatureHabitat = lh_getIntegerFromTable(L, "creatureHabitat");
curr->ubNumCreatures = lh_getIntegerFromTable(L, "numCreatures");
curr->ubNumBloodcats = lh_getIntegerFromTable(L, "numBloodcats");
}
return 0; // number of results
}
static int lh_getIntegerFromTable(lua_State *L, char * fieldname)
{
lua_getfield(L, -1, fieldname);
int i = lua_tointeger(L, -1);
lua_pop(L, 1);
return i;
}
static std::string lh_getStringFromTable(lua_State *L, char * fieldname)
{
lua_getfield(L, -1, fieldname);
string s = lua_tostring(L, -1);
lua_pop(L, 1);
return s;
}
// extract x,y,z from strings like "D13-1"
static bool locationStringToCoordinates(std::string loc, UINT8* x, UINT8* y, UINT8* z)
{
int length = loc.length();
// gather row
if (length < 4 || length > 5)
return false;
char row = loc[0];
if (row >= 'A' && row <= 'P')
*y = row - 'A' + 1;
else if (row >= 'a' && row <= 'p')
*y = row - 'a' + 1;
else
return false;
// gather column
loc = loc.substr(1);
stringstream ss = stringstream();
if (loc[0] >= '0' && loc[0] <= '9')
{
ss << loc[0];
loc = loc.substr(1);
}
if (loc[0] >= '0' && loc[0] <= '9')
{
ss << loc[0];
loc = loc.substr(1);
}
int col;
ss >> col;
if (col >= 1 && col <= 16)
*x = col;
else
return false;
// gather level
char lvl = loc[loc.length() - 1];
if (lvl >= '1' && lvl <= '3')
*z = lvl - '0';
else
return false;
return true;
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef _UNDERGROUNDINIT_H
#define _UNDERGROUNDINIT_H
#include "Types.h"
extern BOOLEAN LetLuaBuildUndergroundSectorInfoList();
#endif
-2
View File
@@ -4448,8 +4448,6 @@ UINT32 MapScreenInit(void)
{
VOBJECT_DESC VObjectDesc;
SetUpBadSectorsList( );
// setup message box system
InitGlobalMessageList( );
+4 -1
View File
@@ -3035,7 +3035,10 @@ void GetSectorIDString( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ , STR16 zS
swprintf( zString, L"P3: %s", pLandTypeStrings[ SHELTER ] );
break;
default:
swprintf( zString, L"%c%d: %s", 'A' + sSectorY - 1, sSectorX, pLandTypeStrings[ CREATURE_LAIR ] );
if (pUnderground->ubNumCreatures)
swprintf( zString, L"%c%d: %s", 'A' + sSectorY - 1, sSectorX, pLandTypeStrings[ CREATURE_LAIR ] );
else
swprintf( zString, L"%c%d-%d", 'A' + sSectorY - 1, sSectorX, bSectorZ );
break;
}
}
+3 -2
View File
@@ -1447,7 +1447,8 @@ UINT8 CurrentPlayerProgressPercentage(void)
}
// Add a static amount of points, as declared in the INI file.
usCurrentProgress += gGameExternalOptions.ubGameProgressIncrement;
// HEADROCK HAM 3.6: Allow negative modifiers!
usCurrentProgress = __max(0, (INT16)(usCurrentProgress + gGameExternalOptions.bGameProgressModifier));
// And failsafes here. I'm not 100% sure about these though: I've never personally seen progress
// values go over 100, and I don't think they SHOULD... Can the game handle values > 100? Should it?
@@ -1457,6 +1458,7 @@ UINT8 CurrentPlayerProgressPercentage(void)
return((UINT8)usCurrentProgress);
}
UINT8 HighestPlayerProgressPercentage(void)
{
if( gfEditMode )
@@ -1465,7 +1467,6 @@ UINT8 HighestPlayerProgressPercentage(void)
return(gStrategicStatus.ubHighestProgress);
}
// monitors the highest level of progress that player has achieved so far (checking hourly),
// as opposed to his immediate situation (which may be worse if he's suffered a setback).
void HourlyProgressUpdate(void)
+7 -3
View File
@@ -822,8 +822,9 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile()
return TRUE;
}
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfEnemies )
// // WANNE: Fix by Headrock:
// Turns out that the program is saving the number of used Placement Slots to the temp file fine, but if that number is equal to the limit of how many enemies/civvies are allowed in a sector by the INI settings, it leads to an assertion error instead when trying to re-load that sector.
if( slots < 0 || slots > (int)gGameExternalOptions.ubGameMaximumNumberOfEnemies )
{ //bad IO!
#ifdef JA2TESTVERSION
sprintf( zReason, "EnemySoldier -- illegal slot value of %d. KM", slots );
@@ -1161,7 +1162,10 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile()
FileClose( hfile );
return TRUE;
}
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfCivilians )
// WANNE: Fix by Headrock:
// Turns out that the program is saving the number of used Placement Slots to the temp file fine, but if that number is equal to the limit of how many enemies/civvies are allowed in a sector by the INI settings, it leads to an assertion error instead when trying to re-load that sector.
if( slots < 0 || slots > (int)gGameExternalOptions.ubGameMaximumNumberOfCivilians )
{
//bad IO!
#ifdef JA2TESTVERSION
+12 -2
View File
@@ -5161,7 +5161,12 @@ void DrawExplosiveValues( OBJECTTYPE * gpItemDescObject )
// print value
SetFontForeground( 5 );
swprintf( pStr, L"%2d", Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubDamage + ( (Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubDamage * gGameExternalOptions.ubExplosivesDamageMultiplier ) / 100 ));
// HEADROCK HAM 3.6: Can now use negative modifier.
UINT16 explDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubDamage );
//swprintf( pStr, L"%2d", Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubDamage + ( (Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubDamage * gGameExternalOptions.ubExplosivesDamageMultiplier ) / 100 ));
swprintf( pStr, L"%2d", explDamage );
uiStringLength=StringPixLength(pStr, ITEMDESC_FONT );
FindFontRightCoordinates( (INT16)(gWeaponStats[ 2 ].sX + gsInvDescX + gWeaponStats[ 2 ].sValDx), (INT16)(gWeaponStats[ 2 ].sY + gsInvDescY ), ITEM_STATS_WIDTH ,ITEM_STATS_HEIGHT ,pStr, BLOCKFONT2, &sStrX, &usY);
mprintf( sStrX, gWeaponStats[ 2 ].sY + gsInvDescY, pStr );
@@ -5176,7 +5181,12 @@ void DrawExplosiveValues( OBJECTTYPE * gpItemDescObject )
// print value
SetFontForeground( 5 );
swprintf( pStr, L"%2d", Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubStunDamage + ( (Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubStunDamage * gGameExternalOptions.ubExplosivesDamageMultiplier ) / 100 ));
// HEADROCK HAM 3.6: Can now use negative modifier.
UINT16 explStunDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubStunDamage );
//swprintf( pStr, L"%2d", Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubStunDamage + ( (Explosive[Item[ gpItemDescObject->usItem ].ubClassIndex ].ubStunDamage * gGameExternalOptions.ubExplosivesDamageMultiplier ) / 100 ));
swprintf( pStr, L"%2d", explStunDamage );
uiStringLength=StringPixLength(pStr, ITEMDESC_FONT );
FindFontRightCoordinates( (INT16)(gWeaponStats[ 3 ].sX + gsInvDescX + gWeaponStats[ 3 ].sValDx), (INT16)(gWeaponStats[ 3 ].sY + gsInvDescY ), ITEM_STATS_WIDTH ,ITEM_STATS_HEIGHT ,pStr, BLOCKFONT2, &sStrX, &usY);
mprintf( sStrX, gWeaponStats[ 3 ].sY + gsInvDescY, pStr );
+5 -2
View File
@@ -8528,8 +8528,11 @@ void GetHelpTextForItem( STR16 pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldier
case IC_BOMB:
// explosives
{
UINT16 explDamage = (UINT16)( Explosive[Item[ usItem ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ usItem ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
UINT16 explStunDamage = (UINT16)( Explosive[Item[ usItem ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ usItem ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
// HEADROCK HAM 3.6: Can now use negative modifier.
//UINT16 explDamage = (UINT16)( Explosive[Item[ usItem ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ usItem ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
//UINT16 explStunDamage = (UINT16)( Explosive[Item[ usItem ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ usItem ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
UINT16 explDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usItem ].ubClassIndex].ubDamage );
UINT16 explStunDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usItem ].ubClassIndex].ubStunDamage );
#ifdef CHINESE
swprintf( pStr, ChineseSpecString5,
+30
View File
@@ -8967,3 +8967,33 @@ INT8 FindBackpackOnSoldier( SOLDIERTYPE * pSoldier )
}
return( ITEM_NOT_FOUND );
}
// HEADROCK HAM 3.6: This applies the INI modifier to explosives
UINT8 GetModifiedExplosiveDamage( UINT16 sDamage )
{
sDamage = (INT16)(( sDamage * gGameExternalOptions.iExplosivesDamageModifier ) / 100);
sDamage = __max(1, sDamage);
sDamage = __min(255, sDamage);
return (UINT8)sDamage;
}
UINT8 GetModifiedMeleeDamage( UINT16 sDamage )
{
sDamage = (INT16)(( sDamage * gGameExternalOptions.iMeleeDamageModifier ) / 100);
sDamage = __max(1, sDamage);
sDamage = __min(255, sDamage);
return (UINT8)sDamage;
}
UINT8 GetModifiedGunDamage( UINT16 sDamage )
{
sDamage = (INT16)(( sDamage * gGameExternalOptions.iGunDamageModifier ) / 100);
sDamage = __max(1, sDamage);
sDamage = __min(255, sDamage);
return (UINT8)sDamage;
}
+5
View File
@@ -346,6 +346,11 @@ INT16 GetSnowCamoBonus( OBJECTTYPE * pObj );
// HEADROCK HAM 3.6: Looks for a backpack anywhere on this character.
INT8 FindBackpackOnSoldier( SOLDIERTYPE * pSoldier );
// HEADROCK HAM 3.6: Handler functions to get modified damage with INI parameter.
UINT8 GetModifiedExplosiveDamage( UINT16 ubDamage );
UINT8 GetModifiedMeleeDamage( UINT16 ubDamage );
UINT8 GetModifiedGunDamage( UINT16 ubDamage );
#endif
+8 -5
View File
@@ -7281,6 +7281,14 @@ INT8 CalcSuppressionTolerance( SOLDIERTYPE * pSoldier )
{
bTolerance += pSoldier->bTilesMoved / gGameExternalOptions.ubTilesMovedPerBonusTolerancePoint;
}
// HEADROCK HAM 3.6: This value has moved here. It reduces tolerance if the character is massively shocked.
if (gGameExternalOptions.ubCowerEffectOnSuppression != 0)
{
if (pSoldier->aiData.bShock > bTolerance)
{
bTolerance -= gGameExternalOptions.ubCowerEffectOnSuppression;
}
}
bTolerance = __max(bTolerance, gGameExternalOptions.ubSuppressionToleranceMin);
bTolerance = __min(bTolerance, gGameExternalOptions.ubSuppressionToleranceMax);
@@ -7428,11 +7436,6 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker )
{
fCower = true;
// If cowering, increase suppression effectiveness by external percentage. If the setting is
// over 100%, then the condition of cowering makes the character even MORE susceptible to suppression.
if (gGameExternalOptions.usCowerEffectOnSuppression > 0)
ubPointsLost = (ubPointsLost * gGameExternalOptions.usCowerEffectOnSuppression) / 100;
// If soldier is visible on-screen, report to player that they are cowering.
if ( pSoldier->bVisible != -1 )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113HAMMessage[0], pSoldier->name );
+93
View File
@@ -2646,3 +2646,96 @@ INT16 GetAPsToJumpOver( SOLDIERTYPE *pSoldier )
{
return( GetAPsToChangeStance( pSoldier, ANIM_STAND ) + APBPConstants[AP_JUMP_OVER] );
}
// HEADROCK HAM 3.6: Calculate the actual AP cost to add this many Extra Aiming levels, taking into account
// APBP Constants and extra game features.
INT32 CalcAPCostForAiming( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAimTime )
{
INT16 sAPCost = 0;
UINT16 usItemNum = pSoldier->inv[HANDPOS].usItem;
Assert(pSoldier != NULL);
Assert(&pSoldier->inv[HANDPOS] != NULL);
if (gGameExternalOptions.fIncreasedAimingCost )
{
// HEADROCK HAM B2.6: Changed the number of APs to attack when aiming.
// HEADROCK HAM 3.1: Externalized the entire function to allow customization of each detail.
if (bAimTime > 0)
{
// HEADROCK HAM 3: One-time penalty: Add part of the weapon's Ready AP cost. Reinstated because
// it's now externalized.
if (gGameExternalOptions.ubFirstAimReadyCostDivisor > 0)
{
UINT16 usWeaponReadyTime;
UINT8 ubReadyTimeDivisor;
usWeaponReadyTime = Weapon[ usItemNum ].ubReadyTime * (100 - GetPercentReadyTimeAPReduction(&pSoldier->inv[HANDPOS])) / 100;
ubReadyTimeDivisor = gGameExternalOptions.ubFirstAimReadyCostDivisor;
sAPCost += usWeaponReadyTime / ubReadyTimeDivisor;
}
// If the weapon has a scope, and the target is within eligible range for scope use
if ( IsScoped(&pSoldier->inv[HANDPOS])
&& GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo ) >= GetMinRangeForAimBonus(&pSoldier->inv[HANDPOS]) )
{
// Add an individual cost for EACH click, as necessary.
sAPCost += APBPConstants[AP_FIRST_CLICK_AIM_SCOPE];
if (bAimTime > 1)
sAPCost += APBPConstants[AP_SECOND_CLICK_AIM_SCOPE];
if (bAimTime > 2)
sAPCost += APBPConstants[AP_THIRD_CLICK_AIM_SCOPE];
if (bAimTime > 3)
sAPCost += APBPConstants[AP_FOURTH_CLICK_AIM_SCOPE];
if (bAimTime > 4)
sAPCost += APBPConstants[AP_FIFTH_CLICK_AIM_SCOPE];
if (bAimTime > 5)
sAPCost += APBPConstants[AP_SIXTH_CLICK_AIM_SCOPE];
if (bAimTime > 6)
sAPCost += APBPConstants[AP_SEVENTH_CLICK_AIM_SCOPE];
if (bAimTime > 7)
sAPCost += APBPConstants[AP_EIGHTTH_CLICK_AIM_SCOPE];
}
// Weapon has no scope or not within requried range. Apply regular AP costs.
else
{
sAPCost += bAimTime * APBPConstants[AP_CLICK_AIM];
}
}
else
{
return(0);
}
}
// Regular cost system
else
{
sAPCost += bAimTime * APBPConstants[AP_CLICK_AIM];
}
return sAPCost;
}
// HEADROCK HAM 3.6: Calculate how many Aiming Levels we can get with a given amount of APs.
INT8 CalcAimingLevelsAvailableWithAP( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAPsLeft )
{
INT8 bAllowedLevels = 0;
for (INT16 x = APBPConstants[AP_MIN_AIM_ATTACK]; x <= AllowedAimingLevels(pSoldier); x++)
{
if (CalcAPCostForAiming( pSoldier, sTargetGridNo, x ) <= (INT16)bAPsLeft)
{
bAllowedLevels = x;
}
else
{
break;
}
}
return (bAllowedLevels);
}
+2
View File
@@ -347,5 +347,7 @@ UINT16 GetAPsToReloadRobot( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pRobot );
INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJECTTYPE * pAmmo, BOOLEAN usAllAPs = TRUE );
INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier );
INT32 CalcAPCostForAiming( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAimTime );
INT8 CalcAimingLevelsAvailableWithAP( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAPsLeft );
#endif
+8 -8
View File
@@ -7611,23 +7611,23 @@ void CalculateSoldierAniSpeed( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pStatsSoldier
}
UINT8 GetSpeedUpFactor( )
FLOAT GetSpeedUpFactor( )
{
switch( gTacticalStatus.ubCurrentTeam )
{
case OUR_TEAM:
return gGameExternalOptions.gubPlayerTurnSpeedUpFactor;
return gGameExternalOptions.giPlayerTurnSpeedUpFactor;
case ENEMY_TEAM:
return gGameExternalOptions.gubEnemyTurnSpeedUpFactor;
return gGameExternalOptions.giEnemyTurnSpeedUpFactor;
case CREATURE_TEAM:
return gGameExternalOptions.gubCreatureTurnSpeedUpFactor;
return gGameExternalOptions.giCreatureTurnSpeedUpFactor;
case MILITIA_TEAM:
return gGameExternalOptions.gubMilitiaTurnSpeedUpFactor;
return gGameExternalOptions.giMilitiaTurnSpeedUpFactor;
case CIV_TEAM:
return gGameExternalOptions.gubCivilianTurnSpeedUpFactor;
return gGameExternalOptions.giCivilianTurnSpeedUpFactor;
}
return 1;
return 1.0;
}
void SetSoldierAniSpeed( SOLDIERTYPE *pSoldier )
@@ -7681,7 +7681,7 @@ void SetSoldierAniSpeed( SOLDIERTYPE *pSoldier )
if ( gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT )
if( GetSpeedUpFactor() )
pSoldier->sAniDelay /= GetSpeedUpFactor();
pSoldier->sAniDelay = (INT16)((FLOAT)pSoldier->sAniDelay * GetSpeedUpFactor());
else
pSoldier->sAniDelay = 0;
}
+21 -6
View File
@@ -50,8 +50,9 @@
#endif
#include "connect.h"
#include "Map Edgepoints.h"
#include "Queen Command.h"
BOOLEAN gfOriginalList = TRUE;
SOLDIERINITNODE *gSoldierInitHead = NULL;
@@ -1942,16 +1943,30 @@ void AddSoldierInitListBloodcats()
{
SECTORINFO *pSector;
SOLDIERINITNODE *curr;
UINT8 ubSectorID;
UINT8 ubSectorID = 0;
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("AddSoldierInitListBloodcats"));
SECTORINFO dummy;
if( gbWorldSectorZ )
{
return; //no bloodcats underground.
}
// This function can only cope with regular SECTORINFO objects.
// So let's fake a sector above ground and copy over data from UNDERGROUND_SECTORINFO.
UNDERGROUND_SECTORINFO *pUndergroundSector
= FindUnderGroundSector(gWorldSectorX, gWorldSectorY, gbWorldSectorZ);
ubSectorID = (UINT8)SECTOR( gWorldSectorX, gWorldSectorY );
pSector = &SectorInfo[ ubSectorID ];
if (!pUndergroundSector)
return;
pSector = &dummy;
pSector->bBloodCats = pUndergroundSector->ubNumBloodcats;
pSector->bBloodCatPlacements = pUndergroundSector->ubNumBloodcats;
}
else
{
ubSectorID = (UINT8)SECTOR( gWorldSectorX, gWorldSectorY );
pSector = &SectorInfo[ ubSectorID ];
}
if( !pSector->bBloodCatPlacements )
{ //This map has no bloodcat placements, so don't waste CPU time.
+1 -1
View File
@@ -246,7 +246,7 @@ BOOLEAN LoadMercProfiles(void)
UINT32 uiLoop, uiLoop2;//, uiLoop3;
UINT16 usItem;//, usNewGun, usAmmo, usNewAmmo;
if (gGameExternalOptions.fAlwaysUseProfDat == FALSE)
if (gGameExternalOptions.fUseDifficultyBasedProfDat == TRUE)
{
switch ( gGameOptions.ubDifficultyLevel)
{
+11 -5
View File
@@ -4976,7 +4976,7 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, SOLDIERTYPE * pTarget, UINT8 ubHitLocat
// HEADROCK HAM 3.2: Critical headshots may now cause blindness, based on shot damage.
if (gGameExternalOptions.ubChanceBlindedByHeadshot)
{
if (PreRandom(gGameExternalOptions.ubChanceBlindedByHeadshot) == 0)
if (__min(100,(PreRandom(100)+1 + iImpact)) <= gGameExternalOptions.ubChanceBlindedByHeadshot)
{
if (pTarget->bBlindedCounter < iImpact / 10 )
pTarget->bBlindedCounter = iImpact / 10;
@@ -6181,17 +6181,23 @@ UINT8 GetDamage ( OBJECTTYPE *pObj )
if ( Item[pObj->usItem].usItemClass == IC_BLADE || Item[pObj->usItem].usItemClass == IC_PUNCH || Item[pObj->usItem].usItemClass == IC_TENTACLES )
{
UINT8 ubDamage = Weapon[ pObj->usItem ].ubImpact + GetMeleeDamageBonus(pObj);
return min(255, (UINT8)( (ubDamage) + ( (double)ubDamage / 100) * gGameExternalOptions.ubMeleeDamageMultiplier ) );
// HEADROCK HAM 3.6: Can now take a negative modifier
UINT8 ubDamage = (UINT8)GetModifiedMeleeDamage( Weapon[ pObj->usItem ].ubImpact );
ubDamage += GetMeleeDamageBonus(pObj);
//return min(255, (UINT8)( (ubDamage) + ( (double)ubDamage / 100) * gGameExternalOptions.ubMeleeDamageMultiplier ) );
return min(255, (UINT8)ubDamage);
}
else
{
UINT8 ubDamage = Weapon[ pObj->usItem ].ubImpact;
// HEADROCK HAM 3.6: Can now take a negative modifier
UINT8 ubDamage = (UINT8)GetModifiedMeleeDamage( Weapon[ pObj->usItem ].ubImpact );
// WTF? Why do only small weapons get their damage bonus?!
if (FitsInSmallPocket(pObj) == true)
{
ubDamage += GetDamageBonus(pObj);
}
return min(255, (UINT8)( (ubDamage) + ( (double)ubDamage / 100) * gGameExternalOptions.ubGunDamageMultiplier ) );
return min(255, (UINT8)ubDamage );
}
}
+11 -3
View File
@@ -254,7 +254,9 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns
if ( TANK( pSoldier ) )
{
ubMaxPossibleAimTime = pSoldier->bActionPoints - ubMinAPcost;
// HEADROCK HAM 3.6: Calculation must take into account APBP constants and other aiming modifications!
INT8 bAPsLeft = pSoldier->bActionPoints - ubMinAPcost;
ubMaxPossibleAimTime = CalcAimingLevelsAvailableWithAP( pSoldier, pOpponent->sGridNo, bAPsLeft );
// always burst
if ( ubMaxPossibleAimTime < ubBurstAPs )
@@ -268,7 +270,9 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns
}
else
{
ubMaxPossibleAimTime = min(AllowedAimingLevels(pSoldier),pSoldier->bActionPoints - ubMinAPcost);
// HEADROCK HAM 3.6: Calculation must take into account APBP constants and other aiming modifications!
INT8 bAPsLeft = pSoldier->bActionPoints - ubMinAPcost;
ubMaxPossibleAimTime = CalcAimingLevelsAvailableWithAP( pSoldier, pOpponent->sGridNo, bAPsLeft );
}
// consider the various aiming times
@@ -287,7 +291,11 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns
//sprintf(tempstr,"Vs. %s, at AimTime %d, ubChanceToHit = %d",ExtMen[pOpponent->ubID].name,ubAimTime,ubChanceToHit);
//PopMessage(tempstr);
iHitRate = (pSoldier->bActionPoints * ubChanceToHit) / (ubRawAPCost + ubAimTime);
// HEADROCK HAM 3.6: Actual aiming time is no longer 1AP per level... Failure to take this into account
// may yield skewed results in favour of high-aim targets.
INT16 sActualAimTime = CalcAPCostForAiming( pSoldier, pOpponent->sGridNo, (INT8)ubAimTime );
iHitRate = (pSoldier->bActionPoints * ubChanceToHit) / (ubRawAPCost + sActualAimTime);
//NumMessage("hitRate = ",iHitRate);
// if aiming for this amount of time produces a better hit rate
+21 -5
View File
@@ -4377,6 +4377,9 @@ INT16 ubMinAPCost;
pSoldier->aiData.bAimTime = BestAttack.ubAimTime;
pSoldier->bDoBurst = 0;
// HEADROCK HAM 3.6: bAimTime represents how MANY aiming levels are used, not how much APs they cost necessarily.
INT16 sActualAimTime = CalcAPCostForAiming( pSoldier, BestAttack.sTarget, (INT8)pSoldier->aiData.bAimTime );
if (ubBestAttackAction == AI_ACTION_FIRE_GUN)
{
// Do we need to change stance? NB We'll have to ready our gun again
@@ -4438,10 +4441,12 @@ INT16 ubMinAPCost;
BestAttack.ubAPCost = MinAPsToAttack( pSoldier, BestAttack.sTarget, ADDTURNCOST, 1) + ubStanceCost;
// Clip the aim time if necessary
if ( BestAttack.ubAPCost + BestAttack.ubAimTime > pSoldier->bActionPoints )
// HEADROCK HAM 3.6: Use Actual Aiming Costs, without assuming that each aim level = 1 AP.
if ( BestAttack.ubAPCost + sActualAimTime > pSoldier->bActionPoints )
{
// AP cost would balance (plus X, minus X) but aim time is reduced
BestAttack.ubAimTime = pSoldier->bActionPoints - BestAttack.ubAPCost - ubStanceCost;
// HEADROCK HAM 3.6: Use actual Aiming Costs.
BestAttack.ubAimTime = CalcAimingLevelsAvailableWithAP( pSoldier, BestAttack.sTarget, (pSoldier->bActionPoints - BestAttack.ubAPCost - ubStanceCost) );
if (BestAttack.ubAimTime < 0 )
{
// This is actually a logic error situation. The ChangeStance section is supposed
@@ -4466,7 +4471,8 @@ INT16 ubMinAPCost;
ubBurstAPs = CalcAPsToBurst( pSoldier->CalcActionPoints(), &(pSoldier->inv[BestAttack.bWeaponIn]) );
if (pSoldier->bActionPoints >= BestAttack.ubAPCost + BestAttack.ubAimTime + ubBurstAPs )
// HEADROCK HAM 3.6: Use Actual Aiming Time.
if (pSoldier->bActionPoints >= BestAttack.ubAPCost + sActualAimTime + ubBurstAPs )
{
// Base chance of bursting is 25% if best shot was +0 aim, down to 8% at +4
if ( TANK( pSoldier ) )
@@ -4504,7 +4510,10 @@ INT16 ubMinAPCost;
iChance += 5 * ( 15 - PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) );
}
}
else if (PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) < 10 && gGameOptions.ubDifficultyLevel > DIF_LEVEL_EASY )
// HEADROCK HAM 3.6: due to the "else", this part of the formula is NEVER hit. Removing.
//else if (PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) < 10 && gGameOptions.ubDifficultyLevel > DIF_LEVEL_EASY )
if (PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) < 10 && gGameOptions.ubDifficultyLevel > DIF_LEVEL_EASY )
{
iChance += 100;
}
@@ -4588,6 +4597,11 @@ INT16 ubMinAPCost;
iChance += 5 * ( 15 - PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) );
}
}
// HEADROCK HAM 3.6: Forcing enemies to autofire at close range if possible, similar to forced burst (see above)
if (PythSpacesAway( pSoldier->sGridNo, BestAttack.sTarget ) < 10 && gGameOptions.ubDifficultyLevel > DIF_LEVEL_EASY )
{
iChance += 100;
}
}
if ((INT32) PreRandom( 100 ) < iChance || Weapon[pSoldier->inv[BestAttack.bWeaponIn].usItem].NoSemiAuto)
@@ -4599,7 +4613,9 @@ INT16 ubMinAPCost;
}
else
{
pSoldier->aiData.bAimTime = 0;
// HEADROCK HAM 3.6: No no no! This line removes all aiming from a potentially deadly single-shot! Commenting out.
//pSoldier->aiData.bAimTime = 0;
pSoldier->aiData.bAimTime = BestAttack.ubAimTime;
pSoldier->bDoBurst = 0;
pSoldier->bDoAutofire = 0;
// not enough aps - do somthing else
+5 -1
View File
@@ -642,7 +642,11 @@ INT32 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *piPercentB
// must be able to reach the cover, so it can't possibly be more than
// action points left (rounded down) tiles away, since minimum
// cost to move per tile is 1 points.
iMaxMoveTilesLeft = __max( 0, pSoldier->bActionPoints - MinAPsToStartMovement( pSoldier, usMovementMode ) );
// HEADROCK HAM 3.6: This doesn't take into account the 100AP system. Adjusting.
// Please note, I used a calculation that may have a better representation in some global variable.
//iMaxMoveTilesLeft = __max( 0, pSoldier->bActionPoints - MinAPsToStartMovement( pSoldier, usMovementMode ) );
iMaxMoveTilesLeft = __max( 0, (pSoldier->bActionPoints - MinAPsToStartMovement( pSoldier, usMovementMode ) / (APBPConstants[AP_MAXIMUM]/25)) );
//NumMessage("In BLACK, maximum tiles to move left = ",maxMoveTilesLeft);
// if we can't go as far as the usual full search range
+6
View File
@@ -245,4 +245,10 @@ INT32 FindClosestClimbPoint (SOLDIERTYPE *pSoldier, BOOLEAN fClimbUp );
INT32 FindFlankingSpot(SOLDIERTYPE *pSoldier, INT32 sPos, INT8 bAction );
BOOLEAN CanClimbFromHere (SOLDIERTYPE * pSoldier, BOOLEAN fUp );
// HEADROCK HAM 3.6: Adding includes for A* cover calculations
INT8 CalcWorstCTGTForPosition( SOLDIERTYPE * pSoldier, UINT8 ubOppID, INT32 sOppGridNo, INT8 bLevel, INT32 iMyAPsLeft );
INT8 CalcBestCTGT( SOLDIERTYPE *pSoldier, UINT8 ubOppID, INT32 sOppGridNo, INT8 bLevel, INT32 iMyAPsLeft );
INT8 CalcAverageCTGTForPosition( SOLDIERTYPE * pSoldier, UINT8 ubOppID, INT32 sOppGridNo, INT8 bLevel, INT32 iMyAPsLeft );
UINT8 NumberOfTeamMatesAdjacent( SOLDIERTYPE * pSoldier, INT32 sGridNo );
#endif
+5 -4
View File
@@ -1813,14 +1813,15 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
uiRoll = PreRandom( 100 );
// Calculate wound amount
INT16 newDamage = pExplosive->ubDamage + (INT16)(( pExplosive->ubDamage * gGameExternalOptions.ubExplosivesDamageMultiplier) / 100); //lal
// HEADROCK HAM 3.6: Can now use negative modifier.
INT16 newDamage = (INT16)GetModifiedExplosiveDamage( pExplosive->ubDamage );
//INT16 newDamage = pExplosive->ubDamage + (INT16)(( pExplosive->ubDamage * gGameExternalOptions.ubExplosivesDamageMultiplier) / 100); //lal
sWoundAmt = newDamage + (INT16) ( (newDamage * uiRoll) / 100 );
// Calculate breath amount ( if stun damage applicable )
INT16 newBreath = pExplosive->ubStunDamage + (INT16)(( pExplosive->ubStunDamage * gGameExternalOptions.ubExplosivesDamageMultiplier) / 100); //lal
INT16 newBreath = (INT16)GetModifiedExplosiveDamage( pExplosive->ubStunDamage );
//INT16 newBreath = pExplosive->ubStunDamage + (INT16)(( pExplosive->ubStunDamage * gGameExternalOptions.ubExplosivesDamageMultiplier) / 100); //lal
sBreathAmt = ( newBreath * 100 ) + (INT16) ( ( ( newBreath / 2 ) * 100 * uiRoll ) / 100 ) ;
+133 -135
View File
@@ -376,11 +376,11 @@ STR16 pAssignmentStrings[] =
L"Repar.", // repairing
L"Üben", // training themselves
L"Miliz", // training a town to revolt
L"M.Militia", //training moving militia units // TODO.Translate
L"M.Miliz", //training moving militia units
L"Trainer", // training a teammate
L"Rekrut", // being trained by someone else
L"Staff", // operating a strategic facility // TODO.Translate
L"Rest", // Resting at a facility // TODO.Translate
L"Betrieb", // operating a strategic facility
L"Pause", // Resting at a facility
L"Tot", // dead
L"Unfähig", // abbreviation for incapacitated
L"Gefangen", // Prisoner of war - captured
@@ -393,14 +393,14 @@ STR16 pMilitiaString[] =
L"Miliz", // the title of the militia box
L"Ohne Aufgabe", //the number of unassigned militia troops
L"Mit Feinden im Sektor können Sie keine Miliz einsetzen!",
L"Some militia were not assigned to a sector. Would you like to disband them?", // TODO.Translate
L"Einige Milizen wurden keinem Sektor zugewiesen. Möchten Sie diese Einheiten auflösen?",
};
STR16 pMilitiaButtonString[] =
{
L"Autom.", // auto place the militia troops for the player
L"Fertig", // done placing militia troops
L"Disband", // HEADROCK HAM 3.6: Disband militia // TODO.Translate
L"Auflösen", // HEADROCK HAM 3.6: Disband militia
};
STR16 pConditionStrings[] =
@@ -615,7 +615,7 @@ STR16 pAssignMenuStrings[] =
L"Fahrzeug", // the merc is in a vehicle
L"Repar.", // the merc is repairing items
L"Training", // the merc is training
L"Facility", // the merc is using/staffing a facility // TODO.Translate
L"Betrieb", // the merc is using/staffing a facility
L"Abbrechen", // cancel this menu
};
@@ -672,7 +672,7 @@ STR16 pTrainingMenuStrings[] =
{
L"Üben", // train yourself
L"Miliz", // train the town
L"Mobile Militia", // TODO.Translate
L"Mobile Miliz",
L"Trainer", // train your teammates
L"Rekrut", // be trained by an instructor
L"Abbrechen", // cancel this menu
@@ -1082,7 +1082,7 @@ CHAR16 gWeaponStatsDesc[][ 16 ] =
L"Gewicht:", //12
L"Bet. Schaden:", //13
// HEADROCK: Added new strings for extended description ** REDUNDANT **
L"Attachments:", //14 // TODO.Translate
L"Zubehör:", //14 // Attachments
L"AUTO/5:", //15
L"Menge:", //16
@@ -1701,7 +1701,7 @@ STR16 sFacilitiesStrings[] =
{
L"Keine",
L"Hospital",
L"Factory", // TODO.Translate
L"Fabrik", // Factory
L"Gefängnis",
L"Militär",
L"Flughafen",
@@ -1730,7 +1730,7 @@ STR16 pwTownInfoStrings[] =
L"Level", // the training level of civilians in this town
L"Zivilistentraining", // 10 // state of civilian training in town
L"Miliz", // the state of the trained civilians in the town
L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town // TODO.Translate
L"Mobile. M. Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town
};
// Mine strings
@@ -1990,7 +1990,7 @@ STR16 pTransactionText[] =
L"Kauf bei Bobby Rays", // Bobby Ray is the name of an arms dealer
L"Ausgeglichene Konten bei M.E.R.C.",
L"Krankenversicherung für %s", // medical deposit for merc
L"B.S.E-Profilanalyse", // IMP is the acronym for International Mercenary Profiling
L"B.S.E.-Profilanalyse", // IMP is the acronym for International Mercenary Profiling
L"Versicherung für %s abgeschlossen",
L"Versicherung für %s verringert",
L"Versicherung für %s verlängert", // johnny contract extended
@@ -2011,8 +2011,8 @@ STR16 pTransactionText[] =
L"Miliz in %s ausbilden", // initial cost to equip a town's militia
L"Gegenstände von %s gekauft.", //is used for the Shop keeper interface. The dealers name will be appended to the end of the string.
L"%s hat Geld angelegt.",
L"Facility Use", // HEADROCK HAM 3.6 // TODO.Translate
L"Militia upkeep", // HEADROCK HAM 3.6 // TODO.Translate
L"Betriebskosten", // HEADROCK HAM 3.6
L"Unterhaltskosten für Miliz", // HEADROCK HAM 3.6
};
STR16 pTransactionAlternateText[] =
@@ -2216,7 +2216,7 @@ STR16 pImpPopUpStrings[] =
L"Fehler beim Laden des B.S.E. Charakters.",
L"Sie haben bereits die maximale Anzahl an B.S.E. Charakteren.",
L"Sie haben bereits drei B.S.E. Charaktere mit dem gleichen Geschlecht.",
L"Sie können sich den I.M.P. Charakter nicht leisten.",
L"Sie können sich den B.S.E. Charakter nicht leisten.",
L"Der neue B.S.E. Charakter ist nun in ihrem Team.",
};
@@ -2268,12 +2268,12 @@ STR16 pFilesTitle[] =
STR16 pFilesSenderList[] =
{
L"Aufklärungsbericht", // the recon report sent to the player. Recon is an abbreviation for reconissance
L"Intercept #1", // first intercept file .. Intercept is the title of the organization sending the file...similar in function to INTERPOL/CIA/KGB..refer to fist record in files.txt for the translated title
L"Intercept #2", // second intercept file
L"Intercept #3", // third intercept file
L"Intercept #4", // fourth intercept file
L"Intercept #5", // fifth intercept file
L"Intercept #6", // sixth intercept file
L"Abschnitt #1", // first intercept file .. Intercept is the title of the organization sending the file...similar in function to INTERPOL/CIA/KGB..refer to fist record in files.txt for the translated title
L"Abschnitt #2", // second intercept file
L"Abschnitt #3", // third intercept file
L"Abschnitt #4", // fourth intercept file
L"Abschnitt #5", // fifth intercept file
L"Abschnitt #6", // sixth intercept file
};
// Text having to do with the History Log
@@ -2307,7 +2307,7 @@ STR16 pHistoryStrings[] =
L"Rechnung an M.E.R.C. bezahlt", // paid outstanding bills at MERC
L"Enrico Chivaldoris Auftrag akzeptiert",
//6-10
L"B.S.E-Profil erstellt",
L"B.S.E.-Profil erstellt",
L"Versicherung abgeschlossen für %s.", // insurance contract purchased
L"Versicherung gekündigt für %s.", // insurance contract canceled
L"Versicherung ausgezahlt für %s.", // insurance claim payout for merc
@@ -2418,7 +2418,7 @@ STR16 pBookMarkStrings[] =
{
L"A.I.M.",
L"Bobby Rays",
L"B.S.E",
L"B.S.E.",
L"M.E.R.C.",
L"Bestattungsinst.",
L"Florist",
@@ -2511,8 +2511,8 @@ STR16 pWebPagesTitles[] =
L"Bobby Rays - Sonst.", //misc is an abbreviation for miscellaneous
L"Bobby Rays - Gebraucht",
L"Bobby Rays - Versandauftrag",
L"B.S.E",
L"B.S.E",
L"B.S.E.",
L"B.S.E.",
L"Fleuropa",
L"Fleuropa - Gestecke",
L"Fleuropa - Bestellformular",
@@ -3196,7 +3196,7 @@ STR16 AimFiText[] =
// The title of the page, the above text gets added at the end of this text
L"A.I.M.-Mitglieder ansteigend sortiert nach %s",
L"A.I.M. Mitglieder absteigend sortiert nach %s",
L"A.I.M.-Mitglieder absteigend sortiert nach %s",
// Instructions to the players on what to do
@@ -3462,10 +3462,10 @@ STR16 pMilitiaConfirmStrings[] =
L"Sie können sich keine $%d für die Miliz hier leisten.",
L"%s benötigt eine Loyalität von %d Prozent, um mit dem Milizen-Training fortzufahren.",
L"Sie können die Miliz in %s nicht mehr trainieren.",
L"You cannot afford the $%d to train mobile militia here.", // HEADROCK HAM 3.6: Mobile Militia TODO.Translate
L"Continue training mobile militia in %s (%s %d)?", // HEADROCK HAM 3.6: Mobile Militia TODO.Translate
L"Training mobile militia in %d sectors will cost $ %d. %s", // HEADROCK HAM 3.6: Mobile Militia TODO.Translate
L"Training a squad of mobile militia will cost $", // HEADROCK HAM 3.6: Mobile Militia TODO.Translate
L"Sie können sich keine $%d für mobile Miliz hier leisten.", // HEADROCK HAM 3.6: Mobile Militia
L"Mobile Milizen in %s (%s %d) weitertrainieren?", // HEADROCK HAM 3.6: Mobile Militia
L"Mobile Milizen in %d Sektoren zu trainieren kostet $ %d. %s", // HEADROCK HAM 3.6: Mobile Militia
L"Eine mobile Milizeinheit für diese Stadt zu trainieren kostet $", // HEADROCK HAM 3.6: Mobile Militia
};
//Strings used in the popup box when withdrawing, or depositing money from the $ sign at the bottom of the single merc panel
@@ -3520,7 +3520,7 @@ STR16 zOptionsToggleText[] =
L"Niedrige CPU Belastung",
L"Erw. Gegenstandsinfo (EDB)",
L"Erzwungener Runden-Modus", // add forced turn mode
L"Stat Progress Bars", // Show progress towards stat increase
L"Status Trainingsfortschritt", // Show progress towards stat increase
L"--Cheat Mode Optionen--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Erzwinge Bobby Ray Lieferungen", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
@@ -3616,7 +3616,7 @@ STR16 zOptionsScreenHelpText[] =
L"Wenn diese Funktion aktiviert ist, wird das Spiel mit viel geringerer CPU Belastung laufen.",
L"Wenn diese Funktion aktiviert ist, werden erweiterte Beschreibungen 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"When ON, shows character progress towards gaining levels.",
L"Wenn diese Funktion aktiviert ist, wird der Trainingsfortschritt für die Söldner angezeigt.",
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",
@@ -4234,7 +4234,7 @@ STR16 gzLateLocalizedString[] =
//46-48
L"%ss Gewehrlauf-Verlängerung fällt ab!",
L"No more than %d militia trainers are permitted in this sector.", // TODO.Translate
L"Es sind nicht mehr als %d Milizenausbilder in diesem Sektor erlaubt.",
L"Sind Sie sicher?", //
//49-50
@@ -4274,7 +4274,7 @@ STR16 gzLateLocalizedString[] =
STR16 gzCWStrings[] =
{
L"Call reinforcements to %s from adjacent sectors?", // TODO.Translate
L"Verstärkung aus benachbarten Sektoren nach %s rufen?",
};
// WANNE: Tooltips
@@ -4351,36 +4351,36 @@ STR16 New113Message[] =
L"Gegner gesichtet! (Ctrl + x für Rundenmodus)",
};
// TODO.Translate
STR16 New113HAMMessage[] =
{
// 0 - 5
L"%s cowers in fear!",
L"%s is pinned down!",
L"%s fires more rounds than intended!",
L"You cannot train militia in this sector.",
L"Militia picks up %s.",
L"Cannot train militia with enemies present!",
L"%s zittert vor Angst!",
L"%s is festgenagelt!",
L"%s feuert mehr Schüsse mehr als beabsichtigt!",
L"Sie können keine Miliz in diesem Sektor ausbilden.",
L"Miliz hebt %s auf.",
L"Wenn Feinde im Sektor sind können Sie keine Miliz ausbilden!",
// 6 - 10
L"%s lacks sufficient Leadership score to train militia.",
L"No more than %d Mobile Militia trainers are permitted in this sector.",
L"No room in %s or around it for new Mobile Militia!",
L"You need to have %d Town Militia in each of %s's liberated sectors before you can train Mobile Militia here.",
L"Can't staff a facility while enemies are present!",
L"%s hat nicht genug Führungsqualität um Milizen auszubilden.",
L"Pro Sektor sind nicht mehr als %d Milizausbilder erlaubt.",
L"Kein Platz für mobile Milizen in oder rund um %s!",
L"Sie benötigen %d Stadtmilizen in jedem von %ss befreiten Sektoren bevor Sie hier mobile Milizen ausbilden können.",
L"Anlage nicht nutzbar wenn Feinde in der Gegend sind!",
// 11 - 15
L"%s lacks sufficient Wisdom to staff this facility.",
L"The %s is already fully-staffed.",
L"It will cost $%d per hour to staff this facility. Do you wish to continue?",
L"You have insufficient funds to pay for all Facility work today. $%d have been paid, but you still owe $%d. The locals are not pleased.",
L"You have insufficient funds to pay for all Facility work today. You owe $%d. The locals are not pleased.",
L"%s hat nicht genügend Weisheit um diese Anlage betreiben zu können.",
L"%s ist schon voll besetzt.",
L"Diese Anlage zu betreiben kostet $%d pro Stunde. Weitermachen?",
L"Sie haben nicht genug Geld um alle heutigen Betriebskosten zu zahlen. $%d wurden bezahlt, Sie schulden weiterhin $%d. Die Einwohner sind nicht erfreut.",
L"Sie haben nicht genug Geld um alle heutigen Betriebskosten zu zahlen. Sie schulden $%d. Die Einwohner sind nicht erfreut.",
// 16 - 20
L"You have an outstanding debt of $%d for Facility Operation, and no money to pay it off!",
L"You have an outstanding debt of $%d for Facility Operation. You can't assign this merc to facility duty until you have enough money to pay off the entire debt.",
L"You have an outstanding debt of $%d for Facility Operation. Would you like to pay it all back?",
L"N/A in this sector",
L"Daily Expenses",
L"Sie haben eine ausstehende Forderung von $%d für Betriebskosen und kein Geld um zu bezahlen!",
L"Sie haben eine ausstehende Forderung von $%d für Betriebskosen. Dieser Anlage können Sie keinen Söldner zuweisen bis Sie Ihre gesamten Schulden beglichen haben.",
L"Sie haben eine ausstehende Forderung von $%d für Betriebskosen. Möchten Sie diese Schuld begleichen?",
L"Nicht möglich in diesem Sektor",
L"Tagesausgaben",
// 21 - 25
L"Insufficient funds to pay all enlisted militia! %d militia have disbanded and returned home.",
L"Nicht genug Geld für alle angeworbenen Milzen! %d Milzen wurden entlassen und sind heimgekehrt.",
};
// WANNE: This are the email texts, when one of the 4 new 1.13 MERC mercs have levelled up, that Speck sends
@@ -4693,112 +4693,110 @@ STR16 gzIMPDisabilityTraitText[]=
L"Ihre größte Schwäche",
};
// TODO.Translate
// HEADROCK HAM 3.6: Error strings for assigning a merc to a facility
STR16 gzFacilityErrorMessage[]=
{
L"%s lacks sufficient Strength to perform this task.",
L"%s lacks sufficient Dexterity to perform this task.",
L"%s lacks sufficient Agility to perform this task.",
L"%s is not Healthy enough to perform this task.",
L"%s lacks sufficient Wisdom to perform this task.",
L"%s lacks sufficient Marksmanship to perform this task.",
L"%s hat nicht genug Kraft um diese Aufgabe zu erledigen.",
L"%s ist nicht geschickt genug um diese Aufgabe zu erledigen.",
L"%s ist nicht beweglich genug um diese Aufgabe zu erledigen.",
L"%s hat keine ausreichende Gesundheit um diese Aufgabe zu erledigen.",
L"%s mangelt es an ausreichender Weisheit um diese Aufgabe zu erledigen.",
L"%s mangelt es an ausreichender Treffsicherheit um diese Aufgabe zu erledigen.",
// 6 - 10
L"%s lacks sufficient Medical Skill to perform this task.",
L"%s lacks sufficient Mechanical Skill to perform this task.",
L"%s lacks sufficient Leadership to perform this task.",
L"%s lacks sufficient Explosives Skill to perform this task.",
L"%s lacks sufficient Experience to perform this task.",
L"%s hat nicht genug Medizinkenntnis um diese Aufgabe zu erledigen.",
L"%s hat zu wenig technisches Verständnis um diese Aufgabe zu erledigen.",
L"%s mangelt es an ausreichender Führungsqualität um diese Aufgabe zu erledigen.",
L"%s hat nicht genug Sprengstoffkenntnis um diese Aufgabe zu erledigen.",
L"%s mangelt es an ausreichender Erfahrung um diese Aufgabe zu erledigen.",
// 11 - 15
L"%s lacks sufficient Morale to perform this task.",
L"%s is too exhausted to perform this task.",
L"Insufficient loyalty in %s. The locals refuse to allow you to perform this task.",
L"Too many people are already working at the %s.",
L"Too many people are already performing this task at the %s.",
L"%s hat nicht genug Moral um diese Aufgabe zu erledigen.",
L"%s ist zu erschöpft um diese Aufgabe zu erledigen.",
L"Zu wenig Loyalität in %s. Die Einwohner lassen Sie diese Aufgabe nicht verrichten.",
L"Es arbeiten bereits zu viele Personen in %s.",
L"Zu viele Personen verrichten diese Aufgabe schon in %s.",
// 16 - 20
L"%s can find no items to repair.",
L"%s has lost some %s while working in sector %s!",
L"%s has lost some %s while working at the %s in %s!",
L"%s was injured while working in sector %s, and requires immediate medical attention!",
L"%s was injured while working at the %s in %s, and requires immediate medical attention!",
L"%s findet nichts mehr zum Reparieren.",
L"%s verliert %s beim Arbeiten in %s.",
L"%s hat ein paar %s verloren beim Arbeiten in der %s in %s !",
L"%s wurde verletzt beim Arbeiten in Sektor %s und benötigt dringend medizinische Versorgung!",
L"%s wurde verletzt beim Arbeiten in der %s in %s und benötigt dringend medizinische Versorgung!",
// 21 - 25
L"%s was injured while working in sector %s. It doesn't seem too bad though.",
L"%s was injured while working at the %s in %s. It doesn't seem too bad though.",
L"The residents of %s seem upset about %s's presence.",
L"The residents of %s seem upset about %s's work at the %s.",
L"%s's actions in sector %s have caused loyalty loss throughout the region!",
L"%s wurde verletzt beim Arbeiten in Sektor %s. Es scheint aber nichts Ernstes zu sein.",
L"%s wurde verletzt beim Arbeiten in der %s in %s. Es scheint aber nichts Ernstes zu sein.",
L"Die Einwohner von %s scheinen sich über die Anwesenheit von %s aufzuregen."
L"Die Einwohner von %s scheinen sich über die Arbeit von %s in der %s aufzuregen."
L"%ss Handeln im Sektor %s hat einen Loyalitätsverlust in der gesamten Region bewirkt!",
// 26 - 30
L"%s's actions at the %s in %s have caused loyalty loss throughout the region!",
L"%s is drunk.", // <--- This is a log message string.
L"%s has become severely ill in sector %s, and has been taken off duty.",
L"%s has become severely ill and cannot continue his work at the %s in %s.",
L"%s was injured in sector %s.", // <--- This is a log message string.
L"%ss Handeln in der %s in %s hat einen Loyalitätsverlust in der gesamten Region bewirkt!",
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.
// 31 - 35
L"%s was severely injured in sector %s.", //<--- This is a log message string.
L"%s wurde ernsthaft im Sektor %s verletzt.", //<--- This is a log message string.
};
// TODO.Translate
STR16 gzFacilityRiskResultStrings[]=
{
L"Strength",
L"Agility",
L"Dexterity",
L"Wisdom",
L"Health",
L"Marksmanship",
L"Kraft",
L"Beweglichkeit",
L"Geschicklichkeit",
L"Weisheit",
L"Gesundheit",
L"Treffsicherheit",
// 5-10
L"Leadership",
L"Mechanical skill",
L"Medical skill",
L"Explosives skill",
L"Führungsqualität",
L"Technik",
L"Medizin",
L"Sprengstoffe",
};
// TODO.Translate
STR16 gzFacilityAssignmentStrings[]=
{
L"AMBIENT",
L"Staff",
L"Rest",
L"Repair Items",
L"Repair %s", // Vehicle name inserted here
L"Repair Robot",
L"UMGEBUNG",
L"Betrieb",
L"Pause",
L"Repariere Gegenstände",
L"Repariere %s",
L"Repariere Roboter",
// 6-10
L"Doctor",
L"Arzt",
L"Patient",
L"Practice Strength",
L"Practice Dexterity",
L"Practice Agility",
L"Practice Health",
L"Üben Kraft",
L"Üben Geschicklichkeit",
L"Üben Beweglichkeit",
L"Üben Gesundheit",
// 11-15
L"Practice Marksmanship",
L"Practice Medical",
L"Practice Mechanical",
L"Practice Leadership",
L"Practice Explosives",
L"Üben Treffsicherheit",
L"Üben Medizin",
L"Üben Technik",
L"Üben Führungsqualität",
L"Üben Sprengstoff",
// 16-20
L"Student Strength",
L"Student Dexterity",
L"Student Agility",
L"Student Health",
L"Student Marksmanship",
L"Rekrut Kraft",
L"Rekrut Geschicklichkeit",
L"Rekrut Beweglichkeit",
L"Rekrut Gesundheit",
L"Rekrut Treffsicherheit",
// 21-25
L"Student Medical",
L"Student Mechanical",
L"Student Leadership",
L"Student Explosives",
L"Trainer Strength",
L"Rekrut Medizin",
L"Rekrut Technik",
L"Rekrut Führungsqualität.",
L"Rekrut Sprengstoff",
L"Trainer Kraft",
// 26-30
L"Trainer Dexterity",
L"Trainer Agility",
L"Trainer Health",
L"Trainer Marksmanship",
L"Trainer Medical",
L"Trainer Geschicklichkeit",
L"Trainer Beweglichkeit",
L"Trainer Gesundheit",
L"Trainer Treffsicherheit",
L"Trainer Medizin",
// 30-35
L"Trainer Mechanical",
L"Trainer Leadership",
L"Trainer Explosives",
L"Trainer Technik",
L"Trainer Führungsqualität",
L"Trainer Sprengstoff",
};
STR16 Additional113Text[]=
+1 -1
View File
@@ -3709,7 +3709,7 @@ STR16 zOptionsToggleText[] =
L"Íèçêàÿ çàãðóçêà ïðîöåññîðà",
L"Ïîäðîáíîå îïèñàíèå ïðåäìåòîâ", //Enhanced Description Box
L"Òîëüêî ïîøàãîâûé ðåæèì", // add forced turn mode
L"Ñòàòèñòèêà ïðîäâèæåíèÿ íàâûêîâ", //Stat Progress Bars // Show progress towards stat increase // TODO.Translate
L"Ñòàòèñòèêà ïðîäâèæåíèÿ íàâûêîâ", //Stat Progress Bars // Show progress towards stat increase
L"--Cheat Mode Options--", // TOPTION_CHEAT_MODE_OPTIONS_HEADER,
L"Óñêîðèòü äîñòàâêó Áîááè Ðýÿ", // force all pending Bobby Ray shipments
L"-----------------", // TOPTION_CHEAT_MODE_OPTIONS_END
+5 -5
View File
@@ -66,7 +66,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib .\Multiplayer\raknet\RakNetLibStaticDebug.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_Debug_3342.exe"
OutputFile="$(OutDir)\JA2_EN_3353_Debug.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="2"
@@ -145,7 +145,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib .\Multiplayer\raknet\RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_Release_3342.exe"
OutputFile="$(OutDir)\JA2_EN_3353.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
GenerateMapFile="true"
@@ -229,7 +229,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib .\Multiplayer\raknet\RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\MapEditor_EN_Release_3342.exe"
OutputFile="$(OutDir)\MapEditor_EN_3353.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
GenerateMapFile="true"
@@ -316,7 +316,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib .\Multiplayer\raknet\RakNetLibStaticDebug.lib ws2_32.lib"
OutputFile="$(OutDir)\MapEditor_EN_Debug_3342.exe"
OutputFile="$(OutDir)\MapEditor_EN_3353_Debug.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="2"
@@ -399,7 +399,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib .\Multiplayer\raknet\RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_ReleaseDebugInfo_3342.exe"
OutputFile="$(OutDir)\JA2_EN_3353_ReleaseDebugInfo.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
GenerateMapFile="false"
+8 -8
View File
@@ -62,7 +62,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_Debug_3342_VS2008.exe"
OutputFile="$(OutDir)\JA2_MP_EN_Debug_VS2008.exe"
LinkIncremental="2"
AdditionalLibraryDirectories="Multiplayer\raknet"
IgnoreDefaultLibraryNames="libc"
@@ -95,7 +95,7 @@
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Games\Jagged Alliance 2 EN"
OutputDirectory="D:\misc\1.13\Misc\JA2 1.13 MP"
IntermediateDirectory="build\VS2008\$(ProjectName)_$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets=".\ja2_VS2008.vsprops;.\ja2_VS2008Linker.vsprops;.\ja2_VS2008Libs.vsprops"
@@ -141,7 +141,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_Release_3342_VS2008.exe"
OutputFile="$(OutDir)\JA2_MP_VS2008_Release.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="Multiplayer\raknet"
GenerateDebugInformation="false"
@@ -221,7 +221,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\MapEditor_EN_Release_3342_VS2008.exe"
OutputFile="$(OutDir)\MapEditor_EN_VS2008.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="Multiplayer\raknet"
GenerateDebugInformation="false"
@@ -255,7 +255,7 @@
</Configuration>
<Configuration
Name="MapEditorD|Win32"
OutputDirectory="C:\Games\Jagged Alliance 2 EN"
OutputDirectory="\games\jagged alliance 2"
IntermediateDirectory="build\VS2008\$(ProjectName)_$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets=".\ja2_VS2008.vsprops;.\ja2_VS2008Linker.vsprops;.\ja2_VS2008Libs.vsprops;.\ja2_VS2008Editor.vsprops"
@@ -299,7 +299,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\MapEditor_EN_Debug_3342_VS2008.exe"
OutputFile="$(OutDir)\Map EditorD_2389_en.exe"
LinkIncremental="2"
AdditionalLibraryDirectories="Multiplayer\raknet"
IgnoreDefaultLibraryNames=""
@@ -332,7 +332,7 @@
</Configuration>
<Configuration
Name="Release_WithDebugInfo|Win32"
OutputDirectory="C:\Games\Jagged Alliance 2 EN"
OutputDirectory="\games\jagged alliance 2"
IntermediateDirectory="build\VS2008\$(ProjectName)_$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets=".\ja2_VS2008.vsprops;.\ja2_VS2008Linker.vsprops;.\ja2_VS2008Libs.vsprops"
@@ -379,7 +379,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Winmm.lib RakNetLibStatic.lib ws2_32.lib"
OutputFile="$(OutDir)\JA2_EN_ReleaseDebugInfo_3342_VS2008.exe"
OutputFile="$(OutDir)\JA2_MP_EN_v1.1_WDI.exe"
LinkIncremental="2"
AdditionalLibraryDirectories="Multiplayer\raknet"
GenerateDebugInformation="true"