From 86a29675083598679d8701a88f0db5787e7cb26f Mon Sep 17 00:00:00 2001 From: Flugente Date: Mon, 4 Nov 2013 22:32:44 +0000 Subject: [PATCH] new radio operator settings: RADIO_OPERATOR_ARTILLERY disables artillery for all teams, RADIO_OPERATOR_ARTILLERY_DISTRIBUTED_OVER_TURNS causes artillery to not fire one massive barrage, but to fire over multipe turns git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6556 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 2 ++ GameSettings.h | 4 +++- Tactical/Soldier Control.cpp | 32 +++++++++++++++++++++++--------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 36f1ce5c..59801b1f 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2356,6 +2356,8 @@ void LoadSkillTraitsExternalSettings() gSkillTraitValues.fCOElitesDetectNextTile = iniReader.ReadBoolean("Covert Ops","COVERT_ELITES_DETECT_NEXTTILE", TRUE); // Flugente: RADIO OPERATOR + gSkillTraitValues.fROAllowArtillery = iniReader.ReadBoolean("Radio Operator","RADIO_OPERATOR_ARTILLERY", TRUE); + gSkillTraitValues.fROArtilleryDistributedOverTurns = iniReader.ReadBoolean("Radio Operator","RADIO_OPERATOR_ARTILLERY_DISTRIBUTED_OVER_TURNS", FALSE); gSkillTraitValues.bVOArtillerySectorFrequency = iniReader.ReadInteger("Radio Operator","RADIO_OPERATOR_ARTILLERY_SECTOR_FREQUENCY", 120, 20, 1440); gSkillTraitValues.usVOMortarCountDivisor = iniReader.ReadInteger("Radio Operator","RADIO_OPERATOR_MORTAR_COUNT_DIVISOR", 6, 5, 20); gSkillTraitValues.usVOMortarShellDivisor = iniReader.ReadInteger("Radio Operator","RADIO_OPERATOR_MORTAR_SHELL_DIVISOR", 30, 2, 100); diff --git a/GameSettings.h b/GameSettings.h index 6ebb72ba..c8d56766 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1580,7 +1580,9 @@ typedef struct BOOLEAN fCOElitesDetectNextTile; // RADIO OPERATOR - INT16 bVOArtillerySectorFrequency; // ability to call an a artillery strike from a sector every '_' minutes. Only applies if ordered from enemy/militia + BOOLEAN fROAllowArtillery; // artillery can be forbidden for all teams with this setting + BOOLEAN fROArtilleryDistributedOverTurns; // shells don't come in at once, but over multiple turns + INT16 bVOArtillerySectorFrequency; // ability to call an a artillery strike from a sector every '_' minutes. Only applies if ordered from enemy/militia UINT8 usVOMortarCountDivisor; UINT8 usVOMortarShellDivisor; UINT8 usVOMortarPointsAdmin; diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index afa45955..af9f8a96 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -17266,6 +17266,9 @@ BOOLEAN SOLDIERTYPE::GetSlotOfSignalShellIfMortar(UINT8* pbLoop) BOOLEAN SOLDIERTYPE::CanAnyArtilleryStrikeBeOrdered(UINT32* pSectorID) // can any artillery strikes be ordered by this guy's team from the neighbouring sectors? { + if ( !gSkillTraitValues.fROAllowArtillery ) + return FALSE; + if ( this->bSectorZ ) return FALSE; @@ -17450,6 +17453,10 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN for (INT16 i = 0; i < numwaves; ++i) { AddItemToPool( sStartingGridNo, &shellobj, HIDDEN_ITEM, 1, WORLD_ITEM_ARMED_BOMB, 0 ); + + // if option is set, delay each wave by one turn + if ( gSkillTraitValues.fROArtilleryDistributedOverTurns ) + shellobj[0]->data.misc.bDelay += 1; } // update the sector Artillery time @@ -17582,7 +17589,12 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN // check if soldier exists in this sector if ( !pSoldier || !pSoldier->bActive || pSoldier->sSectorX != sSectorX || pSoldier->sSectorY != sSectorY || pSoldier->bSectorZ != bSectorZ|| pSoldier->bAssignment > ON_DUTY ) continue; - + + INT8 shelldelay = 1; + // In realtime the player could choose to put down a bomb right before a turn expires, so add 1 to the setting in RT + if ( !(gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT) ) + ++shelldelay; + INT8 invsize = (INT8)pSoldier->inv.size(); // remember inventorysize, so we don't call size() repeatedly for ( INT8 bLoop = 0; bLoop < invsize; ++bLoop) { @@ -17596,6 +17608,10 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN // only fire if not signal shell, we already fired one, no need to do so again if ( pAttObj )//&& !HasItemFlag(pAttObj->usItem, SIGNAL_SHELL) ) { + // if option is set, delay each wave by one turn + if ( gSkillTraitValues.fROArtilleryDistributedOverTurns ) + ++shelldelay; + // create mortar shell item OBJECTTYPE shellobj; CreateItem( pAttObj->usItem, 100, &shellobj ); @@ -17606,10 +17622,7 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN shellobj[0]->data.misc.usBombItem = shellobj.usItem; shellobj[0]->data.misc.ubBombOwner = this->ubID + 2; - // In realtime the player could choose to put down a bomb right before a turn expires, so add 1 to the setting in RT - shellobj[0]->data.misc.bDelay = 1; - if ( !(gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT) ) - shellobj[0]->data.misc.bDelay++; + shellobj[0]->data.misc.bDelay = shelldelay; shellobj[0]->data.ubWireNetworkFlag = ARTILLERY_STRIKE_COUNT_1; @@ -17633,6 +17646,10 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN // only fire if not signal shell, we already fired one, no need to do so again if ( pShellObj && !HasItemFlag(pShellObj->usItem, SIGNAL_SHELL) ) { + // if option is set, delay each wave by one turn + if ( gSkillTraitValues.fROArtilleryDistributedOverTurns ) + ++shelldelay; + // create mortar shell item OBJECTTYPE shellobj; CreateItem( pShellObj->usItem, 100, &shellobj ); @@ -17643,10 +17660,7 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN shellobj[0]->data.misc.usBombItem = shellobj.usItem; shellobj[0]->data.misc.ubBombOwner = this->ubID + 2; - // In realtime the player could choose to put down a bomb right before a turn expires, so add 1 to the setting in RT - shellobj[0]->data.misc.bDelay = 1; - if ( !(gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT) ) - shellobj[0]->data.misc.bDelay++; + shellobj[0]->data.misc.bDelay = shelldelay; shellobj[0]->data.ubWireNetworkFlag = ARTILLERY_STRIKE_COUNT_1;