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