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