Ejemplo n.º 1
0
        /// <summary>
        /// Used as an Update method for the Room class while the Play class is in the EnemyTurn state
        /// </summary>
        /// <param name="player">The current player for the enemies to target</param>
        public PlayState TakeEnemyTurn(Player player, GameTime time)
        {
            //Update the current anuimation
            if (currentAttacker < 5 && enemies[currentAttacker] != null && !enemies[currentAttacker].Animation.IsDone)
            {
                enemies[currentAttacker].Animation.UpdateAnimation(time);
                //If the animation just finished increase the currentAttacker
                if (enemies[currentAttacker].Animation.IsDone)
                {
                    currentAttacker++;
                }
                return(PlayState.EnemyTurn);
            }
            else
            {
                //Let the current attacker take their turn
                //If enemies[currentAttacker] is non-null and alive then let that enemy take it's turn
                //Otherwise only increase currentAttacker
                Ability usedAbility;
                switch (currentAttacker)
                {
                    #region Enemy turn
                case 0:
                    if (enemies[0] != null && enemies[0].IsActive)
                    {
                        enemies[0].TurnStart();
                        //End the current enemy's turn if they just died (like to poison)
                        if (!enemies[0].IsActive)
                        {
                            currentAttacker++; break;
                        }
                        enemies[0].AttackPre(player);
                        usedAbility = enemies[0].AttackPlayer();
                        enemies[0].AttackPost(player);
                        enemies[0].TurnEnd();
                        //Update the animation and description
                        description = String.Format("{0} used {1}", enemies[0].Name, usedAbility.Name);
                        enemies[0].Animation.ResetAnimation(player.Position, usedAbility.Color);
                    }
                    else
                    {
                        currentAttacker++;
                    }
                    break;

                case 1:
                    if (enemies[1] != null && enemies[1].IsActive)
                    {
                        enemies[1].TurnStart();
                        if (!enemies[1].IsActive)
                        {
                            currentAttacker++; break;
                        }
                        enemies[1].AttackPre(player);
                        usedAbility = enemies[1].AttackPlayer();
                        enemies[1].TurnEnd();
                        description = String.Format("{0} used {1}", enemies[1].Name, usedAbility.Name);
                        enemies[1].Animation.ResetAnimation(player.Position, usedAbility.Color);
                    }
                    else
                    {
                        currentAttacker++;
                    }
                    break;

                case 2:
                    if (enemies[2] != null && enemies[2].IsActive)
                    {
                        enemies[2].TurnStart();
                        if (!enemies[2].IsActive)
                        {
                            currentAttacker++; break;
                        }
                        enemies[2].AttackPre(player);
                        usedAbility = enemies[2].AttackPlayer();
                        enemies[2].AttackPost(player);
                        enemies[2].TurnEnd();
                        description = String.Format("{0} used {1}", enemies[2].Name, usedAbility.Name);
                        enemies[2].Animation.ResetAnimation(player.Position, usedAbility.Color);
                    }
                    else
                    {
                        currentAttacker++;
                    }
                    break;

                case 3:
                    if (enemies[3] != null && enemies[3].IsActive)
                    {
                        enemies[3].TurnStart();
                        if (!enemies[3].IsActive)
                        {
                            currentAttacker++; break;
                        }
                        enemies[3].AttackPre(player);
                        usedAbility = enemies[3].AttackPlayer();
                        enemies[3].AttackPost(player);
                        enemies[3].TurnEnd();
                        description = String.Format("{0} used {1}", enemies[3].Name, usedAbility.Name);
                        enemies[3].Animation.ResetAnimation(player.Position, usedAbility.Color);
                    }
                    else
                    {
                        currentAttacker++;
                    }
                    break;

                case 4:
                    if (enemies[4] != null && enemies[4].IsActive)
                    {
                        enemies[4].TurnStart();
                        if (!enemies[4].IsActive)
                        {
                            currentAttacker++; break;
                        }
                        enemies[4].AttackPre(player);
                        usedAbility = enemies[4].AttackPlayer();
                        enemies[4].AttackPost(player);
                        enemies[4].TurnEnd();
                        description = String.Format("{0} used {1}", enemies[4].Name, usedAbility.Name);
                        enemies[4].Animation.ResetAnimation(player.Position, usedAbility.Color);
                    }
                    else
                    {
                        currentAttacker++;
                    }
                    break;

                //Once all enemies havce taken their turn end the enemy turn
                default:
                    //Returns the player to their turn if there are still live enemies
                    foreach (Enemy enemy in enemies)
                    {
                        if (enemy != null && enemy.IsActive)
                        {
                            currentAttacker = 0;
                            return(PlayState.PlayerInput);
                        }
                    }
                    //Sends the player to the safe room if all enemies are dead
                    currentAttacker = 0;
                    roomHandler     = RoomCleared;
                    if (roomHandler != null)
                    {
                        RoomCleared();
                    }
                    return(PlayState.CombatEnd);

                    #endregion
                    //Checks if all enemies have been defeated after they have all had a chance to take their turn
                }

                //Continues the enemies' turn if they haven't all finished and the player is still alive
                if (player.IsActive)
                {
                    return(PlayState.EnemyTurn);
                }
                //Ends combat if the player has died
                else
                {
                    return(PlayState.CombatEnd);
                }
            }
        }
Ejemplo n.º 2
0
 public bool ForEachRoom(RoomDelegate action)
 {
     List<pos> completed = new List<pos>();
     for(int i=1;i<H-1;++i){
         for(int j=1;j<W-1;++j){
             pos p = new pos(i,j);
             bool good = true;
             foreach(pos neighbor in p.PositionsWithinDistance(1,map)){ //assumes at least 3x3 rooms. this might need to change in the future.
                 if(!map[neighbor].IsRoomType()){
                     good = false;
                     break;
                 }
             }
             if(good && !completed.Contains(p)){
                 List<pos> room = map.GetFloodFillPositions(p,false,x=>map[x].IsRoomType());
                 if(!action(room)){
                     //return false;
                 }
                 foreach(pos p2 in room){
                     completed.Add(p2);
                 }
             }
         }
     }
     return true;
 }
 public bool ForEachRoom(RoomDelegate action)
 {
     int[,] rooms = new int[H,W];
     for(int i=0;i<H;++i){
         for(int j=0;j<W;++j){
             if(IsRoom(i,j)){
                 rooms[i,j] = 0;
             }
             else{
                 rooms[i,j] = -1;
             }
         }
     }
     int next_room_number = 1;
     for(int i=0;i<H-3;++i){
         for(int j=0;j<W-3;++j){
             if(rooms[i,j] == -1 && rooms[i+1,j+1] == 0 && rooms[i+2,j+2] == 0){ //checks 2 spaces down and right
                 rooms[i+1,j+1] = next_room_number;
                 for(bool done=false;!done;){
                     done = true;
                     for(int s=i+1;s<H-1;++s){
                         for(int t=j+1;t<W-1;++t){
                             if(rooms[s,t] == next_room_number){
                                 for(int u=s-1;u<=s+1;++u){
                                     for(int v=t-1;v<=t+1;++v){
                                         if(u != s || v != t){
                                             if(rooms[u,v] == 0){
                                                 rooms[u,v] = next_room_number;
                                                 done = false;
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 ++next_room_number;
             }
         }
     }
     for(int k=1;k<next_room_number;++k){
         int start_r = 999;
         int start_c = 999;
         int end_r = -1;
         int end_c = -1;
         for(int i=1;i<H-1;++i){
             for(int j=1;j<W-1;++j){
                 if(rooms[i,j] == k){
                     if(i < start_r){
                         start_r = i;
                     }
                     if(i > end_r){
                         end_r = i;
                     }
                     if(j < start_c){
                         start_c = j;
                     }
                     if(j > end_c){
                         end_c = j;
                     }
                 }
             }
         }
         if(!action(start_r,start_c,end_r,end_c)){
             return false;
         }
     }
     return true;
 }