Advertisement
Guest User

FrogAgent.cs

a guest
Mar 12th, 2018
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.48 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class FrogAgent : Agent
  6. {
  7.  
  8.     public FreeLives.InputState inputState = new FreeLives.InputState();
  9.     public FreeLives.InputReader.Device device;
  10.  
  11.     Character closestEnemy, lastClosestEnemy;
  12.     float lastDist;
  13.  
  14.     public override void CollectObservations()
  15.     {
  16.         var me = GameController.GetPlayer(device);
  17.        
  18.         AddFrogObservations(me.character,me);
  19.         int frogsObserved = 1;
  20.         closestEnemy = null;
  21.         float closestDist = float.PositiveInfinity;
  22.         //Character mostKnockedFrog = null;
  23.         //int mostKnocks = 0;
  24.         if (me.character != null)
  25.         {
  26.             for (int i = 0; i < GameController.activePlayers.Count; i++)
  27.             {
  28.                
  29.                 if (GameController.activePlayers[i] != me && GameController.activePlayers[i].character != null)
  30.                 {
  31.  
  32.                     float dist = Vector3.Distance(me.character.transform.position, GameController.activePlayers[i].character.transform.position);
  33.  
  34.                     if (dist < closestDist)
  35.                     {
  36.                         closestEnemy = GameController.activePlayers[i].character;
  37.                         closestDist = dist;
  38.                        
  39.                     }
  40.                 }
  41.  
  42.                 if (GameController.activePlayers[i] != me)
  43.                 {
  44.                     frogsObserved++;
  45.                     AddFrogObservations(GameController.activePlayers[i].character,me);
  46.                 }
  47.                
  48.             }
  49.         }
  50.         while (frogsObserved < 4)
  51.         {
  52.             frogsObserved++;
  53.             AddFrogObservations(null,me);
  54.         }
  55.      
  56.     }
  57.  
  58.     int observationsPerFrog = 16;
  59.     void AddFrogObservations(Character character, Player me)
  60.     {
  61.         if (character == null)
  62.         {
  63.             for (int i = 0; i < observationsPerFrog; i++)
  64.                 AddVectorObs(0f);
  65.         }
  66.         else
  67.         {
  68.             AddVectorObs(1f); //1
  69.  
  70.             AddVectorObs(character.transform.position.x); //2
  71.             AddVectorObs(character.transform.position.y);//3
  72.             AddVectorObs(character.velocity); //5
  73.             AddVectorObs(character.WallSliding ? 1f : 0f); //6
  74.             if (character.state == CharacterState.Bouncing)
  75.             {
  76.                 AddVectorObs(character.hitsTaken);
  77.                 if (character.lastHitByPlayer == me)
  78.                     AddVectorObs(1f);
  79.                 else
  80.                     AddVectorObs(0f);
  81.             }
  82.             else
  83.             {
  84.                 AddVectorObs(0);
  85.                 AddVectorObs(0);
  86.             }
  87.             AddVectorObs(character.state == CharacterState.Attacking ? 1f : 0f);//7
  88.             AddVectorObs(character.state == CharacterState.Bouncing ? 1f : 0f);//8
  89.             AddVectorObs(character.state == CharacterState.Normal ? 1f : 0f);//9
  90.             AddVectorObs(character.state == CharacterState.Tounge ? 1f : 0f);//10
  91.             if (character.state == CharacterState.Tounge && character.tongueState == TongueState.Extending)
  92.             {
  93.  
  94.                 AddVectorObs(1f);
  95.                 AddVectorObs(character.TonguePos);
  96.             }
  97.             else
  98.             {
  99.                 AddVectorObs(0f); //10
  100.                 AddVectorObs(0f); //11
  101.                 AddVectorObs(0f); //12
  102.             }
  103.             AddVectorObs((int)character.attackState); //13
  104.         }
  105.        
  106.     }
  107.  
  108.     public const int aFlag = 1, bFlag = 2, xFlag = 4, leftFlag = 8, rightFlag = 16, upFlag = 32, downFlag = 64;
  109.     public override void AgentAction(float[] vectorAction, string textAction)
  110.     {
  111.  
  112.         int action = Mathf.FloorToInt(vectorAction[0]);
  113.         //inputState.aButton = (action & aFlag) == aFlag;
  114.         //inputState.bButton = (action & bFlag) == bFlag;
  115.         //inputState.xButton = (action & xFlag) == xFlag;
  116.  
  117.  
  118.         //inputState.left = (action & leftFlag) == leftFlag;
  119.         //inputState.right = (action & rightFlag) == rightFlag;
  120.         //inputState.up = (action & upFlag) == upFlag;
  121.         //inputState.down = (action & upFlag) == upFlag;
  122.  
  123.         FreeLives.InputReader.ClearInputState(inputState);
  124.  
  125.         if (action / 27 == 1)
  126.         {
  127.             inputState.aButton = true;
  128.         }
  129.  
  130.         action = action % 27;
  131.         if (action / 9 == 1)
  132.         {
  133.             inputState.xButton = true;
  134.         }
  135.         else if (action / 9 == 2)
  136.         {
  137.             inputState.bButton = true;
  138.         }
  139.         action = action % 9;
  140.  
  141.         switch (action)
  142.         {
  143.             case 0:
  144.                 inputState.left = inputState.down = true;
  145.                 break;
  146.             case 1:
  147.                 inputState.down = true;
  148.                 break;
  149.             case 2:
  150.                 inputState.right = inputState.down = true;
  151.                 break;
  152.             case 3:
  153.                 inputState.left = true;
  154.                 break;
  155.             case 5:
  156.                 inputState.right = true;
  157.                 break;
  158.             case 6:
  159.                 inputState.up = inputState.left = true;
  160.                 break;
  161.             case 7:
  162.                 inputState.up = true;
  163.                 break;
  164.             case 8:
  165.                 inputState.up = inputState.right = true;
  166.                 break;
  167.         }
  168.  
  169.         var me = GameController.GetPlayer(device);
  170.  
  171.         if (me.diedThisFrame)
  172.         {
  173.             me.diedThisFrame = false;
  174.             SetReward(-1f);
  175.         }
  176.         if (me.character == null)
  177.             return;
  178.  
  179.  
  180.         if (me.hitSomeoneThisFrame > 0)
  181.         {
  182.             me.hitSomeoneThisFrame = 0;
  183.             SetReward(0.35f + me.hitSomeoneThisFrame * 0.4f);
  184.         }
  185.  
  186.         if (me.ScoreThisFrame > 0)
  187.         {
  188.             me.ScoreThisFrame = 0;
  189.             AddReward(0.4f + me.ScoreThisFrame * 0.5f);
  190.         }
  191.  
  192.         if (me.gotHitThisFrame)
  193.         {
  194.             me.gotHitThisFrame = false;
  195.             SetReward(-0.4f);
  196.         }
  197.  
  198.         if (me.tongueMissedThisFrame)
  199.         {
  200.             me.tongueMissedThisFrame = false;
  201.             AddReward(-0.3f);
  202.         }
  203.  
  204.         if (me.tongueHitTerrainThisFrame)
  205.         {
  206.             me.tongueHitTerrainThisFrame = false;
  207.             AddReward(-0.1f);
  208.         }
  209.  
  210.         if (me.missedAttackThisFrame)
  211.         {
  212.             me.missedAttackThisFrame = false;
  213.             AddReward(-0.1f);
  214.         }
  215.  
  216.         if (me.startedJumpThisFrame)
  217.         {
  218.             me.startedJumpThisFrame = false;
  219.             AddReward(-0.035f);
  220.         }
  221.  
  222.         if (me.character != null && closestEnemy != null)
  223.         {
  224.             float dist = 0f;
  225.             if (lastClosestEnemy != null)
  226.             {
  227.                 dist = Vector3.Distance(me.character.transform.position, lastClosestEnemy.transform.position);
  228.                 if (closestEnemy == lastClosestEnemy)
  229.                 {
  230.                     if (dist < lastDist)
  231.                     {
  232.                         AddReward(0.01f);
  233.                     }
  234.                 }
  235.             }
  236.             lastClosestEnemy = closestEnemy;
  237.             lastDist = dist;
  238.         }
  239.  
  240.  
  241.  
  242.         if (me.spawnedThisFrame)
  243.         {
  244.             me.spawnedThisFrame = false;
  245.             if (Application.isEditor)
  246.                 print("Reset");
  247.             Done();
  248.         }
  249.  
  250.  
  251.  
  252.  
  253.     }
  254.  
  255.     public override void AgentReset()
  256.     {
  257.  
  258.     }
  259.  
  260.     public override void AgentOnDone()
  261.     {
  262.  
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement