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);
 }
Exemple #2
0
    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);
    }
Exemple #4
0
 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);
    }
Exemple #6
0
    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);
    }
Exemple #8
0
    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);
            }
        }
    }
Exemple #9
0
    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);
 }
Exemple #16
0
 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);
 }
Exemple #18
0
 public abstract bool ExecuteAnimation(SimulatedDisplacement sim, Direction dir, Board board);
Exemple #19
0
 public SimulatorEdge(SimulatorNode start, SimulatorNode end, SimulatedDisplacement sim)
 {
     this.startNode = start;
     this.endNode   = end;
     this.sim       = sim;
 }
Exemple #20
0
 public override bool ExecuteEffect(SimulatedDisplacement sim, Direction dir, Board board)
 {
     // no effect
     return(true);
 }
Exemple #21
0
    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);
    }
Exemple #22
0
 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);
    }
Exemple #24
0
 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);
 }