Beispiel #1
0
    void KillArmy(CombatMonsterGroup group)
    {
        int playerId = group.playerId;

        armies.Remove(group);
        TimelineTurn turn = GetTimelineItem(group.armyId);
        GameObject   army = GetArmyObject(group.armyId);

        Destroy(army);
        Destroy(group.gameObject);
        Destroy(turn.gameObject);

        int count = CountPlayerArmies(playerId) - 1;

        if (count == 0)
        {
            combatOver = true;
            if (playerId == 0)
            {
                lostCanvas.SetActive(true);
            }
            else
            {
                wonCanvas.SetActive(true);
            }
        }
    }
Beispiel #2
0
    void NextTurn()
    {
        TimelineTurn turn = timeline.transform.GetChild(0).GetComponent <TimelineTurn>();

        currentPlayer = turn.group.playerId;
        turnTitle.GetComponent <Text>().text = GetTurnTitle(currentPlayer);

        if (currentArmy)
        {
            currentArmy.SetColor(new Color(1.0f, 1.0f, 1.0f, 1.0f));
        }
        currentArmy = turn.group;
        currentArmy.SetColor(new Color(0.3f, 0.3f, 0.6f, 1.0f));
        currentArmy.hasMoved    = false;
        currentArmy.hasAttacked = false;

        Camera.main.GetComponent <CameraController>().MoveTo(currentArmy.transform.position + new Vector3(0.0f, 0.0f, -3.0f));

        pathfinder.SetTerrain(terrainPassable);
        List <Vector2i> tilesInRange = pathfinder.GetInRange(currentArmy.gamePosition, Creatures.Get(currentArmy.creatureId).speed);

        ClearHighlightedTiles();
        HighlightTiles(tilesInRange);

        pathfinder.SetTerrain(GetPassableTerrain());
        if (currentPlayer != 0)
        {
            computerTurnStartDelay   = true;
            computerTurnStartCurrent = 0.0f;
        }
    }
Beispiel #3
0
    void HoverTile()
    {
        Vector3    mousePosition = Input.mousePosition;
        Ray        ray           = Camera.main.ScreenPointToRay(mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.tag == "Tile")
            {
                Tile   tile    = hit.collider.GetComponent <Tile>();
                bool   isthere = GetArmyAt(tile.gamePosition) == null;
                string has     = isthere ? "true" : "false";
                debugPosition.text = tile.gamePosition.ToString() + ": " + has;
                CombatMonsterGroup group = GetArmyAt(tile.gamePosition);
                if (group != null)
                {
                    int          armyId = group.armyId;
                    TimelineTurn turn   = GetTimelineItem(armyId);
                    turn.SetColor(new Color(0.75f, 0.75f, 0.0f, 0.4f));
                    group.SetColor(new Color(0.75f, 0.75f, 0.0f));

                    string   contextString = "";
                    Creature creature      = Creatures.Get(group.creatureId);
                    if (group.playerId != 0)
                    {
                        contextString = GetChanceToHit(Creatures.Get(currentArmy.creatureId).attack, creature.defense).ToString() + "%\n";
                    }
                    contextString += "A: " + creature.attack + "\nD: " + creature.defense + "\nDMG: " + creature.damage + "\nSPD: " + creature.speed;
                    ShowContext(contextString, group.transform.position);
                }
                else
                {
                    HideContext();
                }
                tile.GetComponent <Renderer>().material.color = new Color(0.2f, 0.2f, 0.2f, 1.0f);
                if (hoverTile && hoverTile.gamePosition != tile.gamePosition)
                {
                    ClearHoverTile();
                }
                hoverTile = tile;
            }
            else
            {
                ClearHoverTile();
                HideContext();
            }
        }
        else
        {
            ClearHoverTile();
            HideContext();
        }
    }
Beispiel #4
0
    int ApplyDamage(CombatMonsterGroup attacking, CombatMonsterGroup defending)
    {
        Creature attCreature   = Creatures.Get(attacking.creatureId);
        int      damage        = attCreature.damage * attacking.count;
        int      startingCount = defending.count;

        defending.ApplyDamage(damage);
        int newCount = defending.count;
        int diff     = startingCount - newCount;

        return(diff);
    }
Beispiel #5
0
    void ClearHoverTile()
    {
        if (hoverTile == null)
        {
            return;
        }
        bool highlighted = false;

        for (int i = 0; i < highlightedTiles.Count; i++)
        {
            if (highlightedTiles[i] == hoverTile)
            {
                highlighted = true;
                break;
            }
        }
        if (highlighted)
        {
            hoverTile.GetComponent <Renderer>().material.color = new Color(0.3f, 0.3f, 0.3f, 1.0f);
        }
        else
        {
            hoverTile.GetComponent <Renderer>().material.color = new Color(0.375f, 0.375f, 0.375f, 1.0f);
        }

        CombatMonsterGroup group = GetArmyAt(hoverTile.gamePosition);

        hoverTile          = null;
        debugPosition.text = "";

        if (group == null)
        {
            return;
        }
        if (group.dead)
        {
            return;
        }

        TimelineTurn turn = GetTimelineItem(group.armyId);

        turn.SetColor(new Color(1.0f, 1.0f, 1.0f, 0.4f));

        if (currentArmy == group)
        {
            group.SetColor(new Color(0.3f, 0.3f, 0.6f, 1.0f));
        }
        else
        {
            group.SetColor(new Color(1.0f, 1.0f, 1.0f));
        }
    }
Beispiel #6
0
 CombatMonsterGroup GetArmyAt(Vector2i position)
 {
     for (int i = 0; i < armyContainer.transform.childCount; i++)
     {
         GameObject         child = armyContainer.transform.GetChild(i).gameObject;
         CombatMonsterGroup group = child.GetComponent <CombatMonsterGroup>();
         if (group.gamePosition == position)
         {
             return(group);
         }
     }
     return(null);
 }
Beispiel #7
0
    void Attack(CombatMonsterGroup attacker, CombatMonsterGroup defender)
    {
        attacker.hasAttacked = true;
        int killed = Hit(attacker, defender);

        switch (killed)
        {
        case -1:
            ShowAttackFeedback("Missed", defender.transform.position);
            break;

        case 0:
            ShowAttackFeedback("0", defender.transform.position);
            break;

        default:
            ShowAttackFeedback("-" + killed.ToString(), defender.transform.position);
            break;
        }
        UpdateTimelineItem(defender);

        if (defender.dead)
        {
            KillArmy(defender);
            return;
        }

        killed = Hit(defender, attacker);
        switch (killed)
        {
        case -1:
            ShowCounterFeedback("Missed", defender.transform.position);
            break;

        case 0:
            ShowCounterFeedback("0", defender.transform.position);
            break;

        default:
            ShowCounterFeedback("-" + killed.ToString(), defender.transform.position);
            break;
        }
        UpdateTimelineItem(attacker);

        if (attacker.dead)
        {
            KillArmy(attacker);
            return;
        }
    }
Beispiel #8
0
    void PlaceMonsterArmy(Tile tile, Vector3 position, Vector2i gamePosition, int armyID)
    {
        CombatMonsterGroup group = Instantiate(monsterPrefab, armyContainer.transform);

        group.transform.position = position;
        group.transform.Find("Monster").transform.rotation = Quaternion.Euler(0.0f, 90.0f, 0.0f);
        group.SetCounter(monsters.armies[armyID].count);
        group.creatureId = monsters.armies[armyID].creatureID;
        group.initiative = Creatures.Get(group.creatureId).initiative + Random.Range(-2, 3);
        group.SetHP(Creatures.Get(group.creatureId).hp);
        group.playerId     = 1;
        group.gamePosition = gamePosition;
        armies.Add(group);
    }
Beispiel #9
0
    void RotateArmy(CombatMonsterGroup group, float angle)
    {
        GameObject child;

        if (currentPlayer == 0)
        {
            child = group.transform.Find("Knight").gameObject;
        }
        else
        {
            child = group.transform.Find("Monster").gameObject;
        }
        child.transform.rotation = Quaternion.Euler(0.0f, 180.0f - angle, 0.0f);
    }
Beispiel #10
0
    void UpdateTimelineItem(CombatMonsterGroup group)
    {
        TimelineTurn turn = GetTimelineItem(group.armyId);

        if (!turn)
        {
            Debug.Log("No turn found for this army.");
            return;
        }
        turn.GetComponentInChildren <Text>().text = group.count.ToString();
        if (group.dead)
        {
            turn.GetComponentInChildren <Image>().color = new Color(1.0f, 0.0f, 0.0f, 1.0f);
        }
    }
Beispiel #11
0
    int Hit(CombatMonsterGroup attacker, CombatMonsterGroup defender)
    {
        Creature attacking = Creatures.Get(attacker.creatureId);
        Creature defending = Creatures.Get(defender.creatureId);

        float chanceToHit = GetChanceToHit(attacking.attack, defending.defense);
        int   chance      = Random.Range(1, 101);

        if (chance < chanceToHit)
        {
            return(ApplyDamage(attacker, defender));
        }
        else
        {
            return(-1);
        }
    }
Beispiel #12
0
    void ComputerTurn()
    {
        Vector2i position = currentArmy.gamePosition;

        CombatMonsterGroup targetPlayerArmy = null;

        List <Vector2i> neighbours = pathfinder.GetNeighbours(position);

        for (int i = 0; i < neighbours.Count; i++)
        {
            CombatMonsterGroup army = GetArmyAt(neighbours[i]);
            if (army == null || army.playerId != 0)
            {
                continue;
            }
            if (targetPlayerArmy == null || GetTotalHP(army) > GetTotalHP(targetPlayerArmy))
            {
                targetPlayerArmy = army;
            }
        }

        List <MovementPoint> path = null;


        if (targetPlayerArmy)
        {
            path = pathfinder.FindPath(currentArmy.gamePosition, targetPlayerArmy.gamePosition, Creatures.Get(currentArmy.creatureId).speed);
            if (path == null)
            {
                Debug.Log("path error");
                return;
            }
            path.RemoveAt(path.Count - 1);
            movingToAttack = true;
            attackTarget   = targetPlayerArmy;
        }
        else
        {
            // find the player army with lowest amount of HP
            for (int i = 0; i < armies.Count; i++)
            {
                if (armies[i].playerId != 0)
                {
                    continue;
                }
                CombatMonsterGroup army = armies[i];
                if (targetPlayerArmy == null || GetTotalHP(army) > GetTotalHP(targetPlayerArmy))
                {
                    targetPlayerArmy = army;
                }
            }

            if (targetPlayerArmy == null)
            {
                Debug.Log("Error: no enemy army chosen :(");
                return;
            }

            path = pathfinder.FindPath(currentArmy.gamePosition, targetPlayerArmy.gamePosition);

            if (path.Count > Creatures.Get(currentArmy.creatureId).speed + 2)
            {
                path           = path.GetRange(0, Creatures.Get(currentArmy.creatureId).speed + 1);
                movingToAttack = false;
            }
            else
            {
                path.RemoveAt(path.Count - 1);
                movingToAttack = true;
                attackTarget   = targetPlayerArmy;
            }
        }
        movementPath         = path;
        movementNextStep     = 0;
        isMoving             = true;
        currentArmy.hasMoved = true;
        MovementNextStep();
    }
Beispiel #13
0
 int GetTotalHP(CombatMonsterGroup army)
 {
     return(Creatures.Get(army.creatureId).hp *(army.count - 1) + army.hp);
 }
Beispiel #14
0
    void CheckClick()
    {
        if (releaseTime < 0.0f || pressTime < 0.0f)
        {
            return;
        }
        if (releaseTime - pressTime > 0.5f)
        {
            return;
        }
        if (pressTile != releaseTile)
        {
            return;
        }

        if (currentArmy.hasMoved)
        {
            return;
        }

        Vector2i position = hoverTile.gamePosition;

        if (currentArmy.gamePosition == position)
        {
            return;
        }

        CombatMonsterGroup monstersAt = GetArmyAt(position);
        bool hasMonsters = monstersAt != null;

        if (!hasMonsters)
        {
            if (!pathfinder.IsPassable(position))
            {
                return;
            }
        }
        else
        {
            if (monstersAt.playerId == currentPlayer)
            {
                return;
            }
        }

        int range = Creatures.Get(currentArmy.creatureId).speed;

        if (hasMonsters)
        {
            range++;
        }

        List <MovementPoint> path = pathfinder.FindPath(currentArmy.gamePosition, releaseTile.gamePosition, range);

        if (path == null)
        {
            return;
        }

        if (hasMonsters)
        {
            path.RemoveAt(path.Count - 1);
            movingToAttack = true;
            attackTarget   = monstersAt;
        }
        else
        {
            movingToAttack = false;
        }

        movementPath         = path;
        movementNextStep     = 0;
        isMoving             = true;
        currentArmy.hasMoved = true;
        MovementNextStep();
    }