We just reached 30,000 articles on this wiki! 🥳
If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Marvel Super Hero Squad Online

From The Cutting Room Floor
Jump to navigation Jump to search

Click to upload a new image...Dummy link

Marvel Super Hero Squad Online

Developers: Gazillion Entertainment, The Amazing Society
Publisher: Gazillion Entertainment
Platform: Unity Web Player
Released internationally: November 4, 2011
Released in US: April 29, 2011
Released in EU: November 4, 2011


AnimationsIcon.png This game has unused animations.
CharacterIcon.png This game has unused playable characters.
CodeIcon.png This game has unused code.
EnemyIcon.png This game has unused enemies.
GraphicsIcon.png This game has unused graphics.
ModelsIcon.png This game has unused models.
SoundIcon.png This game has unused sounds.
DebugIcon.png This game has debugging material.


DevelopmentIcon.png This game has a development article
PrereleaseIcon.png This game has a prerelease article

Hmmm...
To do:
  • Fix formatting for most of the code.
  • There's images of Professor X and Whiplash in the files; upload them!
See, this is why game preservation is important.
This game is defunct.
Do note the game no longer works at all without modifications. This is most likely due to the game's servers being shut down. As a result, further official developments with the game are unlikely to happen.

Marvel Super Hero Squad Online (commonly abbreviated to SHSO or MSHSO) was an MMO beat-'em-up style game where you could play as a mere... 194 characters from the Marvel comics and movies. The game was successful enough to outlive the source material, before eventually shutting down in January of 2017, alongside Gazillion Entertainment, its developers, who shut down later that year when Disney pulled the licensing for their characters away.

Sub-Pages

Read about development information and materials for this game.
Development Info
Read about prerelease information and/or media for this game.
Prerelease Info
ThoughtBubble PrizeWheel SHSO.png
Prize Wheel
Is this gambling? No, just a prize wheel.

Oddities

Safe Chat is referenced to as "OPENCHAT" by its strings.

Mr. Placeholder's VO bundle is his character file, unlike other VO bundles, which contain audio files.

Iron Spider

Iron Spider has a flying animation and voice clip, which is only shown if it has a Sidekick that allows flight(Such as Mini-MODOK). Alongside this, it has a unfinished animation for it, unlike most heroes who just use their Falling animation. It's possible that Iron Spider had the ability to fly at one point, but then got that taken away so his movement options wouldn't be as expansive(3 out of 6 transport methods; he'd just lack the Vehicle, Double Jump and Super Jump).

"Oscorp"(unreleased version of Daily Bugle Hub Zone)

A map shown off in trailers and prerelease footage quite extensively, but it was cut before release and, unlike most of the games cut content, most of it has been taken out. The zone file for the Daily Bugle is named daily_bugle2 internally; this implies that the original zone would've been called daily_bugle, as the other Hub world zones are referred to as asgard, villainville and baxter instead. daily_bugle2 persists as a name for the _avengers, _winter and _fall maps.

Placeholders

Anonymous Squad

If an player doesn't have a username, either via a bug, server issues or cheats, the player's name will default to "Anonymous Squad".

Mr. Placeholder

Filename suggests it's his audio, but instead is a whole hero. Seems to have animations connected to it. The textures are incredibly compressed and small, compared to every other character in the game that exists; The body of Mr. Placeholder consists of two triangles, and seems to be invisible in game due to its incredibly small size and lack of a UV map. He, suprisingly, also has hero data and HQ data; his HQ data, however, is a placeholder, as is his code. His FX bundle and character file are a copy of his head and body textures, compressed.

 <ai_hq_controller>
 <name>mr_placeholder</name>
 </ai_hq_controller>

Placeholder Animations

There are scripts relating to placeholder animations for unfinished characters. There's also developer text in this one!

Placeholder Animation Script

 <attack_data>
 <attack>
   <attack_name>ThrowableGeneric</attack_name>
   <anim>pickup_throw</anim>
   <behavior>BehaviorAttackTimeClamp</behavior>
   <desired_range>10</desired_range>
   <maximum_range>10</maximum_range>
   <interruptible_by>4</interruptible_by>

<effect>Throwable sequence</effect>

   <impact>
     <impact_type>1</impact_type>
     <impact_effect>BoomEffect</impact_effect>
     <damage>35</damage>
     <projectile_lifespan>3</projectile_lifespan>
     <projectile_speed>15</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
   </impact>
 </attack>
 
 <attack>
   <attack_name>ThrowableExplodingBarrel</attack_name>
   <anim>pickup_throw</anim>
   <behavior>BehaviorAttackTimeClamp</behavior>
   <desired_range>10</desired_range>
   <maximum_range>10</maximum_range>
   <interruptible_by>4</interruptible_by>

<effect>Throwable sequence</effect>

   <impact>
     <impact_type>1</impact_type>
     <impact_effect/>
     <damage>0</damage>
     <projectile_lifespan>3</projectile_lifespan>
     <projectile_speed>15</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
   </impact>
 </attack>
 <attack>
   <attack_name>ThrowableGenericSilent</attack_name>
   <anim>pickup_throw</anim>
   <behavior>BehaviorAttackTimeClamp</behavior>
   <desired_range>10</desired_range>
   <maximum_range>10</maximum_range>
   <interruptible_by>4</interruptible_by>

<effect>Throwable sequence</effect>

   <impact>
     <impact_type>1</impact_type>
     <damage>35</damage>
     <projectile_lifespan>3</projectile_lifespan>
     <projectile_speed>15</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
   </impact>
 </attack>
 <attack>
   <attack_name>ThrowableWater</attack_name>
   <anim>pickup_throw</anim>
   <behavior>BehaviorAttackTimeClamp</behavior>
   <desired_range>10</desired_range>
   <maximum_range>10</maximum_range>
   <interruptible_by>4</interruptible_by>
   <effect>Throwable sequence</effect>
   <environmental_attack>true</environmental_attack>
   <impact>
     <impact_type>1</impact_type>
     <impact_effect>BoomEffect</impact_effect>
     <damage>10</damage>
     <projectile_explosion_radius>6.3</projectile_explosion_radius>
     <projectile_lifespan>3</projectile_lifespan>
     <projectile_speed>15</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <pushback_duration>0</pushback_duration>
     <recoil>0</recoil>
   </impact>
 </attack>
 <attack>
   <attack_name>CardGameBlockBlowback</attack_name>
   <impact>
     <recoil>2</recoil>
     <pushback_duration>1</pushback_duration>
   </impact>
 </attack>
 <attack>
   <attack_name>ElementalBonusBurnAttack</attack_name>
   <impact>
     <recoil>0</recoil>
     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
     <hits_friends>true</hits_friends>
     <hits_enemies>false</hits_enemies>
   </impact>
 </attack>
 <attack>
   <attack_name>PumpkinBombFlamesAttack</attack_name>
   <impact>
     <recoil>0</recoil>
     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
     <hits_friends>true</hits_friends>
     <hits_enemies>false</hits_enemies>
   </impact>
 </attack>
 
 <attack>
   <attack_name>DoctorStrangeCrimsonBands</attack_name>
   <impact>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
   </impact>
 </attack>
 <attack>
   <attack_name>DoctorStrangeCrimsonBands2</attack_name>
   <impact>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>6</damage>
   </impact>
 </attack>
 <attack>
   <attack_name>DoctorStrangeCrimsonBands3</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>8</damage>
   </impact>
 </attack>
 
 <attack>
   <attack_name>WarMachineMk2Flamethrower</attack_name>
   <impact>
     <impact_matrix_type>4</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>1</damage>

<hits_friends>false</hits_friends>

   </impact>
 </attack>
 
 <attack>
   <attack_name>WarMachineMk2Flamethrower2</attack_name>
   <impact>
     <impact_matrix_type>4</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>2</damage>

<hits_friends>false</hits_friends>

   </impact>
 </attack>
 
 <attack>
   <attack_name>WarMachineMk2Flamethrower3</attack_name>
   <impact>

<impact_matrix_type>4</impact_matrix_type>

     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>3</damage>

<hits_friends>false</hits_friends>

   </impact>
 </attack>
 <attack>
   <attack_name>SuperSkrullFlamesAttack</attack_name>
   <impact>
     <recoil>0</recoil>
     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
     <hits_friends>true</hits_friends>
     <hits_enemies>false</hits_enemies>
   </impact>
 </attack>
 
 <attack>
   <attack_name>ChemicalTankDOT</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>15</damage>
   </impact>
 </attack>
<attack>
   <attack_name>shockDOT</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>7</recoil>

<recoil_duration>5</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
   </impact>
 </attack>
 
 <attack>
   <attack_name>flameDOT</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>5</damage>
   </impact>
 </attack>
 
 <attack>
   <attack_name>rustbombDOT</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>0</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>4</damage>
   </impact>
 </attack>

<attack>

   <attack_name>RocketDOT</attack_name>
   <impact>
     <impact_matrix_type>0</impact_matrix_type>
     <recoil>7</recoil>

<recoil_duration>0</recoil_duration>

     <pushback_duration>0</pushback_duration>
     <damage>70</damage>
   </impact>
 </attack>
 
 <attack>
   <attack_name>GliderDefaultAttack</attack_name>
   <impact>
     <impact_type>1</impact_type>
     <impact_effect>BoomEffect</impact_effect>
     <damage>35</damage>
     <maximum_hits_per_target>0</maximum_hits_per_target>
     <maximum_targets_hit>1</maximum_targets_hit>
     <minimum_distance>0</minimum_distance>
     <projectile_name>Glider Default Attack</projectile_name>
     <projectile_lifespan>20</projectile_lifespan>
     <projectile_speed>0</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <projectile_aimed>false</projectile_aimed>
     <projectile_attached>true</projectile_attached>
     <projectile_gravity>0</projectile_gravity>
     <projectile_destroy_on_impact>false</projectile_destroy_on_impact>
     <projectile_destroy_on_collision>false</projectile_destroy_on_collision>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
     <knockdown_duration>1</knockdown_duration>
     <recoil_duration>1</recoil_duration>
     <launch_velocity>10</launch_velocity>
     <rotate_target_to_impact>false</rotate_target_to_impact>
     <show_collider>true</show_collider>
     <impact_start_time>0</impact_start_time>
     <impact_end_time>0</impact_end_time>
     <collider_scale>1</collider_scale>
     <pushback_from_collider>true</pushback_from_collider>
     <firing_time>0</firing_time>
   </impact>
   <impact>
     <impact_type>1</impact_type>
     <impact_effect>BoomEffect</impact_effect>
     <damage>0</damage>
     <maximum_hits_per_target>0</maximum_hits_per_target>
     <maximum_targets_hit>1</maximum_targets_hit>
     <minimum_distance>0</minimum_distance>
     <hits_friends>true</hits_friends>
     <hits_enemies>false</hits_enemies>
     <projectile_name>Glider Default Attack</projectile_name>
     <projectile_lifespan>20</projectile_lifespan>
     <projectile_speed>0</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <projectile_aimed>false</projectile_aimed>
     <projectile_attached>true</projectile_attached>
     <projectile_gravity>0</projectile_gravity>
     <projectile_destroy_on_impact>false</projectile_destroy_on_impact>
     <projectile_destroy_on_collision>false</projectile_destroy_on_collision>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
     <knockdown_duration>1</knockdown_duration>
     <recoil_duration>1</recoil_duration>
     <launch_velocity>10</launch_velocity>
     <rotate_target_to_impact>false</rotate_target_to_impact>
     <show_collider>true</show_collider>
     <impact_start_time>0</impact_start_time>
     <impact_end_time>0</impact_end_time>
     <collider_scale>1</collider_scale>
     <pushback_from_collider>true</pushback_from_collider>
     <firing_time>0</firing_time>
   </impact>
 </attack>
 <attack>
   <attack_name>DebugCheatKillAttack</attack_name>
   <impact>
     <impact_type>3</impact_type>
     <damage>1000000</damage>
     <pushback_duration>0</pushback_duration>
     <recoil>0</recoil>
   </impact>
 </attack>
 <attack>
   <attack_name>PlayerRespawnAttack</attack_name>
   <impact>
     <impact_type>3</impact_type>
     <damage>0</damage>
     <pushback_duration>0</pushback_duration>
     <recoil>4</recoil>
     <recoil_duration>0</recoil_duration>
   </impact>
 </attack>
 <attack>
   <attack_name>Throwablerust</attack_name>
   <anim>pickup_throw</anim>
   <desired_range>10</desired_range>
   <maximum_range>10</maximum_range>
   <interruptible_by>4</interruptible_by>

<effect>Throwable sequence</effect>

   <impact>
     <impact_type>1</impact_type>
     <impact_effect>BoomEffect</impact_effect>
     <damage>1</damage>
     <projectile_lifespan>3</projectile_lifespan>
     <projectile_speed>15</projectile_speed>
     <projectile_rotate_to_velocity>false</projectile_rotate_to_velocity>
     <pushback_duration>0</pushback_duration>
     <recoil>0</recoil>
   </impact>
 </attack>
 <attack>
   <attack_name>generic_villain_attack</attack_name>
   <anim>attack_1</anim>
   <desired_range>0.5</desired_range>
   <maximum_range>1</maximum_range>
 </attack>
 <attack>
   <attack_name>generic_hero_attack</attack_name>
   <anim>attack_L1</anim>
   <desired_range>0.5</desired_range>
   <maximum_range>1</maximum_range>
 </attack>
 <attack>
   <attack_name>generic_idle_attack</attack_name>
   <anim>movement_idle</anim>
   <desired_range>0.5</desired_range>
   <maximum_range>1</maximum_range>
 </attack>

</attack_data>

Loading Screens

Loading screens found in the files. Slightly rough.

Debug Mode

There are debug leftovers. A lot, especially for a online game.

SHSDebugConsoleWindow

using System; using UnityEngine;

public class SHSDebugConsoleWindow : GUIControlWindow { private GUITabbedDialogWindow debugDialog;

private GUICursorManager.CursorType priorCursorType;

private SHSLogWindow logwin;

private GUIButton resizeButton;

private bool dragMode;

public SHSLogWindow LogWindow { get { return logwin; } set { logwin = value; } }

public SHSDebugConsoleWindow() { id = "SHSDebugConsoleWindow"; debugDialog = new GUITabbedDialogWindow(GUITabbedDialogWindow.TabbedDialogOrientationEnum.Horizontal); debugDialog.Id = "DebugDialog"; debugDialog.SetPosition(DockingAlignmentEnum.Middle, AnchorAlignmentEnum.Middle, OffsetType.Absolute, Vector2.zero); debugDialog.SetSize(new Vector2(1f, 1f), AutoSizeTypeEnum.Percentage, AutoSizeTypeEnum.Percentage); if (ShsPlayerPrefs.HasKey(ShsPlayerPrefs.Keys.DebugWindowSizeX)) { SetSize(new Vector2(ShsPlayerPrefs.GetFloat(ShsPlayerPrefs.Keys.DebugWindowSizeX), ShsPlayerPrefs.GetFloat(ShsPlayerPrefs.Keys.DebugWindowSizeY))); } debugDialog.HitTestType = HitTestTypeEnum.Rect; debugDialog.BackgroundTextureSource = "debug_bundle|DebugWindowBackground"; debugDialog.Traits.VisibilityTrait = ControlTraits.VisibilityTraitEnum.Inherit; debugDialog.TabButtonNormalStyle = GUIManager.Instance.StyleManager.GetStyle("DebugTabStyleNormal"); debugDialog.TabButtonSelectedStyle = GUIManager.Instance.StyleManager.GetStyle("DebugTabStyleSelected"); Add(debugDialog); resizeButton = new GUIButton(); resizeButton.Id = "resizeButton"; resizeButton.SetPositionAndSize(DockingAlignmentEnum.BottomRight, AnchorAlignmentEnum.BottomRight, OffsetType.Absolute, Vector2.zero, new Vector2(20f, 20f), AutoSizeTypeEnum.Absolute, AutoSizeTypeEnum.Absolute); resizeButton.Text = string.Empty; resizeButton.Rotation = 0f; resizeButton.Color = new Color(1f, 1f, 1f, 1f); resizeButton.IsVisible = true; resizeButton.Style = GUIManager.Instance.StyleManager.GetStyle("ResizeControlIcon"); resizeButton.MouseDown += delegate { dragMode = true; }; resizeButton.MouseUp += delegate { ShsPlayerPrefs.SetFloat(ShsPlayerPrefs.Keys.DebugWindowSizeX, base.rect.width); ShsPlayerPrefs.SetFloat(ShsPlayerPrefs.Keys.DebugWindowSizeY, base.rect.height); dragMode = false; }; Add(resizeButton); logwin = new SHSLogWindow("LogPanel"); debugDialog.AddTab("Network", string.Empty, new SHSServersViewerWindow("Network")); debugDialog.AddTab("Command", string.Empty, new SHSCommandWindow("Command")); debugDialog.AddTab("Input", string.Empty, new SHSDebugInputViewerWindow("Input")); debugDialog.AddTab("Diag", string.Empty, new SHSDiagnosticsWindow("DiagWin")); debugDialog.AddTab("Keys", string.Empty, new SHSKeyboardViewerWindow("KeyWin")); debugDialog.AddTab("UI", string.Empty, new SHSUIViewerWindow("UIWin")); debugDialog.AddTab("Achievements", string.Empty, new SHSAchievementsWindow("Achievements")); debugDialog.AddTab("Counters", string.Empty, new SHSCountersWindow("Counters")); debugDialog.AddTab("Bundles", string.Empty, new SHSBundleViewerWindow("Bundles")); debugDialog.AddTab("Transactions", string.Empty, new SHSTransactionViewerWindow("Transactions")); debugDialog.AddTab("Events", string.Empty, new SHSEventViewerWindow("Events")); debugDialog.AddTab("Log", string.Empty, logwin); debugDialog.AddTab("CardGame", string.Empty, new SHSCardSADebugWindow("CardGame")); debugDialog.AddTab("SmartTips", string.Empty, new SHSSmartTipsViewerWindow("Smart Tips")); debugDialog.AddTab("Levels", string.Empty, new SHSLevelUpViewerWindow("Levels")); debugDialog.AddTab("Entitlements", string.Empty, new EntitlementsViewerWindow("Entitlements")); debugDialog.AddTab("Options", string.Empty, new SHSDebugOptionsWindow("Options", this)); debugDialog.AddTab("Errors", string.Empty, new SHSErrorsWindow("Errors")); debugDialog.AddTab("Strings", string.Empty, new SHSStringTableViewerWindow("Strings")); debugDialog.AddTab("Challenges", string.Empty, new SHSChallengeViewerWindow("Challenges")); debugDialog.AddTab("Expendables", string.Empty, new SHSExpendablesWindow("Expendables")); debugDialog.AddTab("Combinations", string.Empty, new SHSCharacterCombinationViewerWindow("Combinations")); }

private void preformDragResize() { if (dragMode) { Vector2 mouseScreenPosition = SHSInput.mouseScreenPosition; float x = Rect.x; float y = Rect.y; float num = mouseScreenPosition.x - Rect.x; Vector2 rectSize = resizeButton.RectSize; float width = Math.Max(Math.Min(num + rectSize.x / 2f, 1022f), 50f); float num2 = mouseScreenPosition.y - Rect.y; Vector2 rectSize2 = resizeButton.RectSize; SetPositionAndSize(x, y, width, Math.Max(Math.Min(num2 + rectSize2.y / 2f, 644f), 50f)); } }

public override void Draw(DrawModeSetting drawFlags) { preformDragResize(); base.Draw(drawFlags); }

public void SHSDebugConsoleWindowWindowFunction(int WindowId) { debugDialog.DrawPreprocess(); debugDialog.Draw(DrawModeSetting.NormalMode); debugDialog.DrawFinalize(); resizeButton.Draw(DrawModeSetting.NormalMode); }

public override void OnActive() { base.OnActive(); }

public override void OnShow() { priorCursorType = GUIManager.Instance.CursorManager.CursorCurrentType; GUIManager.Instance.CursorManager.SetCursorType(GUICursorManager.CursorType.Native); if (debugDialog.SelectedTab == null) { debugDialog.SelectTab(0); } base.OnShow(); }

public override void OnHide() { GUIManager.Instance.CursorManager.SetCursorType(priorCursorType); GUIManager.Instance.ClearKeyboardFocus(); base.OnHide(); } }

The entire Debug Console window.

DebugFlyCam (Freecam)

using System.Collections.Generic; using UnityEngine;

public class DebugFlyCam : MonoBehaviour, ICaptureHandler, IInputHandler { public static DebugFlyCam _current;

private static KeyBank? _myKeyBank;

private static Dictionary<KeyCodeEntry, SHSInput.KeyEventDelegate> _activeKeyDictionary;

private CameraLiteManager _cameraManager;

private ICaptureManager manager;

private float _oldFOV;

private float _oldDOFRange;

private float _oldDOFTarget;

private bool _paused;

private bool _goSlow;

public float sensitivityX = 10f;

public float sensitivityY = 10f;

public float minimumX = -360f;

public float maximumX = 360f;

public float minimumY = -60f;

public float maximumY = 60f;

private float rotationX;

private float rotationY;

public ICaptureManager Manager { get { return manager; } set { manager = value; } }

public SHSInput.InputRequestorType InputRequestorType { get { return SHSInput.InputRequestorType.World; } }

public bool CanHandleInput { get { return true; } }

public static void Toggle() { if (_current != null) { Object.Destroy(_current.gameObject); _current = null; } else { GameObject gameObject = new GameObject(); gameObject.name = "DebugFlyCam"; _current = Utils.AddComponent<DebugFlyCam>(gameObject); } }

private void OnEnable() { _cameraManager = CameraLiteManager.Instance; if (_cameraManager != null) { if (!_cameraManager.enabled) { _cameraManager = null; } else { _cameraManager.enabled = false; } } KeyBank? myKeyBank = _myKeyBank; if (!myKeyBank.HasValue) { _myKeyBank = new KeyBank(this, GUIControl.KeyInputState.Active, KeyBank.KeyBankTypeEnum.Additive, GetKeyList(GUIControl.KeyInputState.Active)); } HookKeys(true); Quaternion rotation = Camera.main.transform.rotation; Vector3 eulerAngles = rotation.eulerAngles; rotationX = eulerAngles.y; Vector3 eulerAngles2 = rotation.eulerAngles; rotationY = eulerAngles2.x; AOSceneCamera aOSceneCamera = Object.FindObjectOfType(typeof(AOSceneCamera)) as AOSceneCamera; if (aOSceneCamera != null) { _oldDOFRange = aOSceneCamera.DOFRange; _oldDOFTarget = aOSceneCamera.DOFTarget; } _oldFOV = Camera.main.fov; }

private void OnDisable() { if (_cameraManager != null) { _cameraManager.enabled = true; } if (!_paused) { HookKeys(false); } AOSceneCamera aOSceneCamera = Object.FindObjectOfType(typeof(AOSceneCamera)) as AOSceneCamera; if (aOSceneCamera != null) { aOSceneCamera.DOFRange = _oldDOFRange; aOSceneCamera.DOFTarget = _oldDOFTarget; } Camera.main.fov = _oldFOV; }

private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _paused = !_paused; HookKeys(!_paused); } if (_paused) { return; } if (Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKeyDown(KeyCode.RightShift)) { _goSlow = !_goSlow; } Transform transform = Camera.main.transform; rotationX += Input.GetAxis("Mouse X") * sensitivityX * ((!_goSlow) ? 1f : 0.1f); rotationY += Input.GetAxis("Mouse Y") * (0f - sensitivityY) * ((!_goSlow) ? 1f : 0.1f); rotationX = ClampAngle(rotationX, minimumX, maximumX); rotationY = ClampAngle(rotationY, minimumY, maximumY); transform.rotation = Quaternion.Euler(rotationY, rotationX, 0f); Vector3 vector = default(Vector3); if (Input.GetKey(KeyCode.W)) { vector += transform.forward; } if (Input.GetKey(KeyCode.S)) { vector -= transform.forward; } if (Input.GetKey(KeyCode.A)) { Vector3 a = vector; Vector3 right = transform.right; float x = right.x; Vector3 right2 = transform.right; Vector3 vector2 = new Vector3(x, 0f, right2.z); vector = a - vector2.normalized; } if (Input.GetKey(KeyCode.D)) { Vector3 a2 = vector; Vector3 right3 = transform.right; float x2 = right3.x; Vector3 right4 = transform.right; Vector3 vector3 = new Vector3(x2, 0f, right4.z); vector = a2 + vector3.normalized; } if (Input.GetKey(KeyCode.Q)) { vector -= Vector3.up; } if (Input.GetKey(KeyCode.E)) { vector += Vector3.up; } float num = (!_goSlow) ? 10f : 1f; transform.position += vector * (num * Time.deltaTime); float num2 = Input.GetAxis("Mouse ScrollWheel"); if (num2 == 0f) { return; } bool flag = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); if (flag) { num2 *= -1f; } float num3 = Mathf.Abs(num2 * 10f) * 1.1f; float num4 = (!(num2 >= 0f)) ? (1f / num3) : num3; if (flag) { Camera.main.fov *= num4; return; } AOSceneCamera aOSceneCamera = Object.FindObjectOfType(typeof(AOSceneCamera)) as AOSceneCamera; if (aOSceneCamera != null) { if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) { aOSceneCamera.DOFRange *= num4; } else { aOSceneCamera.DOFTarget *= num4; } CspUtils.DebugLog(string.Format("DOF Target: {0} DOF Range: {1}", aOSceneCamera.DOFTarget, aOSceneCamera.DOFRange)); } }

public static float ClampAngle(float angle, float min, float max) { if (angle < -360f) { angle += 360f; } if (angle > 360f) { angle -= 360f; } return Mathf.Clamp(angle, min, max); }

private void HookKeys(bool hook) { if (hook) { SHSInput.RegisterListener(_myKeyBank.Value, true); SHSDebugInput.Inst.DeactivateDebugKeys(); } else { SHSInput.UnregisterListener(_myKeyBank.Value); SHSDebugInput.Inst.ActivateDebugKeys(); } }

public CaptureHandlerResponse HandleCapture(SHSKeyCode keycode) { if (_paused) { return (keycode.code != KeyCode.Space) ? CaptureHandlerResponse.Passthrough : CaptureHandlerResponse.Block; } return (!_activeKeyDictionary.ContainsKey(new KeyCodeEntry(keycode.code, false, false, false))) ? CaptureHandlerResponse.Passthrough : CaptureHandlerResponse.Block; }

public void OnCaptureAcquired() { }

public void OnCaptureUnacquired() { }

public Dictionary<KeyCodeEntry, SHSInput.KeyEventDelegate> GetKeyList(GUIControl.KeyInputState inputState) { if (inputState != 0) { return new Dictionary<KeyCodeEntry, SHSInput.KeyEventDelegate>(); } if (_activeKeyDictionary == null) { _activeKeyDictionary = new Dictionary<KeyCodeEntry, SHSInput.KeyEventDelegate>(); KeyCode[] array = new KeyCode[7] { KeyCode.W, KeyCode.S, KeyCode.A, KeyCode.D, KeyCode.Q, KeyCode.E, KeyCode.Space }; KeyCode[] array2 = array; foreach (KeyCode code in array2) { _activeKeyDictionary.Add(new KeyCodeEntry(code, false, false, false), delegate { }); _activeKeyDictionary.Add(new KeyCodeEntry(code, false, false, true), delegate { }); } } return _activeKeyDictionary; }

public void ConfigureKeyBanks() { }

public bool IsDescendantHandler(IInputHandler handler) { return false; } }

DebugUtil (Debug Utilities)

using System; using System.Collections.Generic; using System.Reflection; using System.Text; using UnityEngine;

internal class DebugUtil { private const string LineIndent = " ";

public static UnityEngine.Object[] GetTopLevelObjects() { List<Transform> list = new List<Transform>(); Transform[] array = (Transform[])UnityEngine.Object.FindObjectsOfType(typeof(Transform)); Transform[] array2 = array; foreach (Transform transform in array2) { Transform root = transform.root; if (!list.Contains(root)) { list.Add(root); } } UnityEngine.Object[] array3 = new UnityEngine.Object[list.Count]; for (int j = 0; j < list.Count; j++) { if (list[j] == null) { array3[j] = null; } else { array3[j] = list[j].gameObject; } } Array.Sort(array3, delegate(UnityEngine.Object o1, UnityEngine.Object o2) { return string.Compare(o1.name, o2.name); }); return array3; }

public static UnityEngine.Object[] GetUnityObjectsWithName(string ChildName, UnityEngine.Object Parent) { List<UnityEngine.Object> list = new List<UnityEngine.Object>(); if (Parent == null) { Transform[] array = (Transform[])UnityEngine.Object.FindObjectsOfType(typeof(Transform)); Transform[] array2 = array; foreach (Transform transform in array2) { if (string.Compare(transform.name, ChildName) == 0) { list.Add(transform.gameObject); } } } else { GameObject gameObject = Parent as GameObject; if (gameObject == null) { return new UnityEngine.Object[0]; } int childCount = gameObject.transform.childCount; for (int j = 0; j < childCount; j++) { if (string.Compare(gameObject.transform.GetChild(j).name, ChildName) == 0) { list.Add(gameObject.transform.GetChild(j).gameObject); } } if (list.Count == 0) { Component[] components = gameObject.transform.GetComponents(typeof(Component)); Component[] array3 = components; foreach (Component component in array3) { if (string.Compare(component.GetType().ToString(), ChildName) == 0) { list.Add(component); } } } } if (list.Count == 0 && ChildName[ChildName.Length - 1] == ']') { int num = ChildName.IndexOf('['); if (num > 0) { string childName = ChildName.Substring(0, num); return GetUnityObjectsWithName(childName, Parent); } } return list.ToArray(); }

public static bool GetMemberWithName(string ChildName, object Parent, out object ResultingValue) { bool result = false; ResultingValue = null; Type type = Parent.GetType(); int num = IndexFromName(ChildName); FieldInfo field = type.GetField(ChildName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); if (field == null && num >= 0) { ChildName = ChildName.Substring(0, ChildName.IndexOf('[')); field = type.GetField(ChildName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); if (field.FieldType == typeof(Array)) { Array array = (Array)field.GetValue(Parent); if (array != null) { ResultingValue = array.GetValue(num); result = true; } } } else if (field != null) { ResultingValue = field.GetValue(Parent); result = true; } return result; }

private static int IndexFromName(string Name) { int result = -1; if (Name[Name.Length - 1] == ']') { int num = Name.IndexOf('['); if (num > 0 && !int.TryParse(Name.Substring(num + 1, Name.Length - num - 2), out result)) { result = -1; } } return result; }

public static bool GetObjectFromObjPathString(object Context, string Children, out string Error, out object ResultingValue) { Error = string.Empty; string[] array = Children.Split('/'); if (Children.Length == 0 || array.Length == 0) { ResultingValue = Context; return true; } string text = array[0]; object ResultingValue2 = null; if (Context is GameObject || Context == null) { UnityEngine.Object[] unityObjectsWithName = GetUnityObjectsWithName(text, (GameObject)Context); if (unityObjectsWithName.Length == 0) { Error = "ERROR: Couldn't find object or component named \"" + text + "\""; ResultingValue = null; return false; } if (unityObjectsWithName.Length > 1) { if (IndexFromName(text) < 0) { Error = "ERROR: More than one \"" + text + "\" found. Must specify an indexer."; ResultingValue = null; return false; } ResultingValue2 = unityObjectsWithName[IndexFromName(text)]; } else { ResultingValue2 = unityObjectsWithName[0]; } } else if (!GetMemberWithName(text, Context, out ResultingValue2)) { Error = "ERROR: Couldn't find object member named \"" + text + "\""; } else if (ResultingValue2 == null) { if (Children.Length == text.Length) { ResultingValue = null; return true; } Error = "ERROR: \"" + text + "\" is null\n"; } if (ResultingValue2 != null) { return GetObjectFromObjPathString(ResultingValue2, Children.Substring(Math.Min(Children.Length, text.Length + 1)), out Error, out ResultingValue); } ResultingValue = null; return false; }

public static void DumpArray(StringBuilder sb, int Indent, Array a) { string text = string.Empty; for (int i = 0; i < Indent; i++) { text += " "; } for (int j = 0; j < a.Length; j++) { sb.Append(text + "[" + j + "]: " + a.GetValue(j).ToString() + "\n"); } }

public static string Dump(string Obj, bool OutputErrors) { string Error = string.Empty; StringBuilder stringBuilder = new StringBuilder(); if (string.IsNullOrEmpty(Obj)) { stringBuilder.Append(" Top-Level Scene Objects\n"); stringBuilder.Append(" ------------------------------------------------------------\n"); UnityEngine.Object[] topLevelObjects = GetTopLevelObjects(); UnityEngine.Object[] array = topLevelObjects; foreach (UnityEngine.Object @object in array) { stringBuilder.Append(" " + @object.name + "\n"); } return stringBuilder.ToString(); } object ResultingValue = null; if (!GetObjectFromObjPathString(null, Obj, out Error, out ResultingValue)) { if (OutputErrors) { return Error; } return string.Empty; } if (ResultingValue is GameObject) { GameObject gameObject = (GameObject)ResultingValue; stringBuilder.Append(" Childen\n"); stringBuilder.Append(" ------------------------------------------------------------\n"); int childCount = gameObject.transform.childCount; if (childCount == 0) { stringBuilder.Append(" <no children found>\n"); } else { for (int j = 0; j < childCount; j++) { Transform child = gameObject.transform.GetChild(j); stringBuilder.Append(" " + child.name + "\n"); } } stringBuilder.Append("\n"); stringBuilder.Append(" Components\n"); stringBuilder.Append(" ------------------------------------------------------------\n"); Component[] components = gameObject.GetComponents(typeof(Component)); if (components == null || components.Length == 0) { stringBuilder.Append(" <no components found>\n"); } else { Component[] array2 = components; foreach (Component component in array2) { if (component != null) { stringBuilder.Append(" " + component.GetType().ToString() + "\n"); } else { stringBuilder.Append(" <null component>\n"); } } } } else if (ResultingValue == null) { stringBuilder.Append(" null\n"); } else if (ResultingValue.GetType().IsPrimitive) { stringBuilder.Append(" " + ResultingValue.ToString()); } else { stringBuilder.Append(" Members of " + ResultingValue.ToString() + " (" + ResultingValue.GetType().ToString() + ")\n"); stringBuilder.Append(" ------------------------------------------------------------\n"); FieldInfo[] fields = ResultingValue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); Array.Sort(fields, delegate(FieldInfo f1, FieldInfo f2) { return string.Compare(f1.Name, f2.Name); }); FieldInfo[] array3 = fields; foreach (FieldInfo fieldInfo in array3) { object value = fieldInfo.GetValue(ResultingValue); stringBuilder.Append(" " + fieldInfo.Name + ": " + ((value != null) ? value.ToString() : "null") + "\n"); if (value is Array) { DumpArray(stringBuilder, 6 + fieldInfo.Name.Length, (Array)value); } } } return stringBuilder.ToString(); } }

DebugHistory

using System.Collections.Generic; using UnityEngine;

public class DebugHistory : MonoBehaviour { System.Security.Cryptography.MD5CryptoServiceProvider md = null; protected class Event { protected float time;

public Event() { time = Time.time; }

public virtual void Log(GameObject owner) { CspUtils.DebugLog(owner.name + " : " + time); } }

protected class PositionEvent : Event { protected Vector3 pos;

public PositionEvent(Vector3 pos) { this.pos = pos; }

public override void Log(GameObject owner) { CspUtils.DebugLog(owner.name + " : " + time + " : " + pos); } }

protected class OwnershipEvent : Event { protected int oldOwner;

protected int newOwner;

public OwnershipEvent(int oldOwner, int newOwner) { this.oldOwner = oldOwner; this.newOwner = newOwner; }

public override void Log(GameObject owner) { CspUtils.DebugLog(owner.name + " : " + time + " : old = " + oldOwner.ToString() + " : " + newOwner.ToString()); } }

protected class NetActionLog : Event { protected string dump;

public NetActionLog(NetAction action) { dump = action.ToString(); }

public override void Log(GameObject owner) { CspUtils.DebugLog(owner.name + " : " + time + " : NetAction = " + dump); } }

public int maxEventCount = 5000;

public bool dumpNow;

protected CharacterGlobals charGlobals;

protected Queue<Event> history;

protected Vector3 lastPosition = Vector3.zero;

protected int lastOwner = -1;

public void Awake() { history = new Queue<Event>(); lastPosition = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); lastOwner = -1; }

public void Start() { charGlobals = Utils.GetComponent<CharacterGlobals>(base.gameObject); }

public void Update() { if ((base.transform.position - lastPosition).sqrMagnitude >= 0.001f) { AddEvent(new PositionEvent(base.transform.position)); lastPosition = base.transform.position; } if (lastOwner != charGlobals.networkComponent.NetOwnerId) { AddEvent(new OwnershipEvent(lastOwner, charGlobals.networkComponent.NetOwnerId)); lastOwner = charGlobals.networkComponent.NetOwnerId; } if (dumpNow) { dumpNow = false; Dump(); } }

public void Dump() { foreach (Event item in history) { item.Log(base.gameObject); } }

public void AddAction(NetAction action) { AddEvent(new NetActionLog(action)); }

protected void DebugCollision() { CspUtils.DebugLog("Handling DebugCollision message on " + base.gameObject.name); Dump(); }

protected void AddEvent(Event evt) { history.Enqueue(evt); if (history.Count > maxEventCount) { history.Dequeue(); } } }

In the Placeholder Animation file, a Debug attack can be found named "DebugCheatKillAttack" that deals 1000000 damage; no enemy in the game has a HP bar as large as this, meaning that this is in essence a OHKO button.

DebugCheatKillAttack (Debug OHKO)

<attack>
  <attack_name>DebugCheatKillAttack</attack_name>
  <impact>
    <impact_type>3</impact_type>
    <damage>1000000</damage>
    <pushback_duration>0</pushback_duration>
    <recoil>0</recoil>
  </impact>
</attack>

Headquarters

All of the maps for the Headquarters are still in the game's files, as is the AI logic for EVERY SINGLE CHARACTER that existed at the time the HQ shut down. The AI logic is mostly(if not exactly) the same for all of them, so only one character's code is displayed to show the code.

Headquarters AI Logic (Impossible Man as example):

string m_Name = "hq_impossible_man_playable" string m_Script = "<ai_hq_controller>

 <name>impossible_man_playable</name>
 <item_keyword_affinities>
   <item>
     <key>
       <int>1</int>
     </key>
     <value>
       <int>4</int>
     </value>
   </item>
   <item>
     <key>
       <int>2</int>
     </key>
     <value>
       <int>2</int>
     </value>
   </item>
   <item>
     <key>
       <int>10</int>
     </key>
     <value>
       <int>5</int>
     </value>
   </item>
   <item>
     <key>
       <int>22</int>
     </key>
     <value>
       <int>5</int>
     </value>
   </item>
   <item>
     <key>
       <int>14</int>
     </key>
     <value>
       <int>1</int>
     </value>
   </item>
 </item_keyword_affinities>
 <room_affinities>
   <item>
     <key>
       <string>lab</string>
     </key>
     <value>
       <int>10</int>
     </value>
   </item>
   <item>
     <key>
       <string>bridge</string>
     </key>
     <value>
       <int>10</int>
     </value>
   </item>
 </room_affinities>
 <marvel_squad>1</marvel_squad>
 <affiliation>Hero</affiliation>
 <destroy_sequence_id>74</destroy_sequence_id>
 <strength>35</strength>
 <hunger_max>100</hunger_max>
 <anger_frequency>55</anger_frequency>
 <anger_duration>5</anger_duration>
 <relationship_emotes>
     <item>
       <key>
         <RelationshipType>like</RelationshipType>
       </key>
       <value>
         <ArrayOfEmote>
           <emote>
             <id>54</id>
           </emote>
           <emote>
             <id>55</id>
           </emote>
           <emote>
             <id>56</id>
           </emote>
           <emote>
             <id>57</id>
           </emote>
         </ArrayOfEmote>
       </value>
     </item>
     <item>
       <key>
         <RelationshipType>dislike</RelationshipType>
       </key>
       <value>
         <ArrayOfEmote>
           <emote>
             <id>51</id>
           </emote>
           <emote>
             <id>52</id>
           </emote>
           <emote>
             <id>53</id>
           </emote>
           <emote>
             <id>70</id>
           </emote>
         </ArrayOfEmote>
       </value>
     </item>
 </relationship_emotes>

</ai_hq_controller>

Alongside that, the code for the entire HQ AI is still left over.

The entire HQ AI (AIControllerHQ):

using System; using System.Collections.Generic; using System.Reflection; using UnityEngine;

public class AIControllerHQ : MonoBehaviour { System.Security.Cryptography.MD5CryptoServiceProvider md = null; public enum AiMode { Sim, Active }

public enum Mood { Happy = 20, Pleasant = 40, Content = 60, Indifferent = 80, Disgruntled = 90, Enraged = 100 }

internal class PotentialActivity { public HqItem item;

public int calculatedAffinity;

public int cumulativeAffinity; }

public class LogMask { public const int None = 0;

public const int ChooseActivity = 1;

public const int CheckingItem = 2;

public const int ItemUsability = 4;

public const int ChooseActivityVerbose = 8;

public const int ChangingRooms = 16;

public const int All = 31; }

private const int DEFAULT_ROOM_AFFINITY = 3;

private const int DEFAULT_ROOM_TIMEOUT = 3;

private const float MAX_INTERACT_DIST_SQRD = 10f;

private const float MIN_INTERACT_DIST_SQRD = 4f;

private const float USE_COOLDOWN = 5f;

private const float INTERACTION_WAIT_TIME = 10f;

private const float DEFAULT_MASS = 3f;

private const int DEFAULT_CONSUMABLE_AFFINITY = 10;

private const int DEFAULT_ITEM_AFFINITY = 3;

private const float MOPE_MIN_TIME = 5f;

private const float MOPE_MAX_TIME = 10f;

private const float THROW_COOLDOWN = 5f;

protected AIControllerHQData aiData;

protected HqRoom2 currentRoom;

protected HqRoom2 spawnRoom;

protected CharacterGlobals charGlobals;

protected BehaviorManager behaviorManager;

protected bool paused;

protected AiMode currentMode;

protected PathFinder currentPathfinder;

protected HqObject2 placeHolderObject;

protected bool flingaObjectIsVisible;

protected Bounds localBounds;

protected bool inJail;

protected Vector3 lastKnownPosition = Vector3.zero;

protected bool isReadyForSwap;

protected Renderer[] renderers;

protected HqRoom2 lastRoom;

protected bool selected;

private LodCharacter lodCharacter;

private HqHappinessEffect happinessEffect;

private float currentHunger;

protected float currentActivityTime;

protected float currentActivityStartTime;

protected float currentRoomTime;

protected float currentRoomEndTime;

protected HqItem.Claim currentClaim;

protected EntryPoint currentItemEntryPoint;

protected float lastInteractionTime;

protected AIControllerHQ interactingWith;

protected HqItem currentActivityItem;

protected HqItem lastUsedActivityItem;

protected List<HqItem> itemsInControl = new List<HqItem>();

protected Dictionary<HqItem, float> itemUseTimes = new Dictionary<HqItem, float>();

protected bool needNewActivity;

protected CharacterDefinition characterDefinition;

protected GameObject attachedObject;

protected float nextThrowTime;

protected bool unloading;

public static bool showBehaviors;

private string _CurrentCaption;

private int CurrentLogMask = 1;

public bool IsReadyForSwap { get { return isReadyForSwap; } }

public bool Paused { get { return paused; } set { bool flag = paused; paused = value; if (paused && !flag) { BehaviorBase behavior = BehaviorManager.getBehavior(); if (behavior != null) { behavior.Paused = true; } foreach (AnimationState item in base.animation) { item.speed = 0f; } if (FlingaObject != null) { FlingaObject.GotoPlacementMode(true); } needNewActivity = false; } else { if (paused || !flag) { return; } foreach (AnimationState item2 in base.animation) { item2.speed = 1f; } if (IsInActiveRoom) { BehaviorBase behavior2 = BehaviorManager.getBehavior(); Type type = behavior2.GetType(); if (type == typeof(BehaviorPaused) || type == typeof(BehaviorMope)) { needNewActivity = true; } if (type == typeof(BehaviorSimulate)) { needNewActivity = true; BehaviorSimulate behaviorSimulate = behavior2 as BehaviorSimulate; if (behaviorSimulate.currentClaim != null) { Log("Reusing BehaviorSimulate claim on " + currentActivityItem.gameObject.name, 4); currentActivityItem = behaviorSimulate.currentClaim.item; currentClaim = behaviorSimulate.currentClaim; currentClaim.Claimer = this; } } if (needNewActivity) { ChooseActivity(); } else { behavior2.Paused = false; } } else { BehaviorSimulate behaviorSimulate2 = ChangeBehavior<BehaviorSimulate>(true); behaviorSimulate2.Initialize(this, OnEnterActiveRoom); } DeactivateFlinga(); } } }

public HqRoom2 LastRoom { get { return lastRoom; } }

public HqRoom2 CurrentRoom { get { return currentRoom; } set { if (currentRoom != value) { if (currentRoom != null && value != null) { Log("Hero is changing rooms from " + currentRoom.Id + " to " + value.Id, 16); } lastRoom = currentRoom; if (itemsInControl != null && itemsInControl.Count > 0) { foreach (HqItem item in itemsInControl) { ReleaseControl(item); } } if (currentRoom != null) { currentRoom.RemoveAI(this); } currentRoom = value; currentRoomTime = 0f; if (currentRoom != null) { currentRoom.AddAI(this); if (IsInActiveRoom) { currentPathfinder = currentRoom.FindClosestPathFinder(base.gameObject.transform.position); Activate(); } else { DeActivate(); if (HqController2.Instance.Input.IsHeroCamTarget(this)) { lastKnownPosition = currentRoom.RandomDoor; } else { lastKnownPosition = currentRoom.RandomLocation; } } AppShell.Instance.EventMgr.Fire(base.gameObject, new HQAIRoomChanged(base.gameObject, currentRoom)); } } if (lastUsedActivityItem != null) { lastUsedActivityItem = null; } } }

public HqRoom2 SpawnRoom { get { return spawnRoom; } set { spawnRoom = value; } }

public AiMode Mode { get { return currentMode; } }

public string InventoryIcon { get { if (CharGlobals.definitionData != null) { return CharGlobals.definitionData.InventoryIconName; } return null; } }

public string Caption { get { return _CurrentCaption; } set { if (_CurrentCaption != value) { TextMesh component = Utils.GetComponent<TextMesh>(base.gameObject, Utils.SearchChildren); if (component != null) { component.text = value; } _CurrentCaption = value; } } }

public HqObject2 FlingaObject { get { return placeHolderObject; } }

public PathFinder Pathfinder { get { if (currentPathfinder == null) { currentPathfinder = CurrentRoom.FindClosestPathFinder(base.gameObject.transform.position); } if (currentPathfinder == null) { CspUtils.DebugLog("Could not find any pathfinder for " + base.gameObject.name + " in " + CurrentRoom.Id); } return currentPathfinder; } }

public string CharacterName { get { if (CharGlobals == null) { CspUtils.DebugLog("charGlobals is null! " + base.gameObject.name); return null; } if (CharGlobals.definitionData != null) { return CharGlobals.definitionData.CharacterName; } return null; } }

public int Strength { get { return aiData.strength; } }

public bool InJail { get { return inJail; } set { if (inJail != value) { inJail = value; } } }

public bool IsFlingaObjectActive { get { return flingaObjectIsVisible; } }

public AIControllerHQData AIData { get { return aiData; } }

public bool Selected { get { return selected; } set { selected = value; SelectedObjectController component = Utils.GetComponent<SelectedObjectController>(Camera.main); if (component != null) { if (selected) { component.AddObject(base.gameObject); } else { component.DelObject(base.gameObject); } } } }

public HqItem CurrentActivityItem { get { return currentActivityItem; } set { if (!IsAngry || CanConsume(value)) { HqItem.Claim nextAvailableClaim = value.NextAvailableClaim; if (nextAvailableClaim == null) { value.CancelUsers(); } SetActivityItem(value); ChooseActivity(); } } }

public Texture2D Icon { get { if (characterDefinition != null) { return GUIManager.Instance.LoadTexture("characters_bundle|token_" + characterDefinition.CharacterName); } return null; } }

public Mood CurrentMood { get { foreach (int value in Enum.GetValues(typeof(Mood))) { if (CurrentHunger <= (float)value) { return (Mood)value; } } return Mood.Happy; } }

public bool IsAngry { get { return CurrentMood == Mood.Disgruntled || CurrentMood == Mood.Enraged; } }

public bool CanPickUp { get { if (IsFlingaObjectActive) { return false; } if (!base.enabled) { return false; } if (CurrentRoom != HqController2.Instance.ActiveRoom) { return false; } return true; } }

public bool IsInActiveRoom { get { return CurrentRoom == HqController2.Instance.ActiveRoom; } }

public HqItem.Claim CurrentClaim { get { return currentClaim; } }

protected CharacterGlobals CharGlobals { get { if (charGlobals == null) { charGlobals = Utils.GetComponent<CharacterGlobals>(base.gameObject); } return charGlobals; } set { charGlobals = value; } }

protected BehaviorManager BehaviorManager { get { if (behaviorManager == null && CharGlobals != null) { behaviorManager = CharGlobals.behaviorManager; } if (behaviorManager == null) { CspUtils.DebugLog("BehaviorManager is null for " + base.gameObject.name); } return behaviorManager; } set { behaviorManager = value; } }

private Renderer[] Renderers { get { if (renderers == null) { renderers = Utils.GetComponents<Renderer>(base.gameObject, Utils.SearchChildren, true); } return renderers; } }

private Texture2D MoodTexture { get { return GUIManager.Instance.LoadTexture(aiData.mood_icons[CurrentMood]); } }

protected LodCharacter LodCharacter { get { if (lodCharacter == null) { lodCharacter = Utils.GetComponent<LodCharacter>(base.gameObject, Utils.SearchChildren); } return lodCharacter; } set { lodCharacter = value; } }

protected virtual float CurrentHunger { get { return currentHunger; } set { currentHunger = value; } }

public bool IsInDefaultBehavior { get { BehaviorBase behavior = BehaviorManager.getBehavior(); Type type = behavior.GetType(); return type == typeof(BehaviorWander); } }

protected float CurrentRoomEndTime { get { return currentRoomEndTime; } set { currentRoomEndTime = value; } }

protected bool IsMovingToGoal { get { BehaviorBase behavior = BehaviorManager.getBehavior(); if (behavior != null && (behavior.GetType() == typeof(BehaviorChangeRooms) || behavior.GetType() == typeof(BehaviorPathTo))) { return true; } return false; } }

protected bool CanInteract { get { if (!IsAngry && Time.time - lastInteractionTime > 10f) { BehaviorBase behavior = BehaviorManager.getBehavior(); return behavior != null && currentActivityItem == null && behavior.allowInterrupt(typeof(BehaviorInteract)); } return false; } }

public void DeactivateFlinga() { if (flingaObjectIsVisible) { base.gameObject.transform.position = FlingaObject.gameObject.transform.position; if (IsInActiveRoom) { Activate(); } Utils.ActivateTree(FlingaObject.gameObject, false); flingaObjectIsVisible = false; if (LodCharacter != null) { LodCharacter.enabled = true; } } }

public void Activate() { currentMode = AiMode.Active; StartRendering(); }

public void StartRendering() { if (attachedObject != null) { Utils.ActivateTree(attachedObject, true); } Renderer[] array = Renderers; foreach (Renderer renderer in array) { if (renderer != null) { renderer.enabled = true; } } EffectSequence[] components = Utils.GetComponents<EffectSequence>(base.gameObject, Utils.SearchChildren, true); EffectSequence[] array2 = components; foreach (EffectSequence effectSequence in array2) { if (effectSequence != null) { effectSequence.gameObject.active = true; effectSequence.enabled = true; } } base.enabled = true; if (LodCharacter != null) { LodCharacter.enabled = true; } Transform transform = Utils.FindNodeInChildren(base.gameObject.transform, "ClickBox"); if (transform != null) { Utils.ActivateTree(transform.gameObject, true); } if (happinessEffect != null) { happinessEffect.gameObject.active = true; } BehaviorManager.setMotionEnabled(true); HqController2.Instance.SetCollisionOnAIController(this); }

public bool Initialize(bool paused, HqRoom2 initialRoom) { if (initialRoom == null) { CspUtils.DebugLog("initialRoom is null!"); return false; } if (aiData == null) { CspUtils.DebugLog(CharacterName + " has no hq ai data."); aiData = new AIControllerHQData(); aiData.InitializeDefaults(); } InitLocalBounds(); if (placeHolderObject == null) { CreateDefaultFlingaObject(); } flingaObjectIsVisible = false; ISHSCounterType counter = AppShell.Instance.CounterManager.GetCounter("HeroHungerCounter"); if (counter != null) { CurrentHunger = counter.GetCurrentValue(CharacterName); } AssetBundle assetBundle = HqController2.Instance.GetAssetBundle("HQ/hq_shared"); if (assetBundle != null) { GameObject gameObject = assetBundle.Load("HappinessEffect_prefab") as GameObject; if (gameObject != null) { GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject) as GameObject; if (gameObject2 != null) { Utils.SetLayerTree(gameObject2, 2); happinessEffect = Utils.GetComponent<HqHappinessEffect>(gameObject2); if (happinessEffect != null) { happinessEffect.AiController = this; } } } } CurrentRoom = initialRoom; currentActivityTime = 0f; CurrentRoomEndTime = 3f; int value = 1; foreach (KeyValuePair<string, HqRoom2> room in HqController2.Instance.Rooms) { if (!aiData.room_affinities.ContainsKey(room.Key)) { aiData.room_affinities.Add(room.Key, 3); } } if (aiData.room_affinities.TryGetValue(currentRoom.Id, out value)) { CurrentRoomEndTime = value * 3; } BehaviorManager.ChangeDefaultBehavior("BehaviorWander"); if (paused) { ChangeBehavior<BehaviorPaused>(true); } Paused = paused; ChooseActivity(); if (IsInActiveRoom) { PlaceAt(base.gameObject.transform.position); } else { lastKnownPosition = Vector3.zero; } AppShell.Instance.EventMgr.AddListener<HqAILogMessage>(OnHqAILogMessage); AppShell.Instance.EventMgr.AddListener<HqAISetHungerMessage>(OnHqAISetHungerMessage); return true; }

private void CreateDefaultFlingaObject() { GameObject gameObject = new GameObject(); gameObject.name = base.gameObject.name + "_flinga_obj"; Animation animation = Utils.AddComponent<Animation>(gameObject); animation.playAutomatically = true; if (base.gameObject.animation != null && base.gameObject.animation.GetClip("movement_idle") != null) { animation.AddClip(base.gameObject.animation.GetClip("movement_idle"), "movement_idle"); animation.clip = animation.GetClip("movement_idle"); } BoxCollider boxCollider = Utils.AddComponent<BoxCollider>(gameObject); boxCollider.size = new Vector3(1f, 2f, 1f); boxCollider.center = new Vector3(0f, 1f, 0f); boxCollider.isTrigger = true; Rigidbody rigidbody = Utils.AddComponent<Rigidbody>(gameObject); rigidbody.mass = 3f; Utils.AddComponent<PhysicsInit>(gameObject); Utils.AddComponent<PlayAnimation>(gameObject); placeHolderObject = Utils.AddComponent<HqObject2>(gameObject); placeHolderObject.AIController = this; for (int i = 0; i < base.gameObject.transform.childCount; i++) { Transform child = base.gameObject.transform.GetChild(i); if (Utils.GetComponent<Collider>(child) == null) { GameObject gameObject2 = UnityEngine.Object.Instantiate(child.gameObject) as GameObject; gameObject2.name = child.gameObject.name; if (gameObject2 != null) { gameObject2.transform.parent = gameObject.transform; } } } gameObject.transform.position = base.gameObject.transform.position; gameObject.transform.rotation = base.gameObject.transform.rotation; Utils.ActivateTree(gameObject, false); flingaObjectIsVisible = false; }

public void Awaken() { if (lastKnownPosition == Vector3.zero) { Vector3 vector = currentRoom.RandomLocation; if (vector == Vector3.zero) { CspUtils.DebugLog(CharacterName + " could not find an open location to awaken at. Waking up at door"); vector = currentRoom.RandomDoor; } CharGlobals.motionController.teleportTo(vector); } else { CharGlobals.motionController.teleportTo(lastKnownPosition); } currentPathfinder = currentRoom.FindClosestPathFinder(base.gameObject.transform.position); CurrentRoomEndTime = 3f; int value = 1; if (aiData.room_affinities.TryGetValue(currentRoom.Id, out value)) { CurrentRoomEndTime = value * 3; } if (InJail) { BehaviorDetention behaviorDetention = ChangeBehavior<BehaviorDetention>(false); behaviorDetention.Initialize(OnResumeActivity, 10f); return; } BehaviorBase behavior = BehaviorManager.getBehavior(); if (!paused && behavior.GetType() == typeof(BehaviorSimulate)) { BehaviorSimulate behaviorSimulate = behavior as BehaviorSimulate; if (behaviorSimulate.currentClaim != null) { currentActivityItem = behaviorSimulate.currentClaim.item; currentClaim = behaviorSimulate.currentClaim; currentClaim.Claimer = this; } ChooseActivity(); } }

public void DeActivate() { currentMode = AiMode.Sim; lastKnownPosition = base.gameObject.transform.position; BehaviorManager.setMotionEnabled(false); StopRendering(); BehaviorBase behavior = BehaviorManager.getBehavior(); if (paused) { behavior.Paused = true; } else if (behavior.GetType() != typeof(BehaviorSimulate)) { BehaviorSimulate behaviorSimulate = ChangeBehavior<BehaviorSimulate>(true); if (behaviorSimulate != null) { behaviorSimulate.Initialize(this, OnEnterActiveRoom); } } if (LodCharacter != null) { LodCharacter.enabled = false; } }

public void StopRendering() { if (attachedObject != null) { Utils.ActivateTree(attachedObject, false); } EffectSequence[] components = Utils.GetComponents<EffectSequence>(base.gameObject, Utils.SearchChildren, true); EffectSequence[] array = components; foreach (EffectSequence effectSequence in array) { if (effectSequence != null) { effectSequence.gameObject.active = false; effectSequence.enabled = false; } } Renderer[] array2 = Renderers; foreach (Renderer renderer in array2) { if (renderer != null) { renderer.enabled = false; } } Transform transform = Utils.FindNodeInChildren(base.gameObject.transform, "ClickBox"); if (transform != null) { Utils.ActivateTree(transform.gameObject, false); } base.enabled = false; if (FlingaObject != null && FlingaObject.gameObject != null) { Utils.ActivateTree(FlingaObject.gameObject, false); flingaObjectIsVisible = false; } if (LodCharacter != null) { LodCharacter.enabled = false; } if (happinessEffect != null) { happinessEffect.gameObject.active = false; } ReleaseAllItems(); }

public bool IsObstacleBlocking(GameObject obj) { HqItem component = Utils.GetComponent<HqItem>(obj, Utils.SearchParents); if (component == null) { return true; } if (component.IsDestroyed) { return false; } if (currentActivityItem != null && component == currentActivityItem) { return true; } if (lastUsedActivityItem != null && component == lastUsedActivityItem) { return true; } return true; }

public void Sim() { if (!Paused) { UpdateHunger(); if (!InJail) { } } }

public void Despawn() { if (currentRoom != null) { currentRoom.RemoveAI(this); } if (HqController2.Instance != null) { HqController2.Instance.DespawnAI(this); } CharGlobals.spawnData.Despawn(EntityDespawnMessage.despawnType.defeated); if (placeHolderObject != null) { UnityEngine.Object.Destroy(placeHolderObject.gameObject); placeHolderObject = null; } foreach (HqItem item in itemsInControl) { item.ReleaseControl(this); } itemsInControl.Clear(); SaveHungerValue(); AppShell.Instance.EventMgr.RemoveListener<HqAILogMessage>(OnHqAILogMessage); AppShell.Instance.EventMgr.RemoveListener<HqAISetHungerMessage>(OnHqAISetHungerMessage); AppShell.Instance.EventMgr.Fire(this, new HQHeroPlacedMessage(CharacterName, false)); }

public virtual void SaveHungerValue() { ISHSCounterType counter = AppShell.Instance.CounterManager.GetCounter("HeroHungerCounter"); if (counter != null) { counter.SetCounter(CharacterName, Convert.ToInt32(Mathf.Floor(CurrentHunger)), SHSCounterType.ReportingMethodEnum.WebService); } }

public virtual void InitializeFromData(DataWarehouse data) { DataWarehouse data2 = data.GetData("ai_hq_controller"); if (data2 == null) { return; } aiData = Utils.XmlDeserialize<AIControllerHQData>(data2); if (aiData != null) { if (aiData.flinga_placeholder != null) { string[] array = aiData.flinga_placeholder.Split('|'); AppShell.Instance.BundleLoader.FetchAssetBundle(array[0], OnFlingaObjectLoaded, array[1]); } aiData.InitializeDefaults(); } AppShell.Instance.DataManager.LoadGameData("Characters/" + aiData.name, OnCharacterDataLoaded); }

public void Interrupt() { ResetActivity(); ChangeBehavior<BehaviorPaused>(true); }

public void PickUpAI() { ResetActivity(); ChangeBehavior<BehaviorPaused>(true); if (FlingaObject != null) { FlingaObject.gameObject.transform.position = base.gameObject.transform.position; FlingaObject.gameObject.transform.rotation = base.gameObject.transform.rotation; Paused = true; StopRendering(); needNewActivity = true; Utils.ActivateTree(FlingaObject.gameObject, true); flingaObjectIsVisible = true; ReleaseAllItems(); if (LodCharacter != null) { LodCharacter.enabled = false; } } if (base.gameObject.collider != null) { base.gameObject.collider.isTrigger = true; } }

public void DropAI() { currentPathfinder = CurrentRoom.FindClosestPathFinder(FlingaObject.gameObject.transform.position); if (base.gameObject.collider != null) { base.gameObject.collider.isTrigger = false; } if (HqController2.Instance.State == typeof(HqController2.HqControllerFlinga)) { DeactivateFlinga(); Paused = false; } else { Paused = true; } }

public void DoGrandEntrance() { BehaviorIntroHero behaviorIntroHero = ChangeBehavior<BehaviorIntroHero>(true); if (behaviorIntroHero != null) { behaviorIntroHero.Initialize(OnWanderEnd, Pathfinder, IsObstacleBlocking); } }

public void PlaceAt(Vector3 target) { Vector3 min = localBounds.min; Vector3 max = localBounds.max; Vector3 center = localBounds.center; Vector3[] array = new Vector3[9]; array[0] = new Vector3(min.x, min.y, min.z); array[1] = new Vector3(min.x, min.y, max.z); array[2] = new Vector3(max.x, min.y, min.z); array[3] = new Vector3(max.x, min.y, max.z); array[4] = new Vector3(center.x, min.y, center.z); array[5] = (array[0] + array[1]) * 0.5f; array[5].y = min.y; array[6] = (array[1] + array[3]) * 0.5f; array[6].y = min.y; array[7] = (array[3] + array[2]) * 0.5f; array[7].y = min.y; array[8] = (array[2] + array[0]) * 0.5f; array[8].y = min.y; float num = float.MinValue; Vector3[] array2 = array; foreach (Vector3 b in array2) { Vector3 origin = target + b; origin.y = CurrentRoom.ceilingHeight; Ray ray = new Ray(origin, Vector3.down); int layerMask = 1155584; RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, CurrentRoom.ceilingHeight * 2f, layerMask)) { Vector3 point = hitInfo.point; if (point.y > num) { Vector3 point2 = hitInfo.point; num = point2.y; } } } base.gameObject.transform.position = new Vector3(target.x, num, target.z); if (FlingaObject != null) { FlingaObject.gameObject.transform.position = base.gameObject.transform.position; } }

public void DoEmote(sbyte emoteId) { BehaviorEmote behaviorEmote = ChangeBehavior<BehaviorEmote>(false); if (behaviorEmote != null && !behaviorEmote.Initialize(emoteId)) { ChooseActivity(); } }

public void StopEmote() { ChooseActivity(); }

public void DoIdleEmote() { BehaviorEmote behaviorEmote = ChangeBehavior<BehaviorEmote>(false); if (behaviorEmote != null && aiData.mood_emotes.ContainsKey(CurrentMood)) { List<AIControllerHQData.emote> list = aiData.mood_emotes[CurrentMood]; int index = UnityEngine.Random.Range(0, list.Count); sbyte id = list[index].id; behaviorEmote.Initialize(id, OnIdleEmoteOver); } else { ChooseActivity(); } }

public void ReleaseControl(HqItem obj) { if (itemsInControl.Contains(obj)) { itemsInControl.Remove(obj); } obj.ReleaseControl(this); }

public void ReleaseCurrentItem() { if (currentActivityItem != null) { ReleaseControl(currentActivityItem); } currentActivityItem = null; if (currentClaim != null) { currentClaim.ReleaseClaim(this); currentClaim = null; } }

public void OnUnload() { unloading = true; }

public void OnDisable() { foreach (HqItem item in itemsInControl) { if (item != null && item.gameObject != null) { item.ReleaseControl(this); if (!unloading) { Utils.ActivateTree(item.gameObject, true); item.gameObject.transform.parent = CurrentRoom.gameObject.transform; } } } itemsInControl.Clear(); }

public void ReactToExplosion(Vector3 position, float force) { for (int num = itemsInControl.Count - 1; num >= 0; num--) { ReleaseControl(itemsInControl[num]); } BehaviorBase behavior = CharGlobals.behaviorManager.getBehavior(); if (behavior.GetType() == typeof(BehaviorHitByObject)) { OnResumeActivity(null); return; } BehaviorHitByObject behaviorHitByObject = ChangeBehavior<BehaviorHitByObject>(true); if (behaviorHitByObject != null) { if (!behaviorHitByObject.Initialize(position, force, base.transform.position - position, false, true, OnResumeActivity)) { OnResumeActivity(null); } else if (interactingWith != null) { interactingWith.InteractionDone(); interactingWith = null; } } }

[AnimTag("projectilefire")] public void OnProjectileFireAnimTag(AnimationEvent evt) { IAnimTagListener animTagListener = BehaviorManager.getBehavior() as IAnimTagListener; if (animTagListener != null) { animTagListener.OnProjectileFireAnimTag(evt); } }

public void GoToRoom(HqRoom2 room) { ReleaseAllItems(); if (room == HqController2.Instance.ActiveRoom) { Vector3 vector = room.RandomLocation; if (vector == Vector3.zero) { Log("Could not find an open location to go to. Going to door instead", 16); vector = room.RandomDoor; } charGlobals.motionController.teleportTo(vector); } else { charGlobals.motionController.teleportTo(base.gameObject.transform.position + Vector3.up * 100f); FlingaObject.transform.position = base.gameObject.transform.position + Vector3.up * 100f; } CurrentRoom = room; }

public T ChangeBehavior<T>(bool force) where T : BehaviorBase { T val = (T)null; val = ((!force) ? (BehaviorManager.requestChangeBehavior(typeof(T), false) as T) : (BehaviorManager.forceChangeBehavior(typeof(T)) as T)); if (val != null) { val.Paused = Paused; } foreach (HqItem item in itemsInControl) { ReleaseControl(item); } if (val == null) { Log("Cannot change behavior to " + typeof(T).ToString() + "!", 1); } else { Log("Changed behavior to " + typeof(T).ToString(), 1); } return val; }

public void TerminateObjectUse(GameObject obj) { Log("Canceling using " + obj.name, 1); ReleaseCurrentItem(); BehaviorManager.cancelBehavior(); ChooseActivity(); }

public HqItem FindItemToEat(HqRoom2 room) { if (room != CurrentRoom && room.RoomState == HqRoom2.AccessState.Locked) { return null; } HqItem hqItem = null; foreach (HqItem aIUsableItem in room.AIUsableItems) { if (!(aIUsableItem == null)) { if (itemUseTimes.ContainsKey(aIUsableItem)) { float num = Time.time - itemUseTimes[aIUsableItem]; if (num < 5f) { continue; } itemUseTimes.Remove(aIUsableItem); } if (CanConsume(aIUsableItem) && aIUsableItem.NextAvailableClaim != null) { if (hqItem == null) { hqItem = aIUsableItem; } else if ((aIUsableItem.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude < (hqItem.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude) { hqItem = aIUsableItem; } } } } return hqItem; }

public void AttachObject(GameObject obj, string attachNode) { if (attachedObject != null) { DetachObject(attachedObject); } if (attachNode != null) { Transform transform = Utils.FindNodeInChildren(base.gameObject.transform, attachNode); if (transform != null) { Utils.AttachGameObject(transform.gameObject, obj); attachedObject = obj; } } else { Utils.AttachGameObject(base.gameObject, obj); attachedObject = obj; } }

public void DetachObject(GameObject obj) { if (obj == attachedObject && obj != null) { obj.transform.parent = CurrentRoom.gameObject.transform; attachedObject = null; } }

public bool IsUsingItem(GameObject obj) { if (currentActivityItem != null && obj == currentActivityItem.gameObject && behaviorManager.getBehavior() is BehaviorUseItem) { return true; } return false; }

public void ForceRoomChange(HqRoom2 room) { if (!(room != currentRoom)) { return; } ResetActivity(); BehaviorChangeRooms behaviorChangeRooms = ChangeBehavior<BehaviorChangeRooms>(false); if (behaviorChangeRooms != null) { behaviorChangeRooms.Initialize(currentRoom, room, Pathfinder, IsObstacleBlocking, OnChangedRoom, OnChangeRoomCanceled); if (behaviorChangeRooms.Status == BehaviorChangeRooms.PathStatus.PathNotFound) { Log("Could not path to exit destination of the room. Canceling room change.", 16); DoDefaultBehavior(); } } }

private void ReleaseAllItems() { foreach (HqItem item in itemsInControl) { ReleaseControl(item); } itemsInControl.Clear(); }

protected void TakeControl(HqItem obj) { Log("Taking control of " + obj.gameObject.name, 1); if (obj.TakeControl(this) && itemsInControl.Contains(obj)) { itemsInControl.Add(obj); } }

protected void Update() { BehaviorBase behavior = BehaviorManager.getBehavior(); if (showBehaviors) { if (behavior != null) { Caption = behavior.GetType().ToString(); } } else if (Caption != null) { Caption = null; } if (lastUsedActivityItem != null) { Bounds bounds = default(Bounds); Collider[] components = Utils.GetComponents<Collider>(lastUsedActivityItem, Utils.SearchChildren); Collider[] array = components; foreach (Collider collider in array) { bounds.Encapsulate(collider.bounds); } bounds.Encapsulate(base.gameObject.collider.bounds); float sqrMagnitude = (lastUsedActivityItem.transform.position - base.gameObject.transform.position).sqrMagnitude; if (sqrMagnitude > bounds.extents.sqrMagnitude) { Collider[] array2 = components; foreach (Collider collider2 in array2) { Physics.IgnoreCollision(collider2, base.gameObject.collider, false); } lastUsedActivityItem = null; } } if (FlingaObject != null && FlingaObject.State != typeof(HqObject2.HqObjectFlingaSelected) && flingaObjectIsVisible) { DropAI(); } if (Paused) { return; } if (!HqController2.Instance.IsInPlayMode()) { Paused = true; return; } currentRoomTime += Time.deltaTime; UpdateHunger(); if (CanInteract) { AIControllerHQ aIToInteractWith = GetAIToInteractWith(); if (aIToInteractWith != null) { InitiateInteraction(aIToInteractWith); interactingWith = aIToInteractWith; } } else if (currentActivityItem != null) { if (!IsCurrentActivityItemStillUseable()) { AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); CharGlobals.behaviorManager.endBehavior(); ChooseActivity(); } } else { if (CurrentMood <= Mood.Content) { return; } Type type = CharGlobals.behaviorManager.getBehavior().GetType(); if (type == typeof(BehaviorMope) || type == typeof(BehaviorWander)) { HqItem hqItem = FindItemToEat(HqController2.Instance.ActiveRoom); if (hqItem != null) { SetActivityItem(hqItem); ChooseActivity(); } } } }

private bool IsCurrentActivityItemStillUseable() { if (currentActivityItem == null) { return false; } if (currentActivityItem.IsDestroyed) { return false; } if (currentActivityItem.IsMoving && behaviorManager.getBehavior().GetType() != typeof(BehaviorEatItem) && behaviorManager.getBehavior().GetType() != typeof(BehaviorThrowItem)) { return false; } bool result = true; HqObject2 component = Utils.GetComponent<HqObject2>(currentActivityItem.gameObject); if (component != null) { if (component.State == typeof(HqObject2.HqObjectFlingaSelected) || !component.IsUsableByAI) { Log("Can no longer use " + currentActivityItem.gameObject.name + " because it is not usable by AI.", 4); result = false; } } else if (currentClaim != null && currentClaim.dockPoint != null) { if (currentActivityItem is PlacedItem) { if (!currentActivityItem.IsUpright(currentClaim.dockPoint)) { Log("Can no longer use " + currentActivityItem.gameObject.name + " because item is not upright", 4); result = false; } if (!CheckItemLocation(currentClaim.dockPoint.transform.position, currentActivityItem)) { Log("Can no longer use " + currentActivityItem.gameObject.name + " because item is not upright", 4); result = false; } } else if (!IsLocationClear(currentClaim.dockPoint.transform.position, currentActivityItem)) { Log("Can no longer use " + currentActivityItem.gameObject.name + " because dockpoint location is blocked.", 4); result = false; } } return result; }

private void UpdateHunger() { Mood currentMood = CurrentMood; if (CurrentHunger < aiData.hunger_max) { CurrentHunger += aiData.hunger_rate / 60f * Time.deltaTime; } if (CurrentHunger > aiData.hunger_max) { CurrentHunger = aiData.hunger_max; } if (CurrentMood != currentMood) { SaveHungerValue(); } }

protected void Start() { isReadyForSwap = true; }

protected void InitLocalBounds() { bool flag = false; Quaternion rotation = Quaternion.identity; Vector3 vector = Vector3.zero; Vector3 vector2 = Vector3.zero; if (!flag) { MeshFilter component = Utils.GetComponent<MeshFilter>(base.gameObject, Utils.SearchChildren); if (component != null) { flag = true; rotation = base.transform.rotation; vector = component.mesh.bounds.min; vector2 = component.mesh.bounds.max; } } if (!flag) { Collider component2 = Utils.GetComponent<Collider>(base.gameObject); if (component2 != null) { flag = true; vector = component2.bounds.min - base.transform.position; vector2 = component2.bounds.max - base.transform.position; } } if (!flag) { SkinnedMeshRenderer component3 = Utils.GetComponent<SkinnedMeshRenderer>(base.gameObject, Utils.SearchChildren); if (component3 != null) { flag = true; vector = component3.sharedMesh.bounds.min; vector2 = component3.sharedMesh.bounds.max; } } if (!flag) { CspUtils.DebugLog("Unable to initialize local bounds"); } Vector3[] array = new Vector3[8] { rotation * new Vector3(vector.x, vector.y, vector.z), rotation * new Vector3(vector.x, vector.y, vector2.z), rotation * new Vector3(vector.x, vector2.y, vector.z), rotation * new Vector3(vector.x, vector2.y, vector2.z), rotation * new Vector3(vector2.x, vector.y, vector.z), rotation * new Vector3(vector2.x, vector.y, vector2.z), rotation * new Vector3(vector2.x, vector2.y, vector.z), rotation * new Vector3(vector2.x, vector2.y, vector2.z) }; localBounds = new Bounds(array[0], Vector3.zero); for (int i = 1; i < array.Length; i++) { localBounds.Encapsulate(array[i]); } }

protected bool IsItemUsable(HqItem placedItem) { if (placedItem.NextAvailableClaim == null) { return false; } if (placedItem.IsDestroyed) { return false; } if (placedItem.IsMoving) { return false; } if (itemUseTimes.ContainsKey(placedItem)) { float num = Time.time - itemUseTimes[placedItem]; if (num < 5f) { Log(placedItem.gameObject.name + " is not usable because it was used recently.", 4); return false; } itemUseTimes.Remove(placedItem); } if (placedItem.ItemDefinition != null && (CanConsume(placedItem) || CanUse(placedItem))) { HqItem.Claim nextAvailableClaim = placedItem.NextAvailableClaim; if (nextAvailableClaim == null) { Log("Cannot use " + placedItem.name + " DockPoint is null!", 4); return false; } if (placedItem.ItemDefinition != null && placedItem.ItemDefinition.UseInfo != null && nextAvailableClaim.dockPoint != null && placedItem.ItemDefinition.UseInfo.GetUseByDockPointName(nextAvailableClaim.dockPoint.name) == null) { return false; } return true; } return false; }

protected void ResetActivity() { if (interactingWith != null) { interactingWith.InteractionDone(); interactingWith = null; } ReleaseCurrentItem(); ReleaseAllItems(); }

protected void ChooseActivityByDistance() { Log("Choosing activity by distance.", 1); if (currentActivityItem == null) { currentActivityItem = FindTheClosestUsableItem(); } if (currentActivityItem != null) { if (currentClaim != null) { if (currentClaim.item != currentActivityItem) { currentClaim.ReleaseClaim(this); currentClaim = currentActivityItem.NextAvailableClaim; } } else { currentClaim = currentActivityItem.NextAvailableClaim; } if (currentClaim != null) { currentClaim.Claimer = this; } currentActivityTime = 10f; GoToPlacedItem(currentActivityItem); } else if (currentRoomTime >= CurrentRoomEndTime && CurrentRoom.RoomState == HqRoom2.AccessState.Unlocked) { List<HqRoom2> list = new List<HqRoom2>(); foreach (KeyValuePair<string, HqRoom2> room in HqController2.Instance.Rooms) { if (room.Value != currentRoom && room.Value.RoomState == HqRoom2.AccessState.Unlocked) { list.Add(room.Value); } } currentActivityItem = FindItemToUse(list); if (currentActivityItem != null) { currentClaim = currentActivityItem.GetClosestAvailableClaim(base.gameObject.transform.position); if (currentClaim != null) { currentClaim.Claimer = this; } if (aiData.room_affinities.ContainsKey(currentActivityItem.Room.Id)) { CurrentRoomEndTime = aiData.room_affinities[currentActivityItem.Room.Id] * 3; Log("Current room time " + CurrentRoomEndTime, 8); } else { CurrentRoomEndTime = 3f; } GoToPlacedItem(currentActivityItem); } else { Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (HqRoom2 item in list) { int value = 3; aiData.room_affinities.TryGetValue(item.Id, out value); dictionary[item.Id] = value; } FindSomethingToDo(dictionary); } } else { DoDefaultBehavior(); } }

private HqItem FindTheClosestUsableItem() { HqItem hqItem = null; float num = float.MaxValue; bool flag = false; foreach (HqItem aIUsableItem in CurrentRoom.AIUsableItems) { if (!(aIUsableItem == null)) { Log("Checking item " + aIUsableItem.gameObject.name, 2); bool flag2 = CanConsume(aIUsableItem); if (IsItemUsable(aIUsableItem)) { Log(aIUsableItem.gameObject.name + " is useable.", 2); float sqrMagnitude = (aIUsableItem.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude; bool flag3 = false; if (hqItem == null) { flag3 = true; flag = flag2; } else if (!flag && flag2) { flag3 = true; } else if (flag && flag2 && sqrMagnitude < num) { flag3 = true; } else if (sqrMagnitude < num) { flag3 = true; } if (flag3) { Log("Setting closest item to " + aIUsableItem.gameObject.name + " distance is " + sqrMagnitude, 2); hqItem = aIUsableItem; num = sqrMagnitude; flag = flag2; } } } } return hqItem; }

protected virtual void ChooseActivity() { if (Paused) { Log(" needs new activity when unpaused.", 1); needNewActivity = true; } else { if (currentRoom != HqController2.Instance.ActiveRoom && InJail) { return; } if (IsAngry && (currentActivityItem == null || currentActivityItem.HungerValue <= 0f)) { HqItem hqItem = FindItemToEat(HqController2.Instance.ActiveRoom); if (hqItem != null) { Log("Found item to eat: " + hqItem.gameObject.name, 1); SetActivityItem(hqItem); } else { HqItem hqItem2 = FindItemToThrowOrDestroy(HqController2.Instance.ActiveRoom); if (hqItem2 != null) { Log("Found item to throw or destroy: " + hqItem2.gameObject.name, 1); TakeControl(hqItem2); if (currentClaim != null) { currentClaim.ReleaseClaim(this); currentClaim = null; } currentActivityItem = hqItem2; if (PathToItem(hqItem2, OnApproachItemDestroyArrived, OnApproachItemDestroyCanceled)) { return; } AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); } } if (currentActivityItem == null) { DoDefaultBehavior(); return; } } ChooseActivityByDistance(); } }

internal void AddToUsedItems(HqItem item) { itemUseTimes[item] = Time.time; }

internal HqItem FindItemToUse(List<HqRoom2> roomList) { HqItem hqItem = null; foreach (HqRoom2 room in roomList) { foreach (HqItem aIUsableItem in room.AIUsableItems) { if (!(aIUsableItem == null) && IsItemUsable(aIUsableItem) && aIUsableItem.ItemDefinition != null) { if (CanConsume(aIUsableItem)) { if (hqItem == null || aIUsableItem.HungerValue > hqItem.HungerValue) { hqItem = aIUsableItem; } } else if (hqItem == null || aIUsableItem.Room == HqController2.Instance.ActiveRoom) { hqItem = aIUsableItem; } } } } return hqItem; }

internal PotentialActivity ChooseActivityBasedOnAffinity(List<HqRoom2> roomList) { Log("Choosing activity based on affinity.", 1); int num = 0; List<PotentialActivity> list = new List<PotentialActivity>(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); List<PotentialActivity> list2 = new List<PotentialActivity>(); foreach (HqRoom2 room in roomList) { int num2 = 0; int value = 3; aiData.room_affinities.TryGetValue(room.Id, out value); num2 = value; if (room == HqController2.Instance.ActiveRoom) { num *= 2; } Log("Considering items in room " + room.Id + " - room affinity = " + value, 8); foreach (HqItem aIUsableItem in room.AIUsableItems) { if (!(aIUsableItem == null)) { Log("Considering " + aIUsableItem.name, 8); if (IsItemUsable(aIUsableItem) && aIUsableItem.ItemDefinition != null) { int num3 = 0; int num4 = 0; int num5 = 0; if (aIUsableItem.ItemDefinition.ItemKeywords != null) { foreach (KeyValuePair<int, ItemKeyword> itemKeyword in aIUsableItem.ItemDefinition.ItemKeywords) { int value2 = 0; aiData.item_keyword_affinities.TryGetValue(itemKeyword.Key, out value2); num3 += itemKeyword.Value.Strength; num4 += value2 * itemKeyword.Value.Strength; if (CanConsume(aIUsableItem) && num4 == 0) { num4 = 10; } } } if (aIUsableItem.HungerValue > 0f) { Log("Found a consumable " + aIUsableItem.gameObject.name, 8); num4 += (int)aIUsableItem.HungerValue; } num5 = ((num3 <= 0) ? 3 : (num4 / num3)); num5 += value; num += num5; Log("Found potential activity " + aIUsableItem.ItemDefinition.Name + " = " + num5 + " ( " + num + " )", 8); PotentialActivity potentialActivity = new PotentialActivity(); potentialActivity.calculatedAffinity = num5; potentialActivity.cumulativeAffinity = num; potentialActivity.item = aIUsableItem; list.Add(potentialActivity); if (CanConsume(aIUsableItem)) { list2.Add(potentialActivity); } num2 += num5; } } } dictionary.Add(room.Id, num2); } if (list.Count == 0) { Log("Could not find any activities", 1); return null; } PotentialActivity potentialActivity2 = null; if (list2.Count > 0) { foreach (PotentialActivity item in list) { if (item.item != null && item.item.HungerValue > 0f && (potentialActivity2 == null || item.item.HungerValue > potentialActivity2.item.HungerValue)) { potentialActivity2 = item; } else if (potentialActivity2 == null || item.cumulativeAffinity > potentialActivity2.cumulativeAffinity) { Log("Found a consumable item: " + item.item.gameObject.name, 8); potentialActivity2 = item; } } } else { int num6 = UnityEngine.Random.Range(1, num); foreach (PotentialActivity item2 in list) { if (item2.cumulativeAffinity >= num6) { Log("Found an activity " + item2.item.gameObject.name, 8); potentialActivity2 = item2; break; } } } if (potentialActivity2 != null) { Log("Chosen activity is " + potentialActivity2.item.ItemDefinition.Name + " for a duration of " + potentialActivity2.calculatedAffinity + " seconds, in room " + potentialActivity2.item.Room.Id, 1); return potentialActivity2; } return null; }

protected bool PathToItem(HqItem item, BehaviorApproach.OnArrive onArriveCallback, BehaviorApproach.OnCanceled onCancelCallback) { Vector3 vector = item.gameObject.transform.position; Quaternion rotation = Quaternion.LookRotation(base.gameObject.transform.forward); bool adjustDestination = true; if (item.EntryPoints != null && item.EntryPoints.Length > 0) { bool flag = false; Component[] entryPoints = item.EntryPoints; for (int i = 0; i < entryPoints.Length; i++) { EntryPoint entryPoint = (EntryPoint)entryPoints[i]; if (!entryPoint.IsBlocked && CheckItemLocation(entryPoint.transform.position, item)) { flag = true; vector = entryPoint.transform.position; rotation = Quaternion.LookRotation(entryPoint.FacingDirection); adjustDestination = false; break; } } if (!flag) { return false; } } else if (currentClaim != null) { vector = currentClaim.Position; rotation = ((!(currentClaim.dockPoint != null)) ? Quaternion.LookRotation(item.transform.position - base.gameObject.transform.position) : Quaternion.LookRotation(currentClaim.dockPoint.FacingDirection)); adjustDestination = false; } Log("Pathing to object " + item.gameObject.name + " Pos x:" + vector.x + " y:" + vector.y + " z:" + vector.z, 8); if (Pathfinder != null) { BehaviorPathTo behaviorPathTo = ChangeBehavior<BehaviorPathTo>(true); if (behaviorPathTo != null) { HqObject2 component = Utils.GetComponent<HqObject2>(item.gameObject); Bounds bounds = default(Bounds); if (item.gameObject.collider != null) { bounds = item.gameObject.collider.bounds; } else if (component != null) { bounds = component.Bounds; } if (bounds.size.sqrMagnitude > 0f && bounds.Contains(vector)) { Log("Trying to adjust destination since it is inside object.", 8); Ray ray = new Ray(base.gameObject.transform.position, vector - base.gameObject.transform.position); float distance; if (bounds.IntersectRay(ray, out distance) && distance > 0f) { Vector3 normalized = ray.direction.normalized; normalized *= distance; vector = base.gameObject.transform.position + normalized; adjustDestination = true; } } Vector3 start = vector + new Vector3(0f, CharGlobals.characterController.height, 0f); Vector3 vector2 = vector - new Vector3(0f, CharGlobals.characterController.height, 0f); bool flag2 = false; RaycastHit hitInfo; if (Physics.Linecast(start, vector2, out hitInfo, 100608) && (hitInfo.point - vector).magnitude <= CharGlobals.characterController.height) { vector = hitInfo.point; flag2 = true; } if (!flag2) { Log("Could not find floor below item " + item.gameObject.name + " at " + vector + " down " + vector2 + ". Canceling pathing.", 8); return false; } behaviorPathTo.Initialize(vector, rotation, item, adjustDestination, onArriveCallback, onCancelCallback, 1f, 2f, true, false, Pathfinder, IsObstacleBlocking); if (behaviorPathTo.Status == BehaviorPathTo.PathStatus.PathNotFound || behaviorPathTo.Status == BehaviorPathTo.PathStatus.PathError) { PathNode pathNode = Pathfinder.ClosestPathNode(base.gameObject.transform.position); if (pathNode != null) { Log(base.gameObject.name + " could not find a path to item " + item.gameObject.name + " trying to teleport to closest path node", 1); CharGlobals.motionController.teleportTo(pathNode.transform.position); behaviorPathTo.Initialize(vector, rotation, item, adjustDestination, onArriveCallback, onCancelCallback, 1f, 2f, true, false, Pathfinder, IsObstacleBlocking); } if (behaviorPathTo.Status == BehaviorPathTo.PathStatus.PathNotFound || behaviorPathTo.Status == BehaviorPathTo.PathStatus.PathError) { Log(base.gameObject.name + " could not find a path to item " + item.gameObject.name + " Canceling moving to item.", 1); return false; } } return true; } } CspUtils.DebugLog(base.gameObject.name + " cannot path to " + item.ItemDefinition.Name + " because AI has no pathfinder."); return false; }

protected void GoToPlacedItem(HqItem item) { bool flag = currentMode == AiMode.Active; bool flag2 = item.Room == HqController2.Instance.ActiveRoom; if (flag && flag2) { if (!PathToItem(item, OnApproachItemArrived, OnApproachItemCanceled)) { AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); DoDefaultBehavior(); } return; } if (flag) { if (Pathfinder != null && item.Room.RoomState == HqRoom2.AccessState.Unlocked) { BehaviorChangeRooms behaviorChangeRooms = ChangeBehavior<BehaviorChangeRooms>(false); if (behaviorChangeRooms != null) { behaviorChangeRooms.Initialize(currentRoom, item.Room, Pathfinder, IsObstacleBlocking, OnChangedRoom, OnChangeRoomCanceled); if (behaviorChangeRooms.Status == BehaviorChangeRooms.PathStatus.PathNotFound) { Log("Could not path to exit destination of the room. Canceling room change.", 16); DoDefaultBehavior(); } } } else { CspUtils.DebugLog(base.gameObject.name + " is trying to go to a room it shouldn't: " + item.Room.name); DoDefaultBehavior(); } return; } if (flag2) { Vector3 randomDoor = item.Room.RandomDoor; CharGlobals.motionController.teleportTo(randomDoor); CurrentRoom = item.Room; if (Time.time - CurrentRoomEndTime < currentActivityTime) { CurrentRoomEndTime = currentActivityTime; } if (!PathToItem(item, OnApproachItemArrived, OnApproachItemCanceled)) { AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); DoDefaultBehavior(); } return; } if (currentClaim != null) { CharGlobals.motionController.teleportTo(currentClaim.Position); CharGlobals.motionController.setDestination(currentClaim.Position); if (currentClaim.dockPoint != null) { base.gameObject.transform.rotation = Quaternion.LookRotation(currentClaim.dockPoint.FacingDirection); } } else { CharGlobals.motionController.teleportTo(item.gameObject.transform.position); CharGlobals.motionController.setDestination(item.gameObject.transform.position); } currentActivityStartTime = Time.time; if (Time.time - CurrentRoomEndTime < currentActivityTime) { CurrentRoomEndTime = currentActivityTime; } }

protected void FindSomethingToDo(Dictionary<string, int> totalRoomAffinities) { if (currentRoom.RoomState == HqRoom2.AccessState.Unlocked) { string text = currentRoom.Id; Dictionary<string, int> dictionary = new Dictionary<string, int>(); int num = 0; foreach (KeyValuePair<string, int> totalRoomAffinity in totalRoomAffinities) { if (totalRoomAffinity.Key != currentRoom.Id) { num += totalRoomAffinity.Value; dictionary.Add(totalRoomAffinity.Key, num); } } int num2 = UnityEngine.Random.Range(0, num); foreach (KeyValuePair<string, int> item in dictionary) { if (item.Value >= num2) { text = item.Key; break; } } CurrentRoomEndTime = 3 * aiData.room_affinities[text]; if (text == currentRoom.Id) { DoDefaultBehavior(); return; } CurrentRoomEndTime = aiData.room_affinities[text] * 3; Log("Decided to change rooms to " + text + " from " + currentRoom.Id + " for " + CurrentRoomEndTime + " seconds", 1); currentActivityTime = CurrentRoomEndTime; if (currentMode == AiMode.Active) { if (Pathfinder != null && Pathfinder.HasADoor && HqController2.Instance.Rooms[text].RoomState == HqRoom2.AccessState.Unlocked) { BehaviorChangeRooms behaviorChangeRooms = ChangeBehavior<BehaviorChangeRooms>(false); if (behaviorChangeRooms != null) { behaviorChangeRooms.Initialize(currentRoom, HqController2.Instance.Rooms[text], Pathfinder, IsObstacleBlocking, OnChangedRoom, OnChangeRoomCanceled); if (behaviorChangeRooms.Status == BehaviorChangeRooms.PathStatus.PathNotFound) { Log("Could not path to exit destination of the room. Canceling room change.", 16); DoDefaultBehavior(); } } } else { DoDefaultBehavior(); } return; } HqRoom2 hqRoom = HqController2.Instance.Rooms[text]; Vector3 randomDoor = hqRoom.RandomDoor; CharGlobals.motionController.teleportTo(randomDoor); CurrentRoom = hqRoom; } DoDefaultBehavior(); }

protected AIControllerHQ GetAIToInteractWith() { if (aiData.relationship_emotes == null) { return null; } if (IsInActiveRoom) { foreach (AIControllerHQ item in currentRoom.AIInRoom) { if (item != this && item.CanInteract) { float sqrMagnitude = (item.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude; if (sqrMagnitude < 10f && sqrMagnitude > 4f) { Vector3 position = base.gameObject.transform.position; position.y = CharGlobals.characterController.height / 2f; Vector3 position2 = item.gameObject.transform.position; position2.y = item.CharGlobals.characterController.height / 2f; RaycastHit hitInfo; if (!Physics.Linecast(position, position2, out hitInfo, 4694016) || !(hitInfo.collider != null) || !(hitInfo.collider.gameObject != base.gameObject)) { return item; } } } } } return null; }

protected void InitiateInteraction(AIControllerHQ aiToInteractWith) { CharGlobals.motionController.setDestination(base.gameObject.transform.position); lastInteractionTime = Time.time; AIControllerHQData.RelationshipType relationshipType = GetRelationshipType(aiToInteractWith); sbyte emoteId = 0; if (aiData.relationship_emotes != null && aiData.relationship_emotes.ContainsKey(relationshipType)) { List<AIControllerHQData.emote> list = aiData.relationship_emotes[relationshipType]; int index = UnityEngine.Random.Range(0, list.Count); emoteId = list[index].id; } BehaviorInteract behaviorInteract = ChangeBehavior<BehaviorInteract>(false); behaviorInteract.Initialize(aiToInteractWith.gameObject, OnAIInteractionDone, OnAIInteractionEvent, emoteId); if (aiToInteractWith.CanInteract) { aiToInteractWith.InitiateInteraction(this); } }

protected AIControllerHQData.RelationshipType GetRelationshipType(AIControllerHQ otherAI) { if (otherAI.aiData.affiliation == aiData.affiliation) { return AIControllerHQData.RelationshipType.like; } return AIControllerHQData.RelationshipType.dislike; }

protected void DoDefaultBehavior() { Log("Will do DefaultBehavior", 1); ReleaseCurrentItem(); currentActivityStartTime = Time.time; currentActivityTime = 9f; if (IsInActiveRoom) { if (InJail) { BehaviorDetention behaviorDetention = ChangeBehavior<BehaviorDetention>(false); behaviorDetention.Initialize(OnResumeActivity, 10f); return; } BehaviorWander behaviorWander = ChangeBehavior<BehaviorWander>(false); if (behaviorWander != null) { behaviorWander.Initialize(OnWanderEnd, Pathfinder, IsObstacleBlocking); } } else { BehaviorSimulate behaviorSimulate = ChangeBehavior<BehaviorSimulate>(true); if (behaviorSimulate != null) { behaviorSimulate.Initialize(this, OnEnterActiveRoom); } } }

protected bool CanUse(HqItem pi) { Log("Checking to see if " + CharacterName + " can use " + pi.gameObject.name, 4); HqObject2 component = Utils.GetComponent<HqObject2>(pi.gameObject); if (component != null && !component.IsUsableByAI) { Log("Can't use " + pi.name + " because it is not useable by AI", 4); return false; } if (pi.Room != HqController2.Instance.ActiveRoom) { return true; } if (pi.ItemDefinition != null && pi.ItemDefinition.UseInfo != null) { if (pi.ItemDefinition.UseInfo.Uses == null || pi.ItemDefinition.UseInfo.Uses.Count == 0) { Log("Can't use " + pi.name + " because it has no useInfo or uses", 4); return false; } bool flag = false; if (pi.EntryPoints != null && pi.EntryPoints.Length > 0) { Log(pi.gameObject.name + " has " + pi.EntryPoints.Length + " entry points.", 4); for (int i = 0; i < pi.EntryPoints.Length; i++) { EntryPoint entryPoint = pi.EntryPoints[i] as EntryPoint; Log("Checking entry point " + entryPoint.gameObject.name, 4); bool flag2 = CheckItemLocation(entryPoint.transform.position, pi); Log(entryPoint.gameObject.name + " isValidLocation = " + flag2 + " IsBlocked = " + entryPoint.IsBlocked, 4); if (!entryPoint.IsBlocked && flag2) { Log("Found a valid entry point:" + entryPoint.gameObject.name + " on " + pi.name, 4); flag = true; break; } } if (!flag) { Log("Cannot find a valid entry point on " + pi.name, 4); return false; } } foreach (Use value in pi.ItemDefinition.UseInfo.Uses.Values) { DockPoint dockPointByName = pi.GetDockPointByName(value.DockPointName); if (dockPointByName == null) { Log("Could not find dock point " + value.DockPointName + " on hqObject " + pi.name, 4); } else { if (pi is HqFixedItem) { return IsLocationClear(dockPointByName.transform.position, pi); } if (dockPointByName != null && pi.IsUpright(dockPointByName)) { if (currentClaim != null && currentClaim.dockPoint != null && dockPointByName == currentClaim.dockPoint) { return true; } if (flag) { return true; } if (CheckItemLocation(dockPointByName.transform.position, pi)) { return true; } Log("Found no ground under dock point on " + pi.ItemDefinition.Name + " dock point:" + value.DockPointName, 4); } if (!pi.IsUpright(dockPointByName)) { Log("Cannot use " + value.DockPointName, 4); } } } } Log("PlacedItem is not usable by AI!", 4); return false; }

protected bool CheckItemLocation(Vector3 location, HqItem item) { Log("Checking location for " + CharacterName + " on object " + item.gameObject.name, 4); Vector3 start = location + new Vector3(0f, CharGlobals.characterController.height, 0f); Vector3 end = location - new Vector3(0f, CharGlobals.characterController.height, 0f); float num = CharGlobals.characterController.height; if (item.ItemDefinition != null && item.ItemDefinition.UseInfo != null) { foreach (Use value in item.ItemDefinition.UseInfo.Uses.Values) { if (value.PostureType == Use.Posture.sit) { location = new Vector3(location.x, location.y + 0.5f, location.z); num = 0.5f; break; } } } RaycastHit hitInfo; if (Physics.Linecast(start, end, out hitInfo, 100608)) { float magnitude = (hitInfo.point - location).magnitude; if (magnitude <= num) { return IsLocationClear(location, item); } } Log("There is no ground below location for " + CharacterName + " to stand on!", 4); return false; }

private bool IsLocationClear(Vector3 location, HqItem item) { int layerMask = -2218245; Collider[] array = Physics.OverlapSphere(location, CharGlobals.characterController.radius, layerMask); if (array != null && array.Length > 0) { Collider[] array2 = array; foreach (Collider collider in array2) { if ((!(collider.gameObject != null) || !(Utils.GetComponent<HqKillZone>(collider.gameObject) != null)) && collider != item.gameObject.collider && collider.gameObject.transform.parent != item.gameObject.transform) { Log(CharacterName + " cannot use " + item.gameObject.name + " no room available to stand. Hit " + collider.gameObject.name, 4); return false; } } } return true; }

protected bool CanConsume(HqItem pi) { HqObject2 component = Utils.GetComponent<HqObject2>(pi.gameObject); if (component != null && component.State == typeof(HqObject2.HqObjectFlingaSelected)) { return false; } if (pi.IsInAIControl) { return false; } if (pi.IsMoving) { return false; } if (pi.Room != HqController2.Instance.ActiveRoom) { return false; } if (pi.HungerValue > 0f && CurrentHunger > 0f) { return true; } return false; }

protected bool CanDestroy(GameObject obj) { if (IsAngry) { HqObject2 component = Utils.GetComponent<HqObject2>(obj); if (component != null) { HqItem item = CurrentRoom.GetItem(component.PlacedId); if (item != null) { return item.CanDestroy(this); } } } return false; }

protected bool CanThrow(GameObject obj) { if (Time.time < nextThrowTime) { return false; } foreach (AIControllerHQ item2 in CurrentRoom.AIInRoom) { BehaviorThrowItem behaviorThrowItem = item2.behaviorManager.getBehavior() as BehaviorThrowItem; if (behaviorThrowItem != null) { return false; } } if (!InJail && IsAngry) { HqObject2 component = Utils.GetComponent<HqObject2>(obj); if (component != null) { PhysicsInit component2 = Utils.GetComponent<PhysicsInit>(component.gameObject); if (component2 != null && component2.IsImmobile) { return false; } HqItem item = CurrentRoom.GetItem(component.PlacedId); if (item != null) { return item.CanThrow(this); } CspUtils.DebugLog("Cannot throw item because it does not have a weight"); } } return false; }

protected void UseItem(HqItem item) { bool flag = true; if (item == null) { flag = false; } if (flag) { if (currentClaim != null) { CharGlobals.motionController.teleportTo(currentClaim.Position); CharGlobals.motionController.setDestination(currentClaim.Position); if (currentClaim.dockPoint != null) { base.gameObject.transform.rotation = Quaternion.LookRotation(currentClaim.dockPoint.FacingDirection); } } currentActivityStartTime = Time.time; if (Time.time - CurrentRoomEndTime < currentActivityTime) { CurrentRoomEndTime = currentActivityTime; } if (item.ItemDefinition == null) { return; } if (item.ItemDefinition.UseInfo != null && currentClaim != null && currentClaim.dockPoint != null) { Log("AI is going to use " + item.name, 1); if (IsAngry && item.HungerValue <= 0f) { CspUtils.DebugLog(CharacterName + " is trying to use an item when angry!"); ReleaseCurrentItem(); ChooseActivity(); } else if (!item.Use(this, currentClaim.dockPoint, OnDoneUsingItem)) { ChooseActivity(); } } else { if (item.HungerValue == 0f) { return; } Log("AI is going to eat " + item.name, 1); if (!item.IsInAIControl || item.AIInControl == this) { BehaviorEatItem behaviorEatItem = ChangeBehavior<BehaviorEatItem>(false); if (behaviorEatItem != null) { behaviorEatItem.Initialize(item.gameObject, OnItemEaten, OnDoneEating); TakeControl(currentActivityItem); } } else { Log("AI cannot eat " + item.name + " because AI is in control!", 1); } } } else { ChooseActivity(); } }

protected void OnFlingaObjectLoaded(AssetBundleLoadResponse response, object extraData) { if (response.Error != null && response.Error != string.Empty) { CspUtils.DebugLog("The following error occurred while loading character assets for <" + response.Path + ">: " + response.Error); return; } if (response.Bundle == null) { CspUtils.DebugLog("Asset bundle is missing for <" + response.Path + ">: " + response.Error); return; } string text = extraData as string; if (text == null) { return; } GameObject gameObject = response.Bundle.Load(text) as GameObject; if (!(gameObject != null)) { return; } GameObject g = UnityEngine.Object.Instantiate(gameObject) as GameObject; HqObject2 component = Utils.GetComponent<HqObject2>(g); if (component != null) { bool flag = false; if (placeHolderObject != null) { flag = placeHolderObject.gameObject.active; UnityEngine.Object.Destroy(placeHolderObject.gameObject); } placeHolderObject = component; placeHolderObject.AIController = this; placeHolderObject.transform.position = base.transform.position; if (!flag) { Utils.ActivateTree(placeHolderObject.gameObject, false); flingaObjectIsVisible = false; } } }

protected void OnCharacterDataLoaded(GameDataLoadResponse response, object extraData) { if (response.Error != null && response.Error != string.Empty) { CspUtils.DebugLog("The following error occurred while fetching game data for <" + response.Path + ">: " + response.Error); return; } DataWarehouse data = response.Data; characterDefinition = new CharacterDefinition(); characterDefinition.InitializeFromData(data); }

protected HqItem FindItemToThrowOrDestroy(HqRoom2 room) { HqItem hqItem = null; foreach (HqItem placedItem in room.PlacedItems) { if (!(placedItem == null) && !(placedItem.HungerValue > 0f) && !placedItem.IsMoving && (CanDestroy(placedItem.gameObject) || CanThrow(placedItem.gameObject))) { if (hqItem == null) { hqItem = placedItem; } else if ((placedItem.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude < (hqItem.gameObject.transform.position - base.gameObject.transform.position).sqrMagnitude) { hqItem = placedItem; } } } return hqItem; }

private bool DestroyOrThrowObject(HqItem hqItem) { if (hqItem == null) { return false; } Log(CharacterName + " is going to destroy or throw " + hqItem.gameObject.name, 1); CharGlobals.motionController.stopGently(); hqItem.CancelUsers(); if (CanDestroy(hqItem.gameObject)) { Log(CharacterName + " decided to destroy " + hqItem.gameObject.name, 1); BehaviorInteract behaviorInteract = ChangeBehavior<BehaviorInteract>(true); if (behaviorInteract != null) { if (hqItem != null) { TakeControl(hqItem); } HqObject2 component = Utils.GetComponent<HqObject2>(hqItem.gameObject); if (component != null) { HqController2.Instance.AIIsTakingOverItem(component); if (component.gameObject.rigidbody != null) { component.gameObject.rigidbody.isKinematic = true; component.gameObject.rigidbody.useGravity = false; component.gameObject.active = false; component.gameObject.active = true; } } behaviorInteract.Initialize(hqItem.gameObject, OnResumeActivity, OnDestroyEvent, aiData.destroy_sequence_id); return true; } } else if (CanThrow(hqItem.gameObject)) { Log(CharacterName + " decided to throw " + hqItem.gameObject.name, 1); BehaviorThrowItem behaviorThrowItem = ChangeBehavior<BehaviorThrowItem>(true); if (behaviorThrowItem != null) { TakeControl(hqItem); HqObject2 component2 = Utils.GetComponent<HqObject2>(hqItem.gameObject); if (component2 != null) { HqController2.Instance.AIIsTakingOverItem(component2); } behaviorThrowItem.Initialize(hqItem.gameObject, OnDoneThrowing); return true; } } return false; }

protected void SetActivityItem(HqItem item) { if (!(item != null) || !(currentActivityItem != item)) { return; } HqItem hqItem = currentActivityItem; HqItem.Claim claim = currentClaim; currentClaim = null; if (!CanUse(item) && !CanConsume(item)) { CspUtils.DebugLog("Could not force " + CharacterName + " to use " + item.gameObject.name); currentClaim = claim; return; } ReleaseCurrentItem(); CspUtils.DebugLog("Setting " + CharacterName + " currentActivityItem to " + item.gameObject.name); currentActivityItem = item; currentClaim = currentActivityItem.NextAvailableClaim; if (currentClaim == null) { currentActivityItem = hqItem; currentClaim = claim; return; } if (claim != null) { claim.ReleaseClaim(this); } currentClaim.Claimer = this; }

protected void FindHighestTransform(Transform parent, ref Transform currentHighest) { if (!(currentHighest == null)) { Vector3 position = parent.position; float y = position.y; Vector3 position2 = currentHighest.position; if (!(y > position2.y)) { goto IL_0032; } } currentHighest = parent; goto IL_0032; IL_0032: for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); FindHighestTransform(child, ref currentHighest); } }

protected void OnWanderEnd() { DoIdleEmote(); }

protected void OnEnterActiveRoom(GameObject obj) { if (obj != null) { HqItem component = Utils.GetComponent<HqItem>(obj, Utils.SearchChildren); if (component != null) { if (currentClaim != null) { currentClaim.ReleaseClaim(this); currentClaim = null; } currentClaim = component.NextAvailableClaim; if (currentClaim != null && (currentClaim.Claimer == null || currentClaim.Claimer == this)) { currentClaim.Claimer = this; currentActivityItem = component; currentActivityTime = 10f; GoToPlacedItem(component); return; } ReleaseCurrentItem(); } } DoDefaultBehavior(); }

protected void OnApproachItemArrived(GameObject obj) { if (!(currentActivityItem != null)) { return; } HqObject2 component = Utils.GetComponent<HqObject2>(obj); if (component != null && component.State == typeof(HqObject2.HqObjectFlingaSelected)) { ChooseActivity(); return; } if (currentClaim != null) { Collider[] components = Utils.GetComponents<Collider>(currentActivityItem, Utils.SearchChildren); Collider[] array = components; foreach (Collider collider in array) { if (collider.bounds.Contains(currentClaim.Position)) { Physics.IgnoreCollision(collider, base.gameObject.collider); } } float sqrMagnitude = (currentClaim.Position - base.gameObject.transform.position).sqrMagnitude; if (sqrMagnitude > 1f) { CharGlobals.motionController.teleportTo(currentClaim.Position); } } UseItem(currentActivityItem); }

protected void OnApproachItemCanceled(GameObject obj) { BehaviorPathTo behaviorPathTo = CharGlobals.behaviorManager.getBehavior() as BehaviorPathTo; if (behaviorPathTo != null && behaviorPathTo.Status == BehaviorPathTo.PathStatus.ItemMoved && currentActivityItem != null && IsCurrentActivityItemStillUseable()) { ChooseActivity(); return; } if (currentActivityItem != null) { AddToUsedItems(currentActivityItem); Collider[] components = Utils.GetComponents<Collider>(currentActivityItem, Utils.SearchChildren); Collider[] array = components; foreach (Collider collider in array) { Physics.IgnoreCollision(collider, base.gameObject.collider, false); } } ReleaseCurrentItem(); ChooseActivity(); }

protected void OnApproachItemDestroyArrived(GameObject obj) { if (!DestroyOrThrowObject(currentActivityItem)) { if (currentActivityItem != null) { AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); } ChooseActivity(); } }

protected void OnApproachItemDestroyCanceled(GameObject obj) { BehaviorPathTo behaviorPathTo = CharGlobals.behaviorManager.getBehavior() as BehaviorPathTo; if (behaviorPathTo != null && behaviorPathTo.Status == BehaviorPathTo.PathStatus.ItemMoved && currentActivityItem != null && IsCurrentActivityItemStillUseable()) { ChooseActivity(); return; } if (currentActivityItem != null) { AddToUsedItems(currentActivityItem); Collider[] components = Utils.GetComponents<Collider>(currentActivityItem, Utils.SearchChildren); Collider[] array = components; foreach (Collider collider in array) { Physics.IgnoreCollision(collider, base.gameObject.collider, false); } } ReleaseCurrentItem(); ChooseActivity(); }

protected void OnChangeRoomCanceled(GameObject obj) { Log("Canceled changing rooms.", 16); CurrentRoomEndTime = 3f; if (aiData.room_affinities.ContainsKey(CurrentRoom.Id)) { CurrentRoomEndTime = aiData.room_affinities[CurrentRoom.Id] * 3; } ReleaseCurrentItem(); ChooseActivity(); }

protected void OnChangedRoom(GameObject obj) { if (currentActivityItem != null) { GoToPlacedItem(currentActivityItem); } CurrentRoomEndTime = 3f; if (aiData.room_affinities.ContainsKey(CurrentRoom.Id)) { CurrentRoomEndTime = aiData.room_affinities[CurrentRoom.Id] * 3; } currentPathfinder = null; }

protected void OnDoneUsingItem(GameObject obj) { if (currentActivityItem != null) { HqExplosive component = Utils.GetComponent<HqExplosive>(currentActivityItem.gameObject); if (component != null) { component.Explode(); } Log("Done using item " + currentActivityItem.gameObject.name, 1); if (currentActivityItem != null) { if (currentActivityItem.HungerValue > 0f) { CurrentHunger -= currentActivityItem.HungerValue; if (CurrentHunger < 0f) { CurrentHunger = 0f; } SaveHungerValue(); } if (currentActivityItem.EntryPoints != null && currentActivityItem.EntryPoints.Length > 0) { bool flag = false; Component[] entryPoints = currentActivityItem.EntryPoints; for (int i = 0; i < entryPoints.Length; i++) { EntryPoint entryPoint = (EntryPoint)entryPoints[i]; if (!entryPoint.IsBlocked && CheckItemLocation(entryPoint.transform.position, currentActivityItem)) { flag = true; CharGlobals.motionController.teleportTo(entryPoint.transform.position); CharGlobals.motionController.rotateTowards(entryPoint.FacingDirection * -1f); break; } } if (!flag) { PathFinder pathFinder = CurrentRoom.FindClosestPathFinder(base.gameObject.transform.position); if (pathFinder != null) { PathNode pathNode = pathFinder.ClosestPathNode(base.gameObject.transform.position); if (pathNode == null) { pathNode = pathFinder.RandomPathNode(); } CharGlobals.motionController.teleportTo(pathNode.transform.position); } } } } AddToUsedItems(currentActivityItem); lastUsedActivityItem = currentActivityItem; } ReleaseCurrentItem(); ChooseActivity(); }

protected void OnItemEaten(GameObject obj) { if (obj != null) { HqItem component = Utils.GetComponent<HqItem>(obj, Utils.SearchChildren); if (component != null && component.HungerValue > 0f) { CurrentHunger -= component.HungerValue; if (CurrentHunger < 0f) { CurrentHunger = 0f; } SaveHungerValue(); } HqExplosive component2 = Utils.GetComponent<HqExplosive>(obj); if (component2 != null) { component2.Explode(); } else { CurrentRoom.ConsumeItem(obj); } } ReleaseCurrentItem(); }

protected void OnDoneEating(GameObject obj) { ReleaseAllItems(); ChooseActivity(); }

protected void OnCollisionEnter(Collision collisionInfo) { if (collisionInfo.gameObject == null || (collisionInfo.gameObject.rigidbody != null && collisionInfo.gameObject.rigidbody.velocity.sqrMagnitude < 1f)) { return; } HqObject2 component = Utils.GetComponent<HqObject2>(collisionInfo.gameObject, Utils.SearchChildren); if (!(component != null)) { return; } float num = 0f; HqItem item = CurrentRoom.GetItem(component.PlacedId); if (item != null) { num = item.ItemDefinition.Weight; } float num2 = num * collisionInfo.relativeVelocity.magnitude / (float)aiData.strength; if (!(num2 > 2f)) { return; } BehaviorHitByObject behaviorHitByObject = ChangeBehavior<BehaviorHitByObject>(false); if (behaviorHitByObject != null) { if (!behaviorHitByObject.Initialize(collisionInfo.gameObject.transform.position, num2, collisionInfo.relativeVelocity, true, false, OnResumeActivity)) { OnResumeActivity(null); } else if (interactingWith != null) { interactingWith.InteractionDone(); interactingWith = null; } } }

protected void OnResumeActivity(GameObject obj) { if (obj != null) { HqItem component = Utils.GetComponent<HqItem>(obj); if (component != null) { ReleaseControl(component); } } if (currentActivityItem != null) { GoToPlacedItem(currentActivityItem); } else { ChooseActivity(); } }

protected void OnIdleEmoteOver(GameObject obj) { BehaviorMope behaviorMope = ChangeBehavior<BehaviorMope>(false); if (behaviorMope != null) { float max = 10f * ((float)CurrentMood / 100f); float min = 5f * ((float)CurrentMood / 100f); float idleTime = UnityEngine.Random.Range(min, max); behaviorMope.Initialize(OnResumeActivity, idleTime); } }

protected void OnDestroyEvent(GameObject objectToDestroy, string eventName, float value) { if (eventName == "destroy" && objectToDestroy != null) { Log("Destroying " + objectToDestroy.name, 8); HqObject2 component = Utils.GetComponent<HqObject2>(objectToDestroy, Utils.SearchChildren); if (component != null) { HqExplosive component2 = Utils.GetComponent<HqExplosive>(component); if (component2 != null) { component2.Explode(); } else if (component.State == typeof(HqObject2.HqObjectFlinga) || component.State == typeof(HqObject2.HqObjectFlingaSelected)) { HqItem item = CurrentRoom.GetItem(component.PlacedId); if (item != null) { ReleaseControl(item); item.Destroy(); } } } } ReleaseCurrentItem(); }

protected void OnDoneThrowing(GameObject objectThrown) { nextThrowTime = Time.time + 5f; ReleaseCurrentItem(); if (objectThrown != null) { HqItem component = Utils.GetComponent<HqItem>(objectThrown, Utils.SearchChildren); if (component != null) { ReleaseControl(component); } } ChooseActivity(); }

protected void OnAIInteractionEvent(GameObject objectInteractedWith, string eventName, float value) { }

protected void OnAIInteractionDone(GameObject objectInteractedWith) { if (interactingWith != null) { interactingWith.InteractionDone(); interactingWith = null; InteractionDone(); } }

protected void InteractionDone() { if (currentActivityItem != null) { if (!PathToItem(currentActivityItem, OnApproachItemArrived, OnApproachItemCanceled)) { AddToUsedItems(currentActivityItem); ReleaseCurrentItem(); DoDefaultBehavior(); } } else { ChooseActivity(); } }

public void Log(string logMessage, int Mask) { if ((Mask & CurrentLogMask) != Mask) { } }

public void OnHqAILogMessage(HqAILogMessage message) { if (message.Character.ToLower().CompareTo(CharacterName) == 0 || message.Character.ToLower().CompareTo("all") == 0) { try { Type typeFromHandle = typeof(LogMask); FieldInfo[] fields = typeFromHandle.GetFields(BindingFlags.Static | BindingFlags.Public); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { if (fieldInfo.Name.ToLower() == message.LogChannel.ToLower()) { int num = (int)fieldInfo.GetValue(null); if ((CurrentLogMask & num) != num) { CurrentLogMask |= num; } else { CurrentLogMask &= ~num; } } } } catch { CspUtils.DebugLog("Could not find log message channel."); } } }

public void OnHqAISetHungerMessage(HqAISetHungerMessage message) { if (message.Character.ToLower().CompareTo(CharacterName) == 0 || message.Character.ToLower().CompareTo("all") == 0) { CurrentHunger = message.HungerValue; if (CurrentHunger < 0f) { CurrentHunger = 0f; } SaveHungerValue(); } } }

Headquarters AI (AIControllerHQData):

using System.Collections.Generic; using System.Xml.Serialization;

[XmlRoot("ai_hq_controller")] public class AIControllerHQData { public enum RelationshipType { like, dislike }

public enum Affiliation { Hero, Villain }

public class emote { public sbyte id;

public emote() { }

public emote(sbyte id) { this.id = id; } }

public string name;

public SerializableDictionary<int, int> item_keyword_affinities = new SerializableDictionary<int, int>();

public SerializableDictionary<string, int> room_affinities = new SerializableDictionary<string, int>();

public int marvel_squad;

public Affiliation affiliation;

public sbyte destroy_sequence_id;

public int strength;

public float hunger_max;

public float hunger_rate = 1.75f;

public int anger_frequency;

public int anger_duration;

public string flinga_placeholder;

public SerializableDictionary<RelationshipType, List<emote>> relationship_emotes = new SerializableDictionary<RelationshipType, List<emote>>();

public SerializableDictionary<AIControllerHQ.Mood, List<emote>> mood_emotes = new SerializableDictionary<AIControllerHQ.Mood, List<emote>>();

public SerializableDictionary<AIControllerHQ.Mood, string> mood_icons = new SerializableDictionary<AIControllerHQ.Mood, string>();

public void InitializeDefaults() { if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Happy)) { mood_emotes[AIControllerHQ.Mood.Happy] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Happy].Add(new emote(54)); mood_emotes[AIControllerHQ.Mood.Happy].Add(new emote(55)); } if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Pleasant)) { mood_emotes[AIControllerHQ.Mood.Pleasant] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Pleasant].Add(new emote(69)); mood_emotes[AIControllerHQ.Mood.Pleasant].Add(new emote(56)); } if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Content)) { mood_emotes[AIControllerHQ.Mood.Content] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Content].Add(new emote(61)); } if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Indifferent)) { mood_emotes[AIControllerHQ.Mood.Indifferent] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Indifferent].Add(new emote(72)); mood_emotes[AIControllerHQ.Mood.Indifferent].Add(new emote(59)); } if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Disgruntled)) { mood_emotes[AIControllerHQ.Mood.Disgruntled] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Disgruntled].Add(new emote(52)); mood_emotes[AIControllerHQ.Mood.Disgruntled].Add(new emote(60)); } if (!mood_emotes.ContainsKey(AIControllerHQ.Mood.Enraged)) { mood_emotes[AIControllerHQ.Mood.Enraged] = new List<emote>(); mood_emotes[AIControllerHQ.Mood.Enraged].Add(new emote(70)); mood_emotes[AIControllerHQ.Mood.Enraged].Add(new emote(53)); mood_emotes[AIControllerHQ.Mood.Enraged].Add(new emote(51)); } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Happy)) { mood_icons[AIControllerHQ.Mood.Happy] = "hq_bundle|Happy"; } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Pleasant)) { mood_icons[AIControllerHQ.Mood.Pleasant] = "hq_bundle|Pleasant"; } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Content)) { mood_icons[AIControllerHQ.Mood.Content] = "hq_bundle|Content"; } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Indifferent)) { mood_icons[AIControllerHQ.Mood.Indifferent] = "hq_bundle|Indifferent"; } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Disgruntled)) { mood_icons[AIControllerHQ.Mood.Disgruntled] = "hq_bundle|Disgruntled"; } if (!mood_icons.ContainsKey(AIControllerHQ.Mood.Enraged)) { mood_icons[AIControllerHQ.Mood.Enraged] = "hq_bundle|Enraged"; } } }

Headquarters AI (AIControllerHQTutorial):

public class AIControllerHQTutorial : AIControllerHQ { protected bool canUseItems;

public bool CanUseItems { set { canUseItems = value; } }

protected override float CurrentHunger { get { return 0f; } set { } }

public override void SaveHungerValue() { }

protected override void ChooseActivity() { if (canUseItems) { base.ChooseActivity(); } else { DoDefaultBehavior(); } } }

Also, a script that names the item cap for a HQ Room and their internal ID's.

Rooms:

<?xml version="1.0"?> <Rooms>

 <Room>
   <typeid>1297</typeid>
   <id>bridge</id>
   <bundle>bridge</bundle>
   <item_cap>100</item_cap>
 </Room>
 <Room>
   <id>training</id>
   <typeid>1309</typeid>
   <bundle>training</bundle>
   <item_cap>100</item_cap>
 </Room>
 <Room>
   <typeid>1298</typeid>
   <id>lab</id>
   <bundle>lab</bundle>
   <fixed_bundles>
     <bundle>Items/Lab_Props</bundle>
   </fixed_bundles>
   <item_cap>70</item_cap>
 </Room>
 <Room>
   <typeid>1310</typeid>
   <id>gym</id>
   <bundle>gym</bundle>
   <item_cap>120</item_cap>
 </Room>
 <Room>
   <id>cafeteria</id>
   <typeid>1308</typeid>
   <bundle>cafeteria</bundle>
   <fixed_bundles>
     <bundle>Items/Cafeteria_Props</bundle>
   </fixed_bundles>
   <item_cap>80</item_cap>
 </Room>
 <Room>
   <id>rec_room</id>
   <typeid>1299</typeid>
   <bundle>rec</bundle>
   <item_cap>100</item_cap>
 </Room>
 <Room>
   <id>dorm1</id>
   <typeid>1300</typeid>
   <bundle>dorm1</bundle>
   <item_cap>40</item_cap>
 </Room>
 <Room>
   <typeid>1301</typeid>
   <id>dorm2</id>
   <bundle>dorm2</bundle>
   <item_cap>40</item_cap>
 </Room>
 <Room>
   <id>dorm3</id>
   <typeid>1302</typeid>
   <bundle>dorm3</bundle>
   <item_cap>40</item_cap>
 </Room>
 <Room>
   <id>dorm4</id>
   <typeid>1303</typeid>
   <bundle>dorm4</bundle>
   <item_cap>40</item_cap>
 </Room>
 <Room>
   <id>dorm5</id>
   <typeid>1304</typeid>
   <bundle>dorm5</bundle>
   <item_cap>40</item_cap>
 </Room>
 <Room>
   <id>dorm6</id>
   <typeid>1305</typeid>
   <bundle>dorm6</bundle>
   <item_cap>40</item_cap>
 </Room>

<Room> <typeid>1306</typeid> <id>cells</id> <bundle>cells</bundle> <item_cap>100</item_cap> </Room> </Rooms>

Code probably used when switching HQ rooms.

ChangeRoomCmd:

using System;

public class ChangeRoomCmd : AutomationCmd { private string roomId;

private DateTime start;

private int ELAPSED_TIME = 1;

public ChangeRoomCmd(string cmdline, string room) : base(cmdline) { roomId = room; AutomationManager.Instance.nHeadQuarters++; }

public override bool execute() { try { AutomationManager.Instance.LogAttribute("roomId", roomId); AppShell.Instance.EventMgr.Fire(null, new HQRoomChangeRequestMessage(roomId)); start = DateTime.Now; } catch (Exception ex) { AutomationManager.Instance.errHeadQuareter++; base.ErrorCode = "E001"; base.ErrorMsg += ex.Message; } return base.execute(); }

public override bool isCompleted() { bool flag = base.isCompleted(); if (flag) { if (DateTime.Now - start > TimeSpan.FromSeconds(ELAPSED_TIME)) { flag = (AutomationManager.Instance.HQRoomId == roomId); if (!flag) { base.ErrorMsg = "HQRoomId is not set to " + roomId; } } else { flag = false; } } else { AutomationManager.Instance.errHeadQuareter++; base.ErrorCode = "C001"; base.ErrorMsg = "ChangeRoomCmd Timed Out"; } return flag; }

public override bool isReady() { bool flag = base.isReady(); if (flag) { flag = (AutomationManager.Instance.activeController == GameController.ControllerType.HeadQuarters); if (!flag) { base.ErrorMsg = "ActiveController is not set to HeadQuarters"; } } else { AutomationManager.Instance.errHeadQuareter++; base.ErrorCode = "P001"; base.ErrorMsg = "ChangeRoomCmd Timed Out"; } return flag; } }

Leftovers for Cut Characters

Leftover Relationship Voice Lines

Hmmm...
To do:

There are several VO files related to heroes who never made it into the game, even mentioning characters that didn't get any placeholder stats.

Unused Characters

Hmmm...
To do:
  • Humanoid_01 to 03 have models, animations, and function. Document these.

Whiplash

Whiplash has one unused image of him in the files.

Professor X

Hmmm...
To do:
  • Lots of images.

Professor X has a lot of assets; alongside his stats being in a state of testing (being a clone of MODOK at that point), Professor X also had a Favorite Hero medallion, meaning that he was likely close to being finished, as his model already existed.

Leftover Stats

A handful cut characters have leftover stats in the files; some of them have placeholder stats. No models for them exist in the game unless they were a Playable variant of a boss/enemy, or Mr. Placeholder, whose model is two triangles without a UV map.

Professor X uses Modok's stats and model as placeholders.

Professor X Stats:

<character_stats> <stat> <stat_type>Health</stat_type> <stat_change_pusle_rate>0</stat_change_pusle_rate> <stat_change_amount>0</stat_change_amount> <initial_value>230</initial_value> <Tool_initial_value_table_setting>Player_Health_Ranged</Tool_initial_value_table_setting> <initial_maximum>230</initial_maximum> <Tool_initial_maximum_table_setting>Player_Health_Ranged</Tool_initial_maximum_table_setting> </stat> <stat> <stat_type>Power</stat_type> <stat_change_pusle_rate>0</stat_change_pusle_rate> <stat_change_amount>0</stat_change_amount> <initial_value>0</initial_value> <initial_maximum>100</initial_maximum> <Tool_initial_maximum_table_setting>Hero_BasePower</Tool_initial_maximum_table_setting> </stat> </character_stats> <name>professor_x</name> <asset_bundle>Characters/modok_04</asset_bundle> <inventory_icon_name>inventory_character_professor_x</inventory_icon_name> <behavior_manager> <default_behavior_type>BehaviorBase</default_behavior_type> </behavior_manager> <click_box> <height>0</height> <radius>0</radius>

<x>0</x> <y>0</y> <z>0</z>

</click_box> <character_controller> <height>2</height> <radius>0.5</radius> <slope_limit>50</slope_limit> <step_offset>0.3</step_offset>

<x>0</x> <y>1.1</y> <z>0</z>

<pickup_bone>fx_Rpalm</pickup_bone> </character_controller> <effect_sequence_list> <character_fx>FX/modok_fx</character_fx> <shared_fx>FX/character_shared_fx</shared_fx> <logical_effect> <name>Power Emote 1</name> <prefab_name>Power Emote 1</prefab_name> </logical_effect> <logical_effect> <name>Power Emote 2</name> <prefab_name>Power Emote 2</prefab_name> </logical_effect> <logical_effect> <name>Power Emote 3</name> <prefab_name>Power Emote 3</prefab_name> </logical_effect> <logical_effect> <name>Transport</name> <prefab_name>transport</prefab_name> </logical_effect> <logical_effect> <name>Splash</name> <prefab_name>Splash sequence</prefab_name> </logical_effect> <logical_effect> <name>Hot Spot Launch</name> <prefab_name>Hot Spot Anticipate</prefab_name> </logical_effect> </effect_sequence_list> <character_model> <model_name>modok_04_prefab</model_name> <size_rank>0</size_rank> <effect_name>persistent sequence</effect_name> <disable_shadow>false</disable_shadow> <collider> <name>HeadBullet</name> <collider_prefab>_AttackCollider</collider_prefab> <node>fx_head_ray</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>HeadLaser</name> <collider_prefab>_AttackColliderBeam</collider_prefab> <node>fx_head_ray</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>RightHandCollider</name> <collider_prefab>_AttackCollider</collider_prefab> <node>RArmPalm</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>LeftHandCollider</name> <collider_prefab>_AttackCollider</collider_prefab> <node>fx_Lpalm</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>AOECollider</name> <collider_prefab>_AttackCollider</collider_prefab> <node>Pelvis</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>RightHandMissile</name> <collider_prefab>_AttackCollider</collider_prefab> <node>fx_Rpalm</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> <collider> <name>LeftHandMissile</name> <collider_prefab>_AttackCollider</collider_prefab> <node>fx_Lpalm</node> <offset> <x>0</x> <y>0</y> <z>0</z> </offset> <scale>1</scale> </collider> </character_model> <character_motion_controller> <landing_effect_name>landing</landing_effect_name> <falling_effect_name>fall_trail_sequence</falling_effect_name> <speed>6</speed> <run_animation_speed>1</run_animation_speed> <deceleration_distance>0.4</deceleration_distance> <gravity>20</gravity> <jump_height>10</jump_height> <gw_jump_height>10</gw_jump_height> <jump_timeout>0.15</jump_timeout> <second_jump_height>12</second_jump_height> <double_jump>false</double_jump> <double_jump_anim_index>-1</double_jump_anim_index> <hold_jump>false</hold_jump> <use_jump_sequence>false</use_jump_sequence> <rotate_speed>500</rotate_speed> <fall_tolerance>0.5</fall_tolerance> <pickup_strength>4</pickup_strength> <hot_spots> <hot_spot>Flying</hot_spot> </hot_spots> <can_swing>false</can_swing> <sit_override /> </character_motion_controller> <lod> <enabled>true</enabled> <animate_offscreen>false</animate_offscreen> </lod> <scoring> <defeat>0</defeat> </scoring> <player_combat_controller> <power_attack_1>modok_playble_attack_super</power_attack_1> <power_attack_2>modok_playble_attack_super_Tier2</power_attack_2> <power_attack_3>modok_playble_attack_super_Tier3</power_attack_3> <health_increase_1>20</health_increase_1> <health_increase_2>20</health_increase_2> <health_increase_3>20</health_increase_3> <health_increase_4>10</health_increase_4> <health_increase_5>10</health_increase_5> <health_increase_6>10</health_increase_6> <health_increase_7>10</health_increase_7> <health_increase_8>10</health_increase_8> <power_damage_received_multiplier>0.5</power_damage_received_multiplier> <power_damage_dealt_multiplier>0.5</power_damage_dealt_multiplier> <combat_controller> <faction>Player</faction> <ignore_height>false</ignore_height> <show_attack_chain_numbers>false</show_attack_chain_numbers> <show_attack_colliders>false</show_attack_colliders> <recoil_resistance>0</recoil_resistance> <pushback_resistance>0</pushback_resistance> <launch_resistance>0</launch_resistance> <knockdown_effect>knockdown</knockdown_effect> <launch_land_effect>launch_land_sequence</launch_land_effect> <despawn_effect>despawn_sequence</despawn_effect> <death_effect>death_effect_sequence</death_effect> <stun_effect>stun1</stun_effect> <recoil_small_interruptible_by>2</recoil_small_interruptible_by> <recoil_large_interruptible_by>4</recoil_large_interruptible_by> <recoil_getup_interruptible_by>4</recoil_getup_interruptible_by> <recoil_knockdown_interruptible_by>10</recoil_knockdown_interruptible_by> <recoil_launch_interruptible_by>10</recoil_launch_interruptible_by> <recoil_dance_interruptible_by>1</recoil_dance_interruptible_by> <recoil_stun_interruptible_by>10</recoil_stun_interruptible_by> <recoil_limit>0</recoil_limit> <default_impact_matrix_type>3</default_impact_matrix_type> <impact_matrix_type>2</impact_matrix_type> <attack> <name>modok_playable_attack_L1</name> <chance>0</chance> <bonus_chance_per_extra_target>0</bonus_chance_per_extra_target> <extra_target_maximum_distance>0</extra_target_maximum_distance> <extra_target_measured_from_attacker>false</extra_target_measured_from_attacker> <minimum_range>0</minimum_range> <maximum_range>0</maximum_range> <minimum_health_percent>0</minimum_health_percent> <maximum_health_percent>100</maximum_health_percent> <minimum_players>1</minimum_players> <maximum_players>4</maximum_players> <cooldown_start_available>true</cooldown_start_available> <cooldown_refresh_time>0</cooldown_refresh_time> <cooldown_expire_time>0</cooldown_expire_time> </attack> <attack> <name>modok_playable_attack_L2</name> <chance>0</chance> <bonus_chance_per_extra_target>0</bonus_chance_per_extra_target> <extra_target_maximum_distance>0</extra_target_maximum_distance> <extra_target_measured_from_attacker>false</extra_target_measured_from_attacker> <minimum_range>0</minimum_range> <maximum_range>0</maximum_range> <minimum_health_percent>0</minimum_health_percent> <maximum_health_percent>100</maximum_health_percent> <minimum_players>1</minimum_players> <maximum_players>4</maximum_players> <cooldown_start_available>true</cooldown_start_available> <cooldown_refresh_time>0</cooldown_refresh_time> <cooldown_expire_time>0</cooldown_expire_time> </attack> <attack> <name>modok_playable_attack_L3</name> <chance>0</chance> <bonus_chance_per_extra_target>0</bonus_chance_per_extra_target> <extra_target_maximum_distance>0</extra_target_maximum_distance> <extra_target_measured_from_attacker>false</extra_target_measured_from_attacker> <minimum_range>0</minimum_range> <maximum_range>0</maximum_range> <minimum_health_percent>0</minimum_health_percent> <maximum_health_percent>100</maximum_health_percent> <minimum_players>1</minimum_players> <maximum_players>4</maximum_players> <cooldown_start_available>true</cooldown_start_available> <cooldown_refresh_time>0</cooldown_refresh_time> <cooldown_expire_time>0</cooldown_expire_time> </attack> <attack> <name>modok_playable_attack_L4</name> <chance>0</chance> <bonus_chance_per_extra_target>0</bonus_chance_per_extra_target> <extra_target_maximum_distance>0</extra_target_maximum_distance> <extra_target_measured_from_attacker>false</extra_target_measured_from_attacker> <minimum_range>0</minimum_range> <maximum_range>0</maximum_range> <minimum_health_percent>0</minimum_health_percent> <maximum_health_percent>100</maximum_health_percent> <minimum_players>1</minimum_players> <maximum_players>4</maximum_players> <cooldown_start_available>true</cooldown_start_available> <cooldown_refresh_time>0</cooldown_refresh_time> <cooldown_expire_time>0</cooldown_expire_time> </attack> <attack> <name>modok_playable_attack_L5</name> <chance>0</chance> <bonus_chance_per_extra_target>0</bonus_chance_per_extra_target> <extra_target_maximum_distance>0</extra_target_maximum_distance> <extra_target_measured_from_attacker>false</extra_target_measured_from_attacker> <minimum_range>0</minimum_range> <maximum_range>0</maximum_range> <minimum_health_percent>0</minimum_health_percent> <maximum_health_percent>100</maximum_health_percent> <minimum_players>1</minimum_players> <maximum_players>4</maximum_players> <cooldown_start_available>true</cooldown_start_available> <cooldown_refresh_time>0</cooldown_refresh_time> <cooldown_expire_time>0</cooldown_expire_time> </attack> <secondary_attack> <rank> <number>0</number> <name>modok_playable_attack_R1</name> <display_name>modok_playable_attack_R1</display_name> </rank> <rank> <number>1</number> <name>modok_playable_attack_R1_Tier2</name> <display_name>modok_playable_attack_R1_Tier2</display_name> </rank> <rank> <number>2</number> <name>modok_playable_attack_R1_Tier3</name> <display_name>modok_playable_attack_R1_Tier3</display_name> </rank> </secondary_attack> <secondary_attack> <rank> <number>0</number> <name>modok_playable_attack_R2</name> <display_name>modok_playable_attack_R2</display_name> </rank> <rank> <number>1</number> <name>modok_playable_attack_R2_Tier2</name> <display_name>modok_playable_attack_R2_Tier2</display_name> </rank> <rank> <number>2</number> <name>modok_playable_attack_R2_Tier3</name> <display_name>modok_playable_attack_R2_Tier3</display_name> </rank> </secondary_attack> <secondary_attack> <rank> <number>0</number> <name>modok_playable_attack_R3</name> <display_name>modok_playable_attack_R3</display_name> </rank> <rank> <number>1</number> <name>modok_playable_attack_R3_Tier2</name> <display_name>modok_playable_attack_R3_Tier2</display_name> </rank> <rank> <number>2</number> <name>modok_playable_attack_R3_Tier3</name> <display_name>modok_playable_attack_R3_Tier3</display_name> </rank> </secondary_attack> <target_bone>Pelvis</target_bone> </combat_controller> </player_combat_controller> <attack_data> <attack> <attack_name>modok_playable_attack_L1</attack_name> <behavior>BehaviorAttackBase</behavior> <anim>attack_L1</anim> <summons /> <desired_range>5</desired_range> <maximum_range>9</maximum_range> <interruptible_by>4</interruptible_by> <effect>L1 head beam</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>0</power_cost> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>1.5</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L1 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>1</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L1</Tool_damage_table_setting> <damage>7.38</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>false</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>0.5</collider_scale> <pushback_from_collider>true</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_L2</attack_name> <behavior>BehaviorAttackBase</behavior> <anim>attack_L2</anim> <summons /> <desired_range>6</desired_range> <maximum_range>50</maximum_range> <interruptible_by>4</interruptible_by> <effect>L2 head beam</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>0</power_cost> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>1.5</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L2 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L2</Tool_damage_table_setting> <damage>14.4000006</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L2 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L2</Tool_damage_table_setting> <damage>14.4000006</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L2 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L2</Tool_damage_table_setting> <damage>14.4000006</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_L3</attack_name> <behavior>BehaviorAttackBase</behavior> <anim>attack_L3</anim> <summons /> <desired_range>4</desired_range> <maximum_range>15</maximum_range> <interruptible_by>4</interruptible_by> <effect>L3 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>0</power_cost> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L3</Tool_damage_table_setting> <damage>18.7200012</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>5</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>3</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>4</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_L4</attack_name> <behavior>BehaviorAttackBase</behavior> <anim>attack_L4</anim> <summons /> <desired_range>7</desired_range> <maximum_range>15</maximum_range> <interruptible_by>4</interruptible_by> <effect>L4 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>0</power_cost> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>1.5</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>1</impact_type> <collider>LeftHandCollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_L4</Tool_damage_table_setting> <damage>31.2480011</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>false</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>true</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>L4 bullet</projectile_name> <projectile_speed>20</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>3</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_L5</attack_name> <behavior>BehaviorAttackBase</behavior> <anim>attack_L5</anim> <summons /> <desired_range>1</desired_range> <maximum_range>15</maximum_range> <interruptible_by>4</interruptible_by> <effect>L5 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>0</power_cost> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>1.5</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>1</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Melee_L5</Tool_damage_table_setting> <damage>45</damage> <Tool_damage_scale>1.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>5</pushback_velocity> <recoil>5</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>10</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>2.5</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>2</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R1</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R1</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>R1 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>20</power_cost> <Tools_powercost_table_value>R1_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>1</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R1</Tool_damage_table_setting> <damage>26.25</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.25</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>5</recoil> <knockdown_duration>1</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>10</launch_velocity> <collider_angle_limit>360</collider_angle_limit> <rotate_target_to_impact>false</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>4</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R2</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R2</anim> <summons /> <desired_range>0</desired_range> <maximum_range>20</maximum_range> <interruptible_by>4</interruptible_by> <effect>R2 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>40</power_cost> <Tools_powercost_table_value>R2_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>12</projectile_speed> <projectile_lifespan>5</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>false</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2</Tool_damage_table_setting> <damage>25.9199982</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R3</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R3</anim> <summons /> <desired_range>4</desired_range> <maximum_range>10</maximum_range> <interruptible_by>4</interruptible_by> <effect>R3 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>60</power_cost> <Tools_powercost_table_value>R3_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L1 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R3</Tool_damage_table_setting> <damage>9.3</damage> <Tool_damage_scale>0.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playble_attack_super</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_super</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>Super sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>100</power_cost> <Tools_powercost_table_value>Super</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Super1_Ranged_AOE</Tool_damage_table_setting> <damage>62.425</damage> <Tool_damage_scale>1.1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <target_combat_effect>MODOK_Confusion</target_combat_effect> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>1.2</impact_start_time> <impact_end_time>1.3</impact_end_time> <collider_scale>6</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R1_Tier2</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R1</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>R1 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>20</power_cost> <Tools_powercost_table_value>R1_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>1</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R1_Tier2</Tool_damage_table_setting> <damage>32.0833359</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.25</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>5</recoil> <knockdown_duration>1</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>10</launch_velocity> <collider_angle_limit>360</collider_angle_limit> <rotate_target_to_impact>false</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>4</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R2_Tier2</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R2</anim> <summons /> <desired_range>0</desired_range> <maximum_range>20</maximum_range> <interruptible_by>4</interruptible_by> <effect>R2 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>40</power_cost> <Tools_powercost_table_value>R2_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>12</projectile_speed> <projectile_lifespan>5</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>false</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier2</Tool_damage_table_setting> <damage>33.12</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R3_Tier2</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R3</anim> <summons /> <desired_range>4</desired_range> <maximum_range>10</maximum_range> <interruptible_by>4</interruptible_by> <effect>R3 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>60</power_cost> <Tools_powercost_table_value>R3_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L2 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R3_Tier2</Tool_damage_table_setting> <damage>10.333333</damage> <Tool_damage_scale>0.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playble_attack_super_Tier2</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_super</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>Super sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>100</power_cost> <Tools_powercost_table_value>Super</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Super2_Ranged_AOE</Tool_damage_table_setting> <damage>104.041672</damage> <Tool_damage_scale>1.1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <target_combat_effect>MODOK_Confusion</target_combat_effect> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>1.2</impact_start_time> <impact_end_time>1.3</impact_end_time> <collider_scale>6</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R1_Tier3</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R1</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>R1 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>20</power_cost> <Tools_powercost_table_value>R1_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>1</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R1_Tier3</Tool_damage_table_setting> <damage>43.75</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.25</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>5</recoil> <knockdown_duration>1</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>10</launch_velocity> <collider_angle_limit>360</collider_angle_limit> <rotate_target_to_impact>false</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>4</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R2_Tier3</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R2</anim> <summons /> <desired_range>0</desired_range> <maximum_range>20</maximum_range> <interruptible_by>4</interruptible_by> <effect>R2 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>40</power_cost> <Tools_powercost_table_value>R2_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>12</projectile_speed> <projectile_lifespan>5</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>false</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>RightHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <impact> <impact_type>1</impact_type> <collider>LeftHandMissile</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R2_Tier3</Tool_damage_table_setting> <damage>47.5199966</damage> <Tool_damage_scale>1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_name>R2 missile</projectile_name> <projectile_speed>15</projectile_speed> <projectile_lifespan>2</projectile_lifespan> <projectile_aimed>false</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playable_attack_R3_Tier3</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_R3</anim> <summons /> <desired_range>4</desired_range> <maximum_range>10</maximum_range> <interruptible_by>4</interruptible_by> <effect>R3 sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>60</power_cost> <Tools_powercost_table_value>R3_Range</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>2</impact_type> <collider>HeadLaser</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <effect>L2 beam</effect> <impact_effect>impact sequence</impact_effect> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Ranged_R3_Tier3</Tool_damage_table_setting> <damage>12.4</damage> <Tool_damage_scale>0.2</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>0</impact_start_time> <impact_end_time>0</impact_end_time> <collider_scale>1</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> <attack> <attack_name>modok_playble_attack_super_Tier3</attack_name> <behavior>BehaviorAttackSpecial</behavior> <anim>attack_super</anim> <summons /> <desired_range>0</desired_range> <maximum_range>1.5</maximum_range> <interruptible_by>4</interruptible_by> <effect>Super sequence</effect> <stop_effect_on_chain>false</stop_effect_on_chain> <power_cost>100</power_cost> <Tools_powercost_table_value>Super</Tools_powercost_table_value> <move_start_time>0</move_start_time> <move_arrive_time>0</move_arrive_time> <collision_off_time>-1</collision_off_time> <collision_on_time>-1</collision_on_time> <move_speed>0</move_speed> <chain_start_time>0</chain_start_time> <chain_end_time>0</chain_end_time> <chain_requires_impact>false</chain_requires_impact> <face_target>true</face_target> <track_target>true</track_target> <attack_duration>0</attack_duration> <forward_speed>0</forward_speed> <forward_on_hit>false</forward_on_hit> <environmental_attack>false</environmental_attack> <targetless_attack>false</targetless_attack> <ignore_height_difference>false</ignore_height_difference> <hide_on_teleport>false</hide_on_teleport> <has_shot_info_tag>false</has_shot_info_tag> <arc_multiplier>0</arc_multiplier> <total_targets>-1</total_targets> <attack_delay>0</attack_delay> <minimum_delay>0</minimum_delay> <pinball_pause>0</pinball_pause> <linear_pinball>false</linear_pinball> <pinball_turn_duration>0</pinball_turn_duration> <pinball_cannot_be_hit>false</pinball_cannot_be_hit> <always_render_max_beam>false</always_render_max_beam> <stop_on_enemy_collision>true</stop_on_enemy_collision> <impact> <impact_type>0</impact_type> <collider>AOECollider</collider> <collider_offset> <x>0</x> <y>0</y> <z>0</z> </collider_offset> <summons /> <hits_friends>false</hits_friends> <maximum_hits_per_target>0</maximum_hits_per_target> <maximum_targets_hit>1</maximum_targets_hit> <minimum_distance>0</minimum_distance> <Tool_damage_table_setting>DPS_Super3_Ranged_AOE</Tool_damage_table_setting> <damage>145.65834</damage> <Tool_damage_scale>1.1</Tool_damage_scale> <pushback_duration>0.5</pushback_duration> <pushback_velocity>2</pushback_velocity> <recoil>1</recoil> <knockdown_duration>0</knockdown_duration> <recoil_duration>1</recoil_duration> <launch_velocity>0</launch_velocity> <target_combat_effect>MODOK_Confusion</target_combat_effect> <collider_angle_limit>45</collider_angle_limit> <rotate_target_to_impact>true</rotate_target_to_impact> <show_collider>false</show_collider> <impact_start_time>1.2</impact_start_time> <impact_end_time>1.3</impact_end_time> <collider_scale>6</collider_scale> <pushback_from_collider>false</pushback_from_collider> <force_attach>false</force_attach> <firing_time>0</firing_time> <projectile_speed>0</projectile_speed> <projectile_lifespan>0</projectile_lifespan> <projectile_aimed>true</projectile_aimed> <projectile_rotate_to_velocity>true</projectile_rotate_to_velocity> <projectile_attached>false</projectile_attached> <projectile_gravity>0</projectile_gravity> <projectile_explosion_radius>0</projectile_explosion_radius> <projectile_destroy_on_impact>true</projectile_destroy_on_impact> <projectile_destroy_on_collision>true</projectile_destroy_on_collision> <projectile_impact_stick_time>0</projectile_impact_stick_time> <projectile_collision_stick_time>0</projectile_collision_stick_time> <projectile_environmental>false</projectile_environmental> <projectile_create_immediate>false</projectile_create_immediate> <projectile_additional_targets>0</projectile_additional_targets> <projectile_return_arc>0</projectile_return_arc> <projectile_ballistic>false</projectile_ballistic> <projectile_ballistic_lob>false</projectile_ballistic_lob> <projectile_scaled_to_owner>false</projectile_scaled_to_owner> <target_aim_offset>0</target_aim_offset> <hits_enemies>true</hits_enemies> <impact_matrix_type>0</impact_matrix_type> <impact_face_camera>true</impact_face_camera> <use_recoil_duration_on_attach>false</use_recoil_duration_on_attach> <attach_uses_rotation>false</attach_uses_rotation> <stun_anim_speed>-1</stun_anim_speed> </impact> <chance>0</chance> <allow_lateral_translation>false</allow_lateral_translation> </attack> </attack_data> <components /> <offset_data> <default_offset>2.6</default_offset> </offset_data> </character>" string m_PathName = ""

There are also placeholder stats for several playable characters, including placeholder stats for... Mole-Man, who never became playable, though he did become a boss... and a Mindless One (Stomper), which are minions; Minions were never playable in any capacity, ever.

Amadeus Cho's code, which is empty placeholder stats. These are also the stats for Yin, Yang, Mr. Placeholder, Mole-Man(Playable), Mindless One (Stomper)(Playable) and Whiplash(Playable):

<character_stats>
   <stat>
     <stat_type>Health</stat_type>
     <stat_change_pusle_rate>0</stat_change_pusle_rate>
     <stat_change_amount>0</stat_change_amount>
     <initial_value>200</initial_value>
     <Tool_initial_value_table_setting>Player_Health</Tool_initial_value_table_setting>
     <initial_maximum>200</initial_maximum>
     <Tool_initial_maximum_table_setting>Player_Health</Tool_initial_maximum_table_setting>
   </stat>
   <stat>
     <stat_type>Power</stat_type>
     <stat_change_pusle_rate>0</stat_change_pusle_rate>
     <stat_change_amount>0</stat_change_amount>
     <initial_value>0</initial_value>
     <initial_maximum>100</initial_maximum>
   </stat>
 </character_stats>
 <name>amadeus_cho</name>
 <asset_bundle>Characters/amadeus_cho_01</asset_bundle>
 <behavior_manager>
   <default_behavior_type>BehaviorBase</default_behavior_type>
 </behavior_manager>
 <click_box>
   <height>0</height>
   <radius>0</radius>
     <x>0</x>
     <y>0</y>
     <z>0</z>
 </click_box>
 <character_controller>
   <height>2</height>
   <radius>0.5</radius>
   <slope_limit>50</slope_limit>
   <step_offset>0.3</step_offset>
     <x>0</x>
     <y>1.1</y>
     <z>0</z>
   <pickup_bone>fx_Rpalm</pickup_bone>
 </character_controller>
 <effect_sequence_list>
   <character_fx>FX/amadeus_cho_fx</character_fx>
   <shared_fx>FX/character_shared_fx</shared_fx>
   <logical_effect>
     <name>Power Emote 1</name>
     <prefab_name>Power Emote 1</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Power Emote 2</name>
     <prefab_name>Power Emote 2</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Power Emote 3</name>
     <prefab_name>Power Emote 3</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Transport</name>
     <prefab_name>transport</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Splash</name>
     <prefab_name>Splash sequence</prefab_name>
   </logical_effect>
 </effect_sequence_list>
 <character_model>
   <model_name>amadeus_cho_01_prefab</model_name>
   <size_rank>0</size_rank>
   <collider>
     <name>RightHandCollider</name>
     <collider_prefab>_AttackCollider</collider_prefab>
     <node>fx_Rpalm</node>
     <offset>
       <x>0</x>
       <y>0</y>
       <z>0</z>
     </offset>
     <scale>1</scale>
   </collider>
   <collider>
     <name>LeftHandCollider</name>
     <collider_prefab>_AttackCollider</collider_prefab>
     <node>fx_Lpalm</node>
     <offset>
       <x>0</x>
       <y>0</y>
       <z>0</z>
     </offset>
     <scale>1</scale>
   </collider>
   <collider>
     <name>AOECollider</name>
     <collider_prefab>_AttackCollider</collider_prefab>
     <node>RLegDigit11</node>
     <offset>
       <x>0</x>
       <y>0</y>
       <z>0</z>
     </offset>
     <scale>1</scale>
   </collider>
 </character_model>
 <character_motion_controller>
   <landing_effect_name>landing</landing_effect_name>
   <speed>6</speed>
   <run_animation_speed>1</run_animation_speed>
   <deceleration_distance>0.4</deceleration_distance>
   <gravity>20</gravity>
   <jump_height>10</jump_height>
   <gw_jump_height>10</gw_jump_height>
   <jump_timeout>0.15</jump_timeout>
   <second_jump_height>12</second_jump_height>
   <double_jump>false</double_jump>
   <hold_jump>false</hold_jump>
   <rotate_speed>500</rotate_speed>
   <fall_tolerance>0.5</fall_tolerance>
   <pickup_strength>4</pickup_strength>
   <can_swing>false</can_swing>
 </character_motion_controller>
 <lod>
   <enabled>true</enabled>
   <animate_offscreen>false</animate_offscreen>
 </lod>
 <scoring>
   <defeat>0</defeat>
 </scoring>
 <player_combat_controller>
   <health_increase_1>50</health_increase_1>
   <health_increase_2>50</health_increase_2>
   <health_increase_3>0</health_increase_3>
   <power_damage_received_multiplier>0.5</power_damage_received_multiplier>
   <power_damage_dealt_multiplier>0.5</power_damage_dealt_multiplier>
   <combat_controller>
     <faction>Player</faction>
     <ignore_height>false</ignore_height>
     <show_attack_chain_numbers>false</show_attack_chain_numbers>
     <show_attack_colliders>false</show_attack_colliders>
     <recoil_resistance>0</recoil_resistance>
     <pushback_resistance>0</pushback_resistance>
     <launch_resistance>0</launch_resistance>
     <knockdown_effect>knockdown</knockdown_effect>
     <launch_land_effect>launch_land_sequence</launch_land_effect>
     <despawn_effect>despawn_sequence</despawn_effect>
     <death_effect>death_effect_sequence</death_effect>
     <stun_effect>stun1</stun_effect>
     <recoil_small_interruptible_by>2</recoil_small_interruptible_by>
     <recoil_large_interruptible_by>4</recoil_large_interruptible_by>
     <recoil_getup_interruptible_by>4</recoil_getup_interruptible_by>
     <recoil_knockdown_interruptible_by>10</recoil_knockdown_interruptible_by>
     <recoil_launch_interruptible_by>10</recoil_launch_interruptible_by>
     <recoil_dance_interruptible_by>1</recoil_dance_interruptible_by>
     <recoil_stun_interruptible_by>10</recoil_stun_interruptible_by>
     <recoil_limit>0</recoil_limit>
     <impact_matrix_type>0</impact_matrix_type>
     <target_bone>Pelvis</target_bone>
   </combat_controller>
 </player_combat_controller>
 <attack_data />
 <offset_data>
   <default_offset>2.01</default_offset>
   <animation_offset_data>
     <animation_offset>
       <name>jump_up</name>
       <offset>2.50</offset>
       <mode>normal</mode>
     </animation_offset>
     <animation_offset>
       <name>jump_run_up</name>
       <offset>2.50</offset>
       <mode>normal</mode>
     </animation_offset>
   </animation_offset_data>
 </offset_data>
</character>"

Whiplash Unused Boss Data

Leftover data exists for a unused Boss in Whiplash.

Whiplash Boss Code:

 <character_stats>
   <stat>
     <stat_type>Health</stat_type>
     <stat_change_pusle_rate>5</stat_change_pusle_rate>
     <stat_change_amount>20</stat_change_amount>
     <initial_value>200</initial_value>
     <initial_maximum>200</initial_maximum>
   </stat>
   <stat>
     <stat_type>Power</stat_type>
     <stat_change_pusle_rate>0</stat_change_pusle_rate>
     <stat_change_amount>0</stat_change_amount>
     <initial_value>0</initial_value>
     <initial_maximum>100</initial_maximum>
   </stat>
 </character_stats>
 <name>whiplash_boss</name>
 <asset_bundle>Characters/whiplash_01</asset_bundle>
 <behavior_manager>
   <default_behavior_type>BehaviorBase</default_behavior_type>
 </behavior_manager>
 <click_box>
   <height>0</height>
   <radius>0</radius>
     <x>0</x>
     <y>0</y>
     <z>0</z>
 </click_box>
 <character_controller>
   <height>2</height>
   <radius>0.5</radius>
   <slope_limit>50</slope_limit>
   <step_offset>0.3</step_offset>
     <x>0</x>
     <y>1.1</y>
     <z>0</z>
   <pickup_bone>fx_Rpalm</pickup_bone>
 </character_controller>
 <effect_sequence_list>
   <character_fx>FX/whiplash_fx</character_fx>
   <shared_fx>FX/character_shared_fx</shared_fx>
   <logical_effect>
     <name>Power Emote 1</name>
     <prefab_name>Power Emote 1</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Power Emote 2</name>
     <prefab_name>Power Emote 2</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Power Emote 3</name>
     <prefab_name>Power Emote 3</prefab_name>
   </logical_effect>
   <logical_effect>
     <name>Transport</name>
     <prefab_name>transport</prefab_name>
   </logical_effect>
 </effect_sequence_list>
 <character_model>
   <model_name>whiplash_01_prefab</model_name>
   <size_rank>0</size_rank>
 </character_model>
 <character_motion_controller>
   <landing_effect_name>landing</landing_effect_name>
   <speed>6</speed>
   <run_animation_speed>1</run_animation_speed>
   <deceleration_distance>0.4</deceleration_distance>
   <gravity>20</gravity>
   <jump_height>10</jump_height>
   <gw_jump_height>10</gw_jump_height>
   <jump_timeout>0.15</jump_timeout>
   <second_jump_height>12</second_jump_height>
   <double_jump>false</double_jump>
   <hold_jump>false</hold_jump>
   <rotate_speed>500</rotate_speed>
   <fall_tolerance>0.5</fall_tolerance>
   <pickup_strength>4</pickup_strength>
   <can_swing>false</can_swing>
 </character_motion_controller>
 <lod>
   <enabled>true</enabled>
   <animate_offscreen>false</animate_offscreen>
 </lod>
 <scoring>
   <defeat>0</defeat>
 </scoring>
 <player_combat_controller>
   <health_increase_1>50</health_increase_1>
   <health_increase_2>50</health_increase_2>
   <health_increase_3>0</health_increase_3>
   <power_damage_received_multiplier>0.5</power_damage_received_multiplier>
   <power_damage_dealt_multiplier>0.5</power_damage_dealt_multiplier>
   <combat_controller>
     <faction>Player</faction>
     <ignore_height>false</ignore_height>
     <show_attack_chain_numbers>false</show_attack_chain_numbers>
     <show_attack_colliders>false</show_attack_colliders>
     <recoil_resistance>0</recoil_resistance>
     <pushback_resistance>0</pushback_resistance>
     <launch_resistance>0</launch_resistance>
     <knockdown_effect>knockdown</knockdown_effect>
     <launch_land_effect>launch_land</launch_land_effect>
     <stun_effect>stun1</stun_effect>
     <recoil_small_interruptible_by>0</recoil_small_interruptible_by>
     <recoil_large_interruptible_by>0</recoil_large_interruptible_by>
     <recoil_getup_interruptible_by>0</recoil_getup_interruptible_by>
     <recoil_knockdown_interruptible_by>0</recoil_knockdown_interruptible_by>
     <recoil_launch_interruptible_by>0</recoil_launch_interruptible_by>
     <recoil_dance_interruptible_by>0</recoil_dance_interruptible_by>
     <recoil_stun_interruptible_by>0</recoil_stun_interruptible_by>
     <recoil_limit>0</recoil_limit>
     <impact_matrix_type>0</impact_matrix_type>
     <target_bone>Pelvis</target_bone>
   </combat_controller>
 </player_combat_controller>
 <attack_data />
 <offset_data>
   <default_offset>2.01</default_offset>
   <animation_offset_data>
     <animation_offset>
       <name>jump_up</name>
       <offset>2.50</offset>
       <mode>normal</mode>
     </animation_offset>
     <animation_offset>
       <name>jump_run_up</name>
       <offset>2.50</offset>
       <mode>normal</mode>
     </animation_offset>
   </animation_offset_data>
 </offset_data>
</character>"

Unused Code

Tokens

Tokens aren't a currency type in the final released game; there's only ever been Gold, Silver, Tickets and Fractals. Tokens did appear in a demo of the HUD menu, though.

AddTokensCmd:

public class AddTokensCmd : AutomationCmd { private int tokens;

private int servertokens;

public AddTokensCmd(string cmdline, int toc) : base(cmdline) { tokens = toc; AutomationManager.Instance.nOther++; }

public override bool execute() { try { AppShell.Instance.Profile.StartInventoryFetch(); AppShell.Instance.Profile.StartCurrencyFetch(); servertokens = AppShell.Instance.Profile.Gold; AppShell.Instance.EventReporter.ReportAwardTokens(tokens); } catch { AutomationManager.Instance.errOther++; base.ErrorCode = "E001"; base.ErrorMsg = "Failed to Add Tokens to the Profile"; } return base.execute(); }

public override bool isCompleted() { bool flag = base.isCompleted(); int num = tokens + servertokens; try { AppShell.Instance.Profile.StartInventoryFetch(); AppShell.Instance.Profile.StartCurrencyFetch(); } catch { AutomationManager.Instance.errOther++; base.ErrorCode = "C001"; base.ErrorMsg = "Error: Fatching Inventory or Currency from Server has failed"; } if (flag && num != AppShell.Instance.Profile.Gold) { AutomationManager.Instance.errOther++; flag = false; base.ErrorCode = "C001"; base.ErrorMsg = "Error: Tickets do not match the server ticket count"; } return flag; }

}

Andy's Code

Code made by Andy Megowan, who was one of the game's system engineers, according to the game's Credits.

AndyGameController:

using UnityEngine;

public class AndyGameController : GameController { private bool createdMissionBriefing;

public TextAsset missionFile;

public override void Start() { base.Start(); CspUtils.DebugLog("Start AndyController"); }

private void Update() { if (missionFile == null) { missionFile = new TextAsset(); missionFile.name = "m_0001_1_SampleMission"; } if (!createdMissionBriefing && GUIManager.Instance["SHSMainWindow/AndyLandWindow"] != null) { ((AndyLandWindow)GUIManager.Instance["SHSMainWindow/AndyLandWindow"]).LoadSampleMissionBriefing(missionFile.name); createdMissionBriefing = true; } }

public override void OnOldControllerUnloading(AppShell.GameControllerTypeData currentGameData, AppShell.GameControllerTypeData newGameData) { base.OnOldControllerUnloading(currentGameData, newGameData); UnregisterDebugKeys(); }

protected override void RegisterDebugKeys() { KeyCodeEntry keyCodeEntry = new KeyCodeEntry(KeyCode.R, false, false, false); debugKeys.Add(keyCodeEntry); SHSDebugInput.Inst.AddKeyListener(keyCodeEntry, ReloadWindow); base.RegisterDebugKeys(); }

private void ReloadWindow(SHSKeyCode code) { CspUtils.DebugLog("Reloading mission briefing from key press: " + code.ToString()); if (GUIManager.Instance["SHSMainWindow/AndyLandWindow"] != null) { AppShell.Instance.DataManager.ClearGameDataCache(); ((AndyLandWindow)GUIManager.Instance["SHSMainWindow/AndyLandWindow"]).LoadSampleMissionBriefing(missionFile.name); createdMissionBriefing = true; } } }

Some sort of controller?

AndyLandWindow:

public class AndyLandWindow : GUITopLevelWindow { public AndyLandWindow() : base("AndyLandWindow") { }

public void LoadSampleMissionBriefing(string missionId) { AppShell.Instance.DataManager.LoadGameData("Missions/" + missionId, OnMissionDefinitionLoaded, new MissionDefinition()); }

private void OnMissionDefinitionLoaded(GameDataLoadResponse response, object extraData) { CspUtils.DebugLog("Attemping to Parse new front page info!"); if (response.Error != null && response.Error != string.Empty) { CspUtils.DebugLog("The following error occurred while fetching game data for <" + response.Path + ">: " + response.Error); } else { CspUtils.DebugLog("Parsed front page info!"); } }

public override void ConfigureKeyBanks() { base.ConfigureKeyBanks(); }

public override void HandleResize(GUIResizeMessage message) { base.HandleResize(message); } }

Some sort of window? Is referenced in AndyLandController.

AndyTestScenarioEvent:

using System; using UnityEngine;

public class AndyTestScenarioEvent : ScenarioEventHandlerEnableBase { public delegate void LoggingFunction(object message);

public LoggingFunction DebugLog;

public void ExtraFunction(object message) { CspUtils.DebugLog("Extra function called"); }

public virtual void OnEnable() { DebugLog = CspUtils.DebugLog; DebugLog = (LoggingFunction)Delegate.Combine(DebugLog, new LoggingFunction(ExtraFunction)); }

protected override void OnEnableEvent(string eventName) { DebugLog("On enable event called for the test scenario event!"); }

protected override void OnDisableEvent(string eventName) { DebugLog("On disable event called for the test scenario event!"); } }

Something for testing scenario events?

Tim's Code

Code made by Tim Royal, who was another one of the game's system engineers, according to the game's Credits.

TimLandController:

public class TimLandController : GameController { private bool hackzoneloaded;

public override void Start() { base.Start(); }

private void Update() { if (!hackzoneloaded) { AppShell.Instance.EventMgr.Fire(this, new ZoneLoadedMessage("TimTown")); hackzoneloaded = true; } }

public override void OnOldControllerUnloading(AppShell.GameControllerTypeData currentGameData, AppShell.GameControllerTypeData newGameData) { base.OnOldControllerUnloading(currentGameData, newGameData); } }

Something about a hackzone and a Zone called TimTown?

TimLandMouseLook

using UnityEngine;

[AddComponentMenu("Camera-Control/Mouse Look")] public class TimLandMouseLook : MonoBehaviour, ICaptureHandler { public enum RotationAxes { MouseXAndY, MouseX, MouseY }

public RotationAxes axes;

public float sensitivityX = 15f;

public float sensitivityY = 15f;

public float minimumX = -360f;

public float maximumX = 360f;

public float minimumY = -60f;

public float maximumY = 60f;

private float rotationX;

private float rotationY;

private GameObject overTarget;

private GameObject selTarget;

private Quaternion originalRotation;

private ICaptureManager manager;

public ICaptureManager Manager { get { return manager; } set { manager = value; } }

private void SetTarget(GameObject target) { SetTarget(target, new Color(1f, 1f, 1f, 1f)); }

private void SetTarget(GameObject target, Color color) { CspUtils.DebugLog((!(target == null)) ? (" Now targeting " + target.name) : ("No longer targeting " + selTarget.name)); SkinnedMeshRenderer skinnedMeshRenderer = ((!(target == null)) ? target : selTarget).GetComponentInChildren(typeof(SkinnedMeshRenderer)) as SkinnedMeshRenderer; skinnedMeshRenderer.material.color = color; selTarget = target; }

private void Update() { if (!SHSInput.AllowInput(this)) { return; } Ray ray = Camera.main.ScreenPointToRay(SHSInput.mousePosition); int layerMask = 512; RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, float.PositiveInfinity, layerMask)) { if (overTarget != hitInfo.collider.gameObject) { CspUtils.DebugLog("Im now over " + overTarget); overTarget = hitInfo.collider.gameObject; } if (SHSInput.GetMouseButtonUp(SHSInput.MouseButtonType.Left) && selTarget != hitInfo.collider.gameObject) { if (selTarget != null) { SetTarget(null); } SetTarget(hitInfo.collider.gameObject, new Color(0f, 1f, 0f, 1f)); } } else { if (overTarget != null) { CspUtils.DebugLog("im NOT over " + overTarget.name); overTarget = null; } if (selTarget != null && SHSInput.GetMouseButtonUp(SHSInput.MouseButtonType.Left)) { SetTarget(null); } } if (axes == RotationAxes.MouseXAndY && SHSInput.GetMouseButton(SHSInput.MouseButtonType.Left)) { rotationX += Input.GetAxis("Mouse X") * sensitivityX; rotationY += Input.GetAxis("Mouse Y") * sensitivityY; rotationX = ClampAngle(rotationX, minimumX, maximumX); rotationY = ClampAngle(rotationY, minimumY, maximumY); Quaternion rhs = Quaternion.AngleAxis(rotationX, Vector3.up); Quaternion rhs2 = Quaternion.AngleAxis(rotationY, Vector3.left); base.transform.localRotation = originalRotation * rhs * rhs2; } else if (axes == RotationAxes.MouseX && Input.GetKey(KeyCode.Space)) { rotationX += Input.GetAxis("Mouse X") * sensitivityX; rotationX = ClampAngle(rotationX, minimumX, maximumX); Quaternion rhs3 = Quaternion.AngleAxis(rotationX, Vector3.up); base.transform.localRotation = originalRotation * rhs3; } else if (Input.GetKey(KeyCode.Space)) { rotationY += Input.GetAxis("Mouse Y") * sensitivityY; rotationY = ClampAngle(rotationY, minimumY, maximumY); Quaternion rhs4 = Quaternion.AngleAxis(rotationY, Vector3.left); base.transform.localRotation = originalRotation * rhs4; } }

private void Start() { if ((bool)base.rigidbody) { base.rigidbody.freezeRotation = true; } originalRotation = base.transform.localRotation; }

public static float ClampAngle(float angle, float min, float max) { if (angle < -360f) { angle += 360f; } if (angle > 360f) { angle -= 360f; } return Mathf.Clamp(angle, min, max); }

public CaptureHandlerResponse HandleCapture(SHSKeyCode code) { return CaptureHandlerResponse.Block; }

public virtual void OnCaptureAcquired() { }

public virtual void OnCaptureUnacquired() { } }

Something about TimLand and the mouse?

Athan's Code

Code by Athan Falangus, who also was one of the game's system engineers, according to the game's Credits.

AthanAnimationDisplay:

using UnityEngine;

public class AthanAnimationDisplay : MonoBehaviour { System.Security.Cryptography.MD5CryptoServiceProvider md = null; private class TestAnimatins : AnimClipBuilder { public static AnimPath Anim(AthanAnimationDisplay s) { return SHSAnimations.GenericPaths.LinearWithWiggle(0f, 10f, s.V(0), (float)(-Mathf.Abs(10)) * s.V(1), s.V(0) * s.V(2)); } }

public float step;

public float[] Values = new float[3] { 0.384f, 0.077f, 0.616f };

private float V(int i) { if (i < Values.Length) { return Values[i]; } return 1f; }

private void Update() { AnimClipBuilder.FullDebugPrint(TestAnimatins.Anim(this), step, new Vector3(0f, 0f, 0f), false); } }

Some code for... animation display or building?

AthanLand_Controller:

public class AthanLand_Controller : GameController { public override void Start() { base.Start(); }

private void Update() { } }

Seems to be dummied out.

Chad's Code

Made by Chad Barry. It's, quite obviously, a test shader.

ChadTest:

Shader "Chad/Chad Test" { Properties {

_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_LightMap ("Lightmap (RGB) AO (A)", 2D) = "black" {}

} SubShader {

Tags { "RenderType"="Opaque" }
Pass {
 Name "BASE"
 Tags { "LIGHTMODE"="Always" "RenderType"="Opaque" }

Program "vp" { SubProgram "opengl " { Bind "vertex" Vertex Bind "color" Color Bind "texcoord" TexCoord0 Bind "texcoord1" TexCoord1 Bind "tangent" ATTR14 Vector 5 [_MainTex_ST] Vector 6 [_LightMap_ST] "!!ARBvp1.0

  1. 8 ALU

PARAM c[7] = { { 0.1 }, state.matrix.mvp, program.local[5..6] }; MOV result.color, vertex.color; MAD result.texcoord[0].xy, vertex.texcoord[0], c[5], c[5].zwzw; MAD result.texcoord[1].xy, vertex.texcoord[1], c[6], c[6].zwzw; DP4 result.position.w, vertex.position, c[4]; DP4 result.position.z, vertex.position, c[3]; DP4 result.position.y, vertex.position, c[2]; DP4 result.position.x, vertex.position, c[1]; SGE result.texcoord[2].x, vertex.attrib[14], c[0]; END

  1. 8 instructions, 0 R-regs

" } SubProgram "d3d9 " { Bind "vertex" Vertex Bind "color" Color Bind "texcoord" TexCoord0 Bind "texcoord1" TexCoord1 Bind "tangent" TexCoord2 Matrix 0 [glstate_matrix_mvp] Vector 4 [_MainTex_ST] Vector 5 [_LightMap_ST] "vs_2_0

8 ALU

def c6, 0.10000000, 0, 0, 0 dcl_position0 v0 dcl_tangent0 v1 dcl_color0 v2 dcl_texcoord0 v3 dcl_texcoord1 v4 mov oD0, v2 mad oT0.xy, v3, c4, c4.zwzw mad oT1.xy, v4, c5, c5.zwzw dp4 oPos.w, v0, c3 dp4 oPos.z, v0, c2 dp4 oPos.y, v0, c1 dp4 oPos.x, v0, c0 sge oT2.x, v1, c6 " } } Program "fp" { SubProgram "opengl " { SetTexture 0 [_MainTex] 2D "!!ARBfp1.0 OPTION ARB_fog_exp2; OPTION ARB_precision_hint_fastest;

  1. 3 ALU, 1 TEX

TEMP R0; TEMP R1; TEX R0, fragment.texcoord[0], texture[0], 2D; ADD R1, fragment.color.primary, -R0; MAD result.color, fragment.texcoord[2].x, R1, R0; END

  1. 3 instructions, 2 R-regs

" } SubProgram "d3d9 " { SetTexture 0 [_MainTex] 2D "ps_2_0

3 ALU, 1 TEX

dcl_2d s0 dcl v0 dcl t0.xy dcl t2.x texld r0, t0, s0 add_pp r1, v0, -r0 mad_pp r0, t2.x, r1, r0 mov_pp oC0, r0 " } }

}

} Fallback Off }

Models

There are leftover models in the game's files.

Hulk

Hulk has a leftover model called "Big Guy" (of which five identical copies were found in the same file), likely from when the character meshes were being made. The early model lacks bones (causing it to be unplayable/unusable), lacks any textures that could be associated with it, and was oddly enough found in a Scenario file, which contains objects found in the hub world, instead of the expected Character files.

The changes between the models are small, with the most notable being the hair. Other changes are the feet details and the small tie on Hulk's pants on the Big Guy model.

Early Final
Big guy 89 SHSO.png SHSO Hulk Final.png

SHS Logotoken

Cafeteria

Ockbot Troublebot

ocktrouble_bot_mesh in the files. Was replaced by the final's troublebot, which comes right after it internally. Was used as a Troublebot during development, as evidenced by promotional screenshots, but went unused in final. The Ockbot also still has all of its animations, bones and anything it'd need to be functional.

Early Final
SHSO Ockbot.png Final Troublebot SHSO.png

Unused Audio

Tutorial

Hmmm...
To do:
Voice lines.

Unused voice lines for the previously-used tutorial still remain in game; some features mentioned here haven't been in use since 2014.

VO_Tutorial_00_Pick_Your_Hero_for_Squad

VO_Tutorial_01_How_to_Move

VO_Tutorial_02_How_to_Jump

VO_Tutorial_03_Troublebots

VO_Tutorial_04_PrizeWheel1

The Prize Wheel was removed in 2014.

VO_Tutorial_05_PrizeWheel2

The Prize Wheel was removed in 2014.

VO_Tutorial_06_PrizeWheel3

The Prize Wheel was removed in 2014.

VO_Tutorial_07_PrizeWheel4

The Prize Wheel was removed in 2014.

VO_Tutorial_08_PrizeWheel5

The Prize Wheel was removed in 2014.

VO_Tutorial_09_PrizeWheel6

The Prize Wheel was removed in 2014.

Unused Text

Early Tutorial Text

Early dialogue for the Tutorial. Notably has bad capitalization, a very casual way of writing, and lacks punctuation. Unlike most other strings, including the formerly used final game's Tutorial text, is not located in the strings file, but instead its own. Also, it'll make your armpits explode.

Early Tutorial dialogue:

<tutorials>

<tutorial name="master">

<step id="start">

<dialog>Welcome to Super Hero Squad! Did you know that we've got awesome stuff that will make your armpits explode? We do!</dialog>

<advanceEvent>TutorialDialogCloseButton</advanceEvent>

</step>

<step>

<dialog>click to move your hero around, eh?</dialog>

<advanceEvent>playerMove</advanceEvent>

</step>

<step>

<dialog>now jump using the spacebar</dialog>

<advanceEvent>jumpPressed</advanceEvent>

</step>

<step>

<dialog>ok let's get some bad guys</dialog>

<advanceEvent>TutorialDialogCloseButton</advanceEvent>

</step>

<step id="brawler1_load">

<load>tutorial_mission</load>

<advanceEvent>missionLoaded</advanceEvent>

</step>

<step id="brawler1_start">

<dialog>Welcome to your first mission! Click on an enemy to attack</dialog>

<advanceEvent>TutorialDialogCloseButton</advanceEvent>

</step>


</tutorial>



</tutorials>

Unused Text Strings

Unused text strings located in the "strings" file.

Text String ID Text Notes
#MIS_NAME_M_XXXX_DATABASETEST NameNameNameName Seems to be a placeholder string; fittingly, named "DATABASETEST", and has no mission number(XXXX instead of, for example, Symbi-Oh-No!'s 1019). First string in the Strings file, and seems unrelated to WIP Land (supposedly mission ID 9999).
#TIP_0_TIP This is a good tip Seems to be a placeholder for the text shown on the tips seen on loading screens. Obviously not a good tip.
#TT_SHOPPING_7 Coming Soon Comes right before the "Buy more Heroes" string.
#MYSTERYBOX_SUMMER_BOX_NAME Spectacular Summer Box
#MYSTERYBOX_SUMMER_BOX_DESC Missing some of the removed Heroes? Well, this box has them - and the Badge for Ends of the Earth Spider-Man! It’s available until August 31. It's been August 31 a few times now for a while. Also, Super Hero Squad Online shut down in January of 2017; not exactly a summer period.
#CQE_NAME_377 Asgard test quest Test quest.
#CQE_NAME_378 Fire test quest Test quest.
#CQE_NAME_379 Frost test quest Test quest.
#CQE_ST_377 Testing Asgard Description for Asgard test quest.
#CQE_ST_378 Testing Fire Description for Fire test quest.
#CQE_ST_379 Testing Frost Description for Frost test quest.
#CIN_THING_R1 r1 No other strings mention a R1 barring Thor, who's using them as move names? Use unknown, but based on R3, these are test strings.
#CIN_THING_R2 r2 No other strings mention a R2 barring Thor. Use unknown, but based on R3, these are test strings.
#CIN_THING_R3 test No other strings mention a R3 barring Thor. Very likely test string used during the game's development.
#CIN_DR_DOOM_PLAYABLE_GIANT_FMLY Giant Doombot Doombots were never playable, yet these strings suggest they are.
#CIN_DR_DOOM_PLAYABLE_GIANT_EXNM
#TESTTEST teststest Obvious test string.
#TEST_IAN ian Test string mentioning a Ian. Likely Ian Christensen(who was a gameplay engineer), as he's the only person named Ian in the game's credits.
#TESTSTRING4 Testy4 Test string. There seem to be no previous test strings.
#HQE_NAME_179868 TEST_ITEM HQ furniture test item name. Little known.
#HQE_DESC_179868 TEST_DESCRIPTION HQ furniture test item description. Little known.
#CARDGAME_NOT_AVAILABLE_TITLE Coming Soon These two features have since been released, so the "Coming Soon" is obviously not in use anymore.
#OPENCHAT_NOT_AVAILABLE_TITLE
#SUBSCRIPTION_SOON Membership is not yet available. S.H.I.E.L.D. Memberships were released, so this string is not in use anymore.
#SUB_UNAVAILABLE_TITLE Membership... S.H.I.E.L.D. Memberships were released, so this string is not in use anymore.
#SUB_UNAVAILABLE Sorry, Recruit! Our Membership system is not yet available. S.H.I.E.L.D. Memberships were released, so this string is not in use anymore.
#ZOMG_TEST wtffff Use unknown. Swearing!
#ZOMG2 wth? Use unknown. Slightly less severe swear word.
#TIP_119_TIP test A obvious test "tip". Just as unused as tip 0.
#GW_BRIEFING_FALLENASGARD Loki has used the Cosmic Cube to take over Asgard! Now he's hiding somewhere in this area and we can't get to him. The Avengers and the Super Hero Squad need to work together to find a way into Loki's castle. Good luck, hero! Would have been used during "Fallen" events if entering the hub world, said by Avengers Nick Fury.
#GW_BRIEFING_FALLENBAXTER Baxter Plaza has fallen! We've got to do something to stop Loki and his new toy, the Cosmic Cube. Go to the Casket of Ancient Winters and use its power to find a way to fight back against the Master of Mischief! Would have been used during "Fallen" events if entering the Baxter Plaza hub world, said by Avengers Nick Fury.
#GW_BRIEFING_FALLENBUGLE This is it, heroes. Loki has taken over Asgard and blown up Baxter Plaza. But this might be the worst of all - the Daily Bugle has fallen! Assemble your squad, help the citizens of Super Hero City, and never give up the fight! Would have been used during "Fallen" events if entering the Daily Bugle hub world, said by Avengers Nick Fury.
#MIS_X_1002_BAXTERMINIMISSION_DESC Baxter Plaza has fallen, but now's your chance to get some payback against Loki! Watch out for frost giants and fight your way to the Master of Mischief! The Baxter Plaza Has Fallen! mission was only available during the Fallen events.
#MIS_X_1002_BAXTERMINIMISSION_NAME Baxter Plaza Has Fallen! The Baxter Plaza Has Fallen! mission was only available during the Fallen events. Notably, labeled as Mission 1002.
#MIS_X_1002_BAXTERMINIMISSION_S1_ORDERS Fight your way through Baxter Plaza to reach Loki and teach him not to mess with Super Hero City! The Baxter Plaza Has Fallen! mission was only available during the Fallen events.
#VO_CAPTAIN_AMERICA_AVENGERS_MISSIONBRIEFING_NE_1001_1_LOKI002 Loki is using power of the Cosmic Cube to wreak havoc on Earth. He may think he's got Super Hero City beat, but he didn't count on two things - the Avengers and the Super Hero Squad! Let's get him! The Baxter Plaza Has Fallen! mission was only available during the Fallen events.
#POTION_NAME_118158 test_timed_player_potion Seems to have been used for a test potion, and how long this potion would last on a player? The difference between this and the Hero potion is unknown.
#POTION_DESC_118158 testing, player potion lasting a duration of play time Seems to have been used for a test potion, and how long this potion would last on a player? The difference between this and the Hero potion is unknown.
#POTION_NAME_118158 test_timed_hero_potion Seems to have been used for a test potion, and how long this potion would last on a Hero.
#POTION_DESC_118158 testing, hero potion lasting a duration of play time Seems to have been used for a test potion, and how long this potion would last on a Hero.
#CARDGAME_NOT_AVAILABLE_TEXT Sorry! The Card Game is not currently available. The Card Game is released, so this string is not in use anymore.
#OPENCHAT_NOT_AVAILABLE_TEXT Sorry! Safe Chat is not currently available. Safe Chat is released, so this string is not in use anymore.
#CIN_YIN_FMLY Yin Yin's name. Both strings their text are identical.
#CIN_YIN_EXNM
#CIN_YANG_FMLY Yang Yang's name. Both strings their text are identical.
#CIN_YANG_EXNM
#MEDALLION_NAME_FAVHERO_PROFESSOR_X Favorite Hero: Professor X Professor X was never released as a Hero, causing this string to go unused.
#HQE_NAME_847 AAA 5m Test Object Name for a HQ test object.
#HQE_DESC_847 This object is for testing purposes. This is only a test. Object is 5m x 5m x 5m Description for said HQ test object.
#HQE_NAME_848 AAA 0.5m Test Object Name for a small HQ test object.
#HQE_DESC_848 This object is for testing purposes. This is only a test. Object is 0.5m x 0.5m x 0.5m Description for said small HQ test object.
#HQE_NAME_4318 Import_Item_Test The name of a HQ test item that's... a import? The purpose of said item test is, so far, not known.
#HQE_DESC_4318 Item_Description A placeholder item description for the Import item.
#HQE_NAME_-1 Psylocke Paint Used variant is NAME 2540(Psylocke's Paint). Notably uses a negative number, instead of a positive number.
#HQE_DESC_-1 Item_Description Notably uses a negative number, instead of a positive number. Notably far away from its NAME in the strings file. Used for a early version of Psylocke's Paint.
#M_9999_1_WIPLAND001_NAME WORK IN PROGRESS LAND Mission name for mission 9999/WIPLAND.
#M_9999_1_WIPLAND001_DESC Behold the glory of upcoming enemies, gimmicks, and environments! Mission description for WORK IN PROGRESS LAND.
#M_9999_1_WIPLAND001_S1_ORDERS Look at all this new stuff! No character is appointed to say this. This message would probably appear if you entered WORK IN PROGRESS LAND.

Unused Mission Newspapers

Unused "newspapers" for missions exist. Newspapers were essentially just covers for missions.

Graphics

There are leftover graphics in the game's files.

Food Items

Zones

Characters

Status Effects

Currency

Hmmm...
To do:
  • Document the GUI icons for silver and tickets.

GUI

Player Frame

Also present in the files are the Player Frames that were used before they got updated when a new feature got added. The original from 2011; went unused upon the introduction of the Sidekick feature.

Original (Unused) Updated (Unused)
SHS Gameworld Hubframe.png Original Sidekick Frame SHS.png

Another Player Frame, used before they added the green level bar into the experience bar.

Updated (Unused) Updated (Used)
Original Sidekick Frame SHS.png Used sidekick frame SHS.png

Thought Bubbles

Tutorial

Believe it or not, there's a entire tutorial that was made in the very beginning of the game's lifetime... before the game released. It stuck around in the files for over 7 years. The health bar is wildly different compared to the one that was used, signaling that this screenshot and its predecessors are from a stage of development during or before 2010.

Internal Name

Internally, the game refers to itself as either MSHS or SHS.