Пример #1
0
		public static void			DoBattle(NPC_Model enemy, bool playerIsAttacker = false)
		{
			BattleInitiation(enemy, playerIsAttacker);
			
			var enemyIsTryingToEscape = false;
			var playerIsTryingToEscape = false;
			var battleIsEnded = false;
			var cargoDropped = 0;
			droppedTraderCargo = new CargoDrop();

			while (!battleIsEnded)
			{
				#region Player's Action

				var action = Get_FightMenuResult(enemy);
				EventLog.ShadowOldMessages();

				if		(action == Menu_Attack_Laser)		DoAttack(Player, enemy, enemy, AttackType.Laser);
				else if (action == Menu_Attack_Missile)		DoAttack(Player, enemy, enemy, AttackType.Missile);
				else if (action == Menu_RunAway)		{	EventLog.Print("Battle_TryToEscape");	playerIsTryingToEscape = true;	}
				else if (action == Menu_ScoopCargo)		{	ScoopDroppedCargo(true);				battleIsEnded = true;			}
				else if (action == Menu_DropAllCargo)
				{
					cargoDropped = Player.CurrentCargo.CurrentLoad;
					Player.CurrentCargo.Clear();
					battleIsEnded = cargoDropped >= GameConfig.MaxDropCargoBonus;
					EventLog.Print(battleIsEnded ? "Battle_DroppedAllCargoEscaped" : "Battle_DroppedCargoTryToEscape");
					playerIsTryingToEscape = true;
					PlayerStats.Draw_PlayerStats();
					ZIOX.PressAnyKey(battleIsEnded);
					
				}
				if (action.StartsWith(Menu_DropOneCargo))
				{
					var result = Enums.Get_Value<Merchandise>(action.Substring(Menu_DropOneCargo.Length));
					EventLog.Print("Battle_DroppedOneCargo", Enums.Get_Name(result));
					Player.CurrentCargo[result]--;
					cargoDropped = 1;
					playerIsTryingToEscape = true;
					PlayerStats.Draw_PlayerStats();
				}				

				#endregion

				#region Enemy's Action

				if (battleIsEnded)
					break;
				droppedTraderCargo.Clear();

				if (enemy.CurrentHP > 0)
				{
					if ((enemy.CurrentHP < GameConfig.EnemyPanicLevel  ||  (enemy.NPC_Type == NPC_Type.Trader  &&  enemy.CurrentHP < enemy.MaxHP / 2))  &&  enemy.NPC_Type != NPC_Type.Alien  &&  enemy.EscapeChance > 0)
					{
						#region Enemy is trying to escape

						if (!enemyIsTryingToEscape)
						{
							if (enemy.NPC_Type == NPC_Type.Trader)
							{
								#region Trader Cargo Drop

								var enemyCargoDropped = RNG.GetDice() <= GameConfig.TraderDropChance;
								if (enemyCargoDropped)
								{
									EventLog.Print("Battle_EnemyDroppedCargo", enemy.Name);
									droppedTraderCargo = enemy.CurrentCargo.GetRandonDrop(0);
									ShowDroppedCargo();
									EventLog.Print("Battle_ScoopCargoOrLoseIt");
								}
								else
									EventLog.Print("Battle_EnemyRunsAway", enemy.Name);
								
								#endregion								
							}
							else
								EventLog.Print("Battle_EnemyRunsAway", enemy.Name);
							enemyIsTryingToEscape = true;
						}
						else
						{
							battleIsEnded = RNG.GetDice() <= GameConfig.PlayerEscapeChance;
							EventLog.Print(battleIsEnded ? "Battle_EnemyEscapeSuccess"
														 : "Battle_EnemyEscapeFail", enemy.Name);
						}

						#endregion
					}
					else
					{
						#region Enemy's Attack

						var willMakeShot = (enemy.NPC_Type != NPC_Type.Pirate || cargoDropped == 0)  ||  RNG.GetDice() > GameConfig.DropCargoBonus + cargoDropped-1;
						if (cargoDropped > 0)
							EventLog.Print(willMakeShot ? "Battle_EnemyIgnoresDroppedCargo"
														: "Battle_EnemyScoopsCargo", enemy.Name);
						if (willMakeShot)
						{
							DoAttack(enemy, Player, enemy, 
								enemy.CurrentMissiles > 0  &&  RNG.GetDice() <= GameConfig.EnemyMissileUsage ? AttackType.Missile : AttackType.Laser);
						}

						#endregion						
					}
				}
				else
				{
					#region Enemy is Dead

					battleIsEnded = true;
					var npcType = enemy.NPC_Type;
					Player.Statistics.ShipDestroyed[enemy.Ship.ModelName]++;
					Player.Statistics.NPC_Defeated[npcType]++;
					Player.CombatRating += enemy.Ship.MaxHP;

					Player.Credits += enemy.Bounty;
					if (enemy.Bounty > 0)
					{
						EventLog.Print("Battle_EarnedBounty", enemy.Bounty);
					}

					CurrentLegalRecord.FineAmount += GameConfig.NPC_StatsConfigs[npcType].FineForAttack;
					if (npcType == NPC_Type.Trader  &&  enemy.EscapeChance > 0)
					{
						droppedTraderCargo = enemy.CurrentCargo.GetRandonDrop(1);
						ShowDroppedCargo();
						ScoopDroppedCargo(false);
					}

					#endregion					
				}

				#endregion

				#region Player's Death or Escape

				if (Player.CurrentHP == 0)
				{
					battleIsEnded = true;
					playerIsTryingToEscape = false;
				}
				if (playerIsTryingToEscape)
				{
					battleIsEnded = RNG.GetDice() <= enemy.EscapeChance;
					EventLog.Print(battleIsEnded ? "Battle_EscapeSuccess" : "Battle_EscapeFail");
					playerIsTryingToEscape = false;
				}				

				#endregion								
			}

			PlayerStats.Draw_PlayerStats();
			ActionPanel.ClearArea();
			EventLog.HighlightArea();			
		}
Пример #2
0
 public Ship Strengthen(double p)
 {
     return(new Ship(Id, Name, LootId, (int)(Health * p), (int)(Nanohull * p), Speed, (int)(Shield * p),
                     ShieldAbsorption, (int)(MinDamage * p), (int)(MaxDamage * p), IsNeutral,
                     LaserColor, Batteries, Rockets, Cargo, Reward, CargoDrop.Multiply(2), AI));
 }