public void FinalizeCharacterRound()
        {
            BattleGUI.End();
            bPlayerMustSelectAction       = false;
            selectedCharTurn.bIsCompleted = true;

            if (selectedCharTurn.character.bSaveAP)
            {
                var       MaxAP      = selectedCharTurn.character.trueSTATChart().currentPassiveStats[(int)STATChart.PASSIVESTATS.AP];
                BasicTile finalTile  = selectedCharTurn.returnCompleteArea().Find(t => t.mapPosition.Location == PathMoveHandler.finalPos.ToPoint());
                var       expendedAP = selectedCharTurn.characterArea.IndexOf(selectedCharTurn.characterArea.Find(area => area.Contains(finalTile))) + 1;
                selectedCharTurn.character.statChart.currentActiveStats[(int)STATChart.ACTIVESTATS.STORED_AP] += MaxAP - expendedAP;
            }

            //Console.WriteLine(selectedCharTurn.character.statChart.currentActiveStats[(int)STATChart.ACTIVESTATS.STORED_AP]);
            BattleScriptHandler.Execute(LUA.LuaBScriptEvent.EventType.postCT, this.toLuaTurnSetInfo());
            EncounterInfo.ClearDeathChars();

            selectedCharTurn = null;
            EncounterInfo.UpdateAllStats();
        }
        public void Start()
        {
            bIsCompleted     = true;
            selectedCharTurn = null;
            GenerateTurns();
            BattleGUI.UpdateGUIElements();

            if (bIsPlayerTurnSet)
            {
                BattleScriptHandler.Execute(LUA.LuaBScriptEvent.EventType.startPT, this.toLuaTurnSetInfo());
            }
            else
            {
                BattleScriptHandler.Execute(LUA.LuaBScriptEvent.EventType.startET, this.toLuaTurnSetInfo());
            }

            PlayerController.previousSelected        = null;
            groupTurnSet.ForEach(gts => gts.stepsSet = 0);
            EncounterInfo.UpdateAllStats();
            selectedCharTurn = null;
            bFirstTurn       = false;
            PlayerController.selectedSprite = null;
        }
Example #3
0
        public static void AIPreCalculate(List <BasicTile> moveRadius, CharacterTurn ct)
        {
            BaseCharacter            caster = ct.character;
            List <List <BasicTile> > abilityRangesAttack        = new List <List <BasicTile> >();
            List <List <BasicTile> > abilityRangesSupport       = new List <List <BasicTile> >();
            List <BaseCharacter>     possibleTargetCharsAttack  = new List <BaseCharacter>();
            List <BaseCharacter>     possibleTargetCharsSupport = new List <BaseCharacter>();

            List <BaseCharacter> possibleAITargetsAttack  = new List <BaseCharacter>();
            List <BaseCharacter> possibleAITargetsSupport = new List <BaseCharacter>();

            possibleAITargets.Clear();

            List <BasicAbility> attackAbilities  = caster.AbilityList().FindAll(abi => abi.abilityType == (int)BasicAbility.ABILITY_TYPE.ATTACK);
            List <BasicAbility> supportAbilities = caster.AbilityList().FindAll(abi => abi.abilityType == (int)BasicAbility.ABILITY_TYPE.SUPPORT);
            bool bCharHasSupportAbis             = supportAbilities.Count > 0;

            #region supportCheck
            if (bCharHasSupportAbis)
            {
                var listOfCharactersTemp = ct.parentTS.charactersInGroup;

                foreach (var character in listOfCharactersTemp)
                {
                    if (character.bIsAlive)
                    {
                        possibleTargetCharsSupport.Add(character);
                    }
                }

                foreach (var ability in supportAbilities)
                {
                    foreach (var character in possibleTargetCharsSupport)
                    {
                        if (character.NeedsHealing(3))
                        {
                            abilityRangesSupport.Add(MapListUtility.returnValidMapRadius(ability.abilityMinRange, ability.abilityMaxRange, CombatProcessor.zoneTiles, (character.position / 64).ToPoint().ToVector2() * 64));
                            Vector2 positionGridCaster = new Vector2((int)(caster.position.X / 64), (int)(caster.position.Y / 64));
                            var     test = abilityRangesSupport[abilityRangesSupport.Count - 1].Find(t => moveRadius.Contains(t) || (t.positionGrid.X == positionGridCaster.X && t.positionGrid.Y == positionGridCaster.Y));
                            if (test != null)
                            {
                                if (!possibleAITargetsSupport.Contains(character))
                                {
                                    possibleAITargetsSupport.Add(character);
                                }
                            }
                        }
                    }
                }
            }


            #endregion

            var listOfCharacters = ct.parentTS.targetGroups[GamePlayUtility.Randomize(0, ct.parentTS.targetGroups.Count - 1)].charactersInGroup;

            if (attackAbilities.Count != 0)
            {
                foreach (var character in listOfCharacters)
                {
                    if (character.bIsAlive)
                    {
                        possibleTargetCharsAttack.Add(character);
                    }
                }
            }

            if (possibleAITargetsSupport.Count == 0 && attackAbilities.Count != 0)
            {
                bCharHasSupportAbis = false; //If nothing is in need of healing, try prioiritize attacking instead.
            }


            foreach (var ability in attackAbilities)
            {
                if (ability.IsAbilityAvailable(caster.trueSTATChart()))
                {
                    if (ability.abilityFightStyle == (int)BasicAbility.ABILITY_CAST_TYPE.MELEE)
                    {
                        foreach (var character in possibleTargetCharsAttack)
                        {
                            abilityRangesAttack.Add(MapListUtility.returnValidMapRadius(ability.abilityMinRange, ability.abilityMaxRange, CombatProcessor.zoneTiles, (character.position / 64).ToPoint().ToVector2() * 64));
                            Vector2 positionGridCaster = new Vector2((int)(caster.position.X / 64), (int)(caster.position.Y / 64));
                            var     test = abilityRangesAttack[abilityRangesAttack.Count - 1].Find(t => moveRadius.Contains(t) || (t.positionGrid.X == positionGridCaster.X && t.positionGrid.Y == positionGridCaster.Y));
                            if (test != null)
                            {
                                if (!possibleAITargetsAttack.Contains(character))
                                {
                                    possibleAITargetsAttack.Add(character);
                                }
                            }
                        }
                    }
                    else if (ability.abilityFightStyle == (int)BasicAbility.ABILITY_CAST_TYPE.RANGED || ability.abilityFightStyle == (int)BasicAbility.ABILITY_CAST_TYPE.MAGIC)
                    {
                        abilityRangesAttack.Add(MapListUtility.returnValidMapRadius(ability.abilityMinRange, ability.abilityMaxRange, CombatProcessor.zoneTiles, (caster.position / 64).ToPoint().ToVector2() * 64));

                        foreach (var item in possibleTargetCharsAttack)
                        {
                            if (ability.abilityCanHitTargetInRange(caster, item))
                            {
                                if (!possibleAITargetsAttack.Contains(item))
                                {
                                    possibleAITargetsAttack.Add(item);
                                }
                            }
                        }
                    }
                    //else if (ability.abilityFightStyle == (int)BasicAbility.ABILITY_CAST_TYPE.RANGED)
                    //{
                    //    abilityRanges.Add(MapListUtility.returnValidMapRadius(ability.abilityMinRange, ability.abilityMaxRange, CombatProcessor.zoneTiles, (caster.position / 64).ToPoint().ToVector2() * 64));

                    //    foreach (var item in heroCharactersStillAlive)
                    //    {
                    //        if (ability.abilityCanHitTargetInRange(caster, item))
                    //        {
                    //            if (!possibleAITargets.Contains(item))
                    //            {
                    //                possibleAITargets.Add(item);
                    //            }
                    //        }
                    //    }
                    //}
                }
            }

            if (!bCharHasSupportAbis)
            {
                possibleAITargets = new List <BaseCharacter>(possibleAITargetsAttack);
            }
            else
            {
                bool  bShouldSupport        = false;
                float percentageSupportAbis = (float)((float)supportAbilities.Count / (float)caster.AbilityList().Count);
                float percentageAttackAbis  = 1 - percentageSupportAbis;
                percentageSupportAbis *= 100f;
                percentageAttackAbis  *= 100f;
                int amountOfEnemies      = possibleAITargetsAttack.Count();
                int amountOfAlliesInNeed = possibleAITargetsSupport.Count();
                if (amountOfAlliesInNeed > amountOfEnemies)
                {
                    int percent = GamePlayUtility.Randomize(30, (int)(percentageSupportAbis + 20));
                    if (percent > GamePlayUtility.Randomize(40, 70))
                    {
                        bShouldSupport = true;
                    }
                }

                if (bShouldSupport)
                {
                    possibleAITargets = new List <BaseCharacter>(possibleAITargetsSupport);
                    bDoSupport        = true;
                }
                else if (possibleTargetCharsAttack.Count != 0)
                {
                    possibleAITargets = new List <BaseCharacter>(possibleAITargetsAttack);
                    bDoSupport        = false;
                }
            }
        }
 internal MindControlInfo(CharacterTurn ct, TurnSet ogFrom, TurnSet currentlyIn)
 {
     this.ct          = ct;
     this.ogFrom      = ogFrom;
     this.currentlyIn = currentlyIn;
 }
        public void Update()
        {
            var gts = groupTurnSet.Find(g => !g.bIsCompleted);

            //CombatProcessor.encounterEnemies

            if (bIsPlayerTurnSet && !EncounterInfo.currentTurn().bPlayerTurnEnemyOverriden&& !BattleGUI.bIsRunning && !bSelectingArea)
            {
                if (!KeyboardMouseUtility.AnyButtonsPressed() && Keyboard.GetState().IsKeyDown(Keys.X))
                {
                    var temp = EncounterInfo.encounterGroups.FindAll(eg => eg.bIsPlayerTurnSet);
                    foreach (var item in temp)
                    {
                        item.bIsCompleted = true;
                    }
                }

                if (EncounterInfo.currentTurn().selectedCharTurn != null && bRegenerateRadius)
                {
                    RegenerateRadius();
                }

                currentEnemy = null;


                if (selectedCharTurn != null && !selectedCharTurn.bIsCompleted)
                {
                    var tempTile = selectedCharTurn.returnCompleteArea().Find(t => t.mapPosition.Contains(GameProcessor.EditorCursorPos));
                    if (tempTile != null)
                    {
                        if (CombatArrowLayout.bShouldRecheck(tempTile))
                        {
                            CombatArrowLayout.Start(tempTile, selectedCharTurn);
                        }
                    }
                    else
                    {
                        CombatArrowLayout.bMustDraw = false;
                        CombatArrowLayout.Clear();
                    }
                }
                else
                {
                    if (CombatArrowLayout.CanClear())
                    {
                        CombatArrowLayout.Clear();
                    }
                }
            }
            else if (bIsPlayerTurnSet && BattleGUI.bIsRunning)
            {
            }
            else if (bIsEnemyTurnSet || EncounterInfo.currentTurn().bPlayerTurnEnemyOverriden)
            {
                UpdateEnemyLogic(gts);
            }

            if (bSelectingArea)
            {
            }

            if (gts == null)
            {
                bIsCompleted = true;
            }

            if (bIsCompleted && !bPlayerTurnEnemyOverriden && !LUA.LuaExecutionList.DemandOverride() && !PathMoveHandler.bIsBusy && BattleGUI.TurnEffectsList.Find(te => te.bMustShow) == default(ChangeTurnEffect))
            {
                ResetAndChangeGroup();
            }
        }
        internal void UpdateEnemyLogic(CharacterTurn gts)
        {
            if (!PathMoveHandler.bIsBusy)
            {
                PathMoveHandler.SkipPathMovement();
            }
            if (gts != null && !LUA.LuaExecutionList.DemandOverride() && !PathMoveHandler.bIsBusy && !bTest && BattleGUI.TurnEffectsList.Find(te => te.bMustShow) == null)
            {
                if (bPlayerTurnEnemyOverriden)
                {
                    gts = currentEnemy;
                }

                if (GameProcessor.cameraFollowTarget != gts.character)
                {
                    GameProcessor.cameraFollowTarget = gts.character;
                }

                bTest = true;
                //randomEnemy = GamePlayUtility.Randomize(0, CombatProcessor.heroCharacters.Count - 1);
                selectedCharTurn = null;
                currentEnemy     = gts;
                AIUtility.AIPreCalculate(gts.returnCompleteArea(), gts);
                //AIUtility.Report(AIBehaviour.ProcessBehaviour(currentEnemy.character,AIUtility.possibleAITargets));
                BaseCharacter target = null;
                var           temp   = AIBehaviour.ProcessBehaviour(currentEnemy.character, AIUtility.possibleAITargets);
                if (temp.Count != 0)
                {
                    target = AIUtility.SelectTargetBasedOnBehaviour(temp);
                }

                var playableMap = GameProcessor.loadedMap.possibleTilesGameZoneForEnemy(CombatProcessor.zoneTiles, currentEnemy.character);

                var beep = new KeyValuePair <List <List <BasicTile> >, List <BasicAbility> >();
                if (target != null)
                {
                    // var beep = AIUtility.returnTilesToAttackFrom(CombatProcessor.zoneTiles,gts.character,target);
                    beep = AIUtility.returnTilesToAttackFrom(gts.returnCompleteArea(), playableMap, gts.character, target);

                    while (beep.Key.Count == 0 && beep.Value.Count == 0 && AIUtility.possibleAITargets.Count - 1 > 0)
                    {
                        AIUtility.possibleAITargets.Remove(target);
                        target = AIUtility.SelectTargetBasedOnBehaviour(AIBehaviour.ProcessBehaviour(currentEnemy.character, AIUtility.possibleAITargets));
                        beep   = AIUtility.returnTilesToAttackFrom(playableMap, playableMap, gts.character, target);
                    }
                }

                if (target != null && beep.Key.Count == 0 && beep.Value.Count == 0)
                {
                    target = null;
                }

                gts.ReGenerateTurn(playableMap);

                List <Node> allPossibleNodes;
                if (target != null)
                {
                    //allPossibleNodes = PathFinder.NewPathSearch(gts.character.position, target.position + new Vector2(64, 0), playableMap);
                    var enemyFavor = AIUtility.returnFavoredAttackAndPosition(beep, gts.character, target);
                    if (enemyFavor.Key != null)
                    {
                        allPossibleNodes = PathFinder.NewPathSearch(gts.character.position, enemyFavor.Key.mapPosition.Location.ToVector2(), playableMap);
                    }
                    else
                    {
                        allPossibleNodes = null;
                    }
                    AITarget = target;
                    AIbtba   = enemyFavor;
                }
                else
                {
                    List <int>   amountOfCharsForEachGroup = new List <int>();
                    List <float> percentagesForEachGroup   = new List <float>();
                    int          totalChars = 0;
                    foreach (var item in gts.parentTS.targetGroups)
                    {
                        int tempCount = item.charactersInGroup.FindAll(c => c.IsAlive()).Count;
                        totalChars += tempCount;
                        amountOfCharsForEachGroup.Add(tempCount);
                    }

                    foreach (var item in amountOfCharsForEachGroup)
                    {
                        percentagesForEachGroup.Add(((float)item / (float)totalChars) * 100);
                    }

                    TurnSet targetGroup = null;
                    int     tempIndex   = 0;
                    while (targetGroup == null)
                    {
                        int randomNumber = GamePlayUtility.Randomize(0, 100);
                        if (percentagesForEachGroup[tempIndex] >= randomNumber)
                        {
                            targetGroup = targetGroups[tempIndex];
                        }
                        tempIndex++;
                        if (tempIndex > percentagesForEachGroup.Count)
                        {
                            targetGroup = targetGroups[0];
                        }
                    }

                    BaseCharacter randomCharacter = targetGroup.charactersInGroup.FindAll(c => c.IsAlive())[GamePlayUtility.Randomize(0, targetGroup.charactersInGroup.FindAll(c => c.IsAlive()).Count)];

                    allPossibleNodes = PathFinder.NewPathSearch(gts.character.position, randomCharacter.position + new Vector2(64, 0), playableMap);
                }
                if (allPossibleNodes != null)
                {
                    CombatProcessor.what = new List <Node>(allPossibleNodes);
                    var NodesWithinRange = MapListUtility.findEqualNodesToTileList(allPossibleNodes, gts.returnCompleteArea());
                    PathMoveHandler.Start(gts.character, NodesWithinRange);
                }

                //FinalizeEnemyRound();
            }

            if (gts != null && !PathMoveHandler.bIsBusy && bTest && !GameProcessor.bStartCombatZoom)
            {
                //THIS IS THE VERY LAST LINE BEFORE AN ENEMY HAS IT'S TURN COMPLETED
                if (!AIbtba.Equals(default(KeyValuePair <BasicTile, BasicAbility>)))
                {
                    if ((AIbtba.Key == null || AIbtba.Key.mapPosition.Location.ToVector2() == gts.character.position) && AIbtba.Value.abilityCanHitTargetInRange(gts.character, AITarget) && AIbtba.Value.IsAbilityAvailable(gts.character.trueSTATChart()))
                    {
                        FaceCharacterInCorrectDirection(gts.character, AITarget);

                        GameProcessor.StartBattleSoon(gts.character, AITarget, gts.character.AbilityList().IndexOf(AIbtba.Value));
                        //GameProcessor.StartBattleSoon(gts.character, AITarget, gts.character.AbilityList().IndexOf(gts.character.AbilityList().Find(ba => ba.abilityName.Equals(AIbtba.Value.abilityName))));
                    }
                    else
                    {
                        if (!currentEnemy.character.attackedAsAI)
                        {
                            LastDitchEffortAttack();
                        }
                        else
                        {
                            FinalizeEnemyRound();
                        }
                    }
                }
                else
                {
                    if (!currentEnemy.character.attackedAsAI)
                    {
                        LastDitchEffortAttack();
                    }
                    else
                    {
                        FinalizeEnemyRound();
                    }
                }
                //
            }
            else if (gts == null)
            {
                if (bPlayerTurnEnemyOverriden)
                {
                    bPlayerTurnEnemyOverriden = false;
                }
            }
        }
        public void TabSelect()
        {
            if (!bPlayerMustSelectAction && !PathMoveHandler.bIsBusy)
            {
                if (EncounterInfo.currentTurn().selectedCharTurn != null)
                {
                    PlayerController.previousSelected = EncounterInfo.currentTurn().selectedCharTurn.character;
                }
                else
                {
                    PlayerController.previousSelected = null;
                }

                //   selectedCharTurn = groupTurnSet.Find(sct => sct.character == CombatProcessor.heroCharacters.Find(c => c.spriteGameSize.Contains(GameProcessor.EditorCursorPos)) && !sct.bIsCompleted);
                int index          = 0;
                var availableChars = groupTurnSet.FindAll(ct => !ct.bIsCompleted);
                if (availableChars.Count == 0)
                {
                    selectedCharTurn = availableChars[index];
                }
                else
                {
                    index = availableChars.IndexOf(EncounterInfo.currentTurn().selectedCharTurn);
                    if (index == -1)
                    {
                        index = 0;
                    }
                    else if (index + 1 != availableChars.Count)
                    {
                        index++;
                    }
                    else
                    {
                        index = 0;
                    }

                    selectedCharTurn = availableChars[index];
                }


                var v = PlayerController.originalPositionCharacter;
                if (selectedCharTurn != null && !selectedCharTurn.bIsCompleted && selectedCharTurn.character != PlayerController.selectedSprite || (bFirstTurn && selectedCharTurn != null))
                {
                    var selectedChar = EncounterInfo.currentTurn().selectedCharTurn.character;
                    if (PlayerController.previousSelected != null && !EncounterInfo.currentTurn().groupTurnSet.Find(gts2 => gts2.character == PlayerController.previousSelected).bIsCompleted&& !bFirstTurn)
                    {
                        //PlayerController.previousSelected.position = PlayerController.originalPositionCharacter;
                        PlayerController.previousSelected.changePosition(PlayerController.originalPositionCharacter);
                        groupTurnSet.Find(sct => sct.character == PlayerController.previousSelected).stepsSet = 0;
                    }
                    PlayerController.selectedSprite  = selectedChar;
                    GameProcessor.cameraFollowTarget = selectedChar;
                    bFirstTurn = false;
                    PlayerController.originalPositionCharacter = selectedChar.position;
                    //   GameProcessor.sceneCamera = ((new Vector2(-(selectedChar.position.X + 32 - 1366 / GameProcessor.zoom / 2), -(selectedChar.position.Y + 32 - 768 / GameProcessor.zoom / 2))));
                    ReGenerateTurn();
                }
                if (selectedCharTurn != null && selectedCharTurn.bIsCompleted)
                {
                    var selectedChar = EncounterInfo.currentTurn().selectedCharTurn.character;
                    // GameProcessor.sceneCamera = ((new Vector2(-(selectedChar.position.X + 32 - 1366 / GameProcessor.zoom / 2), -(selectedChar.position.Y + 32 - 768 / GameProcessor.zoom / 2))));
                }
                if (selectedCharTurn == null)
                {
                    if (PlayerController.previousSelected != null && !EncounterInfo.currentTurn().groupTurnSet.Find(gts2 => gts2.character == PlayerController.previousSelected).bIsCompleted&& !bFirstTurn)
                    {
                        PlayerController.previousSelected.changePosition(PlayerController.originalPositionCharacter);
                        groupTurnSet.Find(sct => sct.character == PlayerController.previousSelected).stepsSet = 0;
                    }
                    // PlayerController.selectedSprite.position = PlayerController.originalPositionCharacter;

                    bFirstTurn = true;
                    GameProcessor.cameraFollowTarget = null;
                }
            }
        }