forked from pyrex/chameleonic
		
	main #21
| @@ -234,10 +234,10 @@ function level:reinit(n) | |||||||
|  self.ix=n |  self.ix=n | ||||||
|  self.todo={} |  self.todo={} | ||||||
|  self.bigx,self.bigy=n%8,n\8 |  self.bigx,self.bigy=n%8,n\8 | ||||||
|  |  self.dirty=false | ||||||
|  |  | ||||||
|  self:load_dynobjs() |  self:load_dynobjs() | ||||||
|  self:recollide() |  self:recollide_reanchor() | ||||||
|  self:reanchor(true) |  | ||||||
|  self:spawn_exit() |  self:spawn_exit() | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -309,10 +309,12 @@ function level:update() | |||||||
|  end |  end | ||||||
|  for cix in all(remove) do |  for cix in all(remove) do | ||||||
|   self._crates[cix]=nil |   self._crates[cix]=nil | ||||||
|  |   self.dirty=true | ||||||
|  end |  end | ||||||
|  if #remove>0 then |  | ||||||
|   self:recollide() |  if self.dirty then | ||||||
|   self:reanchor() |   self:recollide_reanchor() | ||||||
|  |   self.dirty=false | ||||||
|  end |  end | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -344,7 +346,7 @@ function level:load_dynobjs() | |||||||
|  end |  end | ||||||
| end | end | ||||||
|  |  | ||||||
| function level:recollide() | function level:recollide_reanchor() | ||||||
|  self._coll={} |  self._coll={} | ||||||
|  for mx=0,15 do |  for mx=0,15 do | ||||||
|   for my=0,15 do |   for my=0,15 do | ||||||
| @@ -354,9 +356,7 @@ function level:recollide() | |||||||
|     self._crates[mxy] |     self._crates[mxy] | ||||||
|   end |   end | ||||||
|  end |  end | ||||||
| end |  | ||||||
|  |  | ||||||
| function level:reanchor() |  | ||||||
|  local anch_new={} |  local anch_new={} | ||||||
|  for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do |  for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do | ||||||
|   local dx,dy=unpack(dxy) |   local dx,dy=unpack(dxy) | ||||||
| @@ -575,8 +575,7 @@ function level:tug_crate(mx0,my0,dmx,dmy) | |||||||
|  local px1,py1=mx1*8,my1*8 |  local px1,py1=mx1*8,my1*8 | ||||||
|  existing.todo={ |  existing.todo={ | ||||||
|   {px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function() |   {px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function() | ||||||
|    self:recollide() |    self.dirty=true | ||||||
|    self:reanchor() |  | ||||||
|    return true |    return true | ||||||
|   end}, |   end}, | ||||||
|   {px=px1,py=py1} |   {px=px1,py=py1} | ||||||
| @@ -1007,16 +1006,11 @@ function rope:draw(artificial_px,artificial_py) | |||||||
|   local n2=n1.next |   local n2=n1.next | ||||||
|   if n0!=nil and n2!=nil then |   if n0!=nil and n2!=nil then | ||||||
|    if anch then |    if anch then | ||||||
|     local _,_,_,adx,ady=would_stick(anch,n0.ax,n0.ay,n1.ax,n1.ay,n2.ax,n2.ay) |     local _,_,_=would_stick(anch,n0.ax,n0.ay,n1.ax,n1.ay,n2.ax,n2.ay) | ||||||
|     assert(adx==-1 or adx==0 or adx==1) |  | ||||||
|     assert(ady==-1 or ady==0 or ady==1) |  | ||||||
|     --assert(not (adx==0 and ady==0)) |  | ||||||
|  |  | ||||||
|     local c=3 |     local c=3 | ||||||
|     if (anch.dropped) c=4 |     if (anch.dropped) c=4 | ||||||
|     rectfill(x+2,y+2,x+4,y+4,c) |     rectfill(x+2,y+2,x+4,y+4,c) | ||||||
|     pset(x+adx*2,y,9) |  | ||||||
|     pset(x,y+ady*2,9) |  | ||||||
|    else |    else | ||||||
|    rectfill(x+2,y+2,x+4,y+4,2) |    rectfill(x+2,y+2,x+4,y+4,2) | ||||||
|    end |    end | ||||||
| @@ -1163,33 +1157,35 @@ function rope:_check_sane() | |||||||
| end | end | ||||||
|  |  | ||||||
| function would_stick(anchor,x0,y0,x1,y1,x2,y2) | function would_stick(anchor,x0,y0,x1,y1,x2,y2) | ||||||
|  if (x1==nil or y1==nil) x1,y1=anchor.ax,anchor.ay |  x1,y1=x1 or anchor.ax,y1 or anchor.ay | ||||||
|  |  | ||||||
|  local dx=x2-x0 |  | ||||||
|  local dy=y2-y0 |  | ||||||
|  |  | ||||||
|  |  local dx,dy=x2-x0,y2-y0 | ||||||
|  if (x1==x0 and y1==y0) return  |  if (x1==x0 and y1==y0) return  | ||||||
|  if (x1==x2 and y1==y2) return  |  if (x1==x2 and y1==y2) return  | ||||||
|  |  | ||||||
|  local adx,ady |  local function switch_ends()  | ||||||
|  local x1_new,y1_new |   dx,dy,x0,y0,x2,y2=-dx,-dy,x2,y2,x0,y0 | ||||||
|  if abs(dx)>abs(dy) then |  | ||||||
|   if (x0>x2) dx,x0,y0,x2,y2=-dx,x2,y2,x0,y0 |  | ||||||
|   local dprop=(x1-x0)/dx |  | ||||||
|   x1_new,y1_new=x1,y0+dprop*(y2-y0) |  | ||||||
|   ady=sgn0(y1_new-y1) |  | ||||||
|   adx=sgn0(y0-y2)*ady |  | ||||||
|  else |  | ||||||
|   if (y0>y2) dy,x0,y0,x2,y2=-dy,x2,y2,x0,y0 |  | ||||||
|   local dprop=(y1-y0)/dy |  | ||||||
|   x1_new,y1_new=x0+dprop*(x2-x0),y1 |  | ||||||
|   adx=sgn0(x1_new-x1) |  | ||||||
|   ady=sgn0(x0-x2)*adx |  | ||||||
|  end |  end | ||||||
|  |  | ||||||
|  local wouldnt=anchor==nil or (anchor.adx!=adx or anchor.ady!=ady) |  local function signs(douter,dinner) | ||||||
|  |   local adb=sgn0(dinner) | ||||||
|  |   return -sgn0(douter)*adb,adb | ||||||
|  |  end | ||||||
|  |  | ||||||
|  return not wouldnt,x1_new,y1_new,adx,ady |  local adx,ady,x1_new,y1_new | ||||||
|  |  if abs(dx)>abs(dy) then | ||||||
|  |   if (x0>x2) switch_ends() | ||||||
|  |   x1_new,y1_new=x1,y0+(x1-x0)/dx*dy | ||||||
|  |   adx,ady=signs(dy,y1_new-y1) | ||||||
|  |  else | ||||||
|  |   if (y0>y2) switch_ends() | ||||||
|  |   x1_new,y1_new=x0+(y1-y0)/dy*dx,y1 | ||||||
|  |   ady,adx=signs(dx,x1_new-x1) | ||||||
|  |  end | ||||||
|  |  | ||||||
|  |  return  | ||||||
|  |   anchor and anchor.adx==adx and anchor.ady==ady, | ||||||
|  |   x1_new,y1_new | ||||||
| end | end | ||||||
|  |  | ||||||
| function rope:experience_anchor_moves(moves) | function rope:experience_anchor_moves(moves) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user