@@ -161,31 +161,69 @@ Crusher::should_crush()
161
161
162
162
for (Player* player : Sector::get ().get_players ())
163
163
{
164
- const Rectf& playerbbox = player->get_bbox ();
164
+ const Rectf& player_bbox = player->get_bbox ();
165
+ bool player_in_main_detect_zone = false ;
165
166
166
167
if (m_dir == CrusherDirection::ALL)
167
168
{
168
- if (!(playerbbox.overlaps (get_detect_box (CrusherDirection::HORIZONTAL)) ||
169
- playerbbox.overlaps (get_detect_box (CrusherDirection::VERTICAL))))
170
-
171
- continue ;
169
+ if (player_bbox.overlaps (get_detect_box (CrusherDirection::HORIZONTAL)) ||
170
+ player_bbox.overlaps (get_detect_box (CrusherDirection::VERTICAL)))
171
+ {
172
+ player_in_main_detect_zone = true ;
173
+ }
172
174
}
173
- else if (!playerbbox .overlaps (get_detect_box ()))
175
+ else if (player_bbox .overlaps (get_detect_box ()))
174
176
{
175
- continue ;
177
+ player_in_main_detect_zone = true ;
176
178
}
177
179
178
- RaycastResult result = Sector::get ().get_first_line_intersection (get_bbox ().get_middle (),
179
- playerbbox.get_middle (),
180
- false ,
181
- get_collision_object ());
180
+ bool player_in_top_edge_zone = false ;
181
+ if (!player_in_main_detect_zone &&
182
+ (m_dir == CrusherDirection::LEFT ||
183
+ m_dir == CrusherDirection::RIGHT ||
184
+ m_dir == CrusherDirection::HORIZONTAL))
185
+ {
186
+ const Rectf crusher_bbox = get_bbox ();
187
+ const float zone_width = crusher_bbox.get_width () / 6 .0f ;
188
+ const float zone_height = 1 .0f ;
189
+ const float zone_top_y = crusher_bbox.get_top () - zone_height;
182
190
183
- auto obj_p = std::get_if<CollisionObject*>(&result.hit );
184
- if (!obj_p || *obj_p != player->get_collision_object ())
185
- continue ;
191
+ Rectf left_top_zone;
192
+ Rectf right_top_zone;
186
193
187
- m_target = *obj_p;
188
- return true ;
194
+ if (m_dir == CrusherDirection::LEFT || m_dir == CrusherDirection::HORIZONTAL)
195
+ {
196
+ left_top_zone.set_p1 (Vector (crusher_bbox.get_left (), zone_top_y));
197
+ left_top_zone.set_size (zone_width, zone_height);
198
+ if (player_bbox.overlaps (left_top_zone))
199
+ player_in_top_edge_zone = true ;
200
+ }
201
+
202
+ if (!player_in_top_edge_zone &&
203
+ (m_dir == CrusherDirection::RIGHT || m_dir == CrusherDirection::HORIZONTAL))
204
+ {
205
+ right_top_zone.set_p1 (Vector (crusher_bbox.get_right () - zone_width, zone_top_y));
206
+ right_top_zone.set_size (zone_width, zone_height);
207
+ if (player_bbox.overlaps (right_top_zone))
208
+ player_in_top_edge_zone = true ;
209
+ }
210
+ }
211
+
212
+ if (player_in_main_detect_zone || player_in_top_edge_zone)
213
+ {
214
+ const RaycastResult result = Sector::get ().get_first_line_intersection (get_bbox ().get_middle (),
215
+ player_bbox.get_middle (),
216
+ false ,
217
+ get_collision_object ());
218
+
219
+ const auto obj_p = std::get_if<CollisionObject*>(&result.hit );
220
+
221
+ if (!obj_p || *obj_p != player->get_collision_object ())
222
+ continue ;
223
+
224
+ m_target = player->get_collision_object ();
225
+ return true ;
226
+ }
189
227
}
190
228
191
229
return false ;
@@ -358,7 +396,7 @@ Crusher::get_detect_box(CrusherDirection dir)
358
396
detectbox.set_p1 (pos);
359
397
detectbox.set_size (size.width , size.height );
360
398
361
- return detectbox. grown (- 1 . f ) ;
399
+ return detectbox;
362
400
}
363
401
364
402
Vector
0 commit comments