public override void CollectObservations()
    {
        List <GameObject> neighbors = gameState.getNeighbors(x, y, sight);

        foreach (GameObject neighbor in neighbors)
        {
            GameState.HexTypes type = neighbor.GetComponent <Hex>().getType();
            AddVectorObs((int)type, 9);

            GameObject other = neighbor.GetComponent <Hex>().unitInHex;

            if (other == null)
            {
                AddVectorObs(NoUnit, 3);
            }
            else if (other.GetComponent <UnitAgent>().team == team)
            {
                AddVectorObs(Friendly, 3);
            }
            else
            {
                AddVectorObs(Enemy, 3);
            }
        }

        Coordinates3D coordDist = Coordinates3D.AddCoordinates(
            new Coordinates3D(homeX, homeY), new Coordinates3D(-x, -y));

        AddVectorObs(Sigmoid(coordDist.x));
        AddVectorObs(Sigmoid(coordDist.y));
        AddVectorObs(Sigmoid(coordDist.z));
        AddVectorObs((Sigmoid(attack) - 0.5f) * 2);
    }
    public void setType(GameState.HexTypes type)
    {
        hexType = type;
        maxType = type;

        switch (hexType)
        {
        case GameState.HexTypes.Grassland:
            growable    = true;
            growthTimer = 20;
            break;

        case GameState.HexTypes.Forest:
            growable    = true;
            growthTimer = 50;
            break;

        case GameState.HexTypes.Jungle:
            growable    = true;
            growthTimer = 300;
            break;

        default:
            growable = false;
            break;
        }
    }
    protected void Move(Coordinates2D newPos)
    {
        Hex hex = gameState.GetHex(newPos).GetComponent <Hex>();

        if (hex.unitInHex != null)
        {
            if (!Fight(this, hex.unitInHex.GetComponent <UnitAgent>()))
            {
                return;
            }
        }

        GameState.HexTypes type = hex.getType();

        Coordinates3D coordDist = Coordinates3D.AddCoordinates(
            new Coordinates3D(homeX, homeY), new Coordinates3D(-x, -y));

        float dist = Mathf.Abs(coordDist.x) + Mathf.Abs(coordDist.y) + Mathf.Abs(coordDist.z);

        dist = dist / 2;
        dist = dist * .05f;
        dist = (dist - 0.15f) / (dist + 0.85f);
        AddReward(Mathf.Min(Mathf.Max(-dist, maxMovePenalty), 0));
        //Debug.Log(-dist);

        AddReward(-0.02f);

        switch (type)
        {
        case GameState.HexTypes.Mountain:
            AddReward(-0.02f);
            break;

        case GameState.HexTypes.Water:
            SetReward(-1f);
            Dead();
            Done();
            Debug.Log("In Water!");
            break;

        default:
            transform.position = hex.transform.position;
            gameState.GetHex(new Coordinates2D(x, y)).GetComponent <Hex>().unitInHex = null;
            x             = newPos.x;
            y             = newPos.y;
            hex.unitInHex = gameObject;
            break;
        }
    }
    public void Step()
    {
        if (growable)
        {
            switch (hexType)
            {
            case GameState.HexTypes.Desert:
                growthTimer += 0.25f;
                if (growthTimer > 20)
                {
                    hexType = GameState.HexTypes.Grassland;
                    Material[] materials = GetComponentInChildren <MeshRenderer>().materials;
                    materials[1] = hexTypes[2];
                    GetComponentInChildren <MeshRenderer>().materials = materials;
                }
                break;

            case GameState.HexTypes.Grassland:
                growthTimer += 0.5f;
                if (growthTimer > 50 && maxType != GameState.HexTypes.Grassland)
                {
                    hexType = GameState.HexTypes.Forest;
                    Material[] materials = GetComponentInChildren <MeshRenderer>().materials;
                    materials[1] = hexTypes[3];
                    GetComponentInChildren <MeshRenderer>().materials = materials;
                }
                break;

            case GameState.HexTypes.Forest:
                growthTimer += 1f;
                if (growthTimer > 300 && maxType != GameState.HexTypes.Forest)
                {
                    hexType = GameState.HexTypes.Jungle;
                    Material[] materials = GetComponentInChildren <MeshRenderer>().materials;
                    materials[1] = hexTypes[5];
                    GetComponentInChildren <MeshRenderer>().materials = materials;
                }
                break;

            case GameState.HexTypes.Jungle:
                growthTimer += 3f;
                break;

            default:
                break;
            }
        }
    }
    public float Gather()
    {
        float reward = 0;

        Material[] materials;

        switch (hexType)
        {
        case GameState.HexTypes.Grassland:
            reward       = growthTimer;
            growthTimer  = 0;
            hexType      = GameState.HexTypes.Desert;
            materials    = GetComponentInChildren <MeshRenderer>().materials;
            materials[1] = hexTypes[4];
            GetComponentInChildren <MeshRenderer>().materials = materials;

            break;

        case GameState.HexTypes.Forest:
            reward       = growthTimer * 2;
            growthTimer  = 20;
            hexType      = GameState.HexTypes.Grassland;
            materials    = GetComponentInChildren <MeshRenderer>().materials;
            materials[1] = hexTypes[2];
            GetComponentInChildren <MeshRenderer>().materials = materials;

            break;

        case GameState.HexTypes.Jungle:
            reward       = growthTimer * 3;
            growthTimer  = 50;
            hexType      = GameState.HexTypes.Forest;
            materials    = GetComponentInChildren <MeshRenderer>().materials;
            materials[1] = hexTypes[3];
            GetComponentInChildren <MeshRenderer>().materials = materials;

            break;

        default:
            break;
        }

        return(reward);
    }
Beispiel #6
0
    public override void AgentAction(float[] vectorAction, string textAction)
    {
        //Debug.Log("Taking action");

        int action = Mathf.FloorToInt(vectorAction[0]);

        Coordinates2D newPos = new Coordinates2D(x, y);

        switch (action)
        {
        case Up:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(1, 0));
            break;

        case UpRight:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(1, -1));
            break;

        case DownRight:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(0, -1));
            break;

        case Down:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(-1, 0));
            break;

        case DownLeft:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(-1, 1));
            break;

        case UpLeft:
            newPos = Coordinates2D.add(newPos, new Coordinates2D(0, 1));
            break;

        case Interact:
            if (x == homeX && y == homeY)
            {
                if (newReward > 0)
                {
                    castle.AddResources(resources);
                    Debug.Log("Went home with resources");
                    newReward = 0;
                    resources = 0;
                    SetReward(newReward);
                }
                else
                {
                    Debug.Log("Did Nothing In Town");
                    AddReward(-0.02f);
                }
            }
            else if (newReward == 0)
            {
                GameState.HexTypes hexType = gameState.GetHex(newPos).GetComponent <Hex>().getType();

                switch (hexType)
                {
                case GameState.HexTypes.Jungle:
                    newReward += 0.4f;
                    AddReward(0.1f);
                    resources = gameState.GetHex(newPos).GetComponent <Hex>().Gather();
                    Debug.Log("Harvested Jungle");
                    break;

                case GameState.HexTypes.Forest:
                    newReward += 0.3f;
                    AddReward(0.1f);
                    resources = gameState.GetHex(newPos).GetComponent <Hex>().Gather();
                    Debug.Log("Harvested Forest");
                    break;

                case GameState.HexTypes.Grassland:
                    newReward += 0.3f;
                    AddReward(0.1f);
                    resources = gameState.GetHex(newPos).GetComponent <Hex>().Gather();
                    Debug.Log("Harvested Grass");
                    break;

                default:
                    AddReward(-0.02f);
                    Debug.Log("Nothing to Harvest");
                    break;
                }
            }
            else
            {
                Debug.Log("Did Nothing Out Of Town");
                AddReward(-0.02f);
            }
            break;
        }

        if (newPos != null)
        {
            Move(newPos);
        }
    }