GoodNoodle

RunTurnesState

Sep 30th, 2023 (edited)
977
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.68 KB | Source Code | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. using Utils.StateMachine;
  7.  
  8. public class RunTurnState : State<BattleSystem>
  9. {
  10.     public static RunTurnState i { get; private set; }
  11.  
  12.     BattleSystem bs;
  13.  
  14.     Battleunit playerUnit;
  15.     Battleunit enemyUnit;
  16.  
  17.     PartyScreen partyScreen;
  18.  
  19.     BattleDialogueBox dialoguebox;
  20.  
  21.  
  22.     bool isTrainerBattle;
  23.  
  24.     Party playerParty;
  25.     Party trainerParty;
  26.  
  27.     GameController gc;
  28.  
  29.     BattleState state;
  30.  
  31.     Beastiery bestiery;
  32.  
  33.  
  34.     private void Awake()
  35.     {
  36.         gc = GetComponent<GameController>();
  37.         i = this;
  38.         bestiery = FindObjectOfType<Beastiery>();
  39.     }
  40.  
  41.     public override void Enter(BattleSystem owner)
  42.     {
  43.         bs = owner;
  44.  
  45.         playerUnit = bs.PlayerUnit;
  46.         enemyUnit = bs.EnemyUnit;
  47.         dialoguebox = bs.battleDialogueBox;
  48.         partyScreen = bs.PartyScreen;
  49.         isTrainerBattle = bs.IsTrainerBattle;
  50.         playerParty = bs.playerParty;
  51.         trainerParty = bs.trainerParty;
  52.  
  53.  
  54.  
  55.         InputEnter();
  56.  
  57.  
  58.         //StartCoroutine(RunTurns(bs.SelectedAction));
  59.     }
  60.  
  61.    public void InputEnter(int currentButtons = 0)
  62.     {
  63.         EventSystem.current.SetSelectedGameObject(bs.battleButtons[currentButtons].gameObject);
  64.  
  65.     }
  66.  
  67.     public IEnumerator RunTurns(BattleAction playerAction, int SelectedMove)
  68.     {
  69.        
  70.         //GetComponent<MoveSelectionUI>().UpdateMP(GetComponent<Creature>().Moves);
  71.         if (playerAction == BattleAction.Move)
  72.         {
  73.             playerUnit.Creature.CurrentMove = playerUnit.Creature.Moves[SelectedMove];
  74.             enemyUnit.Creature.CurrentMove = enemyUnit.Creature.GetRandomMove();
  75.  
  76.             bool playerGoesFirst = playerUnit.Creature.Speed >= enemyUnit.Creature.Speed;
  77.  
  78.             var firstUnit = (playerGoesFirst) ? playerUnit : enemyUnit;
  79.             var secondUnit = (playerGoesFirst) ? enemyUnit : playerUnit;
  80.  
  81.             var secondCreature = secondUnit.Creature;
  82.  
  83.             if (CheckMoveMP(firstUnit, firstUnit.Creature.CurrentMove))
  84.             {
  85.                firstUnit.Creature.MP -= firstUnit.Creature.CurrentMove.MPCost;
  86.                 Debug.Log($"current unit MP{playerUnit.Creature.MP}");
  87.                     //StartCoroutine(RunTurns(playerAction));
  88.                
  89.             }
  90.             else
  91.             {
  92.                
  93.           yield return NotEnoughMP();
  94.                 //   Debug.Log("test");
  95.                 //   dialoguebox.Enter(SelectedMove - 1);
  96.                 bs.ActionSelection();
  97.               yield break;
  98.  
  99.             }
  100.        
  101.  
  102.             // first turn
  103.  
  104.             yield return RunMove(firstUnit, secondUnit, firstUnit.Creature.CurrentMove);
  105.             yield return RunAfterTurn(firstUnit);
  106.             if (bs.isBattleOver) yield break;
  107.  
  108.             if (secondCreature.HP > 0)
  109.             {
  110.                 // second turn
  111.                 yield return RunMove(secondUnit, firstUnit, secondUnit.Creature.CurrentMove);
  112.                 yield return RunAfterTurn(secondUnit);
  113.                 if (bs.isBattleOver) yield break;
  114.             }
  115.  
  116.         }
  117.         else
  118.         {
  119.             if (playerAction == BattleAction.SwitchCreature)
  120.             {    
  121.                 yield return bs.SwitchCreature(bs.SelectedCreature);
  122.             }
  123.             else if (playerAction == BattleAction.UseItem)
  124.             {
  125.                if(bs.SelectedItem is CapsuleItem)
  126.                 {
  127.                    yield return bs.ThrowCapsule(bs.SelectedItem as CapsuleItem);
  128.                     if (bs.isBattleOver) yield break;
  129.                 }
  130.                
  131.             }
  132.             else if (playerAction == BattleAction.Flee)
  133.             {
  134.                 yield return TryToEscape();
  135.             }
  136.  
  137.             // Enemy Turn
  138.             var enemyMove = enemyUnit.Creature.GetRandomMove();
  139.             yield return RunMove(enemyUnit, playerUnit, enemyMove);
  140.             yield return RunAfterTurn(enemyUnit);
  141.             if (bs.isBattleOver) yield break;
  142.         }
  143.  
  144.         //  bs.StateMachine.ChangeState(ActionSelectionState.i);
  145.         if (!bs.isBattleOver)
  146.             bs.ActionSelection();
  147.        
  148.     }
  149.  
  150.  
  151.     IEnumerator RunMove(Battleunit sourceUnit, Battleunit tarUnit, Move move)
  152.     {
  153.         bool canRunMove = sourceUnit.Creature.OnBeforeMove();
  154.  
  155.         if (!canRunMove)
  156.         {
  157.  
  158.             yield return sourceUnit.Hud.WaitForHpUpdate();
  159.             yield break;
  160.         }
  161.  
  162.         if (CheckIfMoveHits(move, sourceUnit.Creature, tarUnit.Creature))
  163.         {
  164.  
  165.             sourceUnit.PlayAttackAnimation();
  166.             yield return new WaitForSeconds(.5f);
  167.  
  168.             Instantiate(move.Base.attackVisualEffect, tarUnit.transform.position, tarUnit.transform.rotation);
  169.             tarUnit.PLayHitAnimation();
  170.  
  171.  
  172.             if (move.Base.Catagory == MoveCatagory.Status)
  173.             {
  174.                 RunMoveEffects(move.Base.Effects, sourceUnit.Creature, tarUnit.Creature, move.Base.Target);
  175.             }
  176.             else
  177.             {
  178.                 var damageDetails = tarUnit.Creature.TakeDamage(move, sourceUnit.Creature);
  179.               StartCoroutine(ShowDamageNumber(tarUnit.GetComponent<RectTransform>().localPosition, damageDetails));
  180.                 Instantiate(bs.theDamageNumber, tarUnit.transform.position, tarUnit.transform.rotation).SetDamage(damageDetails, tarUnit.transform.position);
  181.                 yield return tarUnit.Hud.WaitForHpUpdate();
  182.  
  183.             }
  184.  
  185.             if (move.Base.Secondaries != null && move.Base.Secondaries.Count > 0 && tarUnit.Creature.HP > 0)
  186.             {
  187.                 foreach (var secondary in move.Base.Secondaries)
  188.                 {
  189.                     var rnd = UnityEngine.Random.Range(1, 100);
  190.                     if (rnd < secondary.Chance)
  191.                         RunMoveEffects(secondary, sourceUnit.Creature, tarUnit.Creature, secondary.MoveTarget);
  192.                 }
  193.             }
  194.             if (tarUnit.Creature.HP <= 0)
  195.             {
  196.                 yield return HandleFaintedUnit(tarUnit);
  197.  
  198.                if (enemyUnit)
  199.                 {
  200.                     bestiery.EnableEntryButton(2);
  201.                 }
  202.             }
  203.         }
  204.         else
  205.         {
  206.            
  207.         }
  208.  
  209.     }
  210.  
  211.  
  212.     bool CheckMoveMP(Battleunit sourceUnit, Move moveToCheck)
  213.     {
  214.         if (sourceUnit.Creature.MP >= moveToCheck.MPCost)
  215.         {
  216.             sourceUnit.Creature.MP -= moveToCheck.MPCost;
  217.             return true;
  218.         }    
  219.             return false;    
  220.     }
  221.  
  222.     public IEnumerator NotEnoughMP()
  223.     {
  224.          
  225.         yield return DialogueManager.Instance.ShowDialogText($"Not enough MP!");
  226.        
  227.  
  228.     }
  229.  
  230.     bool CheckIfMoveHits(Move move, Creature source, Creature target)
  231.     {
  232.         if (move.Base.AlwaysHits)
  233.             return true;
  234.  
  235.         float moveAccuracy = move.Base.Accuracy;
  236.  
  237.         int accuracy = source.StatBoosts[Stat.Accuracy];
  238.         int evasion = target.StatBoosts[Stat.Evasion];
  239.  
  240.         var boostValues = new float[] { 1f, 4f / 3f, 5f / 3f, 2f, 7f / 3f, 8f / 3f, 3f };
  241.  
  242.         if (accuracy > 0)
  243.             moveAccuracy *= boostValues[accuracy];
  244.         else
  245.             moveAccuracy /= boostValues[-accuracy];
  246.  
  247.         if (evasion > 0)
  248.             moveAccuracy /= boostValues[evasion];
  249.         else
  250.             moveAccuracy *= boostValues[-evasion];
  251.  
  252.         return UnityEngine.Random.Range(1, 100) <= moveAccuracy;
  253.     }
  254.  
  255.     IEnumerator RunAfterTurn(Battleunit sourceUnit)
  256.     {
  257.         if (bs.isBattleOver)  yield break;
  258.        
  259.         sourceUnit.Creature.OnAfterTurn();
  260.  
  261.         sourceUnit.Hud.WaitForHpUpdate();
  262.  
  263.         if (sourceUnit.Creature.HP <= 0)
  264.         {
  265.             yield return HandleFaintedUnit(sourceUnit);
  266.          
  267.         }
  268.     }
  269.  
  270.     IEnumerator BattleOverCheck(Battleunit faintedUnit)
  271.     {
  272.         if (faintedUnit.IsPlayerUnit)
  273.         {
  274.             var nextCreature = playerParty.GetUninjuredCreature();
  275.             if (nextCreature != null)
  276.             {
  277.                 yield return GameController.Instance.StateMachine.PushandWait(GamePartyStates.i);
  278.                 yield return bs.SwitchCreature(GamePartyStates.i.SelectedCreature);
  279.             }
  280.             else
  281.                 bs.BattleOver(false);
  282.         }
  283.         else
  284.         {
  285.             if (!isTrainerBattle)
  286.             {
  287.                 bs.BattleOver(true);
  288.             }
  289.             else
  290.             {
  291.                 var nextCreature = trainerParty.GetUninjuredCreature();
  292.                 if (nextCreature != null)
  293.                     yield break; //StartCoroutine(SendNextTrainerCreature(nextCreature));
  294.                 else
  295.                     bs.BattleOver(true);
  296.             }
  297.  
  298.         }
  299.     }
  300.  
  301.     IEnumerator HandleFaintedUnit(Battleunit faintedUnit)
  302.     {
  303.         faintedUnit.PlayDeathAnim();
  304.  
  305.         yield return new WaitForSeconds(2f);
  306.  
  307.         if (!faintedUnit.IsPlayerUnit)
  308.         {
  309.             int exp = faintedUnit.Creature.Base.ExpGain;
  310.             int enemylevel = faintedUnit.Creature.Level;
  311.             float trainerBonus = (isTrainerBattle) ? 1.5f : 1f;
  312.  
  313.             int expGain = Mathf.FloorToInt((exp * enemylevel * trainerBonus) / 7);
  314.             playerUnit.Creature.Exp += expGain;
  315.             yield return playerUnit.Hud.SetEXPSmooth();
  316.  
  317.             while (playerUnit.Creature.CheckForLevelUp())
  318.             {
  319.                 playerUnit.Hud.SetLevel();
  320.  
  321.                 //learn new move
  322.                 var newMove = playerUnit.Creature.GetMoveAtLevel();
  323.                 if (newMove != null)
  324.                 {
  325.                     if (playerUnit.Creature.Moves.Count < CreatureBase.maxMoves)
  326.                     {
  327.                         playerUnit.Creature.LearnMove(newMove.Base);
  328.                         bs.battleDialogueBox.UpdateMoveList(playerUnit.Creature.Moves);
  329.                     }
  330.                     else
  331.                     {
  332.  
  333.                     }
  334.                 }
  335.  
  336.                 yield return playerUnit.Hud.SetEXPSmooth(true);
  337.             }
  338.  
  339.             yield return new WaitForSeconds(1f);
  340.         }
  341.  
  342.        yield return BattleOverCheck(faintedUnit);
  343.     }
  344.  
  345.     void RunMoveEffects(MoveEffects effects, Creature source, Creature target, MoveTarget moveTarget)
  346.     {
  347.  
  348.         if (effects.Boosts != null)
  349.         {
  350.             if (moveTarget == MoveTarget.Self)
  351.                 source.ApplyBoosts(effects.Boosts);
  352.             else
  353.                 target.ApplyBoosts(effects.Boosts);
  354.         }
  355.  
  356.         if (effects.Status != ConditionsID.none)
  357.         {
  358.             target.SetStatus(effects.Status);
  359.         }
  360.  
  361.         if (effects.VolitileStatus != ConditionsID.none)
  362.         {
  363.             target.SetVolitileStatus(effects.VolitileStatus);
  364.         }
  365.  
  366.     }
  367.  
  368.     IEnumerator TryToEscape()
  369.     {
  370.        
  371.         if (isTrainerBattle)
  372.         {
  373.             yield break;
  374.         }
  375.         ++bs.EscapeAttempts;
  376.  
  377.         int playerspeed = playerUnit.Creature.Speed;
  378.         int enemyspeed = enemyUnit.Creature.Speed;
  379.  
  380.         if (enemyspeed < playerspeed)
  381.         {
  382.             bs.BattleOver(true);
  383.         }
  384.         else
  385.         {
  386.             float f = (playerspeed * 128 / enemyspeed + 30 * bs.EscapeAttempts);
  387.             f = f % 256;
  388.  
  389.             if (UnityEngine.Random.Range(0, 255) < f)
  390.             {
  391.                 bs.BattleOver(true);
  392.             }
  393.         }
  394.     }
  395.  
  396.    public  IEnumerator ShowDamageNumber(Vector3 pos, int damage) {
  397.    
  398.     bs.theDamageNumber.gameObject.SetActive(true);
  399.  
  400.     bs.theDamageNumber.SetDamage(damage, pos);
  401.     yield return new WaitForSeconds(1f);
  402.  
  403.     bs.theDamageNumber.gameObject.SetActive(false);
  404.  
  405.     }
  406.  
  407. }
  408.  
Add Comment
Please, Sign In to add comment