public void TestCanAct() { Agent agent1 = new Hacker(); Agent agent2 = new Saboteur(); // They should not be able to act initially because they don't have targets Assert.False(agent1.CanAct); Assert.False(agent2.CanAct); // They should be able to act once they have targets agent1.Target = agent2; agent2.Target = agent1; Assert.True(agent1.CanAct); Assert.True(agent2.CanAct); // A blocked agent should't be able to act agent1.Block(agent2); Assert.IsFalse(agent1.CanAct); // A dead agent should't be able to act agent2.Execute(); Assert.IsFalse(agent2.CanAct); // If the blocker dies, the blocked agent should no longer be blocked Assert.IsTrue(agent1.CanAct); }
public void TestActIfAble() { Agent actor = new Assassin(); Agent target = new Drudge(); Agent blocker = new Saboteur(); // No target and IsActing is false => no action actor.ActIfAble(); Assert.IsFalse(target.WasAttacked); actor.Reset(); // IsActing is true but no target => no action actor.IsActing = true; Assert.Throws <NoTargetException>(() => actor.ActIfAble()); Assert.IsFalse(target.WasAttacked); actor.Reset(); // Has a target but IsActing is false => no action actor.Target = target; actor.ActIfAble(); Assert.IsFalse(target.WasAttacked); actor.Reset(); // Has a target and IsActing is true but blocked => no action actor.Target = target; actor.IsActing = true; actor.Block(blocker); actor.ActIfAble(); Assert.IsFalse(target.WasAttacked); actor.Reset(); // Has a target and IsActing is true, and not blocked => action actor.Target = target; actor.IsActing = true; actor.ActIfAble(); Assert.IsTrue(target.WasAttacked); actor.Reset(); target.Reset(); // Target is dead => no action actor.Target = target; actor.IsActing = true; actor.ActIfAble(); Assert.IsFalse(target.WasAttacked); actor.Reset(); target = new Drudge(); // Actor is dead => no action actor.Target = target; actor.IsActing = true; actor.Execute(); actor.ActIfAble(); Assert.IsFalse(target.WasAttacked); actor.Reset(); }
public void TestReset() { Agent agent = new Hacker(); Agent protector = new Medic(); Agent blocker = new Saboteur(); Agent framer = new Fabricator(); Agent killer = new Android(); string name = agent.Name; string codename = agent.Codename; Gender gender = agent.Gender; agent.Reset(); Assert.AreEqual(name, agent.Name); Assert.AreEqual(codename, agent.Codename); Assert.AreEqual(gender, agent.Gender); agent.Visit(protector); agent.Reset(); Assert.IsNotNull(agent.Visitors); Assert.AreEqual(0, agent.Visitors.Count); agent.Target = protector; agent.IsActing = true; agent.Reset(); Assert.IsNull(agent.Target); Assert.IsFalse(agent.IsActing); agent.Protect(protector); agent.Reset(); Assert.IsFalse(agent.IsProtected); Assert.IsNull(agent.Protector); agent.Block(blocker); agent.Reset(); Assert.IsFalse(agent.IsBlocked); Assert.IsNull(agent.Blocker); agent.Frame(framer); agent.Reset(); Assert.IsFalse(agent.WasFramed); agent.Attack(killer); agent.Reset(); Assert.IsFalse(agent.WasAttacked); Assert.IsFalse(agent.WasKilled); Assert.IsFalse(agent.IsActive); Assert.IsNotNull(agent.Killer); }
public void TestBlock() { Agent agent = new Hacker(); Agent blocker = new Saboteur(); agent.Block(blocker); Assert.IsTrue(agent.IsBlocked); Assert.IsNotNull(agent.Blocker); Assert.IsTrue(agent.Visitors.Contains(blocker.Codename)); Assert.IsFalse(agent.CanAct); // CanAct should still be false after a target is assigned agent.Target = blocker; Assert.IsFalse(agent.CanAct); }
public void TestVisit() { Agent agent = new Hacker(); Agent visitor1 = new Android(); Agent visitor2 = new Saboteur(); agent.Visit(visitor1); Assert.AreEqual(1, agent.Visitors.Count); Assert.IsTrue(agent.Visitors.Contains(visitor1.Codename)); agent.Visit(visitor2); Assert.AreEqual(2, agent.Visitors.Count); Assert.IsTrue(agent.Visitors.Contains(visitor1.Codename)); Assert.IsTrue(agent.Visitors.Contains(visitor2.Codename)); }
/* * =========================================================================================================== * UNITY'S STUFF * =========================================================================================================== */ /// <summary> /// When the script is initialized /// </summary> void Awake() { if(this.droneType == eDroneType.Patrol){ patrolDroneScript = this.gameObject.GetComponent<DronePatrol>(); //patrolScript = this.gameObject.GetComponent<Patrol>(); } else if(this.droneType == eDroneType.Saboteur) saboteurScript = this.gameObject.GetComponent<Saboteur>(); // Check if it is a CPU controlled drone (or opponent drones, for that matter) if(this.gameObject.layer == MainScript.enemyLayer) { // Set a flag to make easier for us isThisAnEnemyDrone = true; // Check the type and get the component // AI hunter drone if(this.droneType == eDroneType.Hunter) { hunterAIScript = this.gameObject.GetComponent<DroneHunter>(); captureSpot = GetCaptureSpot(); captureRaySpot = GetCaptureRaySpot(); if(!hunterAIScript) { // DEBUG Debug.LogError("DroneHunter component not found in " + this.transform); } } if(this.droneType == eDroneType.Patrol) { enemyPatrolScript = this.gameObject.GetComponent<EnemyPatrol>(); // Set a flag to make easier for us //isThisAnEnemyDrone = true; } } sabotageTime = 2.0f; // Set the default settings for all the drones if(!isThisAnEnemyDrone) Selectable = true; // All drones are selectable Movable = true; // All drones are movable Type = eObjType.Drone; AIScript = gameObject.GetComponent<AstarAIFollow>(); // FSM setup eFSMCurrentState = FSMState.STATE_IDLE; // Starts the object variables, like the sweet spot and the main mesh object GetSweetSpotAndMeshObject(); // Get info about the collider GetColliderInfo(); }
// ------- static void Main(string[] args) { Saboteur s = new Saboteur(); s.Run(); }
public Wave(Dictionary <string, System.Object> json) { canvas = GameObject.Find("Canvas").transform; System.Random rand = new System.Random(); enemies = new List <GameObject> (); //note: ints in MiniJSON come out as longs, so must be cast twice levelID = (int)(long)json ["levelID"]; waveID = (int)(long)json ["waveID"]; maxTime = (int)(long)json ["maxMilliseconds"]; interval = (int)(long)json ["minimumInterval"]; List <System.Object> enemyjson = (List <System.Object>)json ["enemies"]; //step one: create a randomized list of spawn times int slots = maxTime / interval; //Debug.Log ("wave "+ waveID + " slots: " + slots); int occupants = enemyjson.Count; //create bool array to randomize List <bool> timeslots = new List <bool>(); for (int i = 0; i < slots; i++) { if (i < occupants) { timeslots.Add(true); } else { timeslots.Add(false); } } //randomize this array (fisher-yates shuffle) for (int i = slots - 1; i > 0; i--) { int j = rand.Next(i + 1); bool temp = timeslots[i]; timeslots[i] = timeslots[j]; timeslots[j] = temp; } //make sure one enemy spawns immediately if (!timeslots[0]) { for (int i = 1; i < slots; i++) { if (timeslots[i]) { timeslots[0] = true; timeslots[i] = false; break; } } } //create corresponding array of random-ish long bonuses to positions List <long> timeChaos = new List <long>(); for (int i = 0; i < timeslots.Count; i++) { timeChaos.Add(0); } for (int i = 0; i < timeChaos.Count; i++) { if (timeslots[i]) //if an enemy should spawn in this timeframe, //get the previous bonus to make sure you're the min distance away { long previous = 0; if (i > 0) { previous = timeChaos[i - 1]; } //create random spawn time within the time slot allotted long chaos = rand.Next((int)previous, (int)interval); timeChaos[i] = chaos; } } //check to make sure nothing went wrong and timeslots and timechaos are both of length slots if (timeslots.Count != slots) { Debug.Log("timeslots is wrong length! slots is " + slots + " but timeslots length is " + timeslots.Count); } if (timeChaos.Count != slots) { Debug.Log("timechaos is wrong length! slots is " + slots + " but timechaos length is " + timeChaos.Count); } //finally, create final list of spawn times List <long> spawntimesInMillis = new List <long>(); for (int i = 0; i < timeslots.Count; i++) { if (timeslots[i]) { long spawntime = i * interval; spawntime += timeChaos[i]; spawntimesInMillis.Add(spawntime); } } //for(int i = 0; i < spawntimesInMillis.Count; i++){ // Debug.Log ("wave "+ waveID + " spawntime "+i +": " + spawntimesInMillis[i]); //} //check to make sure nothing went wrong and spawntimes is of length occupants if (spawntimesInMillis.Count != enemyjson.Count) { Debug.Log("spawntimes and enemies don't match! (" + spawntimesInMillis.Count + "/" + enemyjson.Count + ")"); } //shuffle the enemy order (fisher-yates) for (int i = enemyjson.Count - 1; i > 0; i--) { int j = rand.Next(i + 1); System.Object temp = enemyjson[i]; enemyjson[i] = enemyjson[j]; enemyjson[j] = temp; } for (int i = 0; i < enemyjson.Count; i++) { System.Object enemy = enemyjson[i]; Dictionary <string, System.Object> enemydict = (Dictionary <string, System.Object>)enemy; //would load from bestiary using (string)enemydict["enemyID"], but no bestiary yet //long spawntimeInMillis = (long)enemydict["spawntime"]; string filename = (string)enemydict["enemyID"]; int track = (int)(long)enemydict["trackID"]; int trackpos = 0; if (enemydict.ContainsKey("trackpos")) { trackpos = (int)(long)enemydict["trackpos"]; } //make enemy GameObject enemyspawn = GameObject.Instantiate(Resources.Load("Prefabs/MainCanvas/Enemy")) as GameObject; //Debug.Log("we're setting it to the spawn layer"); //Debug.Log (Dial.spawnLayer == null); enemyspawn.transform.SetParent(Dial.spawnLayer, false); enemyspawn.SetActive(false); Enemy ec = enemyspawn.GetComponent <Enemy>(); FileLoader fl = new FileLoader("JSONData" + Path.DirectorySeparatorChar + "Bestiary", filename); string actualenemyjson = fl.Read(); Dictionary <string, System.Object> actualenemydict = Json.Deserialize(actualenemyjson) as Dictionary <string, System.Object>; string enemytype = (string)actualenemydict["enemyType"]; if (enemytype.Equals("Chainers")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Chainer c = enemyobj.AddComponent <Chainer>() as Chainer; float chaindelay = (float)(double)actualenemydict["delay"]; c.delay = chaindelay; ec = c; } else if (enemytype.Equals("TipOfTheSpear")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); TipOfTheSpear tots = enemyobj.AddComponent <TipOfTheSpear>() as TipOfTheSpear; float chaindelay = (float)(double)actualenemydict["delay"]; tots.SetDelay(chaindelay); tots.leader = true; ec = tots; } else if (enemytype.Equals("WallOfDoom")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); WallOfDoom wod = enemyobj.AddComponent <WallOfDoom>() as WallOfDoom; ec = wod; } else if (enemytype.Equals("TheDiversion")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Diversion d = enemyobj.AddComponent <Diversion>() as Diversion; float chaindelay = (float)(double)actualenemydict["delay"]; d.SetDelay(chaindelay); ec = d; } else if (enemytype.Equals("MeatShield")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); MeatShield ms = enemyobj.AddComponent <MeatShield>() as MeatShield; float chaindelay = (float)(double)actualenemydict["delay"]; ms.SetDelay(chaindelay); ms.leader = true; ec = ms; } else if (enemytype.Equals("Splitter")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Splitter s = enemyobj.AddComponent <Splitter>() as Splitter; ec = s; } else if (enemytype.Equals("Blob")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Blob b = enemyobj.AddComponent <Blob>() as Blob; ec = b; } else if (enemytype.Equals("Megasplit")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Megasplit ms = enemyobj.AddComponent <Megasplit>() as Megasplit; ec = ms; } else if (enemytype.Equals("Melder")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Melder m = enemyobj.AddComponent <Melder>() as Melder; ec = m; } else if (enemytype.Equals("BigSplit")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); BigSplit bs = enemyobj.AddComponent <BigSplit>() as BigSplit; ec = bs; } else if (enemytype.Equals("Junior")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Junior j = enemyobj.AddComponent <Junior>() as Junior; ec = j; } else if (enemytype.Equals("Cheater")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Cheater ch = enemyobj.AddComponent <Cheater>() as Cheater; ec = ch; } else if (enemytype.Equals("Spite")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Spite s = enemyobj.AddComponent <Spite>() as Spite; ec = s; } else if (enemytype.Equals("Executor")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Executor s = enemyobj.AddComponent <Executor>() as Executor; ec = s; } else if (enemytype.Equals("Saboteur")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Saboteur s = enemyobj.AddComponent <Saboteur>() as Saboteur; ec = s; } else if (enemytype.Equals("Pusher")) { GameObject enemyobj = ec.gameObject; GameObject.Destroy(enemyobj.GetComponent <Enemy>()); Pusher s = enemyobj.AddComponent <Pusher>() as Pusher; ec = s; } //give enemy a filename to load from ec.SetSrcFileName(filename); ec.SetTrackID(track); ec.SetTrackLane(trackpos); //calculate and set position float degrees = (track - 1) * 60 + 30; //clockwise of y-axis degrees += 15 * trackpos; //negative trackpos is left side, positive is right side, 0 is middle degrees = ((360 - degrees) + 90) % 360; //convert to counterclockwise of x axis degrees *= Mathf.Deg2Rad; ((RectTransform)enemyspawn.transform).anchoredPosition = new Vector2(Dial.ENEMY_SPAWN_LENGTH * Mathf.Cos(degrees), Dial.ENEMY_SPAWN_LENGTH * Mathf.Sin(degrees)); //set spawn time ec.SetSpawnTime(spawntimesInMillis[i]); enemies.Add(enemyspawn); } /*foreach (System.Object enemy in enemyjson) { * //ec.ConfigureEnemy (); * }*/ }
public void Setup() { Game = new(); Agent = (Saboteur)Game.Agents[nameof(Saboteur)]; }