/// <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); } } }
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; }