public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { // TODO Fail upon silence if (sim.displacement.unit.statusController.HasStatus(new StunEffect(0))) { return(false); } return(true); }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { Unit victim = sim.displacement.unit; // TODO: also check if the victim was pushed against a wall tile/structure if (sim.conflict) { victim.statusController.AddStatus(new StunEffect(STUN_DURATION)); Debug.Log(victim + " was stunned!"); } return(true); }
public override bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board) { //Clean Up all spawned anims foreach (KeyValuePair <Tile, GameObject> pair in ((LancePoke)action).spawnedLanceAnims) { UnitAnimator animator = pair.Value.GetComponent <UnitAnimator>(); animator.SetBool("EndAnimation", true); } //Remove references ((LancePoke)action).spawnedLanceAnims.Clear(); return(true); }
public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { // TODO Fail upon snare if (sim.displacement.unit.statusController.HasStatus(new StunEffect(0))) { return(false); } if (board.CheckCoord(sim.GetCurrentVector())) { Tile tile = board.GetTile(sim.GetCurrentVector()); return(tile.tileType == TileType.PLAINS); } return(false); }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { Vector2 frontVect = Action.GetDirectionVector(dir); if (frontVect == Vector2.zero) { // bad direction input return(false); } List <Tile> sweetSpots = new List <Tile>(); List <Tile> okSpots = new List <Tile>(); // Sweetspot: 1st tile in front of user if (board.CheckCoord(sim.result + frontVect)) { sweetSpots.Add(board.GetTile(sim.result + frontVect)); } // Okspot: 2nd tile in front of user if (board.CheckCoord(sim.result + frontVect * 2)) { okSpots.Add(board.GetTile(sim.result + frontVect * 2)); } // Apply effects to units on top of tiles foreach (Tile t in sweetSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal damage (40) and apply poison status effect t.unit.TakeDamage(DMG); t.unit.statusController.QueueAddStatus(new PoisonEffect(POISON_DURATION)); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + DMG + " damage and got poisoned for " + POISON_DURATION + " frames!"); } } foreach (Tile t in okSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal damage (40) t.unit.TakeDamage(DMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + DMG + " damage!"); } } return(true); }
public override bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board) { Unit unit = sim.displacement.unit; bool collision = sim.conflict; if (!collision) { //Unit's logical location is already on the target unit.gameObject.transform.position = unit.tile.gameObject.transform.position; return(true); } else { //Play some kind of collision return(false); } }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // TODO get targetted area Tile target = ((Signal)action).Target; List <Tile> aoe = new List <Tile>(); if (board.CheckCoord(target.coordinate + Vector2.up)) { aoe.Add(board.GetTile(target.coordinate + Vector2.up)); } if (board.CheckCoord(target.coordinate + Vector2.down)) { aoe.Add(board.GetTile(target.coordinate + Vector2.down)); } if (board.CheckCoord(target.coordinate + Vector2.left)) { aoe.Add(board.GetTile(target.coordinate + Vector2.left)); } if (board.CheckCoord(target.coordinate + Vector2.right)) { aoe.Add(board.GetTile(target.coordinate + Vector2.right)); } if (target.unit && !IsAlreadyHit(target.unit)) { target.unit.TakeDamage(Signal.CENTERDMG); AddUnitHit(target.unit); Debug.Log("Ouch! " + target.unit.unitName + " just took " + Signal.CENTERDMG + " damage!"); } foreach (Tile t in aoe) { if (t.unit && !IsAlreadyHit(t.unit)) { t.unit.TakeDamage(Signal.AOEDMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + Signal.AOEDMG + " damage!"); } } return(true); }
private void ExecuteSingleFrameOrder(List <KeyValuePair <Unit, Command> > commands, List <Player> players, Board board) { Dictionary <Unit, UnitDisplacement> displacements = GetAggregatedDisplacements(players, commands, board); ActionSimulator simulator = new ActionSimulator(displacements, board); Dictionary <Unit, SimulatedDisplacement> result = simulator.Simulate(); foreach (KeyValuePair <Unit, Command> pair in commands) { Unit unit = pair.Key; Command command = pair.Value; Direction absDir = command.GetAbsoluteDir(); SimulatedDisplacement sim = result[unit]; if (command.frame.effect.CanExecute(sim, absDir, board)) { sim.displacement.unit.FaceDirection(absDir); sim.displacement.unit.FaceDirectionAnim(absDir); command.frame.effect.ExecuteEffect(sim, absDir, board); Board.MoveUnit(sim, board); command.frame.anim.ExecuteAnimation(sim, absDir, board); } } }
public ActionSimulatorGraph(Dictionary <Unit, UnitDisplacement> displacements, Board board) { this.nodes = new Dictionary <Vector2, SimulatorNode>(); this.board = board; foreach (KeyValuePair <Unit, UnitDisplacement> pair in displacements) { SimulatedDisplacement sim = new SimulatedDisplacement(pair.Value); Vector2 startCoord = pair.Value.GetStartCoordinate(); Vector2 endCoord = sim.GetNextSimulationStep(board); if (!nodes.ContainsKey(startCoord)) { nodes.Add(startCoord, new SimulatorNode(startCoord)); } if (!nodes.ContainsKey(endCoord)) { nodes.Add(endCoord, new SimulatorNode(endCoord)); } nodes[endCoord].AddEdge(new SimulatorEdge(nodes[startCoord], nodes[endCoord], sim)); } }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // TODO deal damage to enemies on tiles Vector2 frontVect = Action.GetDirectionVector(dir); if (frontVect == Vector2.zero) { // bad direction input return(false); } List <Tile> hitSpots = new List <Tile>(); // 1st hitspot: one tile in front of user if (board.CheckCoord(sim.result + frontVect)) { hitSpots.Add(board.GetTile(sim.result + frontVect)); } // 2nd hitspot: two tiles in front of user if (board.CheckCoord(sim.result + frontVect * 2)) { hitSpots.Add(board.GetTile(sim.result + frontVect * 2)); } // Apply effects to units on top of tiles foreach (Tile t in hitSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal damage (30) and apply knockback status effect t.unit.TakeDamage(DMG); t.unit.statusController.QueueAddStatus(new KnockbackEffect(frontVect)); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just got knocked back and took " + DMG + " damage!"); } } return(true); }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // TODO deal damage to enemies on tiles Vector2 frontVect = Action.GetDirectionVector(dir); Vector2 leftVect = ComputeAbsoluteVector(dir, Direction.LEFT); Vector2 rightVect = ComputeAbsoluteVector(dir, Direction.RIGHT); List <Tile> hitSpots = new List <Tile>(); // 1st hitspot: one tile in front of user if (board.CheckCoord(sim.result + frontVect)) { hitSpots.Add(board.GetTile(sim.result + frontVect)); } // 2nd and 3rd hitspots: one tile on each side of the first one if (board.CheckCoord(sim.result + frontVect + leftVect)) { hitSpots.Add(board.GetTile(sim.result + frontVect + leftVect)); } if (board.CheckCoord(sim.result + frontVect + rightVect)) { hitSpots.Add(board.GetTile(sim.result + frontVect + rightVect)); } // Deal damage to units on top of tiles foreach (Tile t in hitSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal damage (60) t.unit.TakeDamage(DMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + DMG + " damage!"); } } return(true); }
public override bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board) { GameObject lanceAnim = ((LancePokeDescriptor)action.descriptor).lancePrefab; Unit unit = sim.displacement.unit; Vector2 attackDir = Action.GetDirectionVector(dir); if (attackDir == Vector2.zero) { // bad direction input return(false); } //Spawn Anims if (board.CheckCoord(sim.result + attackDir)) { GameObject lance = GameObject.Instantiate(lanceAnim, (sim.result + attackDir), Quaternion.identity); Tile tile = board.GetTile(sim.result + attackDir); lance.transform.position = tile.transform.position - new Vector3(0, 0.3f, 0); //TODO: fix hardcoded sprite offset foreach (SpriteRenderer sprite in lance.GetComponentsInChildren <SpriteRenderer>()) { sprite.sortingOrder = tile.GetSortingOrder(); } ((LancePoke)action).spawnedLanceAnims.Add(tile, lance); } // Ok spot: 2nd tile from user if (board.CheckCoord(sim.result + attackDir * 2)) { GameObject lance = GameObject.Instantiate(lanceAnim, (sim.result + attackDir * 2), Quaternion.identity); Tile tile = board.GetTile(sim.result + attackDir * 2); lance.transform.position = tile.transform.position - new Vector3(0, 0.3f, 0); //TODO: fix hardcoded sprite offset foreach (SpriteRenderer sprite in lance.GetComponentsInChildren <SpriteRenderer>()) { sprite.sortingOrder = tile.GetSortingOrder(); } ((LancePoke)action).spawnedLanceAnims.Add(tile, lance); } // Sweetspot: 3rd tile from user if (board.CheckCoord(sim.result + attackDir * 3)) { GameObject lance = GameObject.Instantiate(lanceAnim, (sim.result + attackDir * 3), Quaternion.identity); Tile tile = board.GetTile(sim.result + attackDir * 3); lance.transform.position = tile.transform.position - new Vector3(0, 0.3f, 0); //TODO: fix hardcoded sprite offset foreach (SpriteRenderer sprite in lance.GetComponentsInChildren <SpriteRenderer>()) { sprite.sortingOrder = tile.GetSortingOrder(); } ((LancePoke)action).spawnedLanceAnims.Add(tile, lance); } //Enable all animations foreach (KeyValuePair <Tile, GameObject> pair in ((LancePoke)action).spawnedLanceAnims) { pair.Value.SetActive(true); } //Play Audio TODO: Probably should move this elsewhere AudioSource source = unit.audioManager.source; AudioClip attackClip = unit.audioManager.library["Attack"][Random.Range(0, unit.audioManager.library["Attack"].Count)]; source.clip = attackClip; source.PlayDelayed(Random.Range(0.0f, 1.0f)); return(true); }
public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { // True if not disabled return(true); }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // cancel move if disabled? return(true); }
public override bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board) { // TODO attack anims return(true); }
public static void MoveUnit(SimulatedDisplacement sim, Board board) { MoveUnit(sim.GetUnit(), board.GetTile(sim.GetCurrentVector())); }
public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { return(true); }
public abstract bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board);
public SimulatorEdge(SimulatorNode start, SimulatorNode end, SimulatedDisplacement sim) { this.startNode = start; this.endNode = end; this.sim = sim; }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // no effect return(true); }
public void Relax() { bool changed; do { Dictionary <Vector2, SimulatorNode> nextIter = new Dictionary <Vector2, SimulatorNode>(); changed = false; foreach (KeyValuePair <Vector2, SimulatorNode> pair in nodes) { SimulatorNode node = pair.Value; if (IsRelaxed(node)) { //No Conflict Resolution Needed, update unit values foreach (SimulatorEdge edge in node.edges) { SimulatedDisplacement sim = edge.sim; Vector2 current = sim.GetCurrentVector(); Vector2 next; if (!sim.conflict && !sim.outOfBounds) { next = sim.GetNextSimulationStep(board); changed = changed || next != current; } else { next = current; //do not move forward } //Create and push to simulation our new location if (!nextIter.ContainsKey(current)) { nextIter.Add(current, new SimulatorNode(current)); } if (!nextIter.ContainsKey(next)) { nextIter.Add(next, new SimulatorNode(next)); } nextIter[next].AddEdge(new SimulatorEdge(nextIter[current], nextIter[next], sim)); } } else { //Create and push to simulation our new location foreach (SimulatorEdge edge in node.edges) { SimulatedDisplacement sim = edge.sim; Vector2 current = sim.GetCurrentVector(); Vector2 prev = sim.GetPreviousSimulationStep(board); sim.conflict = true; changed = changed || prev != current; //Create and push to simulation our new location if (!nextIter.ContainsKey(current)) { nextIter.Add(current, new SimulatorNode(current)); } if (!nextIter.ContainsKey(prev)) { nextIter.Add(prev, new SimulatorNode(prev)); } nextIter[prev].AddEdge(new SimulatorEdge(nextIter[current], nextIter[prev], sim)); } } } nodes = nextIter; } while(changed); }
public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { // ending lag doesn't need to fail return(true); }
public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board) { // TODO deal damage to enemies on tiles Vector2 attackDir = Action.GetDirectionVector(dir); if (attackDir == Vector2.zero) { // bad direction input return(false); } // Add tiles in range to hit lists List <Tile> sourSpots = new List <Tile>(); List <Tile> okSpots = new List <Tile>(); List <Tile> sweetSpots = new List <Tile>(); // Sourspot: 1st tile from user if (board.CheckCoord(sim.result + attackDir)) { sourSpots.Add(board.GetTile(sim.result + attackDir)); } // Ok spot: 2nd tile from user if (board.CheckCoord(sim.result + attackDir * 2)) { okSpots.Add(board.GetTile(sim.result + attackDir * 2)); } // Sweetspot: 3rd tile from user if (board.CheckCoord(sim.result + attackDir * 3)) { sweetSpots.Add(board.GetTile(sim.result + attackDir * 3)); } // Deal damage to units on top of tiles foreach (Tile t in sourSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal sourspot damage (30) t.unit.TakeDamage(SOURSPOTDMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + SOURSPOTDMG + " damage!"); } } foreach (Tile t in okSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal okspot damage (40) t.unit.TakeDamage(OKSPOTDMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + OKSPOTDMG + " damage!"); } } foreach (Tile t in sweetSpots) { if (t.unit && !IsAlreadyHit(t.unit)) { // Deal sweetspot damage (50) t.unit.TakeDamage(SWEETSPOTDMG); AddUnitHit(t.unit); Debug.Log("Ouch! " + t.unit.unitName + " just took " + SWEETSPOTDMG + " damage!"); } } return(true); }
public abstract bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board);
public override bool CanExecute(SimulatedDisplacement sim, Direction dir, Board board) { // TODO Fail upon stun or silence return(true); }