From ab281695a49b42828bf16cc9582e364921c05e04 Mon Sep 17 00:00:00 2001 From: Panxuc Date: Sat, 16 Dec 2023 23:07:59 +0800 Subject: [PATCH 1/4] feat: :sparkles: GameObj be attacked --- logic/GameClass/GameObj/Areas/Construction.cs | 9 ++ logic/GameClass/GameObj/Areas/Home.cs | 10 ++ logic/GameClass/GameObj/Areas/Wormhole.cs | 5 + logic/GameClass/GameObj/Bullets/Arc.cs | 20 ++-- logic/GameClass/GameObj/Bullets/Laser.cs | 20 ++-- logic/GameClass/GameObj/Bullets/Missile.cs | 22 ++--- logic/GameClass/GameObj/Bullets/Plasma.cs | 20 ++-- logic/GameClass/GameObj/Bullets/Shell.cs | 20 ++-- logic/Gaming/AttackManager.cs | 21 +++++ logic/Gaming/ShipManager.cs | 92 +++++++++++++++++++ logic/Preparation/Utility/EnumType.cs | 1 + 11 files changed, 179 insertions(+), 61 deletions(-) diff --git a/logic/GameClass/GameObj/Areas/Construction.cs b/logic/GameClass/GameObj/Areas/Construction.cs index 9c8bf3ee..8454c655 100644 --- a/logic/GameClass/GameObj/Areas/Construction.cs +++ b/logic/GameClass/GameObj/Areas/Construction.cs @@ -43,6 +43,15 @@ public bool Construct(int constructSpeed, ConstructionType constructionType, Shi } return HP.AddV(constructSpeed) > 0; } + public void BeAttacked(Bullet bullet) + { + if (bullet!.Parent!.TeamID == this.TeamID) + { + return; + } + long subHP = bullet.AP; + this.HP.SubPositiveV(subHP); + } public void AddConstructNum(int add = 1) { ConstructNum.Add(add); diff --git a/logic/GameClass/GameObj/Areas/Home.cs b/logic/GameClass/GameObj/Areas/Home.cs index b52da7cd..18c9ecb6 100644 --- a/logic/GameClass/GameObj/Areas/Home.cs +++ b/logic/GameClass/GameObj/Areas/Home.cs @@ -11,4 +11,14 @@ public class Home(XY initPos, long id) public LongInTheVariableRange HP => new(GameData.HomeHP); public override bool IsRigid => false; public override ShapeType Shape => ShapeType.Square; + + public void BeAttacked(Bullet bullet) + { + if (bullet!.Parent!.TeamID == this.TeamID) + { + return; + } + long subHP = bullet.AP; + this.HP.SubPositiveV(subHP); + } } diff --git a/logic/GameClass/GameObj/Areas/Wormhole.cs b/logic/GameClass/GameObj/Areas/Wormhole.cs index 4b6c84cb..46f99539 100644 --- a/logic/GameClass/GameObj/Areas/Wormhole.cs +++ b/logic/GameClass/GameObj/Areas/Wormhole.cs @@ -17,6 +17,11 @@ public bool Repair(int constructSpeed, Ship ship) { return HP.AddV(constructSpeed) > 0; } + public void BeAttacked(Bullet bullet) + { + long subHP = bullet.AP; + this.HP.SubPositiveV(subHP); + } public void AddRepairNum(int add = 1) { RepairNum.Add(add); diff --git a/logic/GameClass/GameObj/Bullets/Arc.cs b/logic/GameClass/GameObj/Bullets/Arc.cs index b3a915bb..a779b2ce 100644 --- a/logic/GameClass/GameObj/Bullets/Arc.cs +++ b/logic/GameClass/GameObj/Bullets/Arc.cs @@ -21,17 +21,13 @@ public Arc(Ship ship, XY pos, int radius = GameData.BulletRadius) : public const int maxBulletNum = 1; public override int MaxBulletNum => maxBulletNum; public override BulletType TypeOfBullet => BulletType.Arc; - public override bool CanAttack(GameObj target) + public override bool CanAttack(GameObj target) => false; + public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch { - //if (target.Type == GameObjType.Ship - // || target.Type == GameObjType.Construction - // || target.Type == GameObjType.Wormhole - // || target.Type == GameObjType.Home) - // return true; - return false; - } - public override bool CanBeBombed(GameObjType gameObjType) - { - return false; - } + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Laser.cs b/logic/GameClass/GameObj/Bullets/Laser.cs index 21ed681d..817e2e10 100644 --- a/logic/GameClass/GameObj/Bullets/Laser.cs +++ b/logic/GameClass/GameObj/Bullets/Laser.cs @@ -21,17 +21,13 @@ public Laser(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int CD => cd; public override int MaxBulletNum => 1; public override BulletType TypeOfBullet => BulletType.Laser; - public override bool CanAttack(GameObj target) + public override bool CanAttack(GameObj target) => false; + public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch { - //if (target.Type == GameObjType.Ship - // || target.Type == GameObjType.Construction - // || target.Type == GameObjType.Wormhole - // || target.Type == GameObjType.Home) - // return true; - return false; - } - public override bool CanBeBombed(GameObjType gameObjType) - { - return false; - } + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Missile.cs b/logic/GameClass/GameObj/Bullets/Missile.cs index db767bd8..26f2f099 100644 --- a/logic/GameClass/GameObj/Bullets/Missile.cs +++ b/logic/GameClass/GameObj/Bullets/Missile.cs @@ -19,18 +19,14 @@ public Missile(Ship ship, XY pos, int radius = GameData.BulletRadius) : public const int maxBulletNum = 1; public override int MaxBulletNum => maxBulletNum; public override BulletType TypeOfBullet => BulletType.Missile; - public override bool CanAttack(GameObj target) + public override bool CanAttack(GameObj target) => + XY.DistanceFloor3(target.Position, this.Position) <= GameData.MissileBombRange; + public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch { - //if (target.Type == GameObjType.Ship - // || target.Type == GameObjType.Construction - // || target.Type == GameObjType.Wormhole - // || target.Type == GameObjType.Home) - // return true; - return false; - } - public override bool CanBeBombed(GameObjType gameObjType) - { - //return true; - return false; - } + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Plasma.cs b/logic/GameClass/GameObj/Bullets/Plasma.cs index a407fbf7..2269a650 100644 --- a/logic/GameClass/GameObj/Bullets/Plasma.cs +++ b/logic/GameClass/GameObj/Bullets/Plasma.cs @@ -19,17 +19,13 @@ public Plasma(Ship ship, XY pos, int radius = GameData.BulletRadius) : public const int maxBulletNum = 1; public override int MaxBulletNum => maxBulletNum; public override BulletType TypeOfBullet => BulletType.Plasma; - public override bool CanAttack(GameObj target) + public override bool CanAttack(GameObj target) => false; + public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch { - //if (target.Type == GameObjType.Ship - // || target.Type == GameObjType.Construction - // || target.Type == GameObjType.Wormhole - // || target.Type == GameObjType.Home) - // return true; - return false; - } - public override bool CanBeBombed(GameObjType gameObjType) - { - return false; - } + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Shell.cs b/logic/GameClass/GameObj/Bullets/Shell.cs index a18cca6f..a4617da2 100644 --- a/logic/GameClass/GameObj/Bullets/Shell.cs +++ b/logic/GameClass/GameObj/Bullets/Shell.cs @@ -19,17 +19,13 @@ public Shell(Ship ship, XY pos, int radius = GameData.BulletRadius) : public const int maxBulletNum = 1; public override int MaxBulletNum => maxBulletNum; public override BulletType TypeOfBullet => BulletType.Shell; - public override bool CanAttack(GameObj target) + public override bool CanAttack(GameObj target) => false; + public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch { - //if (target.Type == GameObjType.Ship - // || target.Type == GameObjType.Construction - // || target.Type == GameObjType.Wormhole - // || target.Type == GameObjType.Home) - // return true; - return false; - } - public override bool CanBeBombed(GameObjType gameObjType) - { - return false; - } + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; } \ No newline at end of file diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index 76b6a04e..9603709d 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -1,4 +1,5 @@ using GameClass.GameObj; +using GameClass.GameObj.Areas; using GameClass.GameObj.Bullets; using GameEngine; using Preparation.Utility; @@ -29,6 +30,26 @@ public void ProduceBulletNaturally(BulletType bulletType, Ship ship, double angl gameMap.Add(bullet); moveEngine.MoveObj(bullet, (int)(bullet.AttackDistance * 1000 / bullet.MoveSpeed), angle, ++bullet.StateNum); // 这里时间参数除出来的单位要是ms } + private void BombObj(Bullet bullet, GameObj objBeingShot) + { + switch (objBeingShot.Type) + { + case GameObjType.Ship: + shipManager.BeAttacked((Ship)objBeingShot, bullet); + break; + case GameObjType.Construction: + ((Construction)objBeingShot).BeAttacked(bullet); + break; + case GameObjType.Wormhole: + ((Wormhole)objBeingShot).BeAttacked(bullet); + break; + case GameObjType.Home: + ((Home)objBeingShot).BeAttacked(bullet); + break; + default: + break; + } + } public bool TryRemoveBullet(Bullet bullet) { if (gameMap.Remove(bullet)) diff --git a/logic/Gaming/ShipManager.cs b/logic/Gaming/ShipManager.cs index d1b9124d..164869b8 100644 --- a/logic/Gaming/ShipManager.cs +++ b/logic/Gaming/ShipManager.cs @@ -17,6 +17,98 @@ private class ShipManager(Map gameMap) newShip.ShipID.SetReturnOri(shipID); return newShip; } + + public void BeAttacked(Ship ship, Bullet bullet) + { + if (bullet!.Parent!.TeamID == ship.TeamID) + { + return; + } + long subHP = bullet.AP; + switch (bullet.TypeOfBullet) + { + case BulletType.Laser: + if (ship.Shield > 0) + { + ship.Shield.SubPositiveV((long)(subHP * GameData.LaserShieldModifier)); + } + else if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * GameData.LaserArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); + } + break; + case BulletType.Plasma: + if (ship.Shield > 0) + { + ship.Shield.SubPositiveV((long)(subHP * GameData.PlasmaShieldModifier)); + } + else if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * GameData.PlasmaArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); + } + break; + case BulletType.Shell: + if (ship.Shield > 0) + { + ship.Shield.SubPositiveV((long)(subHP * GameData.ShellShieldModifier)); + } + else if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * GameData.ShellArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); + } + break; + case BulletType.Missile: + if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * GameData.MissileArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); + } + break; + case BulletType.Arc: + if (ship.Shield > 0) + { + ship.Shield.SubPositiveV((long)(subHP * GameData.ArcShieldModifier)); + } + else if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * GameData.ArcArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); + } + break; + default: + break; + } + if (ship.HP == 0) + { + Remove(ship); + } + } + public void Remove(Ship ship) + { + if (!ship.TryToRemoveFromGame(ShipStateType.Deceased)) + { + return; + } + gameMap.Remove(ship); // TODO + } } } } diff --git a/logic/Preparation/Utility/EnumType.cs b/logic/Preparation/Utility/EnumType.cs index eb48241e..ff21c438 100644 --- a/logic/Preparation/Utility/EnumType.cs +++ b/logic/Preparation/Utility/EnumType.cs @@ -141,6 +141,7 @@ public enum ShipStateType Swinging = 6, Stunned = 7, Moving = 8, + Deceased = 9, } /// /// 舰船类型 From 76efe9e3cd04dfca67270f6fc4d6fc1da47a046e Mon Sep 17 00:00:00 2001 From: Panxuc Date: Sat, 16 Dec 2023 23:57:00 +0800 Subject: [PATCH 2/4] feat: :sparkles: BulletBomb --- logic/GameClass/GameObj/Bullet.cs | 4 +- logic/GameClass/GameObj/Bullets/Arc.cs | 6 +- logic/GameClass/GameObj/Bullets/Laser.cs | 5 +- logic/GameClass/GameObj/Bullets/Missile.cs | 9 +- logic/GameClass/GameObj/Bullets/Plasma.cs | 6 +- logic/GameClass/GameObj/Bullets/Shell.cs | 6 +- logic/Gaming/AttackManager.cs | 55 +++++++++- logic/Gaming/ShipManager.cs | 120 +++++++++------------ 8 files changed, 117 insertions(+), 94 deletions(-) diff --git a/logic/GameClass/GameObj/Bullet.cs b/logic/GameClass/GameObj/Bullet.cs index 3fb409f5..5db22086 100644 --- a/logic/GameClass/GameObj/Bullet.cs +++ b/logic/GameClass/GameObj/Bullet.cs @@ -11,8 +11,8 @@ public abstract class Bullet : ObjOfShip public abstract int Speed { get; } public abstract int CastTime { get; } public abstract int SwingTime { get; } - public abstract int CD { get; } - public abstract int MaxBulletNum { get; } + public abstract double ArmorModifier { get; } + public abstract double ShieldModifier { get; } public override bool IsRigid => true; // 默认为true public override ShapeType Shape => ShapeType.Circle; // 默认为圆形 public abstract BulletType TypeOfBullet { get; } diff --git a/logic/GameClass/GameObj/Bullets/Arc.cs b/logic/GameClass/GameObj/Bullets/Arc.cs index a779b2ce..2939e962 100644 --- a/logic/GameClass/GameObj/Bullets/Arc.cs +++ b/logic/GameClass/GameObj/Bullets/Arc.cs @@ -16,10 +16,8 @@ public Arc(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int Speed => GameData.ArcSpeed; public override int CastTime => GameData.ArcCastTime; public override int SwingTime => GameData.ArcSwingTime; - private const int cd = GameData.ArcSwingTime; - public override int CD => cd; - public const int maxBulletNum = 1; - public override int MaxBulletNum => maxBulletNum; + public override double ArmorModifier => GameData.ArcArmorModifier; + public override double ShieldModifier => GameData.ArcShieldModifier; public override BulletType TypeOfBullet => BulletType.Arc; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch diff --git a/logic/GameClass/GameObj/Bullets/Laser.cs b/logic/GameClass/GameObj/Bullets/Laser.cs index 817e2e10..801cd6cd 100644 --- a/logic/GameClass/GameObj/Bullets/Laser.cs +++ b/logic/GameClass/GameObj/Bullets/Laser.cs @@ -17,9 +17,8 @@ public Laser(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int Speed => GameData.LaserSpeed; public override int CastTime => GameData.LaserCastTime; public override int SwingTime => GameData.LaserSwingTime; - private const int cd = GameData.LaserSwingTime; - public override int CD => cd; - public override int MaxBulletNum => 1; + public override double ArmorModifier => GameData.LaserArmorModifier; + public override double ShieldModifier => GameData.LaserShieldModifier; public override BulletType TypeOfBullet => BulletType.Laser; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch diff --git a/logic/GameClass/GameObj/Bullets/Missile.cs b/logic/GameClass/GameObj/Bullets/Missile.cs index 26f2f099..f71efd33 100644 --- a/logic/GameClass/GameObj/Bullets/Missile.cs +++ b/logic/GameClass/GameObj/Bullets/Missile.cs @@ -1,4 +1,5 @@ -using Preparation.Utility; +using System; +using Preparation.Utility; namespace GameClass.GameObj.Bullets; @@ -14,10 +15,8 @@ public Missile(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int Speed => GameData.MissileSpeed; public override int CastTime => GameData.MissileCastTime; public override int SwingTime => GameData.ShellSwingTime; - private const int cd = GameData.ShellSwingTime; - public override int CD => cd; - public const int maxBulletNum = 1; - public override int MaxBulletNum => maxBulletNum; + public override double ArmorModifier => GameData.MissileArmorModifier; + public override double ShieldModifier => Double.MaxValue; public override BulletType TypeOfBullet => BulletType.Missile; public override bool CanAttack(GameObj target) => XY.DistanceFloor3(target.Position, this.Position) <= GameData.MissileBombRange; diff --git a/logic/GameClass/GameObj/Bullets/Plasma.cs b/logic/GameClass/GameObj/Bullets/Plasma.cs index 2269a650..99b8e243 100644 --- a/logic/GameClass/GameObj/Bullets/Plasma.cs +++ b/logic/GameClass/GameObj/Bullets/Plasma.cs @@ -14,10 +14,8 @@ public Plasma(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int Speed => GameData.PlasmaSpeed; public override int CastTime => GameData.PlasmaCastTime; public override int SwingTime => GameData.PlasmaSwingTime; - private const int cd = GameData.PlasmaSwingTime; - public override int CD => cd; - public const int maxBulletNum = 1; - public override int MaxBulletNum => maxBulletNum; + public override double ArmorModifier => GameData.PlasmaArmorModifier; + public override double ShieldModifier => GameData.PlasmaShieldModifier; public override BulletType TypeOfBullet => BulletType.Plasma; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch diff --git a/logic/GameClass/GameObj/Bullets/Shell.cs b/logic/GameClass/GameObj/Bullets/Shell.cs index a4617da2..576d738f 100644 --- a/logic/GameClass/GameObj/Bullets/Shell.cs +++ b/logic/GameClass/GameObj/Bullets/Shell.cs @@ -14,10 +14,8 @@ public Shell(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override int Speed => GameData.ShellSpeed; public override int CastTime => GameData.ShellCastTime; public override int SwingTime => GameData.ShellSwingTime; - private const int cd = GameData.ShellSwingTime; - public override int CD => cd; - public const int maxBulletNum = 1; - public override int MaxBulletNum => maxBulletNum; + public override double ArmorModifier => GameData.ShellArmorModifier; + public override double ShieldModifier => GameData.ShellShieldModifier; public override BulletType TypeOfBullet => BulletType.Shell; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index 9603709d..5182c76b 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -1,9 +1,11 @@ -using GameClass.GameObj; +using System.Collections.Generic; +using System.Threading; +using GameClass.GameObj; using GameClass.GameObj.Areas; using GameClass.GameObj.Bullets; using GameEngine; using Preparation.Utility; -using System.Threading; +using Preparation.Interface; using Timothy.FrameRateTask; namespace Gaming @@ -72,6 +74,55 @@ public bool TryRemoveBullet(Bullet bullet) } else return false; } + private void BulletBomb(Bullet bullet, GameObj? objBeingShot) + { + if (!TryRemoveBullet(bullet)) + { + return; + } + if (bullet.BulletBombRange == 0) + { + if (objBeingShot == null) + { + shipManager.BackSwing((Ship)bullet.Parent!, bullet.SwingTime); + return; + } + BombObj(bullet, objBeingShot); + shipManager.BackSwing((Ship)bullet.Parent!, bullet.SwingTime); + return; + } + else + { + var beAttackedList = new List(); + foreach (var kvp in gameMap.GameObjDict) + { + if (bullet.CanBeBombed(kvp.Key)) + { + gameMap.GameObjLockDict[kvp.Key].EnterReadLock(); + try + { + foreach (var item in gameMap.GameObjDict[kvp.Key]) + { + if (bullet.CanAttack((GameObj)item)) + { + beAttackedList.Add(item); + } + } + } + finally + { + gameMap.GameObjLockDict[kvp.Key].ExitReadLock(); + } + } + } + foreach (GameObj beAttackedObj in beAttackedList) + { + BombObj(bullet, beAttackedObj); + } + beAttackedList.Clear(); + shipManager.BackSwing((Ship)bullet.Parent!, bullet.SwingTime); + } + } public bool Attack(Ship ship, double angle) { if (!ship.Commandable()) diff --git a/logic/Gaming/ShipManager.cs b/logic/Gaming/ShipManager.cs index 164869b8..474ed322 100644 --- a/logic/Gaming/ShipManager.cs +++ b/logic/Gaming/ShipManager.cs @@ -1,4 +1,5 @@ -using GameClass.GameObj; +using System.Threading; +using GameClass.GameObj; using Preparation.Utility; namespace Gaming @@ -25,82 +26,61 @@ public void BeAttacked(Ship ship, Bullet bullet) return; } long subHP = bullet.AP; - switch (bullet.TypeOfBullet) + if (bullet.TypeOfBullet != BulletType.Missile && ship.Shield > 0) { - case BulletType.Laser: - if (ship.Shield > 0) - { - ship.Shield.SubPositiveV((long)(subHP * GameData.LaserShieldModifier)); - } - else if (ship.Armor > 0) - { - ship.Armor.SubPositiveV((long)(subHP * GameData.LaserArmorModifier)); - } - else - { - ship.HP.SubPositiveV(subHP); - } - break; - case BulletType.Plasma: - if (ship.Shield > 0) - { - ship.Shield.SubPositiveV((long)(subHP * GameData.PlasmaShieldModifier)); - } - else if (ship.Armor > 0) - { - ship.Armor.SubPositiveV((long)(subHP * GameData.PlasmaArmorModifier)); - } - else - { - ship.HP.SubPositiveV(subHP); - } - break; - case BulletType.Shell: - if (ship.Shield > 0) - { - ship.Shield.SubPositiveV((long)(subHP * GameData.ShellShieldModifier)); - } - else if (ship.Armor > 0) - { - ship.Armor.SubPositiveV((long)(subHP * GameData.ShellArmorModifier)); - } - else - { - ship.HP.SubPositiveV(subHP); - } - break; - case BulletType.Missile: - if (ship.Armor > 0) - { - ship.Armor.SubPositiveV((long)(subHP * GameData.MissileArmorModifier)); - } - else - { - ship.HP.SubPositiveV(subHP); - } - break; - case BulletType.Arc: - if (ship.Shield > 0) - { - ship.Shield.SubPositiveV((long)(subHP * GameData.ArcShieldModifier)); - } - else if (ship.Armor > 0) - { - ship.Armor.SubPositiveV((long)(subHP * GameData.ArcArmorModifier)); - } - else - { - ship.HP.SubPositiveV(subHP); - } - break; - default: - break; + ship.Shield.SubPositiveV((long)(subHP * bullet.ShieldModifier)); + } + else if (ship.Armor > 0) + { + ship.Armor.SubPositiveV((long)(subHP * bullet.ArmorModifier)); + } + else + { + ship.HP.SubPositiveV(subHP); } if (ship.HP == 0) { Remove(ship); } } + public static long BeStunned(Ship ship, int time) + { + long stateNum = ship.SetShipState(RunningStateType.RunningForcibly, ShipStateType.Stunned); + if (stateNum == -1) + { + return -1; + } + new Thread + (() => + { + Thread.Sleep(time); + ship.ResetShipState(stateNum); + } + ) + { IsBackground = true }.Start(); + return stateNum; + } + public bool BackSwing(Ship ship, int time) + { + if (time <= 0) + { + return false; + } + long stateNum = ship.SetShipState(RunningStateType.RunningForcibly, ShipStateType.Swinging); + if (stateNum == -1) + { + return false; + } + new Thread + (() => + { + Thread.Sleep(time); + ship.ResetShipState(stateNum); + } + ) + { IsBackground = true }.Start(); + return true; + } public void Remove(Ship ship) { if (!ship.TryToRemoveFromGame(ShipStateType.Deceased)) From c9d9f898b059d7942e3f3ef91b130869e7561f54 Mon Sep 17 00:00:00 2001 From: Panxuc Date: Sun, 17 Dec 2023 00:29:23 +0800 Subject: [PATCH 3/4] fix: :bug: fix NullBullet elements --- logic/GameClass/GameObj/Bullets/NullBullet.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logic/GameClass/GameObj/Bullets/NullBullet.cs b/logic/GameClass/GameObj/Bullets/NullBullet.cs index 42d301f3..ad77e19f 100644 --- a/logic/GameClass/GameObj/Bullets/NullBullet.cs +++ b/logic/GameClass/GameObj/Bullets/NullBullet.cs @@ -9,8 +9,8 @@ internal sealed class NullBullet : Bullet public override int Speed => 0; public override int CastTime => 0; public override int SwingTime => 0; - public override int CD => 0; - public override int MaxBulletNum => 0; + public override double ArmorModifier => 0; + public override double ShieldModifier => 0; public override BulletType TypeOfBullet => BulletType.Null; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => false; From 5a6ed16f97b84cfe375f09a245c09a0afe2294e3 Mon Sep 17 00:00:00 2001 From: 964293341 Date: Sun, 17 Dec 2023 01:42:22 +0800 Subject: [PATCH 4/4] refactor(Bullet): Adjust CanBeBombed from abstract to virtual --- logic/GameClass/GameObj/Bullet.cs | 9 ++++++++- logic/GameClass/GameObj/Bullets/Arc.cs | 8 -------- logic/GameClass/GameObj/Bullets/Laser.cs | 8 -------- logic/GameClass/GameObj/Bullets/Missile.cs | 8 -------- logic/GameClass/GameObj/Bullets/NullBullet.cs | 6 +----- logic/GameClass/GameObj/Bullets/Plasma.cs | 8 -------- logic/GameClass/GameObj/Bullets/Shell.cs | 8 -------- 7 files changed, 9 insertions(+), 46 deletions(-) diff --git a/logic/GameClass/GameObj/Bullet.cs b/logic/GameClass/GameObj/Bullet.cs index 5db22086..b73c9815 100644 --- a/logic/GameClass/GameObj/Bullet.cs +++ b/logic/GameClass/GameObj/Bullet.cs @@ -17,7 +17,14 @@ public abstract class Bullet : ObjOfShip public override ShapeType Shape => ShapeType.Circle; // 默认为圆形 public abstract BulletType TypeOfBullet { get; } public abstract bool CanAttack(GameObj target); - public abstract bool CanBeBombed(GameObjType gameObjType); + public virtual bool CanBeBombed(GameObjType gameObjType) => gameObjType switch + { + GameObjType.Ship => true, + GameObjType.Construction => true, + GameObjType.Wormhole => true, + GameObjType.Home => true, + _ => false + }; public override bool IgnoreCollideExecutor(IGameObj targetObj) { if (targetObj == Parent) return true; diff --git a/logic/GameClass/GameObj/Bullets/Arc.cs b/logic/GameClass/GameObj/Bullets/Arc.cs index 2939e962..039e86be 100644 --- a/logic/GameClass/GameObj/Bullets/Arc.cs +++ b/logic/GameClass/GameObj/Bullets/Arc.cs @@ -20,12 +20,4 @@ public Arc(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override double ShieldModifier => GameData.ArcShieldModifier; public override BulletType TypeOfBullet => BulletType.Arc; public override bool CanAttack(GameObj target) => false; - public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch - { - GameObjType.Ship => true, - GameObjType.Construction => true, - GameObjType.Wormhole => true, - GameObjType.Home => true, - _ => false - }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Laser.cs b/logic/GameClass/GameObj/Bullets/Laser.cs index 801cd6cd..9df9a78c 100644 --- a/logic/GameClass/GameObj/Bullets/Laser.cs +++ b/logic/GameClass/GameObj/Bullets/Laser.cs @@ -21,12 +21,4 @@ public Laser(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override double ShieldModifier => GameData.LaserShieldModifier; public override BulletType TypeOfBullet => BulletType.Laser; public override bool CanAttack(GameObj target) => false; - public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch - { - GameObjType.Ship => true, - GameObjType.Construction => true, - GameObjType.Wormhole => true, - GameObjType.Home => true, - _ => false - }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Missile.cs b/logic/GameClass/GameObj/Bullets/Missile.cs index f71efd33..7302f893 100644 --- a/logic/GameClass/GameObj/Bullets/Missile.cs +++ b/logic/GameClass/GameObj/Bullets/Missile.cs @@ -20,12 +20,4 @@ public Missile(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override BulletType TypeOfBullet => BulletType.Missile; public override bool CanAttack(GameObj target) => XY.DistanceFloor3(target.Position, this.Position) <= GameData.MissileBombRange; - public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch - { - GameObjType.Ship => true, - GameObjType.Construction => true, - GameObjType.Wormhole => true, - GameObjType.Home => true, - _ => false - }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/NullBullet.cs b/logic/GameClass/GameObj/Bullets/NullBullet.cs index ad77e19f..f88bb1e5 100644 --- a/logic/GameClass/GameObj/Bullets/NullBullet.cs +++ b/logic/GameClass/GameObj/Bullets/NullBullet.cs @@ -2,7 +2,7 @@ namespace GameClass.GameObj.Bullets; -internal sealed class NullBullet : Bullet +internal sealed class NullBullet(Ship ship, XY Position, int radius = GameData.BulletRadius) : Bullet(ship, radius, Position) { public override double BulletBombRange => 0; public override double AttackDistance => 0; @@ -14,8 +14,4 @@ internal sealed class NullBullet : Bullet public override BulletType TypeOfBullet => BulletType.Null; public override bool CanAttack(GameObj target) => false; public override bool CanBeBombed(GameObjType gameObjType) => false; - public NullBullet(Ship ship, XY Position, int radius = GameData.BulletRadius) - : base(ship, radius, Position) - { - } } diff --git a/logic/GameClass/GameObj/Bullets/Plasma.cs b/logic/GameClass/GameObj/Bullets/Plasma.cs index 99b8e243..deca2e1a 100644 --- a/logic/GameClass/GameObj/Bullets/Plasma.cs +++ b/logic/GameClass/GameObj/Bullets/Plasma.cs @@ -18,12 +18,4 @@ public Plasma(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override double ShieldModifier => GameData.PlasmaShieldModifier; public override BulletType TypeOfBullet => BulletType.Plasma; public override bool CanAttack(GameObj target) => false; - public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch - { - GameObjType.Ship => true, - GameObjType.Construction => true, - GameObjType.Wormhole => true, - GameObjType.Home => true, - _ => false - }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullets/Shell.cs b/logic/GameClass/GameObj/Bullets/Shell.cs index 576d738f..1b01286e 100644 --- a/logic/GameClass/GameObj/Bullets/Shell.cs +++ b/logic/GameClass/GameObj/Bullets/Shell.cs @@ -18,12 +18,4 @@ public Shell(Ship ship, XY pos, int radius = GameData.BulletRadius) : public override double ShieldModifier => GameData.ShellShieldModifier; public override BulletType TypeOfBullet => BulletType.Shell; public override bool CanAttack(GameObj target) => false; - public override bool CanBeBombed(GameObjType gameObjType) => gameObjType switch - { - GameObjType.Ship => true, - GameObjType.Construction => true, - GameObjType.Wormhole => true, - GameObjType.Home => true, - _ => false - }; } \ No newline at end of file