forked from pyrex/chameleonic
		
	ff to current state #6
@@ -1199,8 +1199,11 @@ end
 | 
				
			|||||||
function _vec_ang_diff(x0,y0,x1,y1)
 | 
					function _vec_ang_diff(x0,y0,x1,y1)
 | 
				
			||||||
 local ang0=atan2(x0,y0)
 | 
					 local ang0=atan2(x0,y0)
 | 
				
			||||||
 local ang1=atan2(x1,y1)
 | 
					 local ang1=atan2(x1,y1)
 | 
				
			||||||
 | 
					 return _ang_diff(ang0,ang1)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 return (ang1-ang0+0.5)%1-0.5
 | 
					function _ang_diff(ang0,ang1)
 | 
				
			||||||
 | 
					 return abs((ang1-ang0+0.5)%1-0.5)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function sum_distance(x,y,z)
 | 
					function sum_distance(x,y,z)
 | 
				
			||||||
@@ -1387,8 +1390,8 @@ function rope:_tug(hypothetically)
 | 
				
			|||||||
 local touched={}
 | 
					 local touched={}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 for i=#ancs-1,2,-1 do
 | 
					 for i=#ancs-1,2,-1 do
 | 
				
			||||||
  local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1])
 | 
					  local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2])
 | 
				
			||||||
  local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i])
 | 
					  local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1])
 | 
				
			||||||
  local ops_to_do={}
 | 
					  local ops_to_do={}
 | 
				
			||||||
  if #ops_before_trash>0 then 
 | 
					  if #ops_before_trash>0 then 
 | 
				
			||||||
   ops_to_do=ops_before_trash 
 | 
					   ops_to_do=ops_before_trash 
 | 
				
			||||||
@@ -1474,7 +1477,7 @@ function rope:_tug(hypothetically)
 | 
				
			|||||||
   (dmx!=0 and sgn0(pull_dx)!=dmx) or
 | 
					   (dmx!=0 and sgn0(pull_dx)!=dmx) or
 | 
				
			||||||
   (dmy!=0 and sgn0(pull_dy)!=dmy) 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
 | 
					   _vec_ang_diff(pull_anc.x\8-mx0,pull_anc.y\8-my0,dmx,dmy) > 0.125 or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   sgn0(mx0-mxa)!=
 | 
					   sgn0(mx0-mxa)!=
 | 
				
			||||||
   sgn0(mx0+dmx-mxa) or
 | 
					   sgn0(mx0+dmx-mxa) or
 | 
				
			||||||
@@ -1503,12 +1506,17 @@ function rope:_tug(hypothetically)
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function rope:_calc_push(
 | 
					function rope:_calc_push(
 | 
				
			||||||
 an,a0,a1
 | 
					 an,a0,a1,af
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 local ops={}
 | 
					 local ops={}
 | 
				
			||||||
 if (an==nil) return ops
 | 
					 if (an==nil) return ops
 | 
				
			||||||
 | 
					 local pull_ang=atan2(
 | 
				
			||||||
 | 
					  a0.x\8 - an.x\8,
 | 
				
			||||||
 | 
					  a0.y\8-an.y\8
 | 
				
			||||||
 | 
					 )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if a0.x==a1.x then
 | 
					 if a0.x==a1.x then
 | 
				
			||||||
 | 
					  -- no far side applying pressure?
 | 
				
			||||||
  local y0,y1=_mnmx(a0.y,a1.y)
 | 
					  local y0,y1=_mnmx(a0.y,a1.y)
 | 
				
			||||||
  local my0,my1,smy=(y0+1)\8,(y1-1)\8,1
 | 
					  local my0,my1,smy=(y0+1)\8,(y1-1)\8,1
 | 
				
			||||||
  if a0.y>a1.y then
 | 
					  if a0.y>a1.y then
 | 
				
			||||||
@@ -1518,10 +1526,16 @@ function rope:_calc_push(
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  local mx,dmx
 | 
					  local mx,dmx
 | 
				
			||||||
  if a0.x%8==0 and a0.x>an.x+7 then
 | 
					  if a0.x%8==0 and a0.x>an.x+7 then
 | 
				
			||||||
 | 
					   local needs_good_pull=af==nil or af.x>=a1.x
 | 
				
			||||||
 | 
					   if (needs_good_pull and _ang_diff(pull_ang,0.5)>=0.125) return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   -- push left
 | 
					   -- push left
 | 
				
			||||||
   mx=(a0.x-1)\8
 | 
					   mx=(a0.x-1)\8
 | 
				
			||||||
   dmx=-1
 | 
					   dmx=-1
 | 
				
			||||||
  elseif a0.x%8==7 and a0.x<an.x-7 then
 | 
					  elseif a0.x%8==7 and a0.x<an.x-7 then
 | 
				
			||||||
 | 
					   local needs_good_pull=af==nil or af.x<=a1.x
 | 
				
			||||||
 | 
					   if (needs_good_pull and _ang_diff(pull_ang,0.0)>=0.125) return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   -- push right
 | 
					   -- push right
 | 
				
			||||||
   mx=(a0.x+1)\8
 | 
					   mx=(a0.x+1)\8
 | 
				
			||||||
   dmx=1
 | 
					   dmx=1
 | 
				
			||||||
@@ -1544,11 +1558,17 @@ function rope:_calc_push(
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  local my,dmy
 | 
					  local my,dmy
 | 
				
			||||||
  if a0.y%8==0 and a0.y>an.y+6 then
 | 
					  if a0.y%8==0 and a0.y>an.y+6 then
 | 
				
			||||||
 | 
					   local needs_good_pull=af==nil or af.x>=a1.x
 | 
				
			||||||
 | 
					   if (needs_good_pull and _ang_diff(pull_ang,0.75)>=0.125) return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   -- push up
 | 
					   -- push up
 | 
				
			||||||
   my=(a0.y-1)\8
 | 
					   my=(a0.y-1)\8
 | 
				
			||||||
   dmy=-1
 | 
					   dmy=-1
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
  elseif a0.y%8==7 and a0.y<an.y-6 then
 | 
					  elseif a0.y%8==7 and a0.y<an.y-6 then
 | 
				
			||||||
 | 
					   local needs_good_pull=af==nil or af.x>=a1.x
 | 
				
			||||||
 | 
					   if (needs_good_pull and _ang_diff(pull_ang,0.25)>=0.125) return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   -- push down
 | 
					   -- push down
 | 
				
			||||||
   my=(a0.y+1)\8
 | 
					   my=(a0.y+1)\8
 | 
				
			||||||
   dmy=1
 | 
					   dmy=1
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user