Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class FrogAgent : Agent
- {
- public FreeLives.InputState inputState = new FreeLives.InputState();
- public FreeLives.InputReader.Device device;
- Character closestEnemy, lastClosestEnemy;
- float lastDist;
- public override void CollectObservations()
- {
- var me = GameController.GetPlayer(device);
- AddFrogObservations(me.character,me);
- int frogsObserved = 1;
- closestEnemy = null;
- float closestDist = float.PositiveInfinity;
- //Character mostKnockedFrog = null;
- //int mostKnocks = 0;
- if (me.character != null)
- {
- for (int i = 0; i < GameController.activePlayers.Count; i++)
- {
- if (GameController.activePlayers[i] != me && GameController.activePlayers[i].character != null)
- {
- float dist = Vector3.Distance(me.character.transform.position, GameController.activePlayers[i].character.transform.position);
- if (dist < closestDist)
- {
- closestEnemy = GameController.activePlayers[i].character;
- closestDist = dist;
- }
- }
- if (GameController.activePlayers[i] != me)
- {
- frogsObserved++;
- AddFrogObservations(GameController.activePlayers[i].character,me);
- }
- }
- }
- while (frogsObserved < 4)
- {
- frogsObserved++;
- AddFrogObservations(null,me);
- }
- }
- int observationsPerFrog = 16;
- void AddFrogObservations(Character character, Player me)
- {
- if (character == null)
- {
- for (int i = 0; i < observationsPerFrog; i++)
- AddVectorObs(0f);
- }
- else
- {
- AddVectorObs(1f); //1
- AddVectorObs(character.transform.position.x); //2
- AddVectorObs(character.transform.position.y);//3
- AddVectorObs(character.velocity); //5
- AddVectorObs(character.WallSliding ? 1f : 0f); //6
- if (character.state == CharacterState.Bouncing)
- {
- AddVectorObs(character.hitsTaken);
- if (character.lastHitByPlayer == me)
- AddVectorObs(1f);
- else
- AddVectorObs(0f);
- }
- else
- {
- AddVectorObs(0);
- AddVectorObs(0);
- }
- AddVectorObs(character.state == CharacterState.Attacking ? 1f : 0f);//7
- AddVectorObs(character.state == CharacterState.Bouncing ? 1f : 0f);//8
- AddVectorObs(character.state == CharacterState.Normal ? 1f : 0f);//9
- AddVectorObs(character.state == CharacterState.Tounge ? 1f : 0f);//10
- if (character.state == CharacterState.Tounge && character.tongueState == TongueState.Extending)
- {
- AddVectorObs(1f);
- AddVectorObs(character.TonguePos);
- }
- else
- {
- AddVectorObs(0f); //10
- AddVectorObs(0f); //11
- AddVectorObs(0f); //12
- }
- AddVectorObs((int)character.attackState); //13
- }
- }
- public const int aFlag = 1, bFlag = 2, xFlag = 4, leftFlag = 8, rightFlag = 16, upFlag = 32, downFlag = 64;
- public override void AgentAction(float[] vectorAction, string textAction)
- {
- int action = Mathf.FloorToInt(vectorAction[0]);
- //inputState.aButton = (action & aFlag) == aFlag;
- //inputState.bButton = (action & bFlag) == bFlag;
- //inputState.xButton = (action & xFlag) == xFlag;
- //inputState.left = (action & leftFlag) == leftFlag;
- //inputState.right = (action & rightFlag) == rightFlag;
- //inputState.up = (action & upFlag) == upFlag;
- //inputState.down = (action & upFlag) == upFlag;
- FreeLives.InputReader.ClearInputState(inputState);
- if (action / 27 == 1)
- {
- inputState.aButton = true;
- }
- action = action % 27;
- if (action / 9 == 1)
- {
- inputState.xButton = true;
- }
- else if (action / 9 == 2)
- {
- inputState.bButton = true;
- }
- action = action % 9;
- switch (action)
- {
- case 0:
- inputState.left = inputState.down = true;
- break;
- case 1:
- inputState.down = true;
- break;
- case 2:
- inputState.right = inputState.down = true;
- break;
- case 3:
- inputState.left = true;
- break;
- case 5:
- inputState.right = true;
- break;
- case 6:
- inputState.up = inputState.left = true;
- break;
- case 7:
- inputState.up = true;
- break;
- case 8:
- inputState.up = inputState.right = true;
- break;
- }
- var me = GameController.GetPlayer(device);
- if (me.diedThisFrame)
- {
- me.diedThisFrame = false;
- SetReward(-1f);
- }
- if (me.character == null)
- return;
- if (me.hitSomeoneThisFrame > 0)
- {
- me.hitSomeoneThisFrame = 0;
- SetReward(0.35f + me.hitSomeoneThisFrame * 0.4f);
- }
- if (me.ScoreThisFrame > 0)
- {
- me.ScoreThisFrame = 0;
- AddReward(0.4f + me.ScoreThisFrame * 0.5f);
- }
- if (me.gotHitThisFrame)
- {
- me.gotHitThisFrame = false;
- SetReward(-0.4f);
- }
- if (me.tongueMissedThisFrame)
- {
- me.tongueMissedThisFrame = false;
- AddReward(-0.3f);
- }
- if (me.tongueHitTerrainThisFrame)
- {
- me.tongueHitTerrainThisFrame = false;
- AddReward(-0.1f);
- }
- if (me.missedAttackThisFrame)
- {
- me.missedAttackThisFrame = false;
- AddReward(-0.1f);
- }
- if (me.startedJumpThisFrame)
- {
- me.startedJumpThisFrame = false;
- AddReward(-0.035f);
- }
- if (me.character != null && closestEnemy != null)
- {
- float dist = 0f;
- if (lastClosestEnemy != null)
- {
- dist = Vector3.Distance(me.character.transform.position, lastClosestEnemy.transform.position);
- if (closestEnemy == lastClosestEnemy)
- {
- if (dist < lastDist)
- {
- AddReward(0.01f);
- }
- }
- }
- lastClosestEnemy = closestEnemy;
- lastDist = dist;
- }
- if (me.spawnedThisFrame)
- {
- me.spawnedThisFrame = false;
- if (Application.isEditor)
- print("Reset");
- Done();
- }
- }
- public override void AgentReset()
- {
- }
- public override void AgentOnDone()
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement