From d3583c27b4982e34764b0ffcfa206b6fbc56a487 Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Sun, 18 Dec 2022 17:10:18 -0800 Subject: [PATCH] Require pullers to be somewhat aligned with what they pull --- chameleonic.p8 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/chameleonic.p8 b/chameleonic.p8 index 2239968..f61c39b 100644 --- a/chameleonic.p8 +++ b/chameleonic.p8 @@ -1196,6 +1196,13 @@ function _linedist(x0,v,x1) return 100 * (sum_distance(x0,v,x1)-distance(x0,x1))/distance(x0,x1) end +function _vec_ang_diff(x0,y0,x1,y1) + local ang0=atan2(x0,y0) + local ang1=atan2(x1,y1) + + return (ang1-ang0+0.5)%1-0.5 +end + function sum_distance(x,y,z) return distance(x,y) + distance(y,z) end @@ -1452,6 +1459,7 @@ function rope:_tug(hypothetically) sgn0(latch.dy) local obj_anc=ancs[1] local pull_anc=ancs[2] + local pull_dx=pull_anc.x-obj_anc.x local pull_dy=pull_anc.y-obj_anc.y @@ -1461,21 +1469,23 @@ function rope:_tug(hypothetically) local mxa=(pull_anc.x+dmx)\8 local mya=(pull_anc.y+dmy)\8 - local too_far=false + local invalid_move=false if (dmx!=0 and sgn0(pull_dx)!=dmx) or (dmy!=0 and sgn0(pull_dy)!=dmy) or + abs(_vec_ang_diff(pull_anc.x\8-mx0,pull_anc.y\8-my0,dmx,dmy)) > 0.125 or + sgn0(mx0-mxa)!= sgn0(mx0+dmx-mxa) or sgn0(my0-mya)!= sgn0(my0+dmy-mya) then - too_far=true + invalid_move=true end - if not too_far and + if not invalid_move and level:can_move(false,mx0,my0,dmx,dmy,1,0) then if (hypothetically) return ancs,0