Jump to content

Normalizing Normal Difficulty (buncha small changes)


johnnylump

Recommended Posts

Amineri's squadsight nerf has the added bonus of disabling the progressive to-hit bonus to the player (ie cheating) after misses on easy and normal difficulty, in its edits to XGAbility_Targeted.AdjustToHit.

 

To build on this, I went through and found a bunch of small changes that made normal and sometimes classic easier than impossible, and change the settings so they are all the same. For modding purposes, this transfers control of the difficulty to modders, who can now manage difficulty much more carefully through .ini settings to, say, alien hit points, monthly funding, etc.

 

The overall impact of this is to serve to make "normal" difficulty a legitimate difficulty, IMO. I can present Long War players with three meaningful difficulty options (normal, classic, impossible) and specify the precise differences between them.

 

EDIT: I found these by simply searching "difficulty" in both the main upk files.

 

EDIT 2: I should add that I don't believe any of these will make the game massively harder. The changes to DetermineSpecialMissionSquad() and possibly AddPossible() (in the next post) are possibly the most significant, along with Amineri's squadsight mod.

 

The changes are:

 

XComGame.upk (IIRC, these all remove normal 'cheats')

XcomGame -->

XGAIPlayer >> AvoidVIP
18 6c 00 98 19 19 2e 
to 
18 6c 00 96 19 19 2e

XGAIBehaviorThinMan >> PrefersLowCover, XGAiBehaviorSectoid >> PRefersLowCover (2 identical changes)
07 70 00 98 19 19 2e 64 
to 
07 70 00 96 19 19 2e 64

XGAIBehavior >> GetMinHitChance
9a 19 19 2e 64 2d 00 00 19 12 20 4f fe ff ff 0a 00 d8 f9 ff ff 00 1c f6 fb ff ff 16 09 00 98 f9 ff ff 00 01 98 f9 ff ff 09 00 71 2d 00 00 00 01 71 2d 00 00 0a 00 c7 9c 00 00 00 1b 1b 32 00 00 00 00 00 00 16 2c 03
to
99 19 19 2e 64 2d 00 00 19 12 20 4f fe ff ff 0a 00 d8 f9 ff ff 00 1c f6 fb ff ff 16 09 00 98 f9 ff ff 00 01 98 f9 ff ff 09 00 71 2d 00 00 00 01 71 2d 00 00 0a 00 c7 9c 00 00 00 1b 1b 32 00 00 00 00 00 00 16 2c 01

XGAIPlayer >> GetAcceptableOverwatchMovementSightRadiusPercent
2c 96 00 00 1e 00 00 40 3f 06 c7 00 
to 
2c 96 00 00 1e 66 66 66 3f 06 c7 00

XGTacticalGameCore >> TryStunned
07 9e 03 98 01 66 76 00 00 26 16
to
07 9e 03 98 01 66 76 00 00 25 16


EDIT: Found three more

XGAIPlayer CanCrit()
07 96 00 9a 19 19 19
to
07 96 00 96 19 19 19

XGAIPlayer InitMindMerge()
00 96 98 00 00 1e 00 00 a0 40 16
to
00 96 98 00 00 1e 00 00 00 40 16

XGAIPlayer CanOneShot()
07 24 02 9a 19 19 19
to
07 24 02 96 19 19 19 
Edited by johnnylump
Link to comment
Share on other sites

The following changes are to XComStrategyGame.upk

- XGAlienObjective OverseerUpdate

16 26 16 04 0b 0f 00 f9 20
to
16 25 16 04 0b 0f 00 f9 20

- XGAlienObjective LaunchUFO

16 26 16 18 2e 00 81 19
to
16 25 16 18 2e 00 81 19

- XGBase GenerateTiles

16 26 16 1b c8 23 00
to
16 25 16 1b c8 23 00

- XGFundingCouncil CausePaniconFailure

07 ef 01 9a 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 2c 03
to
07 ef 01 99 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 2c 01

- XGHeadQuarters GetPowerCapacity

16 26 16 a1 00 04 33
to
16 25 16 a1 00 04 33

- XGStrategyAI AddNewOverseers

07 f7 00 97 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 26
to
07 f7 00 99 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 26

- XGStrategyAI DetermineBestHuntTargets 

07 e7 00 82 98 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 26
to
07 e7 00 82 98 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 25

- XGStrategyAI DetermineSpecialMissionSquad (2 changes)

16 2c 02 16 05 4b 43
to
16 2c 00 16 05 4b 43		

- XGSTrategyAI DetermineFirstMissionSquad

16 2c 02 16 0f 35 38
to
16 2c 01 16 0f 35 38
	
07 2f 02 9a 19 1b 4c
to
07 2f 02 99 19 1b 4c

16 2c 03 16 54 35 e4
to
16 2c 01 16 54 35 e4		

- XGStrategyAI DetermineOverseerSquad

06 be 00 0f 00 36 44 00 00 2c 02
to
06 be 00 0f 00 36 44 00 00 2c 03

16 2c 02 16 55 35 e4 ff ff
to
16 2c 01 16 55 35 e4 ff ff

- XGStrategyAI DetermineCommanderType
04 24 04 06 01 01 04 24 12
to
04 24 12 06 01 01 04 24 12

- XGStrategyAI AddPossible
07 0c 01 9a 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 2c 03
to
07 0c 01 99 19 1b 4c 0e 00 00 00 00 00 00 16 0a 00 43 41 00 00 00 1b f6 0e 00 00 00 00 00 00 16 2c 01

These are all unique code strings and do not prevent the game from starting up if implemented. In a few cases, these will impact easy difficulty as well. I'll leave it to you to investigate the specific impact of each change by looking at the code and deciding whether to implement it.

 

In addition, XGStrategyAI.GetNumOutsiders, GetAbductionDifficulty, and the other Determine*Squad functions all have difficulty-related settings I've long since modded beyond the simple changes noted above; those changes are not included here. GetNumOutsiders is bugged in vanilla (in that it provides more outsiders for easier difficulties); GetAbductionDifficulty makes abductions on impossible one step harder, and the Determine*Squad functions generally max out the aliens at 3 per pod on impossible difficulty.

Edited by johnnylump
Link to comment
Share on other sites

Awesome finds.

 

I'm personally leaving as many cheats in possible in my 'Normal' as it's my new Easy and Amineri's awesome Alien Stats progression and regerneation modlet has made the tactical combat identical for the 2nd and 3rd difficulty, except for all these cheats. So I kind of need them at the moment, hehe.

Link to comment
Share on other sites

Awesome finds.

 

I'm personally leaving as many cheats in possible in my 'Normal' as it's my new Easy and Amineri's awesome Alien Stats progression and regerneation modlet has made the tactical combat identical for the 2nd and 3rd difficulty, except for all these cheats. So I kind of need them at the moment, hehe.

 

I've been thinking about updating the Dynamic Stats progression mod to make the progression vary based on difficulty (e.g. aliens improve stats slower on a easier difficulty setting and faster on a harder one).

 

Also the 2nd iteration of the mod allows for only one base stat offset based on difficulty, so I've been trying to think of ways to add back 1 or 2 base stat deltas based on difficulty.

 

Is there interest in this?

 

Until the mod installers support using the DGC.ini file I'm pretty much limited to packing additional information into the existing BalanceMod structures, likely in a manner similar to how I packed the two ammo values into the iSuppression field for the ammo mod.

 

I could do something like put the Normal/Classic/Impossible stat mods into BalanceMods_Impossible, by packing the values as 010304 (this would be +1 Normal, +3 Classic, +4 Impossible). Making the stats scale from Easy means most of them should be positive. The only exception would be the XCOM soldier values, of which only iHP is typically reduced based on difficulty setting.

 

I suppose I could add in the assumption that any values for XCOM units (soldiers and SHIVs) are always assumed to be negative...

 

---------------------

 

The concern I share with JL is that altering the hit probabilities in ways that aren't displayed to the player (done in Easy/Normal) sets up skewed expectations and makes the transition from Normal to Classic more difficult than it need be. I've seen quite a few comments on the 2k forums about the large delta in difficulty from Normal to Classic, as all the player-cheats are turned off, the AI is unshackled and the aliens get some significant stat bonuses all at once.

Link to comment
Share on other sites

I'm fine with where I am with the difficult modifiers at the moment. But with more modlets being introduced it would make sense to crack open the DGC.ini to allow new code that can be easily editable but i'm personally not against trawling through upk code to make changes either.

 

Also I would need some negative modifiers for the aliens due to the game treating the XCom weapons as the alien ones.

Link to comment
Share on other sites

From my perspective, I'm trying to reduce the number of difficulty-related variables so I can have more direct control over it. Putting normal, classic and impossible on a more level playing field accomplishes this, so I'm not in a hurry to put more difficulty variable settings back in the game. The criticism LW gets is over difficulty, so my hope is that I can have fewer but stronger levers to pull to tweak it in the right direction. If someone says classic is too hard, I can send them in good faith to normal, with more monthly cash, less starting panic and slightly easier aliens -- but otherwise it's the same game. If normal is still too hard, then I have to figure out if the difficulty is capricious or the player in question just hasn't mastered certain aspects of the game.

Link to comment
Share on other sites

Well, Long War is still using the version 1 Dynamic Alien stats mod that doesn't include the Regeneration and Damage Reduction Stats (and allows stat deltas for Classic and Impossible), while I believe that Merciless is using the version 2 that added generally configurable/upgradable Regen and DR, but only has difficulty stat deltas for Impossible (it took over the Classic settings).

 

This was predicated on there only being two effective difficulties (Classic and Impossible) because of all of the cheat code.

 

I'm glad that it's getting gone through and identified so it can be removed, but it does mean that I should re-examine the earlier decision to remove the Classic difficulty modifiers.

 

 

I can compress three upgrades into one balance mod entry using the same trick as with the ammo system, but using 3 digits per tier (since day count often goes over 100).

 

That is, something like iHP = 001003002 would mean +2 HP at day trigger #1, +3 HP at day trigger #2, and +1 HP at day trigger #3. Days would be specified in the iCritHit, with something like iCritHit = 450210090 specifying 90 days for trigger#1, 210 days for trigger #2 and 450 days for trigger #3.

 

This would allow for three upgrades (which are all positive values) whlie still maintaining three stat deltas based on difficulty (which can be plus or minus).

 

------------

 

Given the above is it desirable at all

 

As for Regen and DR configuration... I see that in the current Long War that the iWill stat is never upgraded. If there is consensus that this need not be upgraded I could pack both regen and DR into the will stat (these really should always be single digit value or else balance is getting pretty crazy).

 

Packing in 1 initial value and 3 upgrades of both Regen and DR into will would look like:

iWill = 432109876 -- yields for DR 6 initial, and upgrades of 7, 8, and 9 -- yields for Regen 1 initial, and upgrades of 2, 3 and 4. In practice Regen and DR are used much more sparingly. This would also, unfortunately, remove the ability have assign a negative DR value.

 

This is kind of any ugly workaround, and not my preferred way to implement this.

 

-----------------------

 

If the DGC.ini file load can be worked out for distribution, then a much easier option becomes available. Essentially this would use the fact that the BalanceMods are dynamic arrays, in order to add on dynamic array elements to each.

 

What I would do is pack all of the base difficulty settings into one of the arrays (I'd probably pick BalanceMods_Classic). Instead of 22 entries, this array would now define 88 entries -- 22 entries for each difficulty setting.

 

The first block of 22 would apply to easy, the second block would apply to normal, etc. This also has the advantage of resulting in a lot tighter hex code when loading the information. In theory, if the UI allows it, it could even open up more than 4 difficulty options (as if anyone would want that).

 

The DGC.ini section would look like so:

 

 

;Easy difficulty 
BalanceMods_Classic=(eType=eChar_None,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Civilian,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Soldier,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=-2, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Tank,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectoid,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Floater,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_Thinman,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Muton,				iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Cyberdisc,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_SectoidCommander,	iDamage=3,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_FloaterHeavy,		iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=3,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonElite,		iDamage=0,iCritHit=0, iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Ethereal,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=5, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_Chryssalid,		iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Zombie,			iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=-2,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonBerserker,	iDamage=1,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectopod,			iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=5, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Drone,				iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Outsider,			iDamage=0,iCritHit=10,iAim=10,iDefense=10,iHP=0,iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_EtherealUber,		iDamage=0,iCritHit=20,iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=10)
BalanceMods_Classic=(eType=eChar_BattleScanner,		iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)

;Normal difficulty 
BalanceMods_Classic=(eType=eChar_None,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Civilian,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Soldier,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=-2, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Tank,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectoid,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Floater,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_Thinman,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Muton,				iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Cyberdisc,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_SectoidCommander,	iDamage=3,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_FloaterHeavy,		iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=3,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonElite,		iDamage=0,iCritHit=0, iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Ethereal,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=5, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_Chryssalid,		iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Zombie,			iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=-2,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonBerserker,	iDamage=1,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectopod,			iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=5, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Drone,				iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Outsider,			iDamage=0,iCritHit=10,iAim=10,iDefense=10,iHP=0,iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_EtherealUber,		iDamage=0,iCritHit=20,iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=10)
BalanceMods_Classic=(eType=eChar_BattleScanner,		iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)

;Classic difficulty 
BalanceMods_Classic=(eType=eChar_None,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Civilian,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Soldier,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=-2, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Tank,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectoid,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Floater,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_Thinman,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Muton,				iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Cyberdisc,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_SectoidCommander,	iDamage=3,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_FloaterHeavy,		iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=3,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonElite,		iDamage=0,iCritHit=0, iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Ethereal,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=5, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_Chryssalid,		iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Zombie,			iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=-2,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonBerserker,	iDamage=1,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectopod,			iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=5, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Drone,				iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Outsider,			iDamage=0,iCritHit=10,iAim=10,iDefense=10,iHP=0,iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_EtherealUber,		iDamage=0,iCritHit=20,iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=10)
BalanceMods_Classic=(eType=eChar_BattleScanner,		iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)

;Impossible difficulty 
BalanceMods_Classic=(eType=eChar_None,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Civilian,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Soldier,			iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=-2, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Tank,				iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0,  iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectoid,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Floater,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_Thinman,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Muton,				iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Cyberdisc,			iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_SectoidCommander,	iDamage=3,iCritHit=10,iAim=10,iDefense=0,iHP=0, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_FloaterHeavy,		iDamage=0,iCritHit=0, iAim=0,iDefense=0,iHP=0, iMobility=3,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonElite,		iDamage=0,iCritHit=0, iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Ethereal,			iDamage=0,iCritHit=10,iAim=10,iDefense=0,iHP=5, iMobility=0,iWill=35)
BalanceMods_Classic=(eType=eChar_Chryssalid,		iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Zombie,			iDamage=2,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=-2,iWill=0)
BalanceMods_Classic=(eType=eChar_MutonBerserker,	iDamage=1,iCritHit=0,iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Sectopod,			iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=5, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Drone,				iDamage=0,iCritHit=0,iAim=0,iDefense=0,iHP=0, iMobility=0,iWill=0)
BalanceMods_Classic=(eType=eChar_Outsider,			iDamage=0,iCritHit=10,iAim=10,iDefense=10,iHP=0,iMobility=5,iWill=0)
BalanceMods_Classic=(eType=eChar_EtherealUber,		iDamage=0,iCritHit=20,iAim=10,iDefense=10,iHP=0,iMobility=0,iWill=10)
BalanceMods_Classic=(eType=eChar_BattleScanner,		iDamage=0,iCritHit=0, iAim=0, iDefense=0,iHP=0, iMobility=0,iWill=0) 

 

 

 

This works because the ModifyStatsByDifficulty doesn't check the eType field of the structure -- it uses array position to define which character is getting the stat increases. The array element would be computed via 22*Difficulty + iCharID.

 

This method allows positive and negative values for every character type at every difficulty setting.

 

-------------

 

This then leaves the other three arrays available for other configuration purposes. One array can be used to define dynamic stat upgrades (and since it will be growing a dynamic array, this allows for as many upgrades as is desired).

 

I'd likely take over a third array to define the Damage Reduction and Regeneration progression (and maybe play around with some of the other stats to see what they do)

 

In this implementation I'd use the eType stat to reduce the amount of configuration clutter. This would allow different aliens to have differing numbers of upgrades (e.g. Sectoids could have 5 upgrades while Mutons have 3 and Ethereals have none).

 

This would look like:

 

 

; five Sectoid upgrades
BalanceMods_Normal=(eType=eChar_Sectoid, iDamage=0, iCritHit=15,iAim=0,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Normal=(eType=eChar_Sectoid, iDamage=1, iCritHit=90,iAim=5,iDefense=0,iHP=1, iMobility=1,iWill=0)
BalanceMods_Normal=(eType=eChar_Sectoid, iDamage=1, iCritHit=150,iAim=5,iDefense=0,iHP=1, iMobility=0,iWill=0)
BalanceMods_Normal=(eType=eChar_Sectoid, iDamage=1, iCritHit=240,iAim=10,iDefense=0,iHP=1, iMobility=1,iWill=0)
BalanceMods_Normal=(eType=eChar_Sectoid, iDamage=1, iCritHit=360,iAim=10,iDefense=0,iHP=1, iMobility=1,iWill=0)

; three Muton upgrades
BalanceMods_Normal=(eType=eChar_Muton, iDamage=0, iCritHit=120,iAim=0,iDefense=0,iHP=2, iMobility=0,iWill=0)
BalanceMods_Normal=(eType=eChar_Muton, iDamage=1, iCritHit=210,iAim=0,iDefense=0,iHP=2, iMobility=0,iWill=0)
BalanceMods_Normal=(eType=eChar_Muton, iDamage=1, iCritHit=360,iAim=0,iDefense=0,iHP=2, iMobility=0,iWill=0) 

 

 

 

ModifyStatsByDifficulty is called for a particular character type. The above dynamic config would be applied by looping through the entire BalanceMods_Normal array (or dynamic size). Any entry whose eType matches the current character type AND when the day count exceeds the value defined in iCritHit, then the stat delta is applied.

 

It would allow many smaller upgrades resulting in a smoother ramp-up of difficulty as the campaign progresses.

 

One possible additional thing that I'll have to ponder is how to adjust the dynamic stat amounts or times based on the difficulty setting...

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...