-- Cannonball -- the Enigma Level
-- (c) 2003 Petr Machata/ant_39
-- Licensed under GPL v2.0 or above
-- 2003-01-08
-- 2003-01-10 -- modified base floor beneath doorE, doorF, removed document
-- 2003-01-11 -- modified so that it uses object groups from ant.lua
-- 2003-02-09 -- fixes in object groups
-- 2003-06-24 -- changes in AddConstantForce
-- 2003-10-18 -- too strong gravity fixed, also some minor cleanups

Require("levels/ant.lua")

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
function construct(x, y) set_floor("fl-metal", x, y) end
function destruct(x, y)  set_floor("fl-abyss", x, y) end

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
force = 100
act_state = 0

function forceup()
   enigma.AddConstantForce(force,0)
end

function forcedn()
   enigma.AddConstantForce(0,0)
end

function run_trigger_action()
   if (act_state == 0) then
      act_state = 1
   end
end

function restart_trigger_action()
   act_state = 0
   forcedn()
end

function tick()
   if (act_state == 0) then
      send_group_message(doors_A, "open", nil)
   elseif (act_state == 1) then
      send_group_message(doors_A, "close", nil)
      act_state = act_state + 1
   elseif (act_state == 2) then
      send_group_message(doors_B, "open", nil)
      act_state = act_state + 1
   elseif (act_state == 3) then
      forceup()
      act_state = act_state + 1
   elseif (act_state == 4) then
      send_group_message(doors_B, "close", nil)
      act_state = 0
   else
      act_state = 0
   end
end

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

cells={}
cells[";"]=cell{floor="fl-tigris"}
cells[":"]=cell{floor="fl-sahara"}
cells["."]=cell{floor="fl-abyss"}
cells["_"]=cell{floor="fl-metal"}
cells["w"]=cell{floor="fl-wood"}

cells["v"]=cell{{{gradient, 01}}}
cells["^"]=cell{{{gradient, 02}}}
cells[">"]=cell{{{gradient, 23}}}
cells["|"]=cell{{{gradient, 03}}}
cells["T"]=cell{{{gradient, 05}}}
cells["L"]=cell{{{gradient, 07}}}
cells["R"]=cell{{{gradient, 09}}}
cells["/"]=cell{{{gradient, 10}}}

cells[" "]=cell{{{checkerfloor,{cells[":"], cells[";"]}}}}

cells["="]=cell{stone="st-rock5"}
cells["#"]=cell{stone="st-rock6"}

cells["&"]=cell{{{oneway, EAST}}}
cells["%"]=cell{{{oneway, WEST}}}

cells["x"]=cell{stone="st-grate1"}
cells["e"]=cell{parent=cells["w"],stone={"st-door", {name="doorE", type="v"}}}
cells["f"]=cell{parent=cells["w"],stone={"st-door", {name="doorF", type="v"}}}

doors_A = {};
doors_B = {};
cells["?"]=cell{{{add_multistone, "st-door", doors_A, {type="h"}}}}
cells["!"]=cell{{{add_multistone, "st-door_b", doors_B, {type="v"}}}}

cells["D"]=cell{parent=cells["w"],stone="st-death"}
cells["W"]=cell{parent=cells["w"],stone="st-brick"}
cells["E"]=cell{parent=cells["w"],stone={"st-floppy", {action="openclose", target="doorE"}}}
cells["F"]=cell{parent=cells["w"],stone={"st-floppy", {action="openclose", target="doorF"}}}

path0 = {}
loco0 = {}
cells["$"]=cell{parent={cells["."], {add_multicell, path0, 0}}}
cells["@"]=cell{parent={cells["$"], {add_multicell, path0, 1}, cells["_"]}}
cells["c"]=cell{parent={cells["@"], {add_multicell, loco0, construct}}}
cells["d"]=cell{parent={cells["$"], {add_multicell, loco0, destruct}}}
rail0 = new_rail(loco0, path0)

cells["~"]=cell{stone={"st-timer", {action="callback", target="tick", interval=1}}}
cells["`"]=cell{stone={"st-timer", {action="callback", target="rail0", interval=0.15}}}

cells["+"]=cell{item={"it-trigger", {action="callback", target="forceup"}}}
cells["-"]=cell{parent=cells["_"],item={"it-trigger", {action="callback", target="forcedn"}}}
cells["*"]=cell{parent={cells[">"], cells["+"]}}
cells["o"]=cell{item={"it-trigger", {action="callback", target="run_trigger_action"}}}
cells["9"]=cell{item={"it-trigger", {action="callback", target="restart_trigger_action", invisible=1}}}

cells["h"]=cell{parent=cells["w"],item="it-floppy"}
cells["s"]=cell{parent=cells["x"],item="it-spring1"}

cells["X"]=cell{{cells["x"], cells["$"]}}
cells["Y"]=cell{{cells["x"], cells["@"]}}
cells["y"]=cell{{cells["x"], cells["w"]}}

cells["0"]=oxyd

cells["O"]=cell{parent=cells["9"],actor={"ac-blackball", {player=0}}}

level = {
   "====================.....................................~WWWWWWWWWWWWWWWWWWW",
   "=xxxxxxxxxxxxxxxxxx==wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWW......$$c@Y@@d$...W",
   "=xx        O       %ww=..............www..............Www%wwwwwwXwwwWwwwXwwwW",
   "=x 9               ====...............w...............WWWW...wwwXXXXXXXXXwwwW",
   "=x#?###############=..................w............WWWWWWW...wwwwwwwWwwwwwWWW",
   "=x# !TvvvvvvvvvvvR&__................www...........wwwwww&wwwwwwwwwwWEwwwwe0W",
   "=x#o!|>>*>>>*>>>*>&____________-.....whw.........wwwwwwwDWWWWWWWWWWWWWWWWWWWW",
   "=x# !L^^^^^^^^^^^/&__................www...........wwwwww&wwwwwwwwwwWFwwwwf0W",
   "=x#?###############=..................w............WWWWWWW...wwwwwwwWwwwwwWWW",
   "=x 9               ====...............w...............WWWW...wwwXXXXXXXXXwwwW",
   "=xx                %ww=..............www..............Www%wwwwwwXwwwWwwwXwwwW",
   "=sxxxxxxxxxxxxxxxxx==wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWW......$$c@Y@@d$...W",
   "====================.....................................`WWWWWWWWWWWWWWWWWWW"
}

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
randomseed(enigma.GetTicks())
set_default_parent(cells[" "])
create_world_by_map(level)
oxyd_shuffle()
