Jump to content

R&D Unlocking Hidden/Unused Perks


Amineri

Recommended Posts

Update on a few more "extra" perks:

 

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

 

Repair (0x67)

 

Has an icon and help text, but appears to have no in-game effect. Repair ability for Drones appears to be hard-coded, and buried somewhere in the native code. Some new functionality would have to be built for Repair. The best option I've been able to think of is to make the Arc Thrower "Repair SHIV" ability not consume an Arc Thrower charge if the unit has the Repair perk. It's not very strong, though...

 

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

 

Vengeance (0x2A)

 

Has code that appears to be functional. If a unit has vengeance and takes damage, the unit immediately fires its main weapon at the unit that caused it damage. I haven't tested this yet. It should have an icon, but no localisation descriptive text.

 

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

 

ReadyForAnything (0x1E)

 

Has some code present, but appears non-functional. One code bit appears to increase the radius of Smoke Grenades by 25%. Another is a conditional check to see if the unit was "Ready For Anything" -- if it had fired but not moved, and could see at least one enemy. Unclear what the final effect was supposed to be. Perk has an icon, but no localisation descriptive text.

Link to comment
Share on other sites

  • Replies 40
  • Created
  • Last Reply

Top Posters In This Topic

Found that someone had previous done a bunch of work putting together a TES wiki page detailing a ton of information on all of the perks in the game.

 

http://wiki.tesnexus.com/index.php/XCOM:EU_Perks#.22Alien.22_Perks should get you to about the correct page. It needs some formatting help, and category tags to get linked into the other XCOM wiki pages, but is a great start.

 

I'm likely going to start putting info I find there, and just post short updates to the forum post.

Link to comment
Share on other sites

  • 3 weeks later...

I've always thought it'd be cool if the covering fire perk would allow the reaction shot to take place *before* the alien shots, I'd love to see a muton handing a grenade and getting shot down right there before throwing it... would the grenade explode there? Now that we know there are plenty of unused perks maybe that can be made in a different perk, obviously a much superior one, more fitting for higher levels. I haven't searched for the code responsible for the covering fire perk or anything, I may eventually do it, but I thought I'd toss the idea here. Combined with regular Covering Fire and Sentinel or rapid fire and nobody'll dare to shoot you

Link to comment
Share on other sites

  • 3 weeks later...

Bombadier perk only applies to Alien Grenades.... :(

 

I figured out where the code that is limiting Bombardier to only alien grenades is located : XGAction_Fire.SetChainedDistance

 

It basically has a case statement for various free-aim targeted abilities defining what the range is. These abilities include:

eAbility_FragGrenade = 22       // distance = weapon distance (15 tiles in vanilla)
eAbility_SmokeGrenade = 23      // distance = weapon distance (15 tiles in vanilla)
eAbility_AlienGrenade = 24      // distance = weapon distance (17 tiles in vanilla) OR Sight Range if HasBombardAbility
eAbility_BattleScanner = 71     // distance = weapon distance (27 tiles in vanilla)
eAbility_Rift = 73              // distance = 100 tiles
eAbility_PsiInspiration = 76    // distance = sight 
eAbility_TelekineticField = 74  // distance = sight 
eAbility_Plague = 35            // distance = sight 
eAbility_RocketLauncher = 25    // distance = sight 
eAbility_ShredderRocket = 66    // distance = sight 

Interestingly the two rocket abilities use sight distance instead of the Rocket Launcher or Blaster Launcher weapon distance defined in the DGC.ini. This would prevent Squadsight + Rocket Launcher operation unless it were changed.

 

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

 

The good news is that it should be possible to make the Bombadier perk work with more than just alien grenades. I suspect everyone agrees working with Frag grenades makes sense. I'm also thinking that Smoke Grenades and probably Battlescanners make sense.

 

While I'm in the function, I'm planning to make Bombadier grant a % increase to range instead of simply increasing it to visual. This would apply to alien Bombadiers as well. I'm thinking a 50% range increase seems about right (although it will be configurable via hex edit).

 

For vanilla range values, Bombadier ranges would be:

Frag, Smoke : 22 tiles

Alien : 25 tiles

Battlescanner : 40 tiles

 

This should prevent hitting units that can't be visually seen with the AoE edge of the blast.

 

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

 

Rockets:

 

I'm also thinking of making the two Rocket abilities draw from the weapon range instead of using sight while I'm there.

 

Another option is to check if the unit has moved (I think units can move and fire rockets if given SnapShot), in which case the max range could be reduced by some amount, say 50% by default.

Link to comment
Share on other sites

Agreed, get rid of the fixed max rocket ranges and leave it to the ini, maybe we can adapt another spare perk (call it "Booster" or "Recoilless Rifle" or "RAP Rounds" (Rocket Assisted Projective) as to give them long ranges, and make it either an item or a bonafide perk to pick

 

And Agreed, bombard should apply to everything thrown

 

Might include some code for psi grenade ... that may be why I couldn't throw it when I tried it out

Link to comment
Share on other sites

Agreed, get rid of the fixed max rocket ranges and leave it to the ini, maybe we can adapt another spare perk (call it "Booster" or "Recoilless Rifle" or "RAP Rounds" (Rocket Assisted Projective) as to give them long ranges, and make it either an item or a bonafide perk to pick

 

And Agreed, bombard should apply to everything thrown

 

Might include some code for psi grenade ... that may be why I couldn't throw it when I tried it out

 

I looked into the PsiBomb ability and it appears to be a non-functioning psi ability rather than the ability to implement the psi grenade.

 

 

 

There are quite a few psi animations and abilities:

eAnimAction_PsiAttack
eAnimAction_PsiAttack2
eAnimAction_PsiDrain
eAnimAction_PsiBomb
eAnimAction_PsiBless
eAnimAction_PsiReflect
eAnimAction_PsiPanic
eAnimAction_PsiControl
eAnimAction_PsiInspiration

eAbility_PsiLance
eAbility_PsiBoltII
eAbility_PsiBomb
eAbility_PsiControl
eAbility_PsiPanic
eAbility_PsiDrain
eAbility_PsiBless
eAbility_PsiInspiration

Their item IDs are for the most part in the same block, and distinct from the grenade abilities. Of particular note are the PsiBless and PsiBomb abilities/animations which currently don't have corresponding perks. PsiLance, PsiBolt, and PsiDrain are all alien-only psi abilities, I think.

 

Given this I think it's more likely that I'll be able to duplicate an existing grenade for an upgrade, like I did for the First Aid Kit. I'm not sure where to proceed with a new ability / new item.

 

 

 

 

As far as the "chained abilities" rework, here is my current target code:

 

 

 

if(AbilityRequiresChainedDistance(eInputAbilityType))
{
	UnitX = 0;
	
	switch(eInputAbilityType)  // switch for Bombadier-capable abilities
	{
		case 22: // eAbility_FragGrenade
			UnitX = 85; // eItem_FragGrenade
			break;
		case 24: // eAbility_AlienGrenade 
			UnitX = 88; // eItem_AlienGrenade
			break;
		case 23: // eAbility_SmokeGrenade 
			UnitX = 86; // eItem_SmokeGrenade
			break;
		case 71: // eAbility_BattleScanner
			UnitX = 99; // eItem_Battlescanner
			break;
		default:
			if(UnitX != 0)
			{
				tempTWeapon = XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetTWeapon(UnitX);
				UnitX = tempTWeapon.iRange * 64;
				if(m_kUnit.HasBombardAbility())
				{
					UnitX *= 1.50;
				}
				m_kCursor.m_fMaxChainedDistance = float(UnitX);
				fMinDistance = 1.0;
				return true;
			}
		}
	if(eInputAbilityType == 73) // check for Rift
	{
		m_kCursor.m_fMaxChainedDistance = 100.0 * float(64);
		fMinDistance = 1.0;
		return true;
	}
	switch(eInputAbilityType)  // switch for non-Rift Psi + Misc abilities
	{
		case 76: // eAbility_PsiInspiration 
			UnitX = 27; // default is sight range
			break;
		case 74: eAbility_TelekineticField 
			UnitX = 27; // default is sight range
			break;
		case 35: eAbility_Plague 
			UnitX = 27; // default is sight range
			break;
		default:
			if(UnitX != 0)
			{
				UnitX = Min(UnitX, m_kUnit.GetSightRadius());
				m_kCursor.m_fMaxChainedDistance = float(UnitX * 64);
				fMinDistance = 1.0;
				return true;
			}
		}
	switch(eInputAbilityType)  // switch for Rocket abilities
	{
		case 25: eAbility_RocketLauncher 
		case 66: eAbility_ShredderRocket
			if(m_kUnit.HasItemOfType(30))  // eItem_BlasterLauncher = 0x1E
			{
				UnitX = 30; // eItem_BlasterLauncher = 0x1E
			}
			else
			{
				UnitX = 7; // eItem_RocketLauncher
			}
			tempTWeapon = XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetTWeapon(UnitX);
			UnitX = tempTWeapon.iRange * 64;
			if(m_kUnit.m_iMovesActionsPerformed > 0 ) // check if unit moved
			{
				UnitX *= 0.50;
				UnitX = Min(UnitX, m_kUnit.GetSightRadius() * 64);
			}
			m_kCursor.m_fMaxChainedDistance = float(UnitX);
			fMinDistance = 1.0;
		default:
			if(UnitX != 0)
			{
				return true;
			}
		}
}
return false;
 

 

 

 

It makes Alien Grenades, Frag Grenades, Smoke Grenades and Battlescanners all get increased range from Bombadier. Bombadier now applies a % increase (default 1.50) instead of setting to visual range (should be particularly noticeable with battlescanners). The % increase is applied after conversion to UE units to minimize round-off error.

 

It allows configuration of the Psi Inspiration, Psi TelekineticField (though I think these aren't targeted ...) and Plague abilities to a distance less than visual range. Default is visual range.

 

Rocket and Shredder Rocket ranges are now configured via the appropriate equipped weapon (Blaster Launcher or Rocket Launcher). The option to shorten the range if the unit moved is now allowed (default is 50% of weapon range). Maximum range is capped to be no more than visual range if the unit moved.

 

Note that the default range in the DGC.ini appears to be 50 for Rocket Launcher and 100 for Blaster Launcher, which might be a bit excessive. I believe it is possible to fire blindly into areas covered by the FoW with this, so it could potentially be very powerful as it is effectively a form of Squadsight for Rocket users.

Link to comment
Share on other sites

  • 1 month later...

So this isn't exactly a new set of perks, but some mods to some of the existing perks to fit them together better / balance them.

 

This change alters the behavior of the Covering Fire perk in two ways :

1) A unit with both Suppression and Covering Fire will use the Suppression attack if the Suppressed unit uses a fire action. In vanilla this did not occur.

2) A unit with Covering Fire now shoots just prior to the targeted unit re-entering cover instead of just after. This should mean that in many cases the targetted unit will not have a cover bonus (only the overwatch penalty will apply). This may only occur if the unit actually has to move temporarily to an adjacent tile in order to shoot. When shooting from behind low cover this won't occur, of if the firing angle from behind full cover is such to allow line of sight without movement.

 

This should be considered alpha code. I've verified that the game does not crash when regular firing actions are taken (which execises most of the new code).

 

I have not yet verified that Covering Fire or Suppression + Covering Fire do not crash the game, nor that they work correctly.

 

The usual instance of Suppression (a unit choosing to move) was unaltered. I hooked into the Suppression test made when a Suppressed unit panicks and moves.

 

Hex code follows! :

 

 

 

Suppression + Covering Fire Fix Hex Changes

XGUnit.AddPerkStamp -- helper function called from outside XGUnit that checks for Suppression with Covering Fire

original hex:
header:
BD AF 00 00 50 55 00 00 00 00 00 00 A2 AF 00 00 00 00 00 00 00 00 00 00 A8 AF 00 00 00 00 00 00 BA 01 00 00 FF 44 00 00 AE 00 00 00 66 00 00 00 

body:
0B 0F 35 0B 30 00 00 0C 30 00 00 00 01 00 A3 AF 00 00 00 A8 AF 00 00 0F 35 09 30 00 00 0C 30 00 00 00 01 00 A3 AF 00 00 00 A7 AF 00 00 0F 35 08 30 00 00 0C 30 00 00 00 01 00 A3 AF 00 00 00 A6 AF 00 00 0F 35 0A 30 00 00 0C 30 00 00 00 01 00 A3 AF 00 00 00 A5 AF 00 00 04 00 A3 AF 00 00 04 3A A4 AF 00 00 53 

new hex: (virtual 0x76)
header:
BD AF 00 00 50 55 00 00 00 00 00 00 A2 AF 00 00 00 00 00 00 00 00 00 00 A8 AF 00 00 00 00 00 00 BA 01 00 00 FF 44 00 00 76 00 00 00 66 00 00 00 

body:
0B 0F 2D 01 8C AF 00 00 27 1B E6 5A 00 00 00 00 00 00 17 16 0F 2D 01 8C AF 00 00 28 04 00 A3 AF 00 00 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 04 3A A4 AF 00 00 53 




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


XGUnit.ProcessSingleSuppressingEnemy -- helper function that tests whether covering fire is necessary

original hex:
header:
FD B1 00 00 50 55 00 00 00 00 00 00 E6 B1 00 00 00 00 00 00 00 00 00 00 E8 B1 00 00 00 00 00 00 52 0F 00 00 95 E8 01 00 5D 00 00 00 45 00 00 00 

body:
14 2D 00 E7 B1 00 00 28 07 47 00 1B F0 3C 00 00 00 00 00 00 16 14 2D 00 E7 B1 00 00 19 1A 25 01 A2 30 00 00 0C 00 50 31 00 00 00 1B 21 69 00 00 00 00 00 00 17 4A 16 04 2D 00 E7 B1 00 00 04 3A E8 B1 00 00 53 


new hex: (virtual 0x51)
header:
FD B1 00 00 50 55 00 00 00 00 00 00 E6 B1 00 00 00 00 00 00 00 00 00 00 E8 B1 00 00 00 00 00 00 52 0F 00 00 95 E8 01 00 51 00 00 00 45 00 00 00 

body:
04 84 19 1B 7B 31 00 00 00 00 00 00 16 0C 00 EA A2 00 00 00 1B B8 36 00 00 00 00 00 00 2C 2F 16 18 0D 00 81 2D 01 8C AF 00 00 16 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 04 3A E8 B1 00 00 53 


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


XGUnit.ProcessSuppression -- rebuilt to check for covering fire if boolean set

original hex:
header:
1D B1 00 00 50 55 00 00 00 00 00 00 03 B1 00 00 00 00 00 00 00 00 00 00 08 B1 00 00 00 00 00 00 F2 09 00 00 B2 4B 01 00 DF 00 00 00 9B 00 00 00 

body: (155 bytes)
19 00 08 B1 00 00 13 00 00 00 00 00 00 1B D5 34 00 00 00 00 00 00 00 07 B1 00 00 16 0F 00 05 B1 00 00 25 07 BD 00 96 00 05 B1 00 00 36 00 07 B1 00 00 16 0F 00 06 B1 00 00 10 00 05 B1 00 00 00 07 B1 00 00 19 00 06 B1 00 00 13 00 00 00 00 00 00 1B 27 69 00 00 00 00 00 00 00 08 B1 00 00 16 19 00 06 B1 00 00 0A 00 00 00 00 00 00 1B 6F 11 00 00 00 00 00 00 16 A5 00 05 B1 00 00 16 06 33 00 19 00 08 B1 00 00 0A 00 00 00 00 00 00 1B 6D 11 00 00 00 00 00 00 16 04 0B 53 


new hex: (virtual 0xD3)
header:
1D B1 00 00 50 55 00 00 00 00 00 00 03 B1 00 00 00 00 00 00 00 00 00 00 08 B1 00 00 00 00 00 00 F2 09 00 00 B2 4B 01 00 D3 00 00 00 9B 00 00 00 

body:
19 00 08 B1 00 00 13 00 00 00 00 00 00 1B D5 34 00 00 00 00 00 00 00 07 B1 00 00 16 58 00 07 B1 00 00 00 06 B1 00 00 00 4A A9 00 07 A8 00 19 00 06 B1 00 00 0A 00 E8 B1 00 00 00 1B E5 5A 00 00 00 00 00 00 16 19 00 06 B1 00 00 13 00 00 00 00 00 00 1B 27 69 00 00 00 00 00 00 00 08 B1 00 00 16 19 00 06 B1 00 00 0A 00 00 00 00 00 00 1B 6F 11 00 00 00 00 00 00 16 31 30 19 00 08 B1 00 00 0A 00 00 00 00 00 00 1B 6D 11 00 00 00 00 00 00 16 0B 0B 0B 0B 0B 0B 0B 04 0B 53 


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

XGAction_Fire.state'ShutDownToIdle' -- add new call for suppression and move both up before unit enters cover.

original hex: (next line at 0x656)
07 60 05 84 2D 01 1D 83 00 00 18 0B 00 2D 01 ED 82 00 00 16 1C 9C FC FF FF 21 6E 25 00 00 00 00 00 00 4A 16 19 01 40 BC 00 00 0A 00 00 00 00 00 00 1B B9 5D 00 00 00 00 00 00 16 07 99 05 2D 01 04 83 00 00 1B F5 5D 00 00 00 00 00 00 16 06 99 05 07 56 06 82 82 2D 01 24 83 00 00 18 0D 00 77 01 DD 82 00 00 2A 16 16 18 22 00 81 19 01 DD 82 00 00 0A 00 57 7C 00 00 00 1B 32 3E 00 00 00 00 00 00 16 16 16 19 01 41 BC 00 00 0D 00 00 00 00 00 00 1B 0D 04 00 00 00 00 00 00 25 27 27 16 07 56 06 19 01 41 BC 00 00 0A 00 59 31 00 00 00 1B 5B 3E 00 00 00 00 00 00 16 07 4E 06 19 01 41 BC 00 00 0A 00 59 31 00 00 00 1B 5B 3E 00 00 00 00 00 00 16 61 00 1E CD CC CC 3D 16 06 21 06 61 00 1E 00 00 80 3F 16



new hex : (next line at 0x656   )
19 01 41 BC 00 00 0A 00 A4 AF 00 00 00 1B 2C 02 00 00 00 00 00 00 2A 2A 2A 4A 16 07 E6 05 82 82 2D 01 24 83 00 00 18 0D 00 77 01 DD 82 00 00 2A 16 16 18 22 00 81 19 01 DD 82 00 00 0A 00 57 7C 00 00 00 1B 32 3E 00 00 00 00 00 00 16 16 16 19 01 41 BC 00 00 0D 00 00 00 00 00 00 1B 0D 04 00 00 00 00 00 00 25 27 27 16 07 E6 05 19 01 41 BC 00 00 0A 00 59 31 00 00 00 1B 5B 3E 00 00 00 00 00 00 16 61 00 1E 00 00 80 3F 16 06 B9 05 07 16 06 84 2D 01 1D 83 00 00 18 0B 00 2D 01 ED 82 00 00 16 1C 9C FC FF FF 21 6E 25 00 00 00 00 00 00 4A 16 19 01 40 BC 00 00 0A 00 00 00 00 00 00 1B B9 5D 00 00 00 00 00 00 16 07 4C 06 2D 01 04 83 00 00 1B F5 5D 00 00 00 00 00 00 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B  

 

 

 

 

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

 

Note : I realize that some of the new perks I've been working on, that will be incorporated into Long War, haven't been listed up yet. I do plan to get them up at some point, promise :)

Link to comment
Share on other sites

Great to see some attention being given to Covering Fire!

 

I've thrown it in and began testing it quite extensively, though I'm using an early saved game so if that's at all problematic do let me know.

 

As far as triggering on enemy movement and firing it appears to work fine, though as yet I can't quite tell if it's an improvement - I'm still missing most (all?) of my covering fire shots, though as I said these guys are scopeless Corporals largely.

 

One problem I have noticed:

 

When suppressing, the suppression appears to be working as normal (ie: the target displays typical 'being suppressed' behaviour - reloading, skipping turn, hunkering down, rarely firing, not moving) but the animation for the suppression fire does not initiate; there is no bullet spam and nice muzzle flare happening at all. Just the audio queue "Suppressing, Commander!" and a single 'normal' burst of fire. Suppression is inherent to the weapons (assaults, LMG's) in my game, granted via the DGC and not via the perk, if that at all matters. I believe this symptom also presents itself when the aliens are suppressing XCOM too (i indeed take an aim hit and if I choose to move the alien gets his reaction shot, there's just no spam).

 

Great improvement though if it indeed works as intended, mechanics-wise. Just looks like it might need a little tweak to ensure that the 'suppression spam' actually takes place during the turn too.

Edited by Zybertryx
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...