@@ -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