-- Copyright (c) 2003 Jacob Scott
-- License: GPL v2.0 or above
-- Enigma Level: Run!

levelw=25
levelh=15

create_world( levelw, levelh)

fill_floor("fl-leaves",0,0,levelw,levelh)

function renderLine( line, pattern)
    for i=1, strlen(pattern) do
        local c = strsub( pattern, i, i)
        if c =="#" then
            set_stone( "st-glass", i-1, line)
        elseif c == "o" then
            oxyd( i-1, line)
        elseif c=="z" then
            local     ball=			set_actor("ac-blackball", i-.5,line+.5)
        elseif c == "*" then
            set_stone( "st-brownie", i-1, line)
        elseif c == "g" then
            set_stone( "st-grate1", i-1, line)
        elseif c == "!" then
            abyss(i-1,line)
            --			fill_floor("fl-water", i-1,line, 1,1)
        elseif c == "~" then
            --			abyss(i-1,line)
            fill_floor("fl-water", i-1,line, 1,1)
        elseif c=="+" then
            set_stone( "st-wood", i-1, line)
        elseif c=="L" then
            set_stone("st-oneway-w", i-1,line)
        elseif c=="R" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc10"})
        elseif c=="J" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc11"})
        elseif c=="1" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc1"})
        elseif c=="2" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc2"})
        elseif c=="3" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc3"})
        elseif c=="4" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc4"})
        elseif c=="5" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc5"})
        elseif c=="6" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc6"})
        elseif c=="7" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc7"})
        elseif c=="8" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc8"})
        elseif c=="9" then
            set_item("it-trigger", i-1,line, {invisible=1,action="callback", target="funcc9"})
        end
    end	
end

-- Floor:  " "
-- Border: "#"
-- Oxyd:   "o"

renderLine(00,"####################")
renderLine(01,"#897897897897897897#")
renderLine(02,"#5 4 6 5 4 6 5 4 6 #")
renderLine(03,"#231231231231231231#")
renderLine(04,"# 9 8 7 9 8 7 9 8 7#")
renderLine(05,"#564564564564564564#")
renderLine(06,"#2 1 3 2 1 3 2 1 3 #")
renderLine(07,"#897897897897897897#")
renderLine(08,"# 6 5 4 6 5 4 6 5 4#")
renderLine(09,"#231231231231231231#")
renderLine(10,"#8 7 9 8 7 9 8 7####")
renderLine(11,"#56456456456456RJLz#")
renderLine(12,"####################")

function renderLine( line, pattern)
   for i=1, strlen(pattern) do
      local c = strsub( pattern, i, i)
      if c =="#" then
	 set_stone( "st-glass", i-1, line)
      elseif c == "o" then
	 oxyd( i-1, line)
      end
   end
end

renderLine(00,"####o###o##o###o####")
renderLine(01,"#                  #")
renderLine(02,"# # # # # # # # # ##")
renderLine(03,"o                  o")
renderLine(04,"## # # # # # # # # #")
renderLine(05,"o                  o")
renderLine(06,"# # # # # # # # # ##")
renderLine(07,"o                  o")
renderLine(08,"## # # # # # # # # #")
renderLine(09,"o                  o")
renderLine(10,"# # # # # # # # # ##")
renderLine(11,"#                  #")
renderLine(12,"####o###o##o###o####")

oxyd_shuffle()

fill_floor("fl-abyss",1,1,3,3)

direc=0

tt=0

ax=2
ay=2

bx=16
by=11

prev=0

f1=0
f2=0
f3=0
f4=0
f5=0
f6=0
f7=0
f8=0
f9=0
f10=0
f11=0

cur=4

function funcc1()
   if f1==0 then
      cur=1
      f1=1
      dcheck()
   else
      f1=0
   end
end

function funcc2()
   if f2==0 then
      cur=2
      f2=1
      dcheck()
   else
      f2=0
   end
end

function funcc3()
   if f3==0 then
      cur=3
      f3=1
      dcheck()
   else
      f3=0
   end
end

function funcc4()
   if f4==0 then
      cur=4
      f4=1
      dcheck()
   else
      f4=0
   end
end

function funcc5()
   if f5==0 then
      cur=5
      f5=1
      dcheck()
   else
      f5=0
   end
end

function funcc6()
   if f6==0 then
      cur=6
      f6=1
      dcheck()
   else
      f6=0
   end
end

function funcc7()
   if f7==0 then
      cur=7
      f7=1
      dcheck()
   else
      f7=0
   end
end

function funcc8()
   if f8==0 then
      cur=8
      f8=1
      dcheck()
   else
      f8=0
   end
end

function funcc9()
   if f9==0 then
      cur=9
      f9=1
      dcheck()
   else
      f9=0
   end
end

function funcc10()
   if f10==0 then
      bx=15
      by=11
      cur=4
      f10=1
      if prev==6 then
	 bx=14
	 by=11
	 dcheck()
      end
      if prev==7 then
	 bx=15
	 by=10
	 dcheck()
      end
   else
      f10=0
   end
end


function funcc11()
   if f11==0 then
      cur=5
      prev=4
   else
      f11=1
   end
end

function dcheck()
tt=1
if cur==2 and prev==1 then
direc=2
elseif cur==3 and prev==2 then
direc=2
elseif cur==1 and prev==3 then
direc=2
elseif cur==5 and prev==4 then
direc=2
elseif cur==6 and prev==5 then
direc=2
elseif cur==4 and prev==6 then
direc=2
elseif cur==8 and prev==7 then
direc=2
elseif cur==9 and prev==8 then
direc=2
elseif cur==7 and prev==9 then
direc=2

elseif cur==1 and prev==2 then
direc=4
elseif cur==2 and prev==3 then
direc=4
elseif cur==3 and prev==1 then
direc=4
elseif cur==4 and prev==5 then
direc=4
elseif cur==5 and prev==6 then
direc=4
elseif cur==6 and prev==4 then
direc=4
elseif cur==7 and prev==8 then
direc=4
elseif cur==8 and prev==9 then
direc=4
elseif cur==9 and prev==7 then
direc=4

elseif cur==4 and prev==1 then
direc=1
elseif cur==5 and prev==2 then
direc=1
elseif cur==6 and prev==3 then
direc=1
elseif cur==7 and prev==4 then
direc=1
elseif cur==8 and prev==5 then
direc=1
elseif cur==9 and prev==6 then
direc=1
elseif cur==1 and prev==7 then
direc=1
elseif cur==2 and prev==8 then
direc=1
elseif cur==3 and prev==9 then
direc=1

elseif cur==1 and prev==4 then
direc=3
elseif cur==2 and prev==5 then
direc=3
elseif cur==3 and prev==6 then
direc=3
elseif cur==4 and prev==7 then
direc=3
elseif cur==5 and prev==8 then
direc=3
elseif cur==6 and prev==9 then
direc=3
elseif cur==7 and prev==1 then
direc=3
elseif cur==8 and prev==2 then
direc=3
elseif cur==9 and prev==3 then
direc=3
end

   if direc==1 then
      by=by-1
   elseif direc==2 then
      bx=bx+1
   elseif direc==3 then
      by=by+1
   elseif direc==4 then
      bx=bx-1
   end

prev=cur
end

function timer_callback()
   xdist=(((ax-bx)^2)^(1/2))
   ydist=(((ay-by)^2)^(1/2))
   if xdist>ydist and (ax-bx)<0 then
      direc2=2
   elseif xdist>ydist and (ax-bx)>0 then
      direc2=4
   elseif ydist>xdist and (ay-by)<0 then
      direc2=3
   elseif ydist>xdist and (ay-by)>0 then
      direc2=1
   elseif xdist==ydist then
      direc2=random(2)
      if (ax-bx)>0 then
	 if (ay-by)>0 then
	    if direc2==1 then
	       direc2=1
	    elseif direc2==2 then
	       direc2=4
	    end
	 elseif (ay-by)<0 then
	    if direc2==1 then
	       direc2=3
	    elseif direc2==2 then
	       direc2=4
	    end
	 end
      elseif (ax-bx)<0 then
	 if (ay-by)>0 then
	    if direc2==1 then
	       direc2=1
	    elseif direc2==2 then
	       direc2=2
	    end
	 elseif (ay-by)<0 then
	    if direc2==1 then
	       direc2=2
	    elseif direc2==2 then
	       direc2=3
	    end
	 end
      end	       
   end
   if direc2==1 then
      ay=ay-1
   elseif direc2==2 then
      ax=ax+1
   elseif direc2==3 then
      ay=ay+1
   elseif direc2==4 then
      ax=ax-1
   end
set_floor("fl-abyss", (ax-1), (ay-1))
set_floor("fl-abyss", (ax-1), (ay))
set_floor("fl-abyss", (ax-1), (ay+1))
set_floor("fl-abyss", (ax), (ay-1))
set_floor("fl-abyss", (ax), (ay))
set_floor("fl-abyss", (ax), (ay+1))
set_floor("fl-abyss", (ax+1), (ay-1))
set_floor("fl-abyss", (ax+1), (ay))
set_floor("fl-abyss", (ax+1), (ay+1))

if direc2==4 then
set_floor("fl-leaves", (ax+2), (ay+1))
set_floor("fl-leaves", (ax+2), (ay))
set_floor("fl-leaves", (ax+2), (ay-1))
end

if direc2==2 then
set_floor("fl-leaves", (ax-2), (ay+1))
set_floor("fl-leaves", (ax-2), (ay))
set_floor("fl-leaves", (ax-2), (ay-1))
end

if direc2==1 then
set_floor("fl-leaves", (ax-1), (ay+2))
set_floor("fl-leaves", (ax), (ay+2))
set_floor("fl-leaves", (ax+1), (ay+2))
end

if direc2==3 then
set_floor("fl-leaves", (ax-1), (ay-2))
set_floor("fl-leaves", (ax), (ay-2))
set_floor("fl-leaves", (ax+1), (ay-2))
end
end


set_stone("st-timer", 21,0, {loop=1, action="callback", target="timer_callback", interval=.35})