private void WeaponLogic_Flipper(SocketLocation socket) { flipperCooldownTimers[(int)socket] -= Time.deltaTime; Weapon flipper = socketEquipment.GetWeaponInSocket(socket); if (flipper != null) { Transform flipperTransform = flipper.GetGameObject().transform; float distanceToPlayer = (this.transform.position - player.transform.position).magnitude; bool playerInRange = distanceToPlayer <= flipperActivationRadius; bool imUpsideDown = Vector3.Dot(this.transform.root.up, Vector3.up) < 0; bool correctState = botControl.state == FSMBotController.FSMState.ARRIVE; bool cooldownOkay = flipperCooldownTimers[(int)socket] <= 0.0f; if ((playerInRange || imUpsideDown) && correctState && cooldownOkay) { flipper.Use(); // The cooldown time should reflect the distance to the player: flipperCooldownTimers[(int)socket] = UnityEngine.Random.Range(flipperMinCooldownSeconds, flipperMaxCooldownSeconds); } } }
// Use this for initialization void Start() { switch(transform.parent.name) { case "LeftSocket": location = SocketLocation.LEFT; break; case "RightSocket": location = SocketLocation.RIGHT; break; case "BackSocket": location = SocketLocation.BACK; break; } }
private void DoLogicFor(SocketLocation socket, Equipment item) { switch(item) { case Equipment.Item_Flipper: WeaponLogic_Flipper(socket); break; case Equipment.Item_CircularSaw: WeaponLogic_Saw(socket); break; case Equipment.Item_Hammer: WeaponLogic_Hammer(socket); break; case Equipment.Item_PlasmaShield: WeaponLogic_PlasmaShield(socket); break; case Equipment.Item_Booster: if(socket == SocketLocation.BACK) WeaponLogic_RearBooster(socket); else WeaponLogic_LateralBooster(socket); break; } }
private void WeaponLogic_Saw(SocketLocation socket) { SawHoldTimers[(int)socket] += Time.deltaTime; Weapon saw = socketEquipment.GetWeaponInSocket(socket); if (saw != null) { Transform sawTransform = saw.GetGameObject().transform; float distanceToPlayer = (this.transform.position - player.transform.position).magnitude; bool playerInRange = distanceToPlayer <= flipperActivationRadius; bool correctState = botControl.state == FSMBotController.FSMState.ARRIVE; bool holdTimeOkay = SawHoldTimers[(int)socket] <= 3.0f; if (playerInRange && correctState) { saw.Use(); SawHoldTimers[(int)socket] = 0f; } if (!playerInRange || !correctState || !holdTimeOkay) { saw.EndUse(); } } }
private void WeaponLogic_RearBooster(SocketLocation socket) { boosterCooldown -= Time.deltaTime; Weapon booster = socketEquipment.GetWeaponInSocket(socket); if (booster != null) { Vector3 vectorToPlayer = player.transform.position - this.transform.position; float distanceToPlayer = (vectorToPlayer).magnitude; bool inRange = distanceToPlayer > 5.0f; //bool notStuck = thisBody.velocity.magnitude > 0.8f; bool correctState = (botControl.state == FSMBotController.FSMState.ARRIVE || botControl.state == FSMBotController.FSMState.ARRIVE_SIDE); bool goodAngle = Vector3.Dot(vectorToPlayer.normalized, thisBody.transform.forward) >= 0.8f; bool hasEnergy = energyControl.energy >= energyControl.maxEnergy * 0.4f; if (inRange && correctState && goodAngle && hasEnergy) booster.Use(); if (!inRange) booster.EndUse(); } }
private void WeaponLogic_PlasmaShield(SocketLocation socket) { plasmaCooldownTimer -= Time.deltaTime; Weapon shield = socketEquipment.GetWeaponInSocket(socket); if (shield != null) { Transform shieldTransform = shield.GetGameObject().transform; float distanceToPlayer = (this.transform.position - player.transform.position).magnitude; bool playerInRange = distanceToPlayer <= plasmaShieldActivationRadius; bool cooldownOkay = plasmaCooldownTimer <= 0.0f; bool hasEnergy = energyControl? (energyControl.energy > 8.0f) : false; if (playerInRange && cooldownOkay && hasEnergy) { shield.Use(); plasmaCooldownTimer = UnityEngine.Random.Range(plasmaCooldownMin, plasmaCooldownMax); } } }
private void WeaponLogic_LateralBooster(SocketLocation socket) { boosterCooldown -= Time.deltaTime; Weapon booster = socketEquipment.GetWeaponInSocket(socket); Vector3 toPlayer = (player.transform.position - this.transform.position); float distanceToPlayer = toPlayer.magnitude; float lateralDistance = this.transform.InverseTransformPoint(player.transform.position).x; // Do we want to boost to attack the player? bool boostTowardPlayer = (socket == SocketLocation.LEFT && lateralDistance > 4.0f) || (socket == SocketLocation.RIGHT && lateralDistance < -4.0f); boostTowardPlayer &= botControl.state == FSMBotController.FSMState.ARRIVE; // Do we want to boost to get un-stuck? bool isStuck = thisBody.velocity.magnitude < 0.1f; // Boost toward the player whenever possible, // or try to get un-stuck if ((boostTowardPlayer || isStuck) && boosterCooldown < 0.0f) { booster.Use(); boosterCooldown = UnityEngine.Random.Range(0.8f, 2.0f); } else booster.EndUse(); }
private void WeaponLogic_Hammer(SocketLocation socket) { hammerCooldownTimers[(int)socket] -= Time.deltaTime; Weapon hammer = socketEquipment.GetWeaponInSocket(socket); if (hammer != null) { Transform hammerTransform = hammer.GetGameObject().transform; float distanceToPlayer = (this.transform.position - player.transform.position).magnitude; bool playerInRange = distanceToPlayer <= flipperActivationRadius; bool correctState = botControl.state == FSMBotController.FSMState.ARRIVE; bool cooldownOkay = hammerCooldownTimers[(int)socket] <= 0.0f; if (playerInRange && correctState && cooldownOkay) { hammer.Use(); hammerCooldownTimers[(int)socket] = UnityEngine.Random.Range(flipperMinCooldownSeconds, flipperMaxCooldownSeconds); } } }
private void SpawnSpike(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: // Deactivate ball object foreach (Transform child in socket_left) { child.gameObject.SetActive(false); } brace_left.gameObject.SetActive(true); Transform spike_left = (Transform)Instantiate(prefab_spike, socket_left.position, Quaternion.identity); spike_left.Rotate(-90.0f, 180.0f, 90.0f, Space.World); spike_left.parent = socket_left; socket_left.transform.localPosition += new Vector3(0.0f, 0.99f, -0.055f); break; // Right Socket case SocketLocation.RIGHT: // Deactivate ball object foreach (Transform child in socket_right) { child.gameObject.SetActive(false); } brace_right.gameObject.SetActive(true); Transform spike_right = (Transform)Instantiate(prefab_spike, socket_right.position, Quaternion.identity); spike_right.Rotate(-90.0f, 0.0f, 90.0f, Space.World); spike_right.parent = socket_right; socket_right.transform.localPosition += new Vector3(0.0f, -0.99f, -0.055f); break; // Front Socket case SocketLocation.FRONT: // Deactivate ball object foreach (Transform child in socket_front) { child.gameObject.SetActive(false); } brace_front.gameObject.SetActive(true); Transform spike_front = (Transform)Instantiate(prefab_spike, socket_front.position, Quaternion.identity); spike_front.Rotate(-90.0f, 0.0f, 0.0f, Space.World); spike_front.parent = socket_front; socket_front.transform.localPosition += new Vector3(-1.015f, 0.0f, -0.13f); break; // Back Socket case SocketLocation.BACK: // Deactivate ball object foreach (Transform child in socket_back) { child.gameObject.SetActive(false); } if(brace_back != null) { brace_back.gameObject.SetActive(true); } Transform spike_back = (Transform)Instantiate(prefab_spike, socket_back.position, Quaternion.identity); spike_back.Rotate(-90.0f, 0.0f, 180.0f, Space.World); spike_back.parent = socket_back; socket_back.transform.localPosition += new Vector3(1.05f, 0.0f, -0.17f); break; // Top Socket case SocketLocation.TOP: Debug.Log("Spike in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
public bool SocketContainsAnyOf(SocketLocation socket, Equipment[] equipTypes) { foreach (Equipment e in equipTypes) if (GetEquipTypeInSocket(socket) == e) return true; return false; }
public Equipment GetEquipTypeInSocket(SocketLocation socket) { if (equipmentTypes == null) return Equipment.EMPTY; return equipmentTypes[(int)socket]; }
private void SpawnHandle(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: Debug.Log("Handle in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Right Socket case SocketLocation.RIGHT: Debug.Log("Handle in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Front Socket case SocketLocation.FRONT: Debug.Log("Handle in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Back Socket case SocketLocation.BACK: // Deactivate ball object foreach (Transform child in socket_back) { child.gameObject.SetActive(false); } Transform handle_back = (Transform)Instantiate(prefab_handle, socket_back.position, Quaternion.identity); handle_back.Rotate(-90.0f, 0.0f, 0.0f, Space.World); handle_back.parent = socket_back; socket_back.transform.localPosition += new Vector3(0.825f, 0.0f, 0.0f); break; // Top Socket case SocketLocation.TOP: Debug.Log("Handle in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
private void SpawnHammer(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: // Deactivate ball object foreach (Transform child in socket_left) { child.gameObject.SetActive(false); } brace_left.gameObject.SetActive(true); Transform hammer_left = (Transform)Instantiate(prefab_hammer, socket_left.position, Quaternion.identity); if (!inStore) hammer_left.GetComponentInChildren<hammerControls>().initialRot = new Vector3(0, -90, 0); hammer_left.Rotate(-90.0f, -90.0f, 0.0f, Space.World); hammer_left.parent = socket_left; socket_left.transform.localPosition += new Vector3(0.0f, 0.0f, 0.075f); AddWeaponReference(hammer_left, socket); break; // Right Socket case SocketLocation.RIGHT: // Deactivate ball object foreach (Transform child in socket_right) { child.gameObject.SetActive(false); } brace_right.gameObject.SetActive(true); Transform hammer_right = (Transform)Instantiate(prefab_hammer, socket_right.position, Quaternion.identity); if (!inStore) hammer_right.GetComponentInChildren<hammerControls>().initialRot = new Vector3(0, 90, 0); hammer_right.Rotate(-90.0f, 90.0f, 0.0f, Space.World); hammer_right.parent = socket_right; socket_right.transform.localPosition += new Vector3(0.0f, 0.0f, 0.075f); AddWeaponReference(hammer_right, socket); break; // Front Socket case SocketLocation.FRONT: // Deactivate ball object foreach (Transform child in socket_front) { child.gameObject.SetActive(false); } brace_front.gameObject.SetActive(true); Transform hammer_front = (Transform)Instantiate(prefab_hammer, socket_front.position, Quaternion.identity); if (!inStore) hammer_front.GetComponentInChildren<hammerControls>().initialRot = new Vector3(0, 180, 0); hammer_front.Rotate(-90.0f, 180.0f, 0.0f, Space.World); hammer_front.parent = socket_front; socket_front.transform.localPosition += new Vector3(0.025f, 0.0f, 0.0f); AddWeaponReference(hammer_front, socket); break; // Back Socket case SocketLocation.BACK: Debug.Log("Hammer in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Top Socket case SocketLocation.TOP: Debug.Log("Hammer in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
private void SpawnFlipper(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: // Deactivate ball object foreach (Transform child in socket_left) { child.gameObject.SetActive(false); } brace_left.gameObject.SetActive(true); Transform flipper_left = (Transform)Instantiate(prefab_flipper, socket_left.position, Quaternion.identity); temp = flipper_left.GetComponent<flipperControls>(); if (temp != null) temp.initialRot = new Vector3(0, 0, 0); flipper_left.Rotate(0.0f, 0.0f, 0.0f, Space.World); flipper_left.parent = socket_left; socket_left.transform.localPosition += new Vector3(0.0f, 0.122f, 0.2f); // Add a reference to the array of references AddWeaponReference(flipper_left, socket); break; // Right Socket case SocketLocation.RIGHT: // Deactivate ball object foreach (Transform child in socket_right) { child.gameObject.SetActive(false); } brace_right.gameObject.SetActive(true); Transform flipper_right = (Transform)Instantiate(prefab_flipper, socket_right.position, Quaternion.identity); temp = flipper_right.GetComponent<flipperControls>(); if (temp != null) temp.initialRot = new Vector3(0, 180, 0); flipper_right.Rotate(0.0f, 180.0f, 0.0f, Space.World); flipper_right.parent = socket_right; socket_right.transform.localPosition += new Vector3(0.0f, -0.122f, 0.2f); // Add a reference to the array of references AddWeaponReference(flipper_right, socket); break; // Front Socket case SocketLocation.FRONT: // Deactivate ball object foreach (Transform child in socket_front) { child.gameObject.SetActive(false); } brace_front.gameObject.SetActive(true); Transform flipper_front = (Transform)Instantiate(prefab_flipper, socket_front.position, Quaternion.identity); temp = flipper_front.GetComponent<flipperControls>(); if (temp != null) temp.initialRot = new Vector3(0, 270, 0); flipper_front.Rotate(180.0f, -90.0f, 180.0f, Space.World); flipper_front.parent = socket_front; socket_front.transform.localPosition += new Vector3(0.23f, 0.0f, 0.085f); // Add a reference to the array of references AddWeaponReference(flipper_front, socket); break; // Back Socket case SocketLocation.BACK: Debug.Log("Flipper in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Top Socket case SocketLocation.TOP: Debug.Log("Flipper in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
private void SpawnBooster(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: // Deactivate ball object foreach (Transform child in socket_left) { child.gameObject.SetActive(false); } brace_left.gameObject.SetActive(true); Transform booster_left = (Transform)Instantiate(prefab_booster, socket_left.position, Quaternion.identity); booster_left.Rotate(0.0f, 90.0f, 0.0f, Space.World); booster_left.parent = socket_left; socket_left.transform.localPosition += new Vector3(0.0f, -0.05f, 0.0f); AddWeaponReference(booster_left, socket); break; // Right Socket case SocketLocation.RIGHT: // Deactivate ball object foreach (Transform child in socket_right) { child.gameObject.SetActive(false); } brace_right.gameObject.SetActive(true); Transform booster_right = (Transform)Instantiate(prefab_booster, socket_right.position, Quaternion.identity); booster_right.Rotate(0.0f, -90.0f, 0.0f, Space.World); booster_right.parent = socket_right; socket_right.transform.localPosition += new Vector3(0.0f, 0.05f, 0.0f); AddWeaponReference(booster_right, socket); break; // Front Socket case SocketLocation.FRONT: Debug.Log("Booster in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Back Socket case SocketLocation.BACK: // Deactivate ball object foreach (Transform child in socket_back) { child.gameObject.SetActive(false); } if (brace_back != null) { brace_back.gameObject.SetActive(true); } Transform booster_back = (Transform)Instantiate(prefab_booster, socket_back.position, Quaternion.identity); booster_back.Rotate(0.0f, 0.0f, 0.0f, Space.World); booster_back.parent = socket_back; socket_back.transform.localPosition += new Vector3(0.075f, 0.0f, 0.05f); AddWeaponReference(booster_back, socket); break; // Top Socket case SocketLocation.TOP: Debug.Log("Booster in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
private void SpawnBasicEngine(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: Debug.Log("BasicEngine in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Right Socket case SocketLocation.RIGHT: Debug.Log("BasicEngine in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Front Socket case SocketLocation.FRONT: Debug.Log("BasicEngine in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Back Socket case SocketLocation.BACK: Debug.Log("BasicEngine in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Top Socket case SocketLocation.TOP: // Deactivate ball object foreach (Transform child in socket_top) { child.gameObject.SetActive(false); } Transform basicengine_front = (Transform)Instantiate(prefab_basicengine, socket_top.position, Quaternion.identity); basicengine_front.Rotate(0.0f, -90.0f, 0.0f, Space.World); basicengine_front.parent = socket_top; socket_top.transform.localPosition += new Vector3(0.0f, 0.12f, -0.295f); break; default: break; } }
private void AddWeaponReference(Transform itemTrans, SocketLocation socket) { if (!inStore) { Weapon weapon = itemTrans.GetComponent<Weapon>(); if (weapon == null) throw new System.Exception(itemTrans.name + " has no component that implements Weapon."); equipmentRefs[(int)socket] = weapon; } }
private void SpawnPlasmaShield(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: Debug.Log("PlasmaShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Right Socket case SocketLocation.RIGHT: Debug.Log("PlasmaShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Front Socket case SocketLocation.FRONT: Debug.Log("PlasmaShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Back Socket case SocketLocation.BACK: Debug.Log("PlasmaShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Top Socket case SocketLocation.TOP: // Deactivate ball object foreach (Transform child in socket_top) { child.gameObject.SetActive(false); } Transform plasmashield_top = (Transform)Instantiate(prefab_plasmashield, socket_top.position, Quaternion.identity); plasmashield_top.Rotate(0.0f, 0.0f, 0.0f, Space.World); plasmashield_top.parent = socket_top; socket_top.transform.localPosition += new Vector3(-0.3f, 1.45f, -0.925f); AddWeaponReference(plasmashield_top, socket); break; default: break; } }
private void SpawnMetalShield(SocketLocation socket) { switch (socket) { // Left Socket case SocketLocation.LEFT: // Deactivate ball object foreach (Transform child in socket_left) { child.gameObject.SetActive(false); } brace_left.gameObject.SetActive(true); Transform metalshield_left = (Transform)Instantiate(prefab_metalshield, socket_left.position, Quaternion.identity); metalshield_left.Rotate(0.0f, 0.0f, 0.0f, Space.World); metalshield_left.parent = socket_left; socket_left.transform.localPosition += new Vector3(0.01f, -0.2f, -0.1f); break; // Right Socket case SocketLocation.RIGHT: // Deactivate ball object foreach (Transform child in socket_right) { child.gameObject.SetActive(false); } brace_right.gameObject.SetActive(true); Transform metalshield_right = (Transform)Instantiate(prefab_metalshield, socket_right.position, Quaternion.identity); metalshield_right.Rotate(0.0f, 180.0f, 0.0f, Space.World); metalshield_right.parent = socket_right; socket_right.transform.localPosition += new Vector3(-0.01f, 0.2f, -0.1f); break; // Front Socket case SocketLocation.FRONT: // Deactivate ball object foreach (Transform child in socket_front) { child.gameObject.SetActive(false); } brace_front.gameObject.SetActive(true); Transform metalshield_front = (Transform)Instantiate(prefab_metalshield, socket_front.position, Quaternion.identity); metalshield_front.Rotate(180.0f, -90.0f, 180.0f, Space.World); metalshield_front.parent = socket_front; socket_front.transform.localPosition += new Vector3(0.3f, 0.0f, -0.1f); break; // Back Socket case SocketLocation.BACK: Debug.Log("MetalShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; // Top Socket case SocketLocation.TOP: Debug.Log("MetalShield in wrong position"); equipmentTypes[(int)socket] = Equipment.EMPTY; break; default: break; } }
public Weapon GetWeaponInSocket(SocketLocation socket) { return equipmentRefs[(int)socket]; }