public void fight(Ship Attacker, Ship Defender, Field BattleField) { Core core = Core.Instance; //init values this.attackerId = Attacker.id; this.defenderId = Defender.id; this.attackerUserId = Attacker.userid; this.defenderUserId = Defender.userid; this.starId = BattleField.starId ?? 0; this.spaceX = BattleField.x; this.spaceY = BattleField.y; this.systemX = Defender.systemX; this.systemY = Defender.systemY; this.attackerDamageDealt = 0; this.defenderDamageDealt = 0; this.attackerHitPointsRemain = Attacker.hitpoints; this.defenderHitPointsRemain = Defender.hitpoints; this.AttackerName = Attacker.NAME; this.DefenderName = Defender.NAME; this.DefenderHasRead = false; this.MessageDT = DateTime.Now; this.DefenderShield = Defender.damagereduction; this.AttackerShield = Attacker.damagereduction; this.AttackerExperience = Attacker.Experience; this.DefenderExperience = Defender.Experience; this.AttackerShipHullId = Attacker.hullid; this.DefenderShipHullId = Defender.hullid; this.AttackerShipHullImageId = Attacker.shipHullsImage; this.DefenderShipHullImageId = Defender.shipHullsImage; this.AttackerEvasion = Attacker.FullDefense(); this.AttackerMaxHitPoints = Attacker.CombatMaxHitpoint; this.attackerStartHitpoint = Attacker.hitpoints; Attacker.CombatStartHitpoint = Attacker.hitpoints; this.DefenderEvasion = Defender.FullDefense(); this.DefenderMaxHitPoints = Defender.CombatMaxHitpoint; this.DefenderStartHitpoint = Defender.hitpoints; Defender.CombatStartHitpoint = Defender.hitpoints; //mock the Tanscendence Defense if (Defender.isTranscension()) { Defender.shipModules.Clear(); Defender.shipModules.Add(new ShipModule(Defender.id, 1105, 1, 1)); Defender.shipModules.Add(new ShipModule(Defender.id, 1105, 2, 2)); } //get target Field modifiers: Tuple <byte, byte> systemXY = null; if (this.starId != 0 && this.systemX != 0 && this.systemY != 0) { systemXY = new Tuple <byte, byte>((byte)(this.systemX), (byte)(this.systemY)); } this.CombatField = new SpacegameServer.Core.CombatField(BattleField, systemXY); /* * ObjectDescription targetFieldObjDesc = Core.Instance.TargetFieldObject(BattleField, systemXY); * objectOnMap = null; * Dictionary<short,ObjectWeaponModificator> ObjectWeaponModificator = null; * if (targetFieldObjDesc != null) * { * objectOnMap = core.ObjectsOnMap.ContainsKey(targetFieldObjDesc.id) ? core.ObjectsOnMap[targetFieldObjDesc.id] : null; * ObjectWeaponModificator = core.ObjectWeaponModificators.ContainsKey(targetFieldObjDesc.id) ? core.ObjectWeaponModificators[targetFieldObjDesc.id] : null; * } */ int defenseBonus = this.CombatField.objectOnMap != null ? this.CombatField.objectOnMap.Defensebonus : 0; //fight: int battleCounter = 0; bool defenderFights = true; var AttackerEvasion = Attacker.FullDefense(); double HitValue = Lockable.rnd.Next(0, AttackerEvasion + Defender.FullDefense()); if (HitValue < AttackerEvasion) { defenderFights = false; } while (battleCounter < 100 && Attacker.hitpoints > 0 && Defender.hitpoints > 0) { if (defenderFights) { if (Defender.crew >= 0 && Defender.energy >= 0) { this.createBattleRound(Defender, Attacker, 0, battleCounter, defenderFights); } } else { this.createBattleRound(Attacker, Defender, defenseBonus, battleCounter, defenderFights); } defenderFights = !defenderFights; battleCounter++; } Attacker.CombatStartHitpoint = Attacker.hitpoints; Defender.CombatStartHitpoint = Defender.hitpoints; var Systemname = this.starId != 0 ? Core.Instance.stars[this.starId].systemname : ""; if (Attacker.hitpoints <= 0) { GalacticEvents.AddNewEvent(GalacticEventType.CombatDefenderWins, int1: Attacker.id, int2: Defender.id, int3: Attacker.hullid, int4: Defender.hullid, int5: this.spaceX, int6: this.spaceY, string1: Attacker.NAME, string2: Defender.NAME, string3: Systemname, string4: Attacker.userid.ToString(), string5: Defender.userid.ToString()); Defender.Experience += Attacker.ExperienceBase(); Attacker.destroy(); } if (Defender.hitpoints <= 0) { GalacticEvents.AddNewEvent(GalacticEventType.CombatAttackerWins, int1: Attacker.id, int2: Defender.id, int3: Attacker.hullid, int4: Defender.hullid, int5: this.spaceX, int6: this.spaceY, string1: Attacker.NAME, string2: Defender.NAME, string3: Systemname, string4: Attacker.userid.ToString(), string5: Defender.userid.ToString()); Attacker.Experience += Defender.ExperienceBase(); Defender.destroy(); } if (Core.Instance.users[Attacker.userid].showCombatPopup) { int x = Attacker.userid; core.SendCombat(this, x); } }
public void fieldCombat(List <Ship> ShipsFighting, User Attacker, Tuple <byte, byte> SysXY) { Core core = Core.Instance; //check attacker ships, find the one with the best combat ratio against any defender Ship AttackingShip = this.detectAttackingShip(Attacker, SysXY); if (AttackingShip == null) { return; } Ship Defender = this.StrongestEnemyOnField(AttackingShip, SysXY); if (Defender == null) { return; } //if Attacker has only non-Combatants and defender has combatants, destroy them and quit if (AttackingShip.attack == 0) { if (!ShipsFighting.Any(e => e.id == AttackingShip.id)) { ShipsFighting.Add(AttackingShip); } AttackingShip.destroy(); this.fieldCombat(ShipsFighting, Attacker, SysXY); return; } if (Defender.attack == 0) { if (!ShipsFighting.Any(e => e.id == Defender.id)) { ShipsFighting.Add(Defender); } Defender.destroy(); this.fieldCombat(ShipsFighting, Attacker, SysXY); return; } //let them fight if (!ShipsFighting.Any(e => e.id == AttackingShip.id)) { ShipsFighting.Add(AttackingShip); } if (!ShipsFighting.Any(e => e.id == Defender.id)) { ShipsFighting.Add(Defender); } Combat Combat = new Combat((int)Core.Instance.identities.combat.getNext()); Combat.fight(AttackingShip, Defender, this); //save Combat and both ships Core.Instance.combats[Combat.CombatId] = Combat; Core.Instance.dataConnection.saveCombat(Combat); //continue with evaluation this.fieldCombat(ShipsFighting, Attacker, SysXY); }