diff --git a/GameSettings.cpp b/GameSettings.cpp index 2fb723a00..e0590d59f 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -71,11 +71,13 @@ #define TAUNTS_SETTINGS_FILE "Taunts_Settings.ini" // anv: helicopter repair settings - enough of these to put them in own file -#define HELICOPTER_SETTINGS_FILE "Helicopter_Settings.ini" +#define HELICOPTER_SETTINGS_FILE "Helicopter_Settings.ini" -#define MORALE_SETTINGS_FILE "Morale_Settings.ini" +#define MORALE_SETTINGS_FILE "Morale_Settings.ini" -#define REPUTATION_SETTINGS_FILE "Reputation_Settings.ini" +#define REPUTATION_SETTINGS_FILE "Reputation_Settings.ini" + +#define CREATURES_SETTINGS_FILE "Creatures_Settings.ini" #define CD_ROOT_DIR "DATA\\" @@ -88,6 +90,7 @@ TAUNTS_SETTINGS gTauntsSettings; HELICOPTER_SETTINGS gHelicopterSettings; MORALE_SETTINGS gMoraleSettings; REPUTATION_SETTINGS gReputationSettings; +CREATURES_SETTINGS gCreaturesSettings; CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants MOD_SETTINGS gModSettings; //DBrot: mod specific settings @@ -1047,7 +1050,7 @@ void LoadGameExternalOptions() // Flugente: show health an fatigue bars over currently selected mercs and those we hover our mouse over gGameExternalOptions.ubShowHealthBarsOnHead = iniReader.ReadInteger("Tactical Interface Settings","SHOW_HEALTHBARSOVERHEAD", 1, 0, 5); - + // WANNE: Hide the hit count when enemy gets hit gGameExternalOptions.ubEnemyHitCount = iniReader.ReadInteger("Tactical Interface Settings","ENEMY_HIT_COUNT", 0, 0, 4); // sevenfm: added similar option for player hit count @@ -1690,6 +1693,9 @@ void LoadGameExternalOptions() // Enable/Disable crepitus completely in SCI-FI mode. gGameExternalOptions.fEnableCrepitus = iniReader.ReadBoolean("Strategic Event Settings", "ENABLE_CREPITUS", TRUE); + // Crepitus to attack other player-controlled town sectors + gGameExternalOptions.fCrepitusAttackAllTowns = iniReader.ReadBoolean("Strategic Event Settings", "CREPITUS_ATTACK_ALL_TOWNS", FALSE); + // 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. gGameExternalOptions.bWhichMineRunsOut = iniReader.ReadInteger("Strategic Event Settings","WHICH_MINE_SHUTS_DOWN", -1, -1, 256); @@ -2678,10 +2684,6 @@ void LoadModSettings(){ gModSettings.ubEndGameVictorySectorY = iniReader.ReadInteger("End Game", "VICTORY_SECTOR_Y", 16); gModSettings.iEndGameVictoryGridNo = iniReader.ReadInteger("End Game", "VICTORY_POSITION", 5687); - //[Creatures] - gModSettings.ubCrepitusFeedingSectorX = iniReader.ReadInteger("Creatures", "CREPITUS_FEEDING_SECTOR_X", 9); - gModSettings.ubCrepitusFeedingSectorY = iniReader.ReadInteger("Creatures", "CREPITUS_FEEDING_SECTOR_Y", 10); - gModSettings.ubCrepitusFeedingSectorZ = iniReader.ReadInteger("Creatures", "CREPITUS_FEEDING_SECTOR_Z", 2); } // silversurfer: load item property modifiers @@ -3491,6 +3493,46 @@ void LoadReputationSettings() gReputationSettings.bValues[REPUTATION_MERC_FIRED_ON_BAD_TERMS] = iniReader.ReadInteger("Reputation Settings","REPUTATION_MERC_FIRED_ON_BAD_TERMS", -3, -100, 100); } +void LoadCreaturesSettings() +{ + CIniReader iniReader(CREATURES_SETTINGS_FILE); + + gCreaturesSettings.ubCrepitusFeedingSectorX = iniReader.ReadInteger("Creatures Settings", "CREPITUS_FEEDING_SECTOR_X", 9); + gCreaturesSettings.ubCrepitusFeedingSectorY = iniReader.ReadInteger("Creatures Settings", "CREPITUS_FEEDING_SECTOR_Y", 10); + gCreaturesSettings.ubCrepitusFeedingSectorZ = iniReader.ReadInteger("Creatures Settings", "CREPITUS_FEEDING_SECTOR_Z", 2); + + gCreaturesSettings.usCreatureSpreadTimeNovice = iniReader.ReadInteger("Creatures Settings","CREATURE_SPREAD_TIME_NOVICE", 510, 5, 14400); + gCreaturesSettings.usCreatureSpreadTimeExperienced = iniReader.ReadInteger("Creatures Settings","CREATURE_SPREAD_TIME_EXPERIENCED", 450, 5, 14400); + gCreaturesSettings.usCreatureSpreadTimeExpert = iniReader.ReadInteger("Creatures Settings","CREATURE_SPREAD_TIME_EXPERT", 390, 5, 14400); + gCreaturesSettings.usCreatureSpreadTimeInsane = iniReader.ReadInteger("Creatures Settings","CREATURE_SPREAD_TIME_INSANE", 150, 5, 14400); + + gCreaturesSettings.ubQueenReproductionBaseNovice = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BASE_NOVICE", 6, 1, 30); + gCreaturesSettings.ubQueenReproductionBaseExperienced = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BASE_EXPERIENCED", 7, 1, 30); + gCreaturesSettings.ubQueenReproductionBaseExpert = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BASE_EXPERT", 9, 1, 30); + gCreaturesSettings.ubQueenReproductionBaseInsane = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BASE_INSANE", 15, 1, 30); + + gCreaturesSettings.ubQueenReproductionBonusNovice = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BONUS_NOVICE", 1, 0, 10); + gCreaturesSettings.ubQueenReproductionBonusExperienced = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BONUS_EXPERIENCED", 2, 0, 10); + gCreaturesSettings.ubQueenReproductionBonusExpert = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BONUS_EXPERT", 3, 0, 10); + gCreaturesSettings.ubQueenReproductionBonusInsane = iniReader.ReadInteger("Creatures Settings","QUEEN_REPRODUCTION_BONUS_INSANE", 5, 0, 10); + + gCreaturesSettings.ubQueenInitBonusSpreadsNovice = iniReader.ReadInteger("Creatures Settings","QUEEN_INIT_BONUS_SPREAD_NOVICE", 1, 0, 10); + gCreaturesSettings.ubQueenInitBonusSpreadsExperienced = iniReader.ReadInteger("Creatures Settings","QUEEN_INIT_BONUS_SPREAD_EXPERIENCED", 2, 0, 10); + gCreaturesSettings.ubQueenInitBonusSpreadsExpert = iniReader.ReadInteger("Creatures Settings","QUEEN_INIT_BONUS_SPREAD_EXPERT", 3, 0, 10); + gCreaturesSettings.ubQueenInitBonusSpreadsInsane = iniReader.ReadInteger("Creatures Settings","QUEEN_INIT_BONUS_SPREAD_INSANE", 5, 0, 10); + + gCreaturesSettings.bCreaturePopulationModifierNovice = iniReader.ReadInteger("Creatures Settings","CREATURE_POPULATION_MODIFIER_NOVICE", 0, -5, 5); + gCreaturesSettings.bCreaturePopulationModifierExperienced = iniReader.ReadInteger("Creatures Settings","CREATURE_POPULATION_MODIFIER_EXPERIENCED", 0, -5, 5); + gCreaturesSettings.bCreaturePopulationModifierExpert = iniReader.ReadInteger("Creatures Settings","CREATURE_POPULATION_MODIFIER_EXPERT", 0, -5, 5); + gCreaturesSettings.bCreaturePopulationModifierInsane = iniReader.ReadInteger("Creatures Settings","CREATURE_POPULATION_MODIFIER_INSANE", 0, -5, 5); + + gCreaturesSettings.bCreatureTownAggressivenessNovice = iniReader.ReadInteger("Creatures Settings","CREATURE_TOWN_AGGRESSIVENESS_NOVICE", -10, -100, 100); + gCreaturesSettings.bCreatureTownAggressivenessExperienced = iniReader.ReadInteger("Creatures Settings","CREATURE_TOWN_AGGRESSIVENESS_EXPERIENCED", 0, -100, 100); + gCreaturesSettings.bCreatureTownAggressivenessExpert = iniReader.ReadInteger("Creatures Settings","CREATURE_TOWN_AGGRESSIVENESS_EXPERT", 10, -100, 100); + gCreaturesSettings.bCreatureTownAggressivenessInsane = iniReader.ReadInteger("Creatures Settings","CREATURE_TOWN_AGGRESSIVENESS_INSANE", 50, -100, 100); + +} + void FreeGameExternalOptions() { if (gGameExternalOptions.iaIMPSlots != NULL) // OJW - 20081129 - Fix memory leak when calling LoadGameExternalOptions twice diff --git a/GameSettings.h b/GameSettings.h index bc7304cbe..dc04c0bc8 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -696,6 +696,7 @@ typedef struct //Misc settings BOOLEAN fAmmoDynamicWeight; //Pulmu BOOLEAN fEnableCrepitus; + BOOLEAN fCrepitusAttackAllTowns; BOOLEAN fEnableAllWeaponCaches; BOOLEAN fEnableAllTerrorists; BOOLEAN gfRevealItems; @@ -1469,6 +1470,46 @@ typedef struct INT8 bValues[32]; } REPUTATION_SETTINGS; +typedef struct +{ + //Crepitus Feeding Sector + UINT8 ubCrepitusFeedingSectorX; + UINT8 ubCrepitusFeedingSectorY; + UINT8 ubCrepitusFeedingSectorZ; + + UINT16 usCreatureSpreadTimeNovice; + UINT16 usCreatureSpreadTimeExperienced; + UINT16 usCreatureSpreadTimeExpert; + UINT16 usCreatureSpreadTimeInsane; + + UINT8 ubQueenReproductionBaseNovice; + UINT8 ubQueenReproductionBaseExperienced; + UINT8 ubQueenReproductionBaseExpert; + UINT8 ubQueenReproductionBaseInsane; + + UINT8 ubQueenReproductionBonusNovice; + UINT8 ubQueenReproductionBonusExperienced; + UINT8 ubQueenReproductionBonusExpert; + UINT8 ubQueenReproductionBonusInsane; + + UINT8 ubQueenInitBonusSpreadsNovice; + UINT8 ubQueenInitBonusSpreadsExperienced; + UINT8 ubQueenInitBonusSpreadsExpert; + UINT8 ubQueenInitBonusSpreadsInsane; + + INT8 bCreaturePopulationModifierNovice; + INT8 bCreaturePopulationModifierExperienced; + INT8 bCreaturePopulationModifierExpert; + INT8 bCreaturePopulationModifierInsane; + + INT8 bCreatureTownAggressivenessNovice; + INT8 bCreatureTownAggressivenessExperienced; + INT8 bCreatureTownAggressivenessExpert; + INT8 bCreatureTownAggressivenessInsane; + + +} CREATURES_SETTINGS; + typedef struct { UINT8 ubMaxNumberOfTraits; @@ -2081,12 +2122,6 @@ typedef struct BOOLEAN CreatureMeanwhileCutscene; - //[Creatures] - //Crepitus Feeding Sector - UINT8 ubCrepitusFeedingSectorX; - UINT8 ubCrepitusFeedingSectorY; - UINT8 ubCrepitusFeedingSectorZ; - }MOD_SETTINGS; // silversurfer: item property modifiers @@ -2182,6 +2217,8 @@ extern MORALE_SETTINGS gMoraleSettings; extern REPUTATION_SETTINGS gReputationSettings; +extern CREATURES_SETTINGS gCreaturesSettings; + // HEADROCK HAM 4: CTH constants read from a separate INI file extern CTH_CONSTANTS gGameCTHConstants; @@ -2202,6 +2239,7 @@ void LoadTauntsSettings(); void LoadHelicopterRepairRefuelSettings(); void LoadMoraleSettings(); void LoadReputationSettings(); +void LoadCreaturesSettings(); void FreeGameExternalOptions(); void InitGameOptions(); diff --git a/MainMenuScreen.cpp b/MainMenuScreen.cpp index 43c0b15c3..feb86c816 100644 --- a/MainMenuScreen.cpp +++ b/MainMenuScreen.cpp @@ -391,6 +391,8 @@ void InitDependingGameStyleOptions() LoadMoraleSettings(); // Load externalised reputation settings LoadReputationSettings(); + // Load creatures settings + LoadCreaturesSettings(); #ifdef JA2UB LoadGameUBOptions(); // JA25 UB diff --git a/Strategic/Creature Spreading.cpp b/Strategic/Creature Spreading.cpp index c64252987..9430a4c5a 100644 --- a/Strategic/Creature Spreading.cpp +++ b/Strategic/Creature Spreading.cpp @@ -60,18 +60,18 @@ //This is how often the creatures spread, once the quest begins. The smaller the gap, //the faster the creatures will advance. This is also directly related to the reproduction //rates which are applied each time the creatures spread. -#define EASY_SPREAD_TIME_IN_MINUTES 510 //easy spreads every 8.5 hours -#define NORMAL_SPREAD_TIME_IN_MINUTES 450 //normal spreads every 7.5 hours -#define HARD_SPREAD_TIME_IN_MINUTES 390 //hard spreads every 6.5 hours -#define INSANE_SPREAD_TIME_IN_MINUTES 150 //insane spreads every 2.5 hours +#define EASY_SPREAD_TIME_IN_MINUTES gCreaturesSettings.usCreatureSpreadTimeNovice //easy spreads every 8.5 hours +#define NORMAL_SPREAD_TIME_IN_MINUTES gCreaturesSettings.usCreatureSpreadTimeExperienced //normal spreads every 7.5 hours +#define HARD_SPREAD_TIME_IN_MINUTES gCreaturesSettings.usCreatureSpreadTimeExpert //hard spreads every 6.5 hours +#define INSANE_SPREAD_TIME_IN_MINUTES gCreaturesSettings.usCreatureSpreadTimeInsane //insane spreads every 2.5 hours //Once the queen is added to the game, we can instantly let her spread x number of times //to give her a head start. This can also be a useful tool for having slow reproduction rates //but quicker head start to compensate to make the creatures less aggressive overall. -#define EASY_QUEEN_INIT_BONUS_SPREADS 1 -#define NORMAL_QUEEN_INIT_BONUS_SPREADS 2 -#define HARD_QUEEN_INIT_BONUS_SPREADS 3 -#define INSANE_QUEEN_INIT_BONUS_SPREADS 5 +#define EASY_QUEEN_INIT_BONUS_SPREADS gCreaturesSettings.ubQueenInitBonusSpreadsNovice //1 +#define NORMAL_QUEEN_INIT_BONUS_SPREADS gCreaturesSettings.ubQueenInitBonusSpreadsExperienced //2 +#define HARD_QUEEN_INIT_BONUS_SPREADS gCreaturesSettings.ubQueenInitBonusSpreadsExpert //3 +#define INSANE_QUEEN_INIT_BONUS_SPREADS gCreaturesSettings.ubQueenInitBonusSpreadsInsane //5 //This value modifies the chance to populate a given sector. This is different from the previous definition. //This value gets applied to a potentially complicated formula, using the creature habitat to modify @@ -79,30 +79,30 @@ //population increases), etc. I would recommend not tweaking the value too much in either direction from //zero due to the fact that this can greatly effect spread times and maximum populations. Basically, if the //creatures are spreading too quickly, increase the value, otherwise decrease it to a negative value -#define EASY_POPULATION_MODIFIER 0 -#define NORMAL_POPULATION_MODIFIER 0 -#define HARD_POPULATION_MODIFIER 0 -#define INSANE_POPULATION_MODIFIER 0 +#define EASY_POPULATION_MODIFIER gCreaturesSettings.bCreaturePopulationModifierNovice //0 +#define NORMAL_POPULATION_MODIFIER gCreaturesSettings.bCreaturePopulationModifierExperienced //0 +#define HARD_POPULATION_MODIFIER gCreaturesSettings.bCreaturePopulationModifierExpert //0 +#define INSANE_POPULATION_MODIFIER gCreaturesSettings.bCreaturePopulationModifierInsane //0 //Augments the chance that the creatures will attack a town. The conditions for attacking a town //are based strictly on the occupation of the creatures in each of the four mine exits. For each creature //there is a base chance of 10% that the creatures will feed sometime during the night. -#define EASY_CREATURE_TOWN_AGGRESSIVENESS -10 -#define NORMAL_CREATURE_TOWN_AGGRESSIVENESS 0 -#define HARD_CREATURE_TOWN_AGGRESSIVENESS 10 -#define INSANE_CREATURE_TOWN_AGGRESSIVENESS 50 +#define EASY_CREATURE_TOWN_AGGRESSIVENESS gCreaturesSettings.bCreatureTownAggressivenessNovice //-10 +#define NORMAL_CREATURE_TOWN_AGGRESSIVENESS gCreaturesSettings.bCreatureTownAggressivenessExperienced //0 +#define HARD_CREATURE_TOWN_AGGRESSIVENESS gCreaturesSettings.bCreatureTownAggressivenessExpert //10 +#define INSANE_CREATURE_TOWN_AGGRESSIVENESS gCreaturesSettings.bCreatureTownAggressivenessInsane //50 //This is how many creatures the queen produces for each cycle of spreading. The higher //the numbers the faster the creatures will advance. -#define EASY_QUEEN_REPRODUCTION_BASE 6 //6-7 -#define EASY_QUEEN_REPRODUCTION_BONUS 1 -#define NORMAL_QUEEN_REPRODUCTION_BASE 7 //7-9 -#define NORMAL_QUEEN_REPRODUCTION_BONUS 2 -#define HARD_QUEEN_REPRODUCTION_BASE 9 //9-12 -#define HARD_QUEEN_REPRODUCTION_BONUS 3 -#define INSANE_QUEEN_REPRODUCTION_BASE 15 //15-20 -#define INSANE_QUEEN_REPRODUCTION_BONUS 5 +#define EASY_QUEEN_REPRODUCTION_BASE gCreaturesSettings.ubQueenReproductionBaseNovice //6 //6-7 +#define EASY_QUEEN_REPRODUCTION_BONUS gCreaturesSettings.ubQueenReproductionBonusNovice //1 +#define NORMAL_QUEEN_REPRODUCTION_BASE gCreaturesSettings.ubQueenReproductionBaseExperienced //7 //7-9 +#define NORMAL_QUEEN_REPRODUCTION_BONUS gCreaturesSettings.ubQueenReproductionBonusExperienced //2 +#define HARD_QUEEN_REPRODUCTION_BASE gCreaturesSettings.ubQueenReproductionBaseExpert //9 //9-12 +#define HARD_QUEEN_REPRODUCTION_BONUS gCreaturesSettings.ubQueenReproductionBonusExpert //3 +#define INSANE_QUEEN_REPRODUCTION_BASE gCreaturesSettings.ubQueenReproductionBaseInsane //15 //15-20 +#define INSANE_QUEEN_REPRODUCTION_BONUS gCreaturesSettings.ubQueenReproductionBonusInsane //5 //When either in a cave level with blue lights or there is a creature presence, then //we override the normal music with the creature music. The conditions are maintained @@ -816,6 +816,7 @@ void ChooseTownSectorToAttack( UINT8 ubSectorID, BOOLEAN fOverrideTest ) { INT32 iRandom, i; UINT8 ubSectorX, ubSectorY; + UINT8 ubAttackSectorX, ubAttackSectorY; INT8 bTownId, bTownSize; UINT8 ubAttackSectorID; @@ -943,23 +944,38 @@ void ChooseTownSectorToAttack( UINT8 ubSectorID, BOOLEAN fOverrideTest ) // determine the sector to attack if( !fOverrideTest ) { - bTownId = StrategicMap[ SECTOR_INFO_TO_STRATEGIC_INDEX ( ubSectorID )].bNameId; - bTownSize = GetTownSectorSize( bTownId ); - iRandom = PreRandom( bTownSize + 1 ) + 1; + // attack a random player-controlled town sector + if( gGameExternalOptions.fCrepitusAttackAllTowns ) + { + do + { + i = Random( SEC_P16 + 1 ); + } while ( !StrategicMap[ SECTOR_INFO_TO_STRATEGIC_INDEX ( i ) ].bNameId || + StrategicMap[ SECTOR_INFO_TO_STRATEGIC_INDEX ( i ) ].fEnemyControlled ); - // originating sector has double the chance - if( iRandom == bTownSize + 1 ) - ubAttackSectorID = ubSectorID; + ubAttackSectorID = i; + } + // attack only the creature originating town, nothing will happen if sector is enemy-controlled else { - INT32 j=0; - for( i = 0; i < MAP_WORLD_X * MAP_WORLD_Y + 1; i++ ) + bTownId = StrategicMap[ SECTOR_INFO_TO_STRATEGIC_INDEX ( ubSectorID )].bNameId; + bTownSize = GetTownSectorSize( bTownId ); + iRandom = PreRandom( bTownSize + 1 ) + 1; + + // originating sector has double the chance + if( iRandom == bTownSize + 1 ) + ubAttackSectorID = ubSectorID; + else { - if( StrategicMap[ i ].bNameId == bTownId ) + INT32 j=0; + for( i = 0; i < MAP_WORLD_X * MAP_WORLD_Y + 1; i++ ) { - j++; - if( iRandom == j ) - ubAttackSectorID = STRATEGIC_INDEX_TO_SECTOR_INFO( i ); + if( StrategicMap[ i ].bNameId == bTownId ) + { + j++; + if( iRandom == j ) + ubAttackSectorID = STRATEGIC_INDEX_TO_SECTOR_INFO( i ); + } } } } @@ -967,27 +983,107 @@ void ChooseTownSectorToAttack( UINT8 ubSectorID, BOOLEAN fOverrideTest ) else ubAttackSectorID = ubSectorID; + ubAttackSectorX = (UINT8)((ubAttackSectorID % 16) + 1); + ubAttackSectorY = (UINT8)((ubAttackSectorID / 16) + 1); + // determine the attack sector insertion code if( ubAttackSectorID == ubSectorID ) { gsCreatureInsertionCode = INSERTION_CODE_GRIDNO; gsCreatureInsertionGridNo = gCreaturePlacements[ giLairID ].iAttackSourceGridNo; } - else if ( ubAttackSectorID - ubSectorID < -15 ) + // attack sector north of source sector + else if( ubAttackSectorX < ubSectorX ) { - gsCreatureInsertionCode = INSERTION_CODE_SOUTH; + // valid entry + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ SOUTH_STRATEGIC_MOVE ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ SOUTH_STRATEGIC_MOVE ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = INSERTION_CODE_SOUTH; + } + else + { + for( i = 0; i < THROUGH_STRATEGIC_MOVE; i++ ) + { + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = i; + break; + } + } + } } - else if ( ubAttackSectorID - ubSectorID < 0 ) + // attack sector south of source sector + else if ( ubAttackSectorX > ubSectorX ) { - gsCreatureInsertionCode = INSERTION_CODE_EAST; + // valid entry + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ NORTH_STRATEGIC_MOVE ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ NORTH_STRATEGIC_MOVE ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = INSERTION_CODE_NORTH; + } + else + { + for( i = 0; i < THROUGH_STRATEGIC_MOVE; i++ ) + { + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = i; + break; + } + } + } } - else if ( ubAttackSectorID - ubSectorID < 16 ) + // attack sector west of source sector + else if( ubAttackSectorY < ubSectorY ) { - gsCreatureInsertionCode = INSERTION_CODE_WEST; + // valid entry + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ EAST_STRATEGIC_MOVE ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ EAST_STRATEGIC_MOVE ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = INSERTION_CODE_EAST; + } + else + { + for( i = 0; i < THROUGH_STRATEGIC_MOVE; i++ ) + { + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = i; + break; + } + } + } + } + // attack sector east of source sector + else if( ubAttackSectorY > ubSectorY ) + { + // valid entry + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ WEST_STRATEGIC_MOVE ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ WEST_STRATEGIC_MOVE ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = INSERTION_CODE_WEST; + } + else + { + for( i = 0; i < THROUGH_STRATEGIC_MOVE; i++ ) + { + if( SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != GROUNDBARRIER && + SectorInfo[ ubAttackSectorID ].ubTraversability[ i ] != EDGEOFWORLD ) + { + gsCreatureInsertionCode = i; + break; + } + } + } } else { - gsCreatureInsertionCode = INSERTION_CODE_NORTH; + Assert(0); + return; } gubSectorIDOfCreatureAttack = ubAttackSectorID; @@ -1181,8 +1277,8 @@ void EndCreatureQuest() } //Remove the creatures that are trapped underneath Tixa - pSector = FindUnderGroundSector( gModSettings.ubCrepitusFeedingSectorX, gModSettings.ubCrepitusFeedingSectorY, - gModSettings.ubCrepitusFeedingSectorZ ); // (9, 10, 2) + pSector = FindUnderGroundSector( gCreaturesSettings.ubCrepitusFeedingSectorX, gCreaturesSettings.ubCrepitusFeedingSectorY, + gCreaturesSettings.ubCrepitusFeedingSectorZ ); // (9, 10, 2) if( pSector ) { pSector->ubNumCreatures = 0; @@ -1383,7 +1479,7 @@ BOOLEAN PrepareCreaturesForBattle() { ubNumColors = LightGetColors( LColors ); - if (! gbWorldSectorZ ) + if ( !gbWorldSectorZ ) { UseCreatureMusic(LColors->peBlue); return FALSE; //Creatures don't attack overworld with this battle code. @@ -1610,6 +1706,7 @@ void CreatureNightPlanning() { //Check the populations of the mine exits, and factor a chance for them to attack at night. UINT8 ubNumCreatures; + INT32 i; /* // externalize to xml data ubNumCreatures = CreaturesInUndergroundSector( SEC_H3, 1 ); @@ -1639,10 +1736,42 @@ void CreatureNightPlanning() // Attacksource B1 underground sector must be a valid creature habitat! ubNumCreatures = CreaturesInUndergroundSector( ubSectorID , 1 ); - if( ubNumCreatures > 1 && ubNumCreatures * 10 > (INT32)PreRandom( 100 ) ) - { //10% chance for each creature to decide it's time to attack. - AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 +PreRandom( 429 ), ubSectorID ); + //10% chance for each creature with difficulty modifier to decide it's time to attack. + switch( gGameOptions.ubDifficultyLevel ) + { + case DIF_LEVEL_EASY: + i = EASY_CREATURE_TOWN_AGGRESSIVENESS; + if( ubNumCreatures > 1 && ubNumCreatures * 10 + i > (INT32)PreRandom( 100 ) ) + { + AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 + PreRandom( 429 ), ubSectorID ); + } + break; + case DIF_LEVEL_MEDIUM: + i = NORMAL_CREATURE_TOWN_AGGRESSIVENESS; + if( ubNumCreatures > 1 && ubNumCreatures * 10 + i > (INT32)PreRandom( 100 ) ) + { + AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 + PreRandom( 429 ), ubSectorID ); + } + break; + case DIF_LEVEL_HARD: + i = HARD_CREATURE_TOWN_AGGRESSIVENESS; + if( ubNumCreatures > 1 && ubNumCreatures * 10 + i > (INT32)PreRandom( 100 ) ) + { + AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 + PreRandom( 429 ), ubSectorID ); + } + break; + case DIF_LEVEL_INSANE: + i = INSANE_CREATURE_TOWN_AGGRESSIVENESS; + if( ubNumCreatures > 1 && ubNumCreatures * 10 + i > (INT32)PreRandom( 100 ) ) + { + AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 + PreRandom( 429 ), ubSectorID ); + } + break; } + //if( ubNumCreatures > 1 && ubNumCreatures * 10 > (INT32)PreRandom( 100 ) ) + //{ //10% chance for each creature to decide it's time to attack. + // AddStrategicEvent( EVENT_CREATURE_ATTACK, GetWorldTotalMin() + 1 + PreRandom( 429 ), ubSectorID ); + //} } diff --git a/Strategic/strategic.h b/Strategic/strategic.h index 3e4e98185..cfe6ad320 100644 --- a/Strategic/strategic.h +++ b/Strategic/strategic.h @@ -22,8 +22,8 @@ struct strategicmapelement{ enum { INSERTION_CODE_NORTH, - INSERTION_CODE_SOUTH, INSERTION_CODE_EAST, + INSERTION_CODE_SOUTH, INSERTION_CODE_WEST, INSERTION_CODE_GRIDNO, INSERTION_CODE_ARRIVING_GAME, diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp index 8691512dc..9f97e1bf7 100644 --- a/Strategic/strategicmap.cpp +++ b/Strategic/strategicmap.cpp @@ -2174,8 +2174,8 @@ BOOLEAN SetCurrentWorldSector( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) #ifdef JA2UB /* Ja25 no creatures */ #else - if( gWorldSectorX == gModSettings.ubCrepitusFeedingSectorX && gWorldSectorY == gModSettings.ubCrepitusFeedingSectorY - && gbWorldSectorZ == gModSettings.ubCrepitusFeedingSectorZ ) // (9, 10, 2) + if( gWorldSectorX == gCreaturesSettings.ubCrepitusFeedingSectorX && gWorldSectorY == gCreaturesSettings.ubCrepitusFeedingSectorY + && gbWorldSectorZ == gCreaturesSettings.ubCrepitusFeedingSectorZ ) // (9, 10, 2) { InitCreatureQuest(); //Ignored if already active. } diff --git a/gameloop.cpp b/gameloop.cpp index 4383cc9d4..0539ab20c 100644 --- a/gameloop.cpp +++ b/gameloop.cpp @@ -145,6 +145,8 @@ BOOLEAN InitializeGame(void) LoadMoraleSettings(); // Load externalised reputation settings LoadReputationSettings(); + // Load creatures settings + LoadCreaturesSettings(); #ifdef JA2UB LoadGameUBOptions(); // JA25 UB