forked from pyrex/chameleonic
		
	main #21
| @@ -394,11 +394,14 @@ function level:reanchor() | ||||
|   old.dropped=true | ||||
|  end | ||||
|  | ||||
|  local moves={} | ||||
|  for k,new in pairs(anch_new) do | ||||
|   local old=anch_old[k] | ||||
|   if old then | ||||
|    anch_new[k]=old | ||||
|    old.ax_old,old.ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady | ||||
|    local ax_old,ay_old | ||||
|    ax_old,ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady | ||||
|    if (ax_old!=old.ax or ay_old!=old.ay) add(moves,{ax_old,ay_old,new.ax,new.ay,key=k}) | ||||
|    old.dropped=nil | ||||
|   end | ||||
|  end | ||||
| @@ -408,15 +411,16 @@ function level:reanchor() | ||||
|   add(self._anch_keys,{key=k}) | ||||
|  end | ||||
|  shellsort(self._anch_keys) | ||||
|  for point in self:anchor_points() do | ||||
|   if point.ax_old and player.rope and (point.ax_old != point.ax or point.ay_old != point.ay) then  | ||||
|    -- printh("moving: "..tostring({point.ax_old,point.ay_old}).."=>"..tostring({point.ax,point.ay})) | ||||
|    player.rope:be_pushed_by(point,point.ax_old,point.ay_old) | ||||
|   end | ||||
|   point.ax_old,point.ay_old=nil,nil | ||||
|  shellsort(moves) | ||||
|  printh("!!STARTING!!") | ||||
|  | ||||
|  if player.rope then | ||||
|   player.rope:experience_anchor_moves(moves) | ||||
|  end | ||||
|  | ||||
|  if (player.rope) player.rope:relax() | ||||
|  for point in self:anchor_points() do | ||||
|   point.moved=nil | ||||
|  end | ||||
| end | ||||
|  | ||||
| function level:win_at(mx,my) | ||||
| @@ -424,9 +428,10 @@ function level:win_at(mx,my) | ||||
| end | ||||
|  | ||||
| function level:anchor_points() | ||||
|  keys=all(self._anch_keys) | ||||
|  local i=0 | ||||
|  return function()  | ||||
|   local k=keys() | ||||
|   i+=1 | ||||
|   local k=self._anch_keys[i] | ||||
|   if (k) return self._anch[k.key] | ||||
|  end | ||||
| end | ||||
| @@ -988,7 +993,6 @@ function rope:draw(artificial_px,artificial_py) | ||||
|  end | ||||
|  | ||||
|  -- debug | ||||
|  --[[ | ||||
|  local n1=self.src | ||||
|  local sy=0 | ||||
|  while true do | ||||
| @@ -1036,7 +1040,6 @@ function rope:draw(artificial_px,artificial_py) | ||||
| 	 pset(x+p.adx,y,11) | ||||
| 	 pset(x,y+p.ady,11) | ||||
| 	end | ||||
|  ]] | ||||
| end | ||||
|  | ||||
| function rope:drag_dst(x,y) | ||||
| @@ -1075,6 +1078,7 @@ function rope:relax() | ||||
|   if (not n1) break | ||||
|   local n2=n1.next | ||||
|  | ||||
|  | ||||
|   if n0.ax==n1.ax and n0.ay==n1.ay then  | ||||
|    n0.next=n2  | ||||
|    if (n2) n2.prev=n0 | ||||
| @@ -1090,17 +1094,11 @@ function rope:relax() | ||||
|   local n2=n1.next | ||||
|   if (not n2) return | ||||
|  | ||||
|   if n1.associated_with then | ||||
|  | ||||
|   local x0,y0=n0.ax,n0.ay | ||||
|   local x1,y1=n1.ax,n1.ay | ||||
|   local x2,y2=n2.ax,n2.ay | ||||
|  | ||||
|    if x1!=n1.associated_with.ax or y1!=n1.associated_with.ay then | ||||
|     -- printh("dragging home: "..tostring{n1.ax,n1.ay}.."->"..tostring(n1.associated_with)) | ||||
|     self:_drag(n1,n1.associated_with.ax,n1.associated_with.ay) | ||||
|    end | ||||
|  | ||||
|   if n1.associated_with then | ||||
|    local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2) | ||||
|    if not would and not (n1.ax==x1_new and n1.ay==y1_new) then | ||||
|     -- printh("dragging: "..tostring{n1.associated_with, {x1_new, y1_new}}) | ||||
| @@ -1219,9 +1217,37 @@ function would_stick(x0,y0,anchor,x2,y2) | ||||
|  return not wouldnt,x1_new,y1_new,adx,ady | ||||
| end | ||||
|  | ||||
| function rope:be_pushed_by(anchor,ax_old,ay_old) | ||||
| function rope:experience_anchor_moves(moves) | ||||
|  self:_be_dragged_by(moves) | ||||
|  self:_be_pushed_by(moves) | ||||
|  self:relax() | ||||
| end | ||||
|  | ||||
| function rope:_be_dragged_by(moves) | ||||
|  local n=self.src | ||||
|  while n do | ||||
|   for t in all(moves) do | ||||
|    local ax_old,ay_old,ax_new,ay_new=unpack(t) | ||||
|    if (ax_old==n.ax and ay_old==n.ay) n.dest={ax_new,ay_new} break | ||||
|   end | ||||
|   n=n.next | ||||
|  end | ||||
|  | ||||
|  n=self.src | ||||
|  while n do | ||||
|   if (n.dest) self:_drag(n,unpack(n.dest)) n.dest=nil | ||||
|   n=n.next | ||||
|  end | ||||
| end | ||||
|  | ||||
| function rope:_be_pushed_by(moves) | ||||
|  for i in all(moves) do | ||||
|   self:_be_pushed_by1(unpack(i)) | ||||
|  end | ||||
| end | ||||
|  | ||||
| function rope:_be_pushed_by1(ax_old,ay_old,ax_new,ay_new) | ||||
|  local n0=self.src | ||||
|  local ax_new,ay_new=anchor.ax,anchor.ay | ||||
|  while true do | ||||
|   n1=n0.next | ||||
|   if (not n1) return | ||||
| @@ -1229,17 +1255,18 @@ function rope:be_pushed_by(anchor,ax_old,ay_old) | ||||
|   local nx0,ny0=n0.ax,n0.ay | ||||
|   local nx1,ny1=n1.ax,n1.ay | ||||
|  | ||||
|   printh(tostring{nx0,ny0,nx1,ny1}) | ||||
|   local nxmn,nxmx = _mnmx(nx0,nx1) | ||||
|   local nymn,nymx = _mnmx(ny0,ny1) | ||||
|   -- printh(tostring({anchor,nxmn,nxmx,nymn,nymx})) | ||||
|  | ||||
|   if | ||||
|    (ax_new!=ax_old or (nxmn<=anchor.ax and anchor.ax<=nxmx)) and  | ||||
|    (ay_new!=ay_old or (nymn<=anchor.ay and anchor.ay<=nymx)) and  | ||||
|    (ax_new!=ax_old or (nxmn<=ax_new and ax_new<=nxmx)) and  | ||||
|    (ay_new!=ay_old or (nymn<=ay_new and ay_new<=nymx)) and  | ||||
|  | ||||
|    (_which_side(ax_old,ay_old,nx0,ny0,nx1,ny1)!=  | ||||
|     _which_side(ax_new,ay_new,nx0,ny0,nx1,ny1)  | ||||
|    ) and would_stick(nx0,ny0,anchor,nx1,ny1) | ||||
|    ) and would_stick(nx0,ny0,{ax=ax_new,ay=ay_new},nx1,ny1) | ||||
|   then | ||||
|    -- printh("found (in): "..tostring({{nx0,ny0},{nx1,ny1}, anchor})) | ||||
|    local nx05,ny05 | ||||
| @@ -1333,7 +1360,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing) | ||||
|    ) | ||||
|   if (not anch) break | ||||
|   local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1} | ||||
|   -- printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) | ||||
|   printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) | ||||
|   n0.next=n05 | ||||
|   n1.prev=n05 | ||||
|   n0=n05 | ||||
| @@ -1347,7 +1374,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing) | ||||
|   ) | ||||
|   if (not anch) break | ||||
|   local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2} | ||||
|   -- printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with)) | ||||
|   printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with)) | ||||
|   n1.next=n15 | ||||
|   n2.prev=n15 | ||||
|   n2=n15 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user