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); }
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); } }