mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 17:23:12 +02:00
Merge branch 'SpartaqS-AddingSoldiersToSquad' into Development
This commit is contained in:
commit
a0564ec377
8
theProject/Assets/Prefabs/Managers.meta
Normal file
8
theProject/Assets/Prefabs/Managers.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 06da55108ff6ac84984842ede70a6019
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
48
theProject/Assets/Prefabs/Managers/SquadManager.prefab
Normal file
48
theProject/Assets/Prefabs/Managers/SquadManager.prefab
Normal file
@ -0,0 +1,48 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1831389151964757021
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1831389151964757027}
|
||||
- component: {fileID: 1831389151964757020}
|
||||
m_Layer: 0
|
||||
m_Name: SquadManager
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1831389151964757027
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1831389151964757021}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 2.9636345, y: 6.377094, z: 3.499856}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1831389151964757020
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1831389151964757021}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3a470f948c2458f4994fe0cf5f226c52, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
squadPrefab: {fileID: 6141901885681798073, guid: e79038bbfa9535f45be1d0f0ae0626ce,
|
||||
type: 3}
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f72f88ef966ae34288fa03b7fff7884
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -78,22 +78,22 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: d34caf35d0ce610f8bc87cf815ba1915, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
myTeam: 0
|
||||
maxHealthPoints: 100
|
||||
healthPoints: 100
|
||||
rangeAttack: 3
|
||||
rangeView: 1
|
||||
damageAttack: 1
|
||||
speedAttack: 2
|
||||
lastAttackTick: -1
|
||||
nameText: {fileID: 6838251604148675782}
|
||||
healthPointsText: {fileID: 8012357605284019061}
|
||||
target: {fileID: 0}
|
||||
enemyType: 0
|
||||
ourType: 0
|
||||
movementDestination: {x: 0, y: 0}
|
||||
onDeath:
|
||||
OnDeath:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
rangeAttack: 3
|
||||
rangeView: 1
|
||||
damageAttack: 25
|
||||
speedAttack: 2
|
||||
lastAttackTick: -1
|
||||
target: {fileID: 0}
|
||||
enemyType: 0
|
||||
movementDestination: {x: 0, y: 0}
|
||||
--- !u!1 &1997457243244158843
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -358,12 +358,12 @@ MonoBehaviour:
|
||||
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_isUsingLegacyAnimationComponent: 0
|
||||
m_isVolumetricText: 0
|
||||
m_hasFontAssetChanged: 0
|
||||
m_renderer: {fileID: 1498494949006888735}
|
||||
m_maskType: 0
|
||||
_SortingLayer: 0
|
||||
_SortingLayerID: 0
|
||||
_SortingOrder: 0
|
||||
m_hasFontAssetChanged: 0
|
||||
m_renderer: {fileID: 1498494949006888735}
|
||||
m_maskType: 0
|
||||
--- !u!1 &2062275012809416088
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -530,9 +530,9 @@ MonoBehaviour:
|
||||
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_isUsingLegacyAnimationComponent: 0
|
||||
m_isVolumetricText: 0
|
||||
m_hasFontAssetChanged: 0
|
||||
m_renderer: {fileID: 4083783489867894370}
|
||||
m_maskType: 0
|
||||
_SortingLayer: 0
|
||||
_SortingLayerID: 0
|
||||
_SortingOrder: 0
|
||||
m_hasFontAssetChanged: 0
|
||||
m_renderer: {fileID: 4083783489867894370}
|
||||
m_maskType: 0
|
||||
|
||||
47
theProject/Assets/Prefabs/Squad.prefab
Normal file
47
theProject/Assets/Prefabs/Squad.prefab
Normal file
@ -0,0 +1,47 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &6141901885681798073
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6141901885681798079}
|
||||
- component: {fileID: 6141901885681798078}
|
||||
m_Layer: 0
|
||||
m_Name: Squad
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6141901885681798079
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6141901885681798073}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 4.4048395, y: -4.749419, z: 13.353434}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &6141901885681798078
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6141901885681798073}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: eeef7310a48872043b4089979ec88b42, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
soldiers: []
|
||||
7
theProject/Assets/Prefabs/Squad.prefab.meta
Normal file
7
theProject/Assets/Prefabs/Squad.prefab.meta
Normal file
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e79038bbfa9535f45be1d0f0ae0626ce
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8976c4733dc9814ca33c36b50beadf4
|
||||
guid: ab3f3b9b28d59aa48a9da7d926f1e0cd
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
@ -1,73 +0,0 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
public class Base : MonoBehaviour
|
||||
{
|
||||
public enum SoldierType
|
||||
{
|
||||
Ally,
|
||||
Enemy
|
||||
}
|
||||
[SerializeField] protected SoldierType ourType;
|
||||
[SerializeField] private float maxHealthPoints = 100;
|
||||
[SerializeField] private float healthPoints = 100;
|
||||
|
||||
[SerializeField] private TMP_Text nameText = null;
|
||||
[SerializeField] private TMP_Text healthPointsText = null;
|
||||
|
||||
public SoldierType TempGetOwnType()
|
||||
{
|
||||
return ourType;
|
||||
}
|
||||
|
||||
// Start is called before the first frame update
|
||||
protected void Start(){
|
||||
healthPoints = maxHealthPoints; // initialize health
|
||||
UpdateHPDisplay();
|
||||
|
||||
Debug.Log("Base: " + ourType.ToString() + " has appeared", gameObject);
|
||||
|
||||
switch (ourType)
|
||||
{
|
||||
case SoldierType.Ally:
|
||||
nameText.text = "Ally";
|
||||
nameText.color = Color.blue;
|
||||
break;
|
||||
case SoldierType.Enemy:
|
||||
nameText.text = "Enemy";
|
||||
nameText.color = Color.red;
|
||||
break;
|
||||
default:
|
||||
nameText.text = "how did we get here (forever)";
|
||||
nameText.color = new Color(255, 192, 203);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void setOwnTag(SoldierType type)
|
||||
{
|
||||
ourType = type;
|
||||
}
|
||||
|
||||
protected void OnDestroy()
|
||||
{
|
||||
Debug.Log("Soldier: " + ourType.ToString() + " has died", gameObject);
|
||||
}
|
||||
protected void ReduceHP(float damage)
|
||||
{
|
||||
healthPoints -= damage;
|
||||
|
||||
if (healthPoints <= 0)
|
||||
Destroy(gameObject);
|
||||
|
||||
UpdateHPDisplay();
|
||||
Debug.Log("I took damage, my HP is now: " + healthPoints + " noooo!!!!", gameObject);
|
||||
}
|
||||
|
||||
protected void UpdateHPDisplay()
|
||||
{
|
||||
healthPointsText.text = healthPoints.ToString() + "/" + maxHealthPoints.ToString();
|
||||
}
|
||||
}
|
||||
8
theProject/Assets/Scripts/Entities.meta
Normal file
8
theProject/Assets/Scripts/Entities.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2e5f405b6facc6e47a0297f2be93eae4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
9
theProject/Assets/Scripts/Entities/Base.cs
Normal file
9
theProject/Assets/Scripts/Entities/Base.cs
Normal file
@ -0,0 +1,9 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
public class Base : Entity
|
||||
{
|
||||
|
||||
}
|
||||
96
theProject/Assets/Scripts/Entities/Entity.cs
Normal file
96
theProject/Assets/Scripts/Entities/Entity.cs
Normal file
@ -0,0 +1,96 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
public class Entity : MonoBehaviour
|
||||
{
|
||||
public enum Team
|
||||
{
|
||||
Ally,
|
||||
Enemy
|
||||
}
|
||||
[Header("Values")]
|
||||
[SerializeField] protected Team myTeam;
|
||||
[SerializeField] protected float maxHealthPoints = 100;
|
||||
[SerializeField] protected float healthPoints = 100;
|
||||
|
||||
[SerializeField] protected TMP_Text nameText = null;
|
||||
[SerializeField] protected TMP_Text healthPointsText = null;
|
||||
|
||||
[HideInInspector] public UnityEvent<Entity> OnDeath = new UnityEvent<Entity>();
|
||||
|
||||
public Team GetOwnTeam()
|
||||
{
|
||||
return myTeam;
|
||||
}
|
||||
|
||||
// Start is called before the first frame update
|
||||
protected virtual void Start(){
|
||||
healthPoints = maxHealthPoints; // initialize health
|
||||
UpdateHPDisplay();
|
||||
|
||||
Debug.Log("Entity: " + myTeam.ToString() + " has appeared", gameObject);
|
||||
|
||||
switch (myTeam)
|
||||
{
|
||||
case Team.Ally:
|
||||
nameText.text = "Ally";
|
||||
nameText.color = Color.blue;
|
||||
break;
|
||||
case Team.Enemy:
|
||||
nameText.text = "Enemy";
|
||||
nameText.color = Color.red;
|
||||
break;
|
||||
default:
|
||||
nameText.text = "how did we get here (forever)";
|
||||
nameText.color = new Color(255, 192, 203);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void Awake()
|
||||
{
|
||||
TickSystem.OnTick += HandleTick;
|
||||
}
|
||||
|
||||
protected virtual void Die()
|
||||
{
|
||||
TickSystem.OnTick -= HandleTick;
|
||||
OnDeath.Invoke(this);
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
public void SetOwnTeam(Team type)
|
||||
{
|
||||
myTeam = type;
|
||||
}
|
||||
|
||||
public void ReduceHP(float damage)
|
||||
{
|
||||
healthPoints -= damage;
|
||||
|
||||
if (healthPoints <= 0)
|
||||
Die();
|
||||
|
||||
UpdateHPDisplay();
|
||||
Debug.Log("I took damage, my HP is now: " + healthPoints + " noooo!!!!", gameObject);
|
||||
}
|
||||
|
||||
protected virtual void HandleTick(TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
Debug.Log("Soldier: " + myTeam.ToString() + " has died", gameObject);
|
||||
}
|
||||
|
||||
|
||||
protected void UpdateHPDisplay()
|
||||
{
|
||||
healthPointsText.text = healthPoints.ToString() + "/" + maxHealthPoints.ToString();
|
||||
}
|
||||
}
|
||||
11
theProject/Assets/Scripts/Entities/Entity.cs.meta
Normal file
11
theProject/Assets/Scripts/Entities/Entity.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d77d5669fae0f57499970c2aed5af02b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -1,165 +1,148 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
public class Soldier : Base
|
||||
{
|
||||
private Queue<Action> actions = new Queue<Action>();
|
||||
private Queue<Action> interrupts = new Queue<Action>();
|
||||
#region Action Queue Items
|
||||
abstract class Action // action "template"
|
||||
{
|
||||
public virtual void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs) { } // called by Soldier when action is supposed to be done
|
||||
}
|
||||
|
||||
private class Movement : Action
|
||||
{
|
||||
public override void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
// move solider to previously set destination
|
||||
TilemapManager.MoveSoldierS(soldier.tileCoord.x, soldier.tileCoord.y, soldier.movementDestination.x, soldier.movementDestination.y);
|
||||
}
|
||||
}
|
||||
private class TryAttack : Action
|
||||
{
|
||||
public override void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
//Debug.LogWarning($"(tick: {tickEventArgs.tickNumber}) Looking for enemy in range");
|
||||
if(soldier.TryAttackEnemy())
|
||||
soldier.lastAttackTick = tickEventArgs.tickNumber;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Handling Incoming Orders (Interrupts)
|
||||
public void HandleMovementOrder(Vector2Int destination)
|
||||
{
|
||||
movementDestination = destination;
|
||||
interrupts.Enqueue(new Movement()); // force soldier to find path to the new destination
|
||||
}
|
||||
#endregion
|
||||
|
||||
[Header("Values")]
|
||||
[SerializeField] private float rangeAttack = 100;
|
||||
[SerializeField] private float rangeView = 1;
|
||||
[SerializeField] private float damageAttack = 1;
|
||||
[SerializeField] private int speedAttack = 1; // ticks between attacks
|
||||
[SerializeField] private int lastAttackTick = -1;
|
||||
[Header("References")]
|
||||
[Header("Do-not-change-in-game values")]
|
||||
[SerializeField] private Soldier target;
|
||||
[SerializeField] private SoldierType enemyType;
|
||||
[SerializeField] private SoldierType ourType;
|
||||
[SerializeField] private Vector2Int tileCoord = Vector2Int.zero;
|
||||
|
||||
[SerializeField] private Vector2Int movementDestination = Vector2Int.zero;
|
||||
|
||||
// variables not visible in inspector
|
||||
|
||||
[HideInInspector] public UnityEvent onDeath = new UnityEvent();
|
||||
|
||||
|
||||
void Start(){
|
||||
base.Start();
|
||||
setEnemyTag();
|
||||
}
|
||||
|
||||
public void SetTileCoords(Vector2Int tileCoordinates)
|
||||
{
|
||||
tileCoord = tileCoordinates;
|
||||
}
|
||||
|
||||
public void setEnemyTag()
|
||||
{
|
||||
if(ourType == SoldierType.Ally) enemyType = SoldierType.Enemy;
|
||||
else enemyType = SoldierType.Ally;
|
||||
}
|
||||
|
||||
void Awake()
|
||||
{
|
||||
TickSystem.OnTick += HandleTick;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
TickSystem.OnTick -= HandleTick;
|
||||
onDeath.Invoke();
|
||||
}
|
||||
|
||||
private void HandleTick(TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
ref Queue<Action> queueToHandle = ref interrupts;
|
||||
if (interrupts.Count < 1) // if no interrupt actions to do, handle regular queue
|
||||
queueToHandle = actions;
|
||||
|
||||
if(queueToHandle.Count > 0)
|
||||
queueToHandle.Dequeue().Execute(this, tickEventArgs);
|
||||
else
|
||||
{
|
||||
if(lastAttackTick + speedAttack <= tickEventArgs.tickNumber)
|
||||
{
|
||||
queueToHandle.Enqueue(new TryAttack());
|
||||
queueToHandle.Dequeue().Execute(this, tickEventArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TryAttackEnemy () //returns true if an enemy was attacked
|
||||
{
|
||||
// Enemies are the game objects tagged with the "Enemy"
|
||||
//GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyType);
|
||||
Soldier[] soldiers = GameObject.FindObjectsOfType<Soldier>();
|
||||
|
||||
List<Soldier> enemiesList = new List<Soldier>();
|
||||
|
||||
foreach (Soldier obj in soldiers)
|
||||
{
|
||||
if (obj.ourType == enemyType)
|
||||
enemiesList.Add(obj);
|
||||
}
|
||||
|
||||
Soldier[] enemies = enemiesList.ToArray();
|
||||
|
||||
// We have not found enemy yet so the distance to enemy is "infinite"
|
||||
float shortestDistance = Mathf.Infinity;
|
||||
Soldier nearestEnemy = null;
|
||||
foreach ( Soldier enemy in enemies)
|
||||
{
|
||||
// Go through each enemy existing
|
||||
// Calculate distance to this enemy
|
||||
float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
|
||||
if (distanceToEnemy < shortestDistance)
|
||||
{
|
||||
shortestDistance = distanceToEnemy;
|
||||
nearestEnemy = enemy;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearestEnemy != null && shortestDistance <= rangeAttack)
|
||||
{
|
||||
target = nearestEnemy;
|
||||
}
|
||||
else
|
||||
target = null;
|
||||
|
||||
if (target != null)
|
||||
target.ReduceHP(damageAttack);
|
||||
|
||||
return target != null;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
//if (target == null) return;
|
||||
}
|
||||
|
||||
/* https://www.youtube.com/watch?v=QKhn2kl9_8I 08:54 Soldier attack
|
||||
void OnDrawGizmosSelected ()
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
public class Soldier : Entity
|
||||
{
|
||||
private Queue<Action> actions = new Queue<Action>();
|
||||
private Queue<Action> interrupts = new Queue<Action>();
|
||||
#region Action Queue Items
|
||||
abstract class Action // action "template"
|
||||
{
|
||||
public virtual void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs) { } // called by Soldier when action is supposed to be done
|
||||
}
|
||||
|
||||
private class Movement : Action
|
||||
{
|
||||
public override void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{//TO DO: CALL PROPER FUNCTION TO MOVE
|
||||
throw new System.NotImplementedException($"(tick: {tickEventArgs.tickNumber}) Trying to teleport to {soldier.movementDestination}");
|
||||
//??tileMap.Teleport(movementDestination)
|
||||
}
|
||||
}
|
||||
private class TryAttack : Action
|
||||
{
|
||||
public override void Execute(Soldier soldier, TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
//Debug.LogWarning($"(tick: {tickEventArgs.tickNumber}) Looking for enemy in range");
|
||||
if(soldier.TryAttackEnemy())
|
||||
soldier.lastAttackTick = tickEventArgs.tickNumber;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Handling Incoming Orders (Interrupts)
|
||||
public void HandleMovementOrder(Vector2Int destination)
|
||||
{
|
||||
movementDestination = destination;
|
||||
interrupts.Enqueue(new Movement()); // force soldier to find path to the new destination
|
||||
}
|
||||
#endregion
|
||||
|
||||
[Header("Soldier Values")]
|
||||
[SerializeField] private float rangeAttack = 100;
|
||||
[SerializeField] private float rangeView = 1;
|
||||
[SerializeField] private float damageAttack = 1;
|
||||
[SerializeField] private int speedAttack = 1; // ticks between attacks
|
||||
[SerializeField] private int lastAttackTick = -1;
|
||||
[Header("References")]
|
||||
[Header("Do-not-change-in-game values")]
|
||||
[SerializeField] private Entity target;
|
||||
[SerializeField] private Team enemyType;
|
||||
|
||||
[SerializeField] private Vector2Int movementDestination = Vector2Int.zero;
|
||||
|
||||
// Start is called before the first frame update
|
||||
protected override void Start(){
|
||||
base.Start();
|
||||
SetEnemyTag();
|
||||
}
|
||||
|
||||
public void SetEnemyTag()
|
||||
{
|
||||
if(myTeam == Team.Ally) enemyType = Team.Enemy;
|
||||
else enemyType = Team.Ally;
|
||||
}
|
||||
|
||||
protected override void HandleTick(TickSystem.OnTickEventArgs tickEventArgs)
|
||||
{
|
||||
// base.HandleTick(tickEventArgs);
|
||||
|
||||
ref Queue<Action> queueToHandle = ref interrupts;
|
||||
if (interrupts.Count < 1) // if no interrupt actions to do, handle regular queue
|
||||
queueToHandle = actions;
|
||||
|
||||
if(queueToHandle.Count > 0)
|
||||
queueToHandle.Dequeue().Execute(this, tickEventArgs);
|
||||
else
|
||||
{
|
||||
if(lastAttackTick + speedAttack <= tickEventArgs.tickNumber)
|
||||
{
|
||||
queueToHandle.Enqueue(new TryAttack());
|
||||
queueToHandle.Dequeue().Execute(this, tickEventArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TryAttackEnemy () //returns true if an enemy was attacked
|
||||
{
|
||||
// Enemies are the game objects tagged with the "Enemy"
|
||||
//GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyType);
|
||||
Entity[] soldiers = GameObject.FindObjectsOfType<Entity>();
|
||||
|
||||
List<Entity> enemiesList = new List<Entity>();
|
||||
|
||||
foreach (Entity obj in soldiers)
|
||||
{
|
||||
if (obj.GetOwnTeam() == enemyType)
|
||||
enemiesList.Add(obj);
|
||||
}
|
||||
|
||||
Debug.Log(soldiers.Length);
|
||||
Debug.Log(enemiesList.Count);
|
||||
Entity[] enemies = enemiesList.ToArray();
|
||||
|
||||
// We have not found enemy yet so the distance to enemy is "infinite"
|
||||
float shortestDistance = Mathf.Infinity;
|
||||
Entity nearestEnemy = null;
|
||||
foreach (Entity enemy in enemies)
|
||||
{
|
||||
// Go through each enemy existing
|
||||
// Calculate distance to this enemy
|
||||
float distanceToEnemy = Vector3.Distance(transform.position,
|
||||
enemy.transform.position);
|
||||
if (distanceToEnemy < shortestDistance)
|
||||
{
|
||||
shortestDistance = distanceToEnemy;
|
||||
nearestEnemy = enemy;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearestEnemy != null && shortestDistance <= rangeAttack)
|
||||
{
|
||||
target = nearestEnemy;
|
||||
}
|
||||
else
|
||||
target = null;
|
||||
|
||||
if (target != null)
|
||||
target.ReduceHP(damageAttack);
|
||||
|
||||
return target != null;
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
//if (target == null) return;
|
||||
}
|
||||
|
||||
/* https://www.youtube.com/watch?v=QKhn2kl9_8I 08:54 Soldier attack
|
||||
void OnDrawGizmosSelected ()
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
38
theProject/Assets/Scripts/Managers/SquadManager.cs
Normal file
38
theProject/Assets/Scripts/Managers/SquadManager.cs
Normal file
@ -0,0 +1,38 @@
|
||||
// TEMP CODE JUST FOR SHOWCASE PURPOSES
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class SquadManager : MonoBehaviour
|
||||
{
|
||||
[SerializeField] GameObject squadPrefab;
|
||||
Squad playerSquad;
|
||||
Squad enemySquad;
|
||||
private void Awake()
|
||||
{
|
||||
playerSquad = Instantiate(squadPrefab).GetComponent<Squad>();
|
||||
playerSquad.gameObject.name = "Player Squad";
|
||||
playerSquad.transform.SetParent(transform);
|
||||
|
||||
enemySquad = Instantiate(squadPrefab).GetComponent<Squad>();
|
||||
enemySquad.gameObject.name = "Enemy Squad";
|
||||
enemySquad.transform.SetParent(transform);
|
||||
|
||||
}
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
Debug.Log("Added initial soldiers to squad");
|
||||
// add all ally soldiers to squad
|
||||
var soldiers = FindObjectsOfType<Soldier>();
|
||||
foreach(var soldier in soldiers)
|
||||
{
|
||||
if(soldier.GetOwnTeam() == Soldier.Team.Ally)
|
||||
{
|
||||
playerSquad.TempAddSoldierToSquad(soldier);
|
||||
}
|
||||
}
|
||||
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
@ -1,29 +0,0 @@
|
||||
// TEMP CODE JUST FOR SHOWCASE PURPOSES
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class TempSquadManager : MonoBehaviour
|
||||
{
|
||||
Squad playerSquad;
|
||||
private void Awake()
|
||||
{
|
||||
playerSquad = FindObjectOfType<Squad>();
|
||||
}
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
Debug.Log("Added initial soldeirs to squad");
|
||||
// add all ally soldiers to squad
|
||||
var soldiers = FindObjectsOfType<Soldier>();
|
||||
foreach(var soldier in soldiers)
|
||||
{
|
||||
if(soldier.TempGetOwnType() == Soldier.SoldierType.Ally)
|
||||
{
|
||||
playerSquad.TempAddSoldierToSquad(soldier);
|
||||
}
|
||||
}
|
||||
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
@ -14,7 +14,7 @@ public class TilemapManager : MonoBehaviour
|
||||
|
||||
public struct Tile
|
||||
{
|
||||
public Soldier standingSoldier;
|
||||
public Entity standingEntity;
|
||||
}
|
||||
|
||||
[Header("Common Values")]
|
||||
@ -101,19 +101,19 @@ public class TilemapManager : MonoBehaviour
|
||||
return false;
|
||||
|
||||
if (isBase)
|
||||
tiles[x, y].standingSoldier = Instantiate(basePrefab, tilemap.CellToWorld(new Vector3Int(x, y, 0)) + WORLD_SPACE_OFFSET, Quaternion.identity).GetComponent<Soldier>();
|
||||
tiles[x, y].standingEntity = Instantiate(basePrefab, tilemap.CellToWorld(new Vector3Int(x, y, 0)) + WORLD_SPACE_OFFSET, Quaternion.identity).GetComponent<Base>();
|
||||
else
|
||||
tiles[x, y].standingSoldier = Instantiate(soldierPrefab, tilemap.CellToWorld(new Vector3Int(x, y, 0)) + WORLD_SPACE_OFFSET, Quaternion.identity).GetComponent<Soldier>();
|
||||
tiles[x, y].standingEntity = Instantiate(soldierPrefab, tilemap.CellToWorld(new Vector3Int(x, y, 0)) + WORLD_SPACE_OFFSET, Quaternion.identity).GetComponent<Soldier>();
|
||||
|
||||
if (tiles[x, y].standingSoldier == null)
|
||||
return false;
|
||||
|
||||
if (isAlly)
|
||||
tiles[x, y].standingSoldier.setOwnTag(Soldier.SoldierType.Ally);
|
||||
tiles[x, y].standingEntity.SetOwnTeam(Base.Team.Ally);
|
||||
else
|
||||
tiles[x, y].standingSoldier.setOwnTag(Soldier.SoldierType.Enemy);
|
||||
tiles[x, y].standingEntity.SetOwnTeam(Base.Team.Enemy);
|
||||
|
||||
tiles[x, y].standingSoldier.SetTileCoords(new Vector2Int(x, y));
|
||||
tiles[x, y].standingEntity.SetTileCoords(new Vector2Int(x, y));
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -123,46 +123,32 @@ public class TilemapManager : MonoBehaviour
|
||||
if (GetTileState(x, y) != TileState.taken)
|
||||
return false;
|
||||
|
||||
Destroy(tiles[x, y].standingSoldier.gameObject);
|
||||
tiles[x, y].standingSoldier = null;
|
||||
Destroy(tiles[x, y].standingEntity.gameObject);
|
||||
tiles[x, y].standingEntity = null;
|
||||
Debug.Log("Despaned a soldier");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Soldier GetSoldier(int x, int y)
|
||||
public Entity GetSoldier(int x, int y)
|
||||
{
|
||||
if (GetTileState(x, y) != TileState.taken)
|
||||
return null;
|
||||
|
||||
return tiles[x,y].standingSoldier;
|
||||
return tiles[x,y].standingEntity;
|
||||
}
|
||||
|
||||
public Soldier[] GetAllSoldiers()
|
||||
{
|
||||
List<Soldier> list = new List<Soldier>();
|
||||
|
||||
foreach (Tile obj in tiles)
|
||||
{
|
||||
if (obj.standingSoldier != null)
|
||||
list.Add(obj.standingSoldier);
|
||||
}
|
||||
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
public bool MoveSoldier(int x1, int y1, int x2, int y2)
|
||||
public bool MoveEntity(int x1, int y1, int x2, int y2) // old MoveSoldier
|
||||
{
|
||||
if (GetTileState(x1, y1) == TileState.taken && GetTileState(x2, y2) == TileState.free)
|
||||
{
|
||||
// change proper values
|
||||
tiles[x2, y2].standingSoldier = tiles[x1, y1].standingSoldier;
|
||||
tiles[x1, y1].standingSoldier = null;
|
||||
tiles[x2, y2].standingSoldier.SetTileCoords(new Vector2Int(x2, y2));
|
||||
tiles[x2, y2].standingEntity = tiles[x1, y1].standingEntity;
|
||||
tiles[x1, y1].standingEntity = null;
|
||||
tiles[x2, y2].standingEntity.SetTileCoords(new Vector2Int(x2, y2));
|
||||
|
||||
// change Soldier world position
|
||||
tiles[x2, y2].standingSoldier.transform.position = tilemap.CellToWorld(new Vector3Int(x2, y2, 0));
|
||||
|
||||
tiles[x2, y2].standingEntity.transform.position = tilemap.CellToWorld(new Vector3Int(x2, y2, 0)) + WORLD_SPACE_OFFSET;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -183,7 +169,7 @@ public class TilemapManager : MonoBehaviour
|
||||
if (x < 0 || y < 0 || x >= mapSize.x || y >= mapSize.y)
|
||||
return TileState.outOfBounds;
|
||||
|
||||
if (tiles[x, y].standingSoldier == null)
|
||||
if (tiles[x, y].standingEntity == null)
|
||||
return TileState.free;
|
||||
|
||||
return TileState.taken;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user