Skip to content

Commit

Permalink
Updated doppelganger AI.
Browse files Browse the repository at this point in the history
Chirr  can no longer befriend enemies with a DestroyOnTimer component.
  • Loading branch information
Moffein committed Dec 17, 2022
1 parent 174319b commit 6dbc83d
Show file tree
Hide file tree
Showing 6 changed files with 424 additions and 2 deletions.
81 changes: 81 additions & 0 deletions Starstorm 2/Modules/Prefabs.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using R2API;
using RoR2;
using RoR2.CharacterAI;
using System.Collections.Generic;
using UnityEngine;

Expand All @@ -18,6 +19,86 @@ internal static class Prefabs
internal static List<GameObject> masterPrefabs = new List<GameObject>();
internal static List<GameObject> projectilePrefabs = new List<GameObject>();

public static void RemoveAISkillDrivers(GameObject masterObject)
{
AISkillDriver[] skillDrivers = masterObject.GetComponents<AISkillDriver>();
for (int i = 0; i < skillDrivers.Length; i++)
{
UnityEngine.Object.Destroy(skillDrivers[i]);
}
}

public static AISkillDriver AddAISkillDriver(GameObject masterObject,
string customName,
SkillSlot skillSlot,
RoR2.Skills.SkillDef requiredSkill,
bool requireSkillReady,
bool requireEquipmentReady,
float minUserHealthFraction,
float maxUserHealthFraction,
float minTargetHealthFraction,
float maxTargetHealthFraction,
float minDistance,
float maxDistance,
bool selectionRequiresTargetLoS,
bool selectionRequiresOnGround,
bool selectionRequiresAimTarget,
int maxTimesSelected,
AISkillDriver.TargetType moveTargetType,
bool activationRequiresTargetLoS,
bool activationRequiresAimTargetLoS,
bool activationRequiresAimConfirmation,
AISkillDriver.MovementType movementType,
float moveInputScale,
AISkillDriver.AimType aimType,
bool ignoreNodeGraph,
bool shouldSprint,
bool shouldFireEquipment,
AISkillDriver.ButtonPressType buttonPressType,
float driverUpdateTimerOverride,
bool resetCurrentEnemyOnNextDriverSelection,
bool noRepeat,
AISkillDriver nextHighPriorityOverride)
{
//Make sure you're not accidentally adding them to something that's not a charactermaster
CharacterMaster cm = masterObject.GetComponent<CharacterMaster>();
if (!cm) return null;

AISkillDriver newSkillDriver = masterObject.AddComponent<AISkillDriver>();
newSkillDriver.customName = customName;
newSkillDriver.skillSlot = skillSlot;
newSkillDriver.requiredSkill = requiredSkill;
newSkillDriver.requireSkillReady = requireSkillReady;
newSkillDriver.requireEquipmentReady = requireEquipmentReady;
newSkillDriver.minUserHealthFraction = minUserHealthFraction;
newSkillDriver.maxUserHealthFraction = maxUserHealthFraction;
newSkillDriver.minTargetHealthFraction = minTargetHealthFraction;
newSkillDriver.maxTargetHealthFraction = maxTargetHealthFraction;
newSkillDriver.minDistance = minDistance;
newSkillDriver.maxDistance = maxDistance;
newSkillDriver.selectionRequiresTargetLoS = selectionRequiresTargetLoS;
newSkillDriver.selectionRequiresOnGround = selectionRequiresOnGround;
newSkillDriver.selectionRequiresAimTarget = selectionRequiresAimTarget;
newSkillDriver.maxTimesSelected = maxTimesSelected;
newSkillDriver.moveTargetType = moveTargetType;
newSkillDriver.activationRequiresTargetLoS = activationRequiresTargetLoS;
newSkillDriver.activationRequiresAimConfirmation = activationRequiresAimConfirmation;
newSkillDriver.activationRequiresAimTargetLoS = activationRequiresAimTargetLoS;
newSkillDriver.movementType = movementType;
newSkillDriver.moveInputScale = moveInputScale;
newSkillDriver.aimType = aimType;
newSkillDriver.ignoreNodeGraph = ignoreNodeGraph;
newSkillDriver.shouldSprint = shouldSprint;
newSkillDriver.shouldFireEquipment = shouldFireEquipment;
newSkillDriver.buttonPressType = buttonPressType;
newSkillDriver.driverUpdateTimerOverride = driverUpdateTimerOverride;
newSkillDriver.resetCurrentEnemyOnNextDriverSelection = resetCurrentEnemyOnNextDriverSelection;
newSkillDriver.noRepeat = noRepeat;
newSkillDriver.nextHighPriorityOverride = nextHighPriorityOverride;

return newSkillDriver;
}

internal static SurvivorDef RegisterNewSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string namePrefix, UnlockableDef unlockableDef, float sortPosition)
{
string fullNameString = namePrefix + "_NAME";
Expand Down
99 changes: 99 additions & 0 deletions Starstorm 2/Survivors/Chirr/ChirrCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using System.Runtime.CompilerServices;
using Starstorm2.Cores;
using System.Collections.Generic;
using RoR2.CharacterAI;

namespace Starstorm2.Survivors.Chirr
{
Expand Down Expand Up @@ -439,6 +440,104 @@ public static void CreateDoppelganger()
doppelganger = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/CommandoMonsterMaster"), "ChirrMonsterMaster", true);
doppelganger.GetComponent<CharacterMaster>().bodyPrefab = chirrPrefab;

Modules.Prefabs.RemoveAISkillDrivers(doppelganger);


Modules.Prefabs.AddAISkillDriver(doppelganger, "Secondary", SkillSlot.Secondary, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 8f,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.ChaseMoveTarget, 1f,
AISkillDriver.AimType.AtMoveTarget,
false,
true,
false,
AISkillDriver.ButtonPressType.Hold,
-1f,
false,
false,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "HealSelf", SkillSlot.Utility, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.FleeMoveTarget, 1f,
AISkillDriver.AimType.AtMoveTarget,
false,
true,
false,
AISkillDriver.ButtonPressType.Abstain,
-1f,
true,
true,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Primary", SkillSlot.Primary, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 45f,
true, false, true, -1,
AISkillDriver.TargetType.CurrentEnemy,
true, true, false,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
false,
false,
AISkillDriver.ButtonPressType.Hold,
-1,
false,
false,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Strafe", SkillSlot.None, null,
false, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 30f,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
true,
false,
AISkillDriver.ButtonPressType.Abstain,
-1,
false,
false,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Chase", SkillSlot.None, null,
false, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
30f, Mathf.Infinity,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.ChaseMoveTarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
true,
false,
AISkillDriver.ButtonPressType.Abstain,
-1,
false,
false,
null);

Modules.Prefabs.masterPrefabs.Add(doppelganger);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,9 @@ private HurtBox SearchForTarget(Ray aimRay)
bool isChampion = hbBody.isChampion;
bool isBlacklisted = blacklistedBodies.Contains(hbBody.bodyIndex);
bool isDecay = hbBody.inventory && hbBody.inventory.GetItemCount(RoR2Content.Items.HealthDecay) > 0;
bool isDestroy = (hbBody.GetComponent<DestroyOnTimer>() != null) || (hbBody.master && hbBody.master.GetComponent<DestroyOnTimer> () != null);

if (!isPlayerControlled && !isDecay && (((!isChampion && !isBoss) || canBefriendChampion) || (hbBody.bodyIndex == EnemyCore.brotherHurtIndex && (canBefriendChampion || HasLunarTrinket()))) && !isBlacklisted)
if (!isPlayerControlled && !isDecay && !isDestroy && (((!isChampion && !isBoss) || canBefriendChampion) || (hbBody.bodyIndex == EnemyCore.brotherHurtIndex && (canBefriendChampion || HasLunarTrinket()))) && !isBlacklisted)
{
validTargets.Add(hb);
}
Expand Down
2 changes: 1 addition & 1 deletion Starstorm 2/Survivors/Chirr/EntityStates/ChirrHeal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private void FireHeal()
healOrb.overrideDuration = 0.3f;
OrbManager.instance.AddOrb(healOrb);
}*/
hurtBox.healthComponent.Heal(healAmount, default(ProcChainMask), true);
hurtBox.healthComponent.HealFraction(healFraction, default);
if (hurtBox.healthComponent.body != base.characterBody) hurtBox.healthComponent.body.AddTimedBuff(RoR2Content.Buffs.CrocoRegen, regenDuration);
}
}
Expand Down
117 changes: 117 additions & 0 deletions Starstorm 2/Survivors/Cyborg/CyborgCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Starstorm2.Survivors.Cyborg.Components.OverheatProjectile;
using System.Runtime.CompilerServices;
using EntityStates.SS2UStates.Cyborg.Secondary;
using RoR2.CharacterAI;

namespace Starstorm2.Survivors.Cyborg
{
Expand Down Expand Up @@ -453,6 +454,122 @@ internal static void CreateDoppelganger()
{
doppelganger = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/CommandoMonsterMaster"), "CyborgMonsterMaster", true);
doppelganger.GetComponent<CharacterMaster>().bodyPrefab = cybPrefab;
Modules.Prefabs.RemoveAISkillDrivers(doppelganger);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Overheat", SkillSlot.Utility, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 30f,
true, false, true, -1,
AISkillDriver.TargetType.CurrentEnemy,
true, true, false,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
false,
false,
AISkillDriver.ButtonPressType.Hold,
-1,
false,
false,
null);


Modules.Prefabs.AddAISkillDriver(doppelganger, "Special", SkillSlot.Special, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 30f,
true, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
false,
false,
AISkillDriver.ButtonPressType.Hold,
-1f,
false,
true,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Secondary", SkillSlot.Secondary, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 200f,
true, false, true, -1,
AISkillDriver.TargetType.CurrentEnemy,
true, true, true,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
false,
false,
AISkillDriver.ButtonPressType.Hold,
1f,
false,
true,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Primary", SkillSlot.Primary, null,
true, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 50f,
true, false, true, -1,
AISkillDriver.TargetType.CurrentEnemy,
true, true, true,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
false,
false,
AISkillDriver.ButtonPressType.Hold,
3,
false,
false,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Strafe", SkillSlot.None, null,
false, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
0f, 30f,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.StrafeMovetarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
true,
false,
AISkillDriver.ButtonPressType.Abstain,
-1,
false,
false,
null);

Modules.Prefabs.AddAISkillDriver(doppelganger, "Chase", SkillSlot.None, null,
false, false,
Mathf.NegativeInfinity, Mathf.Infinity,
Mathf.NegativeInfinity, Mathf.Infinity,
30f, Mathf.Infinity,
false, false, false, -1,
AISkillDriver.TargetType.CurrentEnemy,
false, false, false,
AISkillDriver.MovementType.ChaseMoveTarget, 1f,
AISkillDriver.AimType.AtCurrentEnemy,
false,
true,
false,
AISkillDriver.ButtonPressType.Abstain,
-1,
false,
false,
null);

Modules.Prefabs.masterPrefabs.Add(doppelganger);
}
Expand Down
Loading

0 comments on commit 6dbc83d

Please sign in to comment.