Skip to content

Commit b1a638c

Browse files
authored
Merge pull request #30 from jxd136/dev
game.cs first try
2 parents 94740ba + 6cb28e1 commit b1a638c

2 files changed

Lines changed: 84 additions & 9 deletions

File tree

logic/Gaming/ActionManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public bool Harvest(Character character)
162162
}
163163
)
164164
{ IsBackground = true }.Start();
165-
return false;
165+
return true;
166166
}
167167
public bool Occupy(Character character)
168168
{
@@ -210,7 +210,7 @@ public bool Occupy(Character character)
210210
}
211211
)
212212
{ IsBackground = true }.Start();
213-
return false;
213+
return true;
214214
}
215215

216216
public bool Attack(Character character, Character gameobj)

logic/Gaming/Game.cs

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,41 @@ public Game(MapStruct mapResource, int numOfTeam)
5858
// => characterManager != null && characterManager.Move(playerId, timeMs, direction);
5959

6060
/// <summary>
61-
/// 发起一次攻击(可按方向或目标判定,按实际规则实现)。
61+
/// 发起一次攻击(按目标 ID 判定)。
6262
/// </summary>
6363
/// <param name="playerId">发起者 ID</param>
64-
/// <param name="direction">攻击方向,弧度;如按目标实现,可忽略</param>
64+
/// <param name="targetId">目标对象 ID(角色或工厂)</param>
6565
/// <returns>是否成功受理</returns>
66-
public bool Attack(long playerId, double direction)
67-
=> throw new NotImplementedException();
66+
public bool Attack(long playerId, long targetId)
67+
{
68+
if (!characterManager.TryGetCharacter(playerId, out var attacker)) return false;
69+
if (attacker.IsRemoved) return false;
70+
if (targetId <= 0) return false;
71+
72+
Character? targetCharacter = gameMap.FindCharacterInID(targetId);
73+
if (targetCharacter != null)
74+
{
75+
if (targetCharacter.IsRemoved) return false;
76+
if (targetCharacter.ID == attacker.ID) return false;
77+
if (targetCharacter.TeamID.Get() == attacker.TeamID.Get()) return false;
78+
return actionManager.Attack(attacker, targetCharacter);
79+
}
80+
81+
Factory? targetFactory = FindFactoryById(targetId);
82+
if (targetFactory != null)
83+
{
84+
if (targetFactory.TeamID.Get() == attacker.TeamID.Get()) return false;
85+
return actionManager.Attack(attacker, targetFactory);
86+
}
87+
88+
return false;
89+
}
90+
91+
public bool Attack(long playerId, double targetId)
92+
{
93+
if (double.IsNaN(targetId) || double.IsInfinity(targetId)) return false;
94+
return Attack(playerId, (long)Math.Round(targetId));
95+
}
6896

6997

7098
/// <summary>
@@ -75,7 +103,18 @@ public bool Attack(long playerId, double direction)
75103
/// <param name="timeMs">采集时间(毫秒)</param>
76104
/// <returns>是否成功受理</returns>
77105
public bool Harvest(long playerId, long resourceId, int timeMs)
78-
=> throw new NotImplementedException();
106+
{
107+
if (timeMs <= 0) return false;
108+
if (resourceId <= 0) return false;
109+
if (!characterManager.TryGetCharacter(playerId, out var character)) return false;
110+
if (character.IsRemoved) return false;
111+
112+
Resource? target = FindResourceById(resourceId);
113+
if (target == null) return false;
114+
if (!GameData.ApproachToInteract(character.Position, target.Position)) return false;
115+
116+
return actionManager.Harvest(character);
117+
}
79118

80119
/// <summary>
81120
/// 进行交易(购买/出售)某种商品。
@@ -87,7 +126,10 @@ public bool Harvest(long playerId, long resourceId, int timeMs)
87126
/// <returns>是否成功受理</returns>
88127
public bool Trade(long playerId, Preparation.Utility.GoodsType type, int amount, bool buy)
89128
{
129+
if (amount <= 0) return false;
130+
if (type < GoodsType.FOOD || type > GoodsType.SEMICONDUCTOR) return false;
90131
if (!characterManager.TryGetCharacter(playerId, out var character)) return false;
132+
if (character.IsRemoved) return false;
91133
return buy ? tradeManager.Buy(character, type, amount) : tradeManager.Sell(character, type, amount);
92134
}
93135

@@ -99,7 +141,18 @@ public bool Trade(long playerId, Preparation.Utility.GoodsType type, int amount,
99141
/// <param name="timeMs">占领时间(毫秒)</param>
100142
/// <returns>是否成功受理</returns>
101143
public bool Occupy(long playerId, long computeCenterId, int timeMs)
102-
=> throw new NotImplementedException();
144+
{
145+
if (timeMs <= 0) return false;
146+
if (computeCenterId <= 0) return false;
147+
if (!characterManager.TryGetCharacter(playerId, out var character)) return false;
148+
if (character.IsRemoved) return false;
149+
150+
ComputeCenter? target = FindComputeCenterById(computeCenterId);
151+
if (target == null) return false;
152+
if (!GameData.ApproachToInteract(character.Position, target.Position)) return false;
153+
154+
return actionManager.Occupy(character);
155+
}
103156

104157
/// <summary>
105158
/// 使用/研发一项科技(根据实际赛题约束实现)。
@@ -108,7 +161,11 @@ public bool Occupy(long playerId, long computeCenterId, int timeMs)
108161
/// <param name="tech">科技类型</param>
109162
/// <returns>是否成功受理</returns>
110163
public bool UplevelTech(long playerId, Preparation.Utility.TechType tech)
111-
=> uplevelManager.UplevelTech(playerId, tech);
164+
{
165+
if (!characterManager.TryGetCharacter(playerId, out var character)) return false;
166+
if (character.IsRemoved) return false;
167+
return uplevelManager.UplevelTech(character, tech);
168+
}
112169

113170
/// <summary>
114171
/// 获取当前帧/时刻对该玩家可见的世界快照。
@@ -163,6 +220,24 @@ private bool IsInBush(XY pos)
163220
return inBush;
164221
}
165222

223+
private Resource? FindResourceById(long resourceId)
224+
{
225+
if (!gameMap.GameObjDict.TryGetValue(GameObjType.RESOURCE, out var resources)) return null;
226+
return (Resource?)resources.Find(obj => obj is Resource r && r.ID == resourceId);
227+
}
228+
229+
private ComputeCenter? FindComputeCenterById(long computeCenterId)
230+
{
231+
if (!gameMap.GameObjDict.TryGetValue(GameObjType.COMPUTE_CENTER, out var centers)) return null;
232+
return (ComputeCenter?)centers.Find(obj => obj is ComputeCenter c && c.ID == computeCenterId);
233+
}
234+
235+
private Factory? FindFactoryById(long factoryId)
236+
{
237+
if (!gameMap.GameObjDict.TryGetValue(GameObjType.FACTORY, out var factories)) return null;
238+
return (Factory?)factories.Find(obj => obj is Factory f && f.ID == factoryId);
239+
}
240+
166241
/// <summary>
167242
/// 获取当前游戏进行的时间(毫秒)。
168243
/// </summary>

0 commit comments

Comments
 (0)