예제 #1
0
		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);
		}
예제 #2
0
        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);
            }
        }
예제 #3
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();			
		}
예제 #4
0
		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);
		}
예제 #5
0
		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;
		}
예제 #6
0
        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;
        }
예제 #7
0
        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;
        }