private static void BattleInitiation(NPC_Model enemy, bool playerIsAttacker) { ActionPanel.HighlightArea(); EventLog.ShadowOldMessages(); var npcType = enemy.NPC_Type; switch (npcType) { case NPC_Type.Pirate: case NPC_Type.Assassin: case NPC_Type.Alien: case NPC_Type.Guard: if (enemy.BattleInitMessage == null) EventLog.Print(!playerIsAttacker ? "Battle_Init_StandardAttack" : "Battle_Init_PlayerAttack", enemy.Name); else EventLog.Print(enemy.BattleInitMessage, enemy.Name); break; case NPC_Type.Trader: EventLog.Print("Battle_Init_AttackTrader", enemy.Name); Player.Statistics.AttackedTrader = true; break; case NPC_Type.Police: EventLog.Print("Battle_Init_AttackPolice", enemy.Name); Player.Statistics.AttackedPolice = true; break; } CurrentLegalRecord.FineAmount += GameConfig.NPC_StatsConfigs[npcType].FineForAttack; EventLog.Print("Battle_Init_YouAreFightingWith", Lang["NPC_" + npcType], enemy.Name); BattleStats.Draw_NPC_Stats(enemy, Player); BattleStats.Draw_Player_Stats(Player); }
public void Draw_NPC_Stats(NPC_Model npc, PlayerModel player) { ZOutput.Print(AreaRect.Left+2, AreaRect.Top+1, Lang["Stats_Enemy"], Color.Red); CommonMethods.Draw_Stat(enemyCoord, 1, Lang["Stats_Name"], npc.Name); CommonMethods.Draw_Stat(enemyCoord, 2, Lang["Stats_ShipModel"], npc.Ship.ModelName); if (player.Scanner == EquipmentState.Yes) { CommonMethods.Draw_Stat(enemyCoord, 3, Lang["Stats_ShipState"], ZIOX.Draw_State, npc.CurrentHP, npc.MaxHP); CommonMethods.Draw_Stat(enemyCoord, 4, Lang["Stats_Attack"], npc.Attack); CommonMethods.Draw_Stat(enemyCoord, 5, Lang["Stats_Defense"], npc.Defense); CommonMethods.Draw_Stat(enemyCoord, 6, Lang["Stats_Missiles"], ZIOX.Draw_State, npc.CurrentMissiles, npc.MaxMissiles); CommonMethods.Draw_Stat(enemyCoord, 7, Lang["Stats_ECM"], npc.IsRelevealedECM ? (Lang["EquipmentState_"] + npc.ECM) : Lang["Common_Unknown"]); if (npc.Bounty > 0) CommonMethods.Draw_Stat(enemyCoord, 9, Lang["Stats_Bounty"], ZIOX.Draw_Currency, npc.Bounty); } }
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(); }
private static void DoAttack(BasicUnitModel attacker, BasicUnitModel defender, NPC_Model enemy, AttackType attackType) { var resultDamage = 0; switch (attackType) { case AttackType.Laser : resultDamage = DoLaserAttack(attacker, defender); break; case AttackType.Missile : resultDamage = DoMissileAttack(attacker, defender); if (attacker.IsPlayer) Player.Statistics.MissilesUsed++; break; } if (attacker.IsPlayer) Player.Statistics.DamageInflicted += resultDamage; else Player.Statistics.DamageTaken += resultDamage; defender.CurrentHP -= (resultDamage); if (defender.IsDead) { defender.CurrentHP = 0; EventLog.Print(defender.IsPlayer ? "Battle_YouAreDead" : "Battle_EnemyIsDead"); ZIOX.PressAnyKey(defender.IsPlayer); } PlayerStats.Draw_PlayerStats(); BattleStats.Draw_Player_Stats(Player); BattleStats.Draw_NPC_Stats(enemy, Player); }
private static string Get_FightMenuResult(NPC_Model enemy) { #region Get items for menu var mainMenuItems = new ZMenu.MenuItemList { new ZMenu.MenuItem(Menu_Attack_Laser), new ZMenu.MenuItem(Menu_Attack_Missile) { IsActive = Player.CurrentMissiles > 0 }, new ZMenu.MenuItem(Menu_RunAway) }; if (enemy.NPC_Type == NPC_Type.Pirate) { var dropCargoMenuItems = new ZMenu.MenuItemList(); dropCargoMenuItems.AddRange(from merch in Enums.All_Merchandise where Player.CurrentCargo[merch] > 0 select new ZMenu.MenuItem(Menu_DropOneCargo + Lang["Merchandise_" + merch])); dropCargoMenuItems.Add(new ZMenu.MenuItem(Menu_DropAllCargo)); mainMenuItems.Add(new ZMenu.MenuItem { Caption = Menu_DropCargoAndRun, IsActive = Player.CurrentCargo.CurrentLoad > 0, ChildMenuItems = dropCargoMenuItems }); } if (enemy.NPC_Type == NPC_Type.Trader && droppedTraderCargo.Count > 0) { mainMenuItems.Add(new ZMenu.MenuItem { Caption = Menu_ScoopCargo }); } #endregion return ZMenu.GetMenuResult(NPCStatsArea.Left + 24, NPCStatsArea.Top+1, new ZMenu.MenuItem(Lang["Common_YourAction"]) { Options = new ZMenu.Options { ColorScheme = new ZMenu.ColorScheme { FrameForeColor = Color.Cyan, CaptionForeColor = Color.Yellow }, IsMonoStyleColor = true, UseSelectedBackColor = true }, ChildMenuItems = mainMenuItems }, ZFrontier.HotKeys).Text; }
private static bool FinesPayment(NPC_Model policeShip, bool toPayFines) { if (toPayFines && Player.Credits >= CurrentLegalRecord.FineAmount) { Player.Credits -= CurrentLegalRecord.FineAmount; CurrentLegalRecord.FineAmount = 0; PlayerStats.Draw_PlayerStats(); EventLog.Print("Police_FinesPaymentYes", policeShip.Name); return true; } EventLog.Print("Police_FinesPaymentNo", policeShip.Name); BattleLogic.DoBattle(policeShip); return false; }
public static NPC_Model LoadNPC(BinaryReader reader) { var npc = new NPC_Model(); var npcDataEnd = false; while (!npcDataEnd) { var field = reader.ReadUInt32(); var fieldType = (SaveField)(field >> 24); var fieldValue = (int)field & 0x00FFFFFF; switch (fieldType) { case SaveField.NPC_Type : npc.NPC_Type = (NPC_Type)fieldValue; break; case SaveField.PlayerName : npc.Name = new string(reader.ReadChars(20)).TrimEnd(); break; case SaveField.ShipName : var shipName = new string(reader.ReadChars(20)).TrimEnd(); npc.Ship = GameConfig.ShipModels.FirstOrDefault(a => a.ModelName == shipName); break; case SaveField.CurrentHP : npc.CurrentHP = fieldValue; break; case SaveField.CurrentMissiles: npc.CurrentMissiles = fieldValue; break; case SaveField.Attack : npc.Attack = fieldValue; break; case SaveField.Defense : npc.Defense = fieldValue; break; case SaveField.HasECM : npc.ECM = (EquipmentState)fieldValue; break; case SaveField.Bounty : npc.Bounty = fieldValue; break; case SaveField.EscapeChance : npc.EscapeChance = fieldValue; break; case SaveField.IsRelevealedECM: npc.IsRelevealedECM = fieldValue > 0; break; case SaveField.CurrentCargo : for (var i = 0; i < fieldValue; i++) npc.CurrentCargo[(Merchandise)i] = reader.ReadByte(); break; case SaveField.NPC_DataEnd : npcDataEnd = true; break; } } return npc; }