From 142091f36f9ddb8e1d6bc834e608a2afbb232180 Mon Sep 17 00:00:00 2001 From: monsterkodi Date: Mon, 8 Aug 2016 13:27:33 +0200 Subject: [PATCH] levels --- levels/bombs.coffee | 30 +++++ levels/borg.coffee | 32 ++++++ levels/bridge.coffee | 48 ++++++++ levels/bronze.coffee | 87 +++++++++++++++ levels/captured.coffee | 36 ++++++ levels/chain.coffee | 37 ++++++ levels/cheese.coffee | 85 ++++++++++++++ levels/church.coffee | 43 +++++++ levels/circuit.coffee | 69 ++++++++++++ levels/columns.coffee | 32 ++++++ levels/conductor.coffee | 79 +++++++++++++ levels/cube.coffee | 24 ++++ levels/edge.coffee | 29 +++++ levels/electro.coffee | 61 ++++++++++ levels/elevate.coffee | 49 ++++++++ levels/energy.coffee | 87 +++++++++++++++ levels/entropy.coffee | 29 +++++ levels/escape.coffee | 65 +++++++++++ levels/evil.coffee | 69 ++++++++++++ levels/fallen.coffee | 62 ++++++++++ levels/flower.coffee | 36 ++++++ levels/gamma.coffee | 76 +++++++++++++ levels/gears.coffee | 60 ++++++++++ levels/gold.coffee | 24 ++++ levels/grasp.coffee | 45 ++++++++ levels/green.coffee | 65 +++++++++++ levels/grid.coffee | 37 ++++++ levels/hidden.coffee | 75 +++++++++++++ levels/invisimaze.coffee | 129 +++++++++++++++++++++ levels/jump.coffee | 31 +++++ levels/love.coffee | 23 ++++ levels/machine.coffee | 43 +++++++ levels/maze.coffee | 77 +++++++++++++ levels/mesh.coffee | 30 +++++ levels/mini.coffee | 35 ++++++ levels/move.coffee | 40 +++++++ levels/mutants.coffee | 47 ++++++++ levels/nice.coffee | 42 +++++++ levels/plate.coffee | 34 ++++++ levels/pool.coffee | 35 ++++++ levels/random.coffee | 236 +++++++++++++++++++++++++++++++++++++++ levels/regal.coffee | 44 ++++++++ levels/rings.coffee | 31 +++++ levels/sandbox.coffee | 56 ++++++++++ levels/slick.coffee | 31 +++++ levels/spiral.coffee | 48 ++++++++ levels/start.coffee | 31 +++++ levels/steps.coffee | 30 +++++ levels/stones.coffee | 43 +++++++ levels/switch.coffee | 87 +++++++++++++++ levels/throw.coffee | 32 ++++++ levels/towers.coffee | 25 +++++ levels/walls.coffee | 41 +++++++ 53 files changed, 2772 insertions(+) create mode 100644 levels/bombs.coffee create mode 100644 levels/borg.coffee create mode 100644 levels/bridge.coffee create mode 100644 levels/bronze.coffee create mode 100644 levels/captured.coffee create mode 100644 levels/chain.coffee create mode 100644 levels/cheese.coffee create mode 100644 levels/church.coffee create mode 100644 levels/circuit.coffee create mode 100644 levels/columns.coffee create mode 100644 levels/conductor.coffee create mode 100644 levels/cube.coffee create mode 100644 levels/edge.coffee create mode 100644 levels/electro.coffee create mode 100644 levels/elevate.coffee create mode 100644 levels/energy.coffee create mode 100644 levels/entropy.coffee create mode 100644 levels/escape.coffee create mode 100644 levels/evil.coffee create mode 100644 levels/fallen.coffee create mode 100644 levels/flower.coffee create mode 100644 levels/gamma.coffee create mode 100644 levels/gears.coffee create mode 100644 levels/gold.coffee create mode 100644 levels/grasp.coffee create mode 100644 levels/green.coffee create mode 100644 levels/grid.coffee create mode 100644 levels/hidden.coffee create mode 100644 levels/invisimaze.coffee create mode 100644 levels/jump.coffee create mode 100644 levels/love.coffee create mode 100644 levels/machine.coffee create mode 100644 levels/maze.coffee create mode 100644 levels/mesh.coffee create mode 100644 levels/mini.coffee create mode 100644 levels/move.coffee create mode 100644 levels/mutants.coffee create mode 100644 levels/nice.coffee create mode 100644 levels/plate.coffee create mode 100644 levels/pool.coffee create mode 100644 levels/random.coffee create mode 100644 levels/regal.coffee create mode 100644 levels/rings.coffee create mode 100644 levels/sandbox.coffee create mode 100644 levels/slick.coffee create mode 100644 levels/spiral.coffee create mode 100644 levels/start.coffee create mode 100644 levels/steps.coffee create mode 100644 levels/stones.coffee create mode 100644 levels/switch.coffee create mode 100644 levels/throw.coffee create mode 100644 levels/towers.coffee create mode 100644 levels/walls.coffee diff --git a/levels/bombs.coffee b/levels/bombs.coffee new file mode 100644 index 0000000..c1856fd --- /dev/null +++ b/levels/bombs.coffee @@ -0,0 +1,30 @@ + +# 0000000 0000000 00 00 0000000 0000000 +# 000 000 000 000 000 000 000 000 000 +# 0000000 000 000 000000000 0000000 0000000 +# 000 000 000 000 000 0 000 000 000 000 +# 0000000 0000000 000 000 0000000 0000000 + +module.exports = + name: 'bombs' + scheme: "red_scheme" + size: [9,9,9] + intro: "bombs" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + use the bombs + """ + player: position: [0,-4,0] + + exits: [ + name: "exit" + active: 1 + position: [0,2,0] + ], + create: -> + world.addObjectAtPos KikiBomb(), world.decenter 0,-4,2 + world.addObjectAtPos KikiBomb(), world.decenter 0,-4,-2 + world.addObjectAtPos KikiBomb(), world.decenter -3,-2,0 \ No newline at end of file diff --git a/levels/borg.coffee b/levels/borg.coffee new file mode 100644 index 0000000..b2d3424 --- /dev/null +++ b/levels/borg.coffee @@ -0,0 +1,32 @@ +# level design by Michael Abel + +# 0000000 0000000 00000000 0000000 +# 000 000 000 000 000 000 000 +# 0000000 000 000 0000000 000 0000 +# 000 000 000 000 000 000 000 000 +# 0000000 0000000 000 000 0000000 + +module.exports = + name: 'borg' + scheme: "default_scheme" + size: [9,9,9] + intro: "borg" + help: """ + Believe me, + they are + CRAZY! + """ + player: + coordinates: [0,0,0] + nostatus: 0 + + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + world.addObjectAtPos KikiLight(), KikiPos 7,7,7 + for i in [0...150] + world.setObjectRandom KikiMutant() + \ No newline at end of file diff --git a/levels/bridge.coffee b/levels/bridge.coffee new file mode 100644 index 0000000..d7ec2d8 --- /dev/null +++ b/levels/bridge.coffee @@ -0,0 +1,48 @@ + +# 0000000 00000000 000 0000000 0000000 00000000 +# 000 000 000 000 000 000 000 000 000 +# 0000000 0000000 000 000 000 000 0000 0000000 +# 000 000 000 000 000 000 000 000 000 000 +# 0000000 000 000 000 0000000 0000000 00000000 + +module.exports = + name: 'bridge' + scheme: "red_scheme" + size: [9,9,5] + intro: "bridge" + help: """ + $scale(1.5)mission: + activate the exit! + to activate the exit, + feed it with electricity: + + connect the generator + with the motor + + place a wire stone + next to the exit + """ + player: position: [0,-3,1] + exits: [ + name: "exit" + active: 0 + position: [0,-1,0] + ] + create: -> + + s = world.getSize() + + world.addObjectAtPos KikiMotorGear(KikiFace.NY), KikiPos s.x/2-1, s.y-1, s.z/2 + world.addObjectAtPos KikiMotorCylinder(KikiFace.NY), KikiPos s.x/2-1, s.y-2, s.z/2 + world.addObjectAtPos KikiGenerator(KikiFace.NY), KikiPos s.x/2+1, s.y-1, s.z/2 + world.addObjectLine "KikiWire (KikiFace.NY, KikiWire.VERTICAL)", KikiPos(s.x/2, s.y-1, 0), KikiPos s.x/2, s.y-1, s.z + world.addObjectLine "KikiWire (KikiFace.PY, KikiWire.VERTICAL)", KikiPos(s.x/2, 0, 0), KikiPos s.x/2, 0, s.z + world.addObjectLine "KikiWire (KikiFace.PZ, KikiWire.VERTICAL)", KikiPos(s.x/2, 0, 0), KikiPos s.x/2, s.y, 0 + world.addObjectLine "KikiWire (KikiFace.NZ, KikiWire.VERTICAL)", KikiPos(s.x/2, 0, s.z-1), KikiPos s.x/2, s.y, s.z-1 + + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2+3, 0, s.z/2 + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2-3, 0, s.z/2 + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2+2, 1, s.z/2 + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2-2, 1, s.z/2 + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2+1, 2, s.z/2 + world.addObjectAtPos KikiWireStone(), KikiPos s.x/2-1, 2, s.z/2 diff --git a/levels/bronze.coffee b/levels/bronze.coffee new file mode 100644 index 0000000..470d28a --- /dev/null +++ b/levels/bronze.coffee @@ -0,0 +1,87 @@ + +module.exports = + name: 'bronze' + scheme: "bronze_scheme" + size: [9,6,9] + intro: "bronze" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit + feed it with electricity: + + connect the generator + with the motor + and close the circuit + with the wire stones" + """ + player: position: [0,1,0] + + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ] + create: -> + s = world.getSize() + d = 2 + + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), KikiPos(s.x/2, 1, s.z/2)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), KikiPos(s.x/2, 0, s.z/2)) + + world.addObjectAtPos(KikiGear(KikiFace.PY), KikiPos(s.x/2-1, s.y-1, s.z/2-1)) + world.addObjectAtPos(KikiGenerator(KikiFace.PY), KikiPos(s.x/2+1, s.y-1, s.z/2-1)) + + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2-1, s.y-1, s.z/2+1)) + + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x/2, s.y-1, s.z/2)) + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x/2+1, s.y-2, s.z/2)) + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x/2-1, s.y-2, s.z/2)) + + # floor wire square + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2-d), KikiPos(s.x/2+d, 0, s.z/2-d)) + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2+d), KikiPos(s.x/2+d, 0, s.z/2+d)) + + world.addObjectAtPos(KikiWire(KikiFace.PY, 5), KikiPos(s.x/2-d, 0, s.z/2+1)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 5), KikiPos(s.x/2-d, 0, s.z/2-1)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 13), KikiPos(s.x/2-d, 0, s.z/2)) + + world.addObjectAtPos(KikiWire(KikiFace.PY, 5), KikiPos(s.x/2+d, 0, s.z/2+1)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 5), KikiPos(s.x/2+d, 0, s.z/2-1)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 7), KikiPos(s.x/2+d, 0, s.z/2)) + + # corners of wire square + world.addObjectAtPos(KikiWire(KikiFace.PY, 6), KikiPos(s.x/2-d, 0, s.z/2-d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 3), KikiPos(s.x/2-d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 9), KikiPos(s.x/2+d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 12), KikiPos(s.x/2+d, 0, s.z/2-d)) + + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(0, 0, s.z/2), KikiPos(s.x/2-d, 0, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2+d+1, 0, s.z/2), KikiPos(s.x, 0, s.z/2)) + + # ceiling wire square + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(s.x/2-d+1, s.y-1, s.z/2-d), KikiPos(s.x/2+d, s.y-1, s.z/2-d)) + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(s.x/2-d+1, s.y-1, s.z/2+d), KikiPos(s.x/2+d, s.y-1, s.z/2+d)) + + world.addObjectAtPos(KikiWire(KikiFace.NY, 5), KikiPos(s.x/2-d, s.y-1, s.z/2+1)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 5), KikiPos(s.x/2-d, s.y-1, s.z/2-1)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 13), KikiPos(s.x/2-d, s.y-1, s.z/2)) + + world.addObjectAtPos(KikiWire(KikiFace.NY, 5), KikiPos(s.x/2+d, s.y-1, s.z/2+1)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 5), KikiPos(s.x/2+d, s.y-1, s.z/2-1)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 7), KikiPos(s.x/2+d, s.y-1, s.z/2)) + + # corners of wire square + world.addObjectAtPos(KikiWire(KikiFace.NY, 3), KikiPos(s.x/2-d, s.y-1, s.z/2-d)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 6), KikiPos(s.x/2-d, s.y-1, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 12), KikiPos(s.x/2+d, s.y-1, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.NY, 9), KikiPos(s.x/2+d, s.y-1, s.z/2-d)) + + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(0, s.y-1, s.z/2), KikiPos(s.x/2-d, s.y-1, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(s.x/2+d+1, s.y-1, s.z/2), KikiPos(s.x, s.y-1, s.z/2)) + + # wall wire lines + world.addObjectLine("KikiWire(KikiFace.PX, 5)", KikiPos( 0, 0, s.z/2), KikiPos( 0, s.y, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NX, 5)", KikiPos(s.x-1, 0, s.z/2), KikiPos(s.x-1, s.y, s.z/2)) + \ No newline at end of file diff --git a/levels/captured.coffee b/levels/captured.coffee new file mode 100644 index 0000000..271a80c --- /dev/null +++ b/levels/captured.coffee @@ -0,0 +1,36 @@ +# Level design of 'captured' by Niko Boehm + +module.exports = + + name: "captured" + scheme: "default_scheme" + size: [9,9,9] + intro: "captured" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + move the stones + """ + player: position: [0,-3,0] + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s = world.getSize() + + for i in [-2, 2] + world.addObjectPoly (KikiStone, [world.decenter(1, 1, i), world.decenter(1, -1, i), + world.decenter(-1, -1, i), world.decenter(-1, 1, i)]) + world.addObjectPoly (KikiStone, [world.decenter(1, i, 1), world.decenter(1, i, -1),\ + world.decenter(-1, i, -1), world.decenter(-1, i, 1)]) + world.addObjectPoly (KikiStone, [world.decenter(i, 1, 1), world.decenter(i, 1, -1),\ + world.decenter(i, -1, -1), world.decenter(i, -1, 1)]) + + for i in [-4, -2, 2, 4] + world.addObjectAtPos(KikiStone(), world.decenter(i, 0, 0)) + world.addObjectAtPos(KikiStone(), world.decenter(0, i, 0)) + world.addObjectAtPos(KikiStone(), world.decenter(0, 0, i)) diff --git a/levels/chain.coffee b/levels/chain.coffee new file mode 100644 index 0000000..0ae0f12 --- /dev/null +++ b/levels/chain.coffee @@ -0,0 +1,37 @@ +module.exports = + name: "chain" + scheme: "candy_scheme" + size: [9,9,5] + intro: "chain" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + feed it with electricity: + + connect the generator + with the motor + + place a wire stone + next to the exit + """ + player: position: [1,2,0] + + exits: [ + name: "exit" + active: 0 + position: [0,-1,0] + ], + create: -> + s = world.getSize() + d = s.z/2 + + world.addObjectAtPos(KikiWall(), KikiPos(0, 0, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(0, 1, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(1, 0, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(0, 7, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(5, 7, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(1, 3, d)) + world.addObjectAtPos(KikiBomb(), KikiPos(5, 3, d)) + world.addObjectAtPos(KikiWireStone(), KikiPos(1,5,d)) \ No newline at end of file diff --git a/levels/cheese.coffee b/levels/cheese.coffee new file mode 100644 index 0000000..349e99d --- /dev/null +++ b/levels/cheese.coffee @@ -0,0 +1,85 @@ +# level design by Owen Hay + +module.exports = + name: "cheese" + scheme: "yellow_scheme" + size: [11,12,7] + intro: "cheese" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the switches, + shoot them + + to be able to shoot the switches, + move the center stone + to move the center stone, + use the bomb. + + the bomb will detonate if you shoot it + """ + player: + coordinates: [3, 4,3] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [-1,0,0] + ] + create: -> + s = world.getSize() + h = 0 + # bomb and stones + for i in [1, 2] + world.addObjectAtPos(KikiWall(), KikiPos(1, i, 1)) + world.addObjectAtPos(KikiWall(), KikiPos(1, i, 3)) + world.addObjectAtPos(KikiWall(), KikiPos(2, i, 1)) + world.addObjectAtPos(KikiWall(), KikiPos(2, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(2, i, 5)) + world.addObjectAtPos(KikiWall(), KikiPos(3, i, 1)) + world.addObjectAtPos(KikiWall(), KikiPos(3, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(3, i, 4)) + world.addObjectAtPos(KikiWall(), KikiPos(3, i, 5)) + world.addObjectAtPos(KikiWall(), KikiPos(5, i, 0)) + world.addObjectAtPos(KikiWall(), KikiPos(5, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(5, i, 3)) + world.addObjectAtPos(KikiWall(), KikiPos(5, i, 4)) + world.addObjectAtPos(KikiWall(), KikiPos(6, i, 1)) + world.addObjectAtPos(KikiWall(), KikiPos(6, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(7, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(7, i, 4)) + world.addObjectAtPos(KikiWall(), KikiPos(7, i, 5)) + world.addObjectAtPos(KikiWall(), KikiPos(8, i, 0)) + world.addObjectAtPos(KikiWall(), KikiPos(8, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(8, i, 4)) + world.addObjectAtPos(KikiWall(), KikiPos(8, i, 5)) + world.addObjectAtPos(KikiWall(), KikiPos(9, i, 2)) + world.addObjectAtPos(KikiWall(), KikiPos(9, i, 4)) + world.addObjectAtPos(KikiWall(), KikiPos(10, i, 3)) + + for i in range(0,s.x) + for j in range(0, s.z) + world.addObjectAtPos(KikiStone(), KikiPos(i,2,j)) + + world.switch_counter = 0 + + switched = (switch) -> + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate(world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 4) + + switch1 = KikiSwitch() + switch1.getEventWithName("switched").addAction(continuous(()-> s=switch1: switched(s))) + switch2 = KikiSwitch() + switch2.getEventWithName("switched").addAction(continuous(()-> s=switch2: switched(s))) + switch3 = KikiSwitch() + switch3.getEventWithName("switched").addAction(continuous(()-> s=switch3: switched(s))) + switch4 = KikiSwitch() + switch4.getEventWithName("switched").addAction(continuous(()-> s=switch4: switched(s))) + + world.addObjectAtPos(switch1, KikiPos(1, 0 ,2)) + world.addObjectAtPos(switch2, KikiPos(7, 1, 0)) + world.addObjectAtPos(switch3, KikiPos(9, 0, 0)) + world.addObjectAtPos(switch4, KikiPos(9, 1, 5)) + \ No newline at end of file diff --git a/levels/church.coffee b/levels/church.coffee new file mode 100644 index 0000000..e9caab4 --- /dev/null +++ b/levels/church.coffee @@ -0,0 +1,43 @@ +module.exports = + name: "church" + scheme: "yellow_scheme" + size: [5,7,5] + intro: "church" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + feed it with electricity: + + connect the generator + with the motor + + place a wire stone + next to the exit + """ + player: position: [1,0,0] + exits: [ + name: "exit" + active: 0 + position: [0,-1,0] + ] + create: -> + s = world.getSize() + + world.addObjectLine("KikiWireStone()", KikiPos(0, 0, 0), KikiPos(0, s.y-2, 0)) + world.addObjectLine("KikiWireStone()", KikiPos(s.x-1, 0, 0), KikiPos(s.x-1, s.y-2, 0)) + world.addObjectLine("KikiWireStone()", KikiPos(s.x-1, 0, s.z-1), KikiPos(s.x-1, s.y-2, s.z-1)) + world.addObjectLine("KikiWireStone()", KikiPos(0, 0, s.z-1), KikiPos(0, s.y-2, s.z-1)) + + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2, s.y-2, s.z/2)) + world.addObjectAtPos(KikiGenerator(KikiFace.PY), KikiPos(s.x/2, s.y/2, s.z/2)) + + world.addObjectAtPos(KikiWireStone(), KikiPos(1, s.y-2, 1)) + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x-2, s.y-2, 1)) + world.addObjectAtPos(KikiWireStone(), KikiPos(1, s.y-2, s.z-2)) + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x-2, s.y-2, s.z-2)) + world.addObjectAtPos(KikiWireStone(), KikiPos(s.x/2, s.y-1, s.z/2)) + + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), KikiPos(s.x/2, 0, 0)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), KikiPos(s.x/2, 1, 0)) diff --git a/levels/circuit.coffee b/levels/circuit.coffee new file mode 100644 index 0000000..18b35d9 --- /dev/null +++ b/levels/circuit.coffee @@ -0,0 +1,69 @@ +# level design by Michael Abel + +module.exports = + + name: "circuit" + scheme: "tron_scheme" + size: [9,9,9] + intro: "circuit" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit + feed it with electricity + """ + player: + coordinates: [4,6,4] + nostatus: 0 + orientation: rot0 + exits: [ + name: "exit" + active: 0 + coordinates: [8,8,8] + ] + create: -> + s=world.getSize() + mx=s.x/2 + my=s.y/2 + mz=s.z/2 + sx=s.x-1 + sy=s.y-1 + sz=s.z-1 + + p=[ [KikiPos( 0, 0, 0+1),KikiPos( 0, 0,mz),KikiPos( 0,my,mz), KikiFace.X, KikiFace.X], + [KikiPos( 0,my,mz+1),KikiPos( 0,my,sz),KikiPos(mx,my,sz), KikiFace.X, KikiFace.NZ], + [KikiPos(mx,my-1,sz),KikiPos(mx, 0,sz),KikiPos(my, 0,mz), KikiFace.NZ, KikiFace.Y], + [KikiPos(mx+1, 0,mz),KikiPos(sx, 0,mz),KikiPos(sx,my,mz), KikiFace.Y, KikiFace.NX], + [KikiPos(sx,my,mz-1),KikiPos(sx,my, 0),KikiPos(mx,my, 0), KikiFace.NX, KikiFace.Z], + [KikiPos(mx,my+1, 0),KikiPos(mx,sy, 0),KikiPos(mx,sy,my), KikiFace.Z, KikiFace.NY], + [KikiPos(mx+1,sy,my),KikiPos(sx,sy,mz),KikiPos(sx,sy,sz), KikiFace.NY, KikiFace.NY], + ] + for k in p + stone= () -> KikiWire(k[3], 15) + world.addObjectLine(stone,k[0],k[1]) + world.addObjectAtPos(KikiWire(k[3], 15), k[1]) # correct the last missing stone of the line + + stone= () ->KikiWire(k[4], 15) + world.addObjectLine(stone,k[1],k[2]) + + world.addObjectAtPos(KikiWireStone(), world.decenter(1,0,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(-1,0,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,1,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,-1,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,1)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,-1)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,2)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,-2)) + + world.addObjectAtPos(KikiWire(KikiFace.X), KikiPos(0,0,0)) + world.addObjectAtPos(KikiWire(KikiFace.Z), KikiPos(0,0,0)) + world.addObjectAtPos(KikiWire(KikiFace.Z), KikiPos(1,0,0)) + + world.addObjectAtPos(KikiWire(KikiFace.NY), KikiPos(sx,sy,sz)) + + world.addObjectAtPos(KikiMotorGear(KikiFace.Z), KikiPos(2,0,0)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.Z), KikiPos(2,0,1)) + g=KikiGenerator(KikiFace.Z) + world.addObjectAtPos(g, KikiPos(mx,my,mz)) + \ No newline at end of file diff --git a/levels/columns.coffee b/levels/columns.coffee new file mode 100644 index 0000000..2f8a454 --- /dev/null +++ b/levels/columns.coffee @@ -0,0 +1,32 @@ +module.exports = + name: "columns" + scheme: "green_scheme" + size: [7,9,7] + intro: "columns" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + use the stones + """ + player: position: [0,-1,0] + + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + + s = world.getSize() + + for y in range(-s.y/2+1, s.y/2+1) + for x in range(-s.x/2+1, s.x/2+1, 2) + for z in range(-s.z/2+1, s.z/2+1, 2) + world.addObjectAtPos(KikiStone(), world.decenter(x, y, z)) + + world.deleteObject(world.getOccupantAtPos(world.decenter(-1, 0, 1))) + world.deleteObject(world.getOccupantAtPos(world.decenter( 1, 0,-1))) + world.deleteObject(world.getOccupantAtPos(world.decenter( 1, 0, 1))) + world.deleteObject(world.getOccupantAtPos(world.decenter(-1, 0,-1))) diff --git a/levels/conductor.coffee b/levels/conductor.coffee new file mode 100644 index 0000000..e4852bb --- /dev/null +++ b/levels/conductor.coffee @@ -0,0 +1,79 @@ +# level design by Michael Abel + +module.exports = + name: "conductor" + scheme: "default_scheme" + size: [11,9,11] + intro: "conductor" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit + feed it with electricity: + + connect the generator + with the motor + + and place a powered wirestone + next to the exit + """ + player: + coordinates: [3,0,3] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,0,4] + ], + create: -> + + KikiWireWall = (c , p) -> + if world.isUnoccupiedPos(KikiPos(p.x,p.y,p.z)) + world.addObjectAtPos(KikiWall() , KikiPos(p.x,p.y,p.z)) + world.addObjectAtPos(KikiWire (KikiFace.X, c ), KikiPos(p.x+1,p.y ,p.z )) + world.addObjectAtPos(KikiWire (KikiFace.NX, c ), KikiPos(p.x-1,p.y ,p.z )) + world.addObjectAtPos(KikiWire (KikiFace.Y, c ), KikiPos(p.x ,p.y+1,p.z )) + world.addObjectAtPos(KikiWire (KikiFace.NY, c ), KikiPos(p.x ,p.y-1,p.z )) + world.addObjectAtPos(KikiWire (KikiFace.Z, c ), KikiPos(p.x ,p.y ,p.z+1)) + world.addObjectAtPos(KikiWire (KikiFace.NZ, c ), KikiPos(p.x ,p.y ,p.z-1)) + + for h in [2,4,6] + world.addObjectLine (KikiWall, KikiPos(5,2,h), KikiPos(5,6,h) ) + world.addObjectAtPos(KikiWireStone(), KikiPos(5,1,h)) + world.addObjectAtPos(KikiWireStone(), KikiPos(5,6,h)) + + wire_u= -> KikiWire(KikiFace.Z, 4+1 ) + wire_d= -> KikiWire(KikiFace.NZ, 4+1 ) + + world.addObjectLine(wire_d, KikiPos(5,2,1),KikiPos(5,6,1)) + world.addObjectLine(wire_u, KikiPos(5,2,3),KikiPos(5,6,3)) + world.addObjectAtPos( KikiWire (KikiFace.NY, 5 ), KikiPos(5,1,2)) + world.addObjectAtPos( KikiWire (KikiFace.Y, 5 ), KikiPos(5,6,2)) + + + world.addObjectAtPos(KikiMotorGear(KikiFace.Z), KikiPos(5,0,0)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.Z), KikiPos(5,0,1)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.NX), KikiPos(4,0,0)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.X), KikiPos(6,0,0)) + + + g = KikiGenerator(KikiFace.Z) #set to Active as last command in LevelS + world.addObjectAtPos(g, KikiPos(5,1,0)) + + world.addObjectAtPos(KikiWireStone(), KikiPos(5,2,0)) + world.addObjectAtPos(KikiWireStone(), KikiPos(5,2,1)) + + world.addObjectAtPos(KikiWireStone(), KikiPos(5,5,3)) + world.addObjectAtPos(KikiWireStone(), KikiPos(5,5,5)) + + KikiWireWall(15, KikiPos(5,4,8)) + + world.addObjectAtPos(KikiWall(), KikiPos(0,0,0)) + world.addObjectAtPos(KikiWall(), KikiPos(10,0,0)) + world.addObjectAtPos(KikiWall(), KikiPos(10,8,0)) + world.addObjectAtPos(KikiWall(), KikiPos(0,8,0)) + + g.setActive(True) + + \ No newline at end of file diff --git a/levels/cube.coffee b/levels/cube.coffee new file mode 100644 index 0000000..086d9aa --- /dev/null +++ b/levels/cube.coffee @@ -0,0 +1,24 @@ +# level design by Michael Abel + +module.exports = + name: "cube" + scheme: "default_scheme" + size: [5,5,5] + intro: "cube" + help: "reach the exit!" + player: + coordinates: [2,0,0] + nostatus: 0 + orientation: rot0 + + exits: [ + name: "exit" + active: 1 + position: [0,2,2] + ], + create: -> + #startblock + x=range(5) + for (i,j,l) in [(i,j,l) for i in x for j in x for l in x] + if (-1)**(i+j+l) == -1 + world.addObjectAtPos(KikiStone(), KikiPos(i,j,l)) diff --git a/levels/edge.coffee b/levels/edge.coffee new file mode 100644 index 0000000..0a2bd35 --- /dev/null +++ b/levels/edge.coffee @@ -0,0 +1,29 @@ +# level design by Michael Abel + +module.exports = + name: "edge" + scheme: "candy_scheme" + size: [7,7,7] + intro: "edge" + help: "$scale(1.5)mission:\nget to the exit!" + player: + coordinates: [3,0,0] + nostatus: 0 + orientation: rot0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s=world.getSize() + + for (i,j,l) in [ (m,n,o) for m in range(3) for n in range(3) for o in range(3)]: + if (i==2 or j==2 or l==2) and i>=1 and j>=1 and l >=1 : + c= 0.6 - (0.3)*(-1)**(i+j+l) + d= 0.6 + (0.3)*(-1)**(i+j+l) + world.addObjectAtPos(KikiStone(KColor(c ,0, d, 0.8) , False), KikiPos(i,j,l)) + world.addObjectAtPos(KikiStone(KColor(c ,0, d, 0.8) , False), KikiPos(s.x-i-1,s.y-j-1,s.z-l-1)) + world.addObjectAtPos(KikiStone(KColor(c ,0, d, 0.8) , False), KikiPos(s.x-i-1,j,l)) + world.addObjectAtPos(KikiStone(KColor(c ,0, d, 0.8) , False), KikiPos(i,s.y-j-1,s.z-l-1)) + \ No newline at end of file diff --git a/levels/electro.coffee b/levels/electro.coffee new file mode 100644 index 0000000..1bc6288 --- /dev/null +++ b/levels/electro.coffee @@ -0,0 +1,61 @@ +module.exports = + name: "electro" + scheme: "metal_scheme" + size: [9,7,9] + intro: "electro" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit + feed it with electricity: + + connect the generator + with the motor + """ + player: + coordinates: [2,0,4] + orientation: rotz180 + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ], + create: -> + s = world.getSize () + d = 2 + + world.addObjectLine(KikiWireStone, world.decenter(-d, s.y/2, 0), world.decenter(-d, 0, 0)) + world.addObjectLine(KikiWireStone, world.decenter( d, s.y/2, 0), world.decenter( d, 0, 0)) + world.addObjectLine(KikiWireStone, world.decenter( d, 0, 0), world.decenter( 0, 0, 0)) + world.addObjectLine(KikiWireStone, world.decenter(-d, 0, 0), world.decenter( 0, 0, 0)) + + world.addObjectAtPos(KikiGear(KikiFace.PY), KikiPos(s.x/2-1, 0, s.z/2-1)) + + world.addObjectAtPos(KikiGenerator(KikiFace.PY), KikiPos(s.x/2+1, 0, s.z/2+1)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), KikiPos(s.x/2, 1, s.z/2)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), KikiPos(s.x/2, 0, s.z/2)) + + # floor wire square + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2-d), KikiPos(s.x/2+d, 0, s.z/2-d)) + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2+d), KikiPos(s.x/2+d, 0, s.z/2+d)) + world.addObjectLine("KikiWire(KikiFace.PY, 5)", KikiPos(s.x/2-d, 0, s.z/2-d+1), KikiPos(s.x/2-d, 0, s.z/2+d)) + world.addObjectLine("KikiWire(KikiFace.PY, 5)", KikiPos(s.x/2+d, 0, s.z/2-d+1), KikiPos(s.x/2+d, 0, s.z/2+d)) + # corners of wire square + world.addObjectAtPos(KikiWire(KikiFace.PY, 6), KikiPos(s.x/2-d, 0, s.z/2-d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 3), KikiPos(s.x/2-d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 9), KikiPos(s.x/2+d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 12), KikiPos(s.x/2+d, 0, s.z/2-d)) + + world.addObjectLine("KikiWire(KikiFace.PX, 5)", KikiPos( 0, 0, s.z/2), KikiPos( 0, s.y, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NX, 5)", KikiPos(s.x-1, 0, s.z/2), KikiPos(s.x-1, s.y, s.z/2)) + + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(0, s.y-1, s.z/2), KikiPos(s.x/2-d, s.y-1, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(s.x-d, s.y-1, s.z/2), KikiPos(s.x, s.y-1, s.z/2)) + + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(0, 0, s.z/2), KikiPos(s.x/2-d, 0, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x-d, 0, s.z/2), KikiPos(s.x, 0, s.z/2)) + + world.addObjectAtPos(KikiWire(KikiFace.PY, 13), KikiPos(s.x/2-d, 0, s.z/2)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 7), KikiPos(s.x/2+d, 0, s.z/2)) \ No newline at end of file diff --git a/levels/elevate.coffee b/levels/elevate.coffee new file mode 100644 index 0000000..13d8b7a --- /dev/null +++ b/levels/elevate.coffee @@ -0,0 +1,49 @@ +module.exports = + name: "elevate" + scheme: "bronze_scheme" + size: [9,5,7] + intro: "elevate" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + feed it with electricity + + use the bombs + to elevate the gears + + and the generator + + the bombs will detonate + if you shoot them + """ + player: position: [3,-2,0] + exits: [ + name: "exit" + active: 0 + position: 2,-2,0 + ] + create: -> + + s = world.getSize() + + world.addObjectAtPos(KikiMotorGear(KikiFace.NY), KikiPos(s.x/2-3, s.y-1, s.z/2)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.NY), KikiPos(s.x/2-3, s.y-2, s.z/2)) + world.addObjectAtPos(KikiGenerator (KikiFace.NY), KikiPos(s.x/2+2, 1, s.z/2-1)) + world.addObjectAtPos(KikiGear(KikiFace.NY), KikiPos(s.x/2+1, 1, s.z/2+1)) + world.addObjectAtPos(KikiGear(KikiFace.NY), KikiPos(s.x/2, 1, s.z/2-1)) + world.addObjectAtPos(KikiGear(KikiFace.NY), KikiPos(s.x/2-1, 1, s.z/2+1)) + world.addObjectAtPos(KikiGear(KikiFace.NY), KikiPos(s.x/2-2, 1, s.z/2-1)) + + world.addObjectLine("KikiWire (KikiFace.NY, KikiWire.VERTICAL)", KikiPos(s.x/2+2, s.y-1, 0), KikiPos(s.x/2+2, s.y-1, s.z)) + world.addObjectLine("KikiWire (KikiFace.PY, KikiWire.VERTICAL)", KikiPos(s.x/2+2, 0, 0), KikiPos(s.x/2+2, 0, s.z)) + world.addObjectLine("KikiWire (KikiFace.PZ, KikiWire.VERTICAL)", KikiPos(s.x/2+2, 0, 0), KikiPos(s.x/2+2, s.y, 0)) + world.addObjectLine("KikiWire (KikiFace.NZ, KikiWire.VERTICAL)", KikiPos(s.x/2+2, 0, s.z-1), KikiPos(s.x/2+2, s.y, s.z-1)) + + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2+2, 0, s.z/2-1)) + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2+1, 0, s.z/2+1)) + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2, 0, s.z/2-1)) + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2-1, 0, s.z/2+1)) + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2-2, 0, s.z/2-1)) + \ No newline at end of file diff --git a/levels/energy.coffee b/levels/energy.coffee new file mode 100644 index 0000000..c15b419 --- /dev/null +++ b/levels/energy.coffee @@ -0,0 +1,87 @@ +module.exports = + name: "energy" + scheme: "default_scheme" + size: [9,17,9] + intro: "energy" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + shoot the 4 switches + """ + player: + position: [0,1,0] + orientation: roty90 + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ], + create: -> + + s = world.getSize() + + world.addObjectLine(KikiWall, [0, s.y/2, s.z/2], [s.x, s.y/2, s.z/2]) + world.addObjectLine(KikiWall, [s.x/2, s.y/2, 0], [s.x/2, s.y/2, s.z]) + world.deleteObject(world.getOccupantAtPos(world.decenter(0,0,0))) + + world.addObjectAtPos(KikiWall(), world.decenter(0, 3, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(0, 6, 0)) + + world.addObjectAtPos(KikiWall(), world.decenter(0, -4, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 2,-5, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,-5, 2)) + world.addObjectAtPos(KikiWall(), world.decenter(-2,-5,-1)) + world.addObjectAtPos(KikiWall(), world.decenter( 1,-5,-2)) + + world.addObjectAtPos(KikiMutant(), world.decenter( 2,-5, 2)) + world.addObjectAtPos(KikiMutant(), world.decenter(-2,-5,-2)) + world.addObjectAtPos(KikiMutant(), world.decenter( 1,-5, 1)) + world.addObjectAtPos(KikiMutant(), world.decenter(-1,-5,-1)) + world.addObjectAtPos(KikiMutant(), world.decenter( 2,-5,-2)) + world.addObjectAtPos(KikiMutant(), world.decenter(-2,-5, 2)) + world.addObjectAtPos(KikiMutant(), world.decenter( 1,-5,-1)) + world.addObjectAtPos(KikiMutant(), world.decenter(-1,-5, 1)) + + world.addObjectAtPos(KikiWall(), world.decenter( 0, 3, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, 5, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter( 1, 4, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(-1, 4, s.z/2)) + + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, 3, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, 5, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, 4, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, 4, -1)) + + world.addObjectAtPos(KikiWall(), world.decenter( 0, 3, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, 5, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter( 1, 4, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1, 4, -s.z/2+1)) + + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, 3, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, 5, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, 4, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, 4, -1)) + + world.switch_counter = 0 + + switched = (switch) -> + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate (world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 4) + + switch1 = KikiSwitch() + switch1.getEventWithName("switched").addAction(continuous(()-> sw=switch1: switched(sw))) + switch2 = KikiSwitch() + switch2.getEventWithName("switched").addAction(continuous(()-> sw=switch2: switched(sw))) + switch3 = KikiSwitch() + switch3.getEventWithName("switched").addAction(continuous(()-> sw=switch3: switched(sw))) + switch4 = KikiSwitch() + switch4.getEventWithName("switched").addAction(continuous(()-> sw=switch4: switched(sw))) + + world.addObjectAtPos(switch1, world.decenter(-s.x/2+1, 4, 0)) + world.addObjectAtPos(switch2, world.decenter( s.x/2, 4, 0)) + world.addObjectAtPos(switch3, world.decenter(0, 4, -s.z/2+1)) + world.addObjectAtPos(switch4, world.decenter(0, 4, s.z/2)) + \ No newline at end of file diff --git a/levels/entropy.coffee b/levels/entropy.coffee new file mode 100644 index 0000000..85ab59c --- /dev/null +++ b/levels/entropy.coffee @@ -0,0 +1,29 @@ +# level design by Michael Abel + +module.exports = + + name: "entropy" + scheme: "green_scheme" + size: [9,9,9] + intro: "entropy" + help: """ + $scale(1.5)mission: + get to the exit! + + use the stones to reach it + """ + player: + coordinates: [4,3,4] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s=world.getSize() + d=2 + for (i,j,l) in [ (m,n,o) for m in range(s.x) for n in range(s.y) for o in range(s.z)] + if (-1)**(i+j+l) ==1 and not ( d<=i<=s.x-d-1 and d<=j<=s.y-d-1 and d<=l<=s.z-d-1 ) + world.addObjectAtPos(KikiStone(KColor(0,0.8,0.2,0.8), true), KikiPos(i,j,l)) + diff --git a/levels/escape.coffee b/levels/escape.coffee new file mode 100644 index 0000000..c01a139 --- /dev/null +++ b/levels/escape.coffee @@ -0,0 +1,65 @@ +module.exports = + name: "escape" + scheme: "metal_scheme" + size: [7,9,7] + intro: "escape" + help: """ + $scale(1.5)mission: + try to escape! + + to escape, + activate the exit + + to activate the exit, + shoot the switch + + to be able to + shoot the switch, + move the stones + """ + player: + position: [0,0,0] + orientation: rotx180 + exits: [ + name: "exit" + active: 0 + position: [0,-3,0] + ] + create: -> +# + s = world.getSize() + + exit_switch = KikiSwitch() + exit_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit"))) + world.addObjectAtPos(exit_switch, world.decenter( 0, -2, 0)) + + world.addObjectAtPos(KikiStone(), world.decenter( 0, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), world.decenter( 1, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), world.decenter( 0, s.y/2, 1)) + world.addObjectAtPos(KikiStone(), world.decenter( 0, s.y/2,-1)) + world.addObjectAtPos(KikiStone(), world.decenter(-1, s.y/2, 0)) + + world.addObjectLine(KikiStone, world.decenter(-2, s.y/2,-2), world.decenter( 2, s.y/2,-2)) + world.addObjectLine(KikiStone, world.decenter( 2, s.y/2,-2), world.decenter( 2, s.y/2, 2)) + world.addObjectLine(KikiStone, world.decenter( 2, s.y/2, 2), world.decenter(-2, s.y/2, 2)) + world.addObjectLine(KikiStone, world.decenter(-2, s.y/2, 2), world.decenter(-2, s.y/2,-2)) + + world.addObjectAtPos(KikiWall(), world.decenter( 1, 0, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, 0, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1, 0, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, 0,-1)) + + world.addObjectAtPos(KikiWall(), world.decenter( 1,-1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0,-1, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,-1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0,-1,-1)) + world.addObjectAtPos(KikiWall(), world.decenter( 1,-1, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,-1, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,-1,-1)) + world.addObjectAtPos(KikiWall(), world.decenter( 1,-1,-1)) + + world.addObjectAtPos(KikiWall(), world.decenter( 1,-2, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0,-2, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,-2, 0)) + world.addObjectAtPos(KikiWall(), world.decenter( 0,-2,-1)) + \ No newline at end of file diff --git a/levels/evil.coffee b/levels/evil.coffee new file mode 100644 index 0000000..7192809 --- /dev/null +++ b/levels/evil.coffee @@ -0,0 +1,69 @@ +module.exports = + name: "evil" + scheme: "red_scheme" + size: [13,5,13] + intro: "evil" + help: """ + $scale(1.5)mission: + activate the exit! + + place a powered + wire stone next to it. + a wirestone is powered by + a rotating generator + or it shares at least + one edge with + another powered wirestone. + this one is hard, + really hard, + but it's possible. + + good luck! + """ + player: position: [1,1,1] + exits: [ + name: "exit" + active: 0 + position: [0,0,4] + ], + create: -> + + sx, sy, sz = 13,5,13 + + for z in range(-sz/2+2, sz/2) + + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+2, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2-1, 0, z)) + + for z in range(-sz/2+4, sz/2-2) + + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+4, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2-3, 0, z)) + + for x in range(-sx/2+3, sx/2-1) + + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, -sz/2+2)) + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, sz/2-1)) + + for x in range(-sx/2+4, sx/2-2) + + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, -sz/2+4)) + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, sz/2-3)) + + + world.addObjectAtPos(KikiGenerator(KikiFace.PY), world.decenter(0,0,-4)) + world.addObjectAtPos(KikiWireStone(), world.decenter(4,0,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(-4,0,0)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(0,-2,-2)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,-1,-2)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), world.decenter(0,0,-2)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), world.decenter(0,1,-2)) + + world.addObjectAtPos(KikiBomb(), world.decenter(0, 2,-2)) + world.addObjectAtPos(KikiBomb(), world.decenter( 1, 0,-2)) + world.addObjectAtPos(KikiBomb(), world.decenter(-1, 0,-2)) + + world.removeObject(world.getOccupantAtPos(world.decenter(0, 0, 3))) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,3)) + \ No newline at end of file diff --git a/levels/fallen.coffee b/levels/fallen.coffee new file mode 100644 index 0000000..04bd90b --- /dev/null +++ b/levels/fallen.coffee @@ -0,0 +1,62 @@ +# level design by Owen Hay + +module.exports = + name: "fallen" + scheme: "blue_scheme" + size: [13,15,13] + intro: "fallen" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + jump and fall off the stones + try to jump so that you + land on other stones + if you fall, there is a stone + on ground to help get back on + you have to fall of this stone, as well + """ + player: + coordinates: [6,11,6] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [-4, 1,-3] + , + name: "exit" + active: 1 + position: [0, -1, 0] + ] + create: -> + + s = world.getSize () + + #hop back on + world.addObjectAtPos(KikiWall(), KikiPos(2, 12, 12)) + + #orient world + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2+2, s.z/2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2+2, s.z/2)) + + #some Hops + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2-2, s.z/2+2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2-2, s.z/2+4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-2, s.z/2+4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2-2, s.z/2+4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-4, s.z/2+4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-2, s.y/2-4, s.z/2+4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-4, s.y/2-4, s.z/2+4)) + + #long fall and strip1 + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-4, s.y/2+4, s.z/2+2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-3, s.y/2+4, s.z/2+2)) + + #short fall and strip2 + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-4, s.y/2+1, s.z/2-2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-4, s.y/2+1, s.z/2-1)) + + world.addObjectAtPos(KikiStone(), KikiPos(0, 0, 0)) + \ No newline at end of file diff --git a/levels/flower.coffee b/levels/flower.coffee new file mode 100644 index 0000000..faa110b --- /dev/null +++ b/levels/flower.coffee @@ -0,0 +1,36 @@ +# level design by Michael Abel + +module.exports = + + name: "flower" + scheme: "metal_scheme" + size: [7,7,11] + intro: "flower" + help: """ + $scale(1.5)mission: + get to the exit! + + the green stone is slicky + you can't grab it while falling + """ + player: + coordinates: [3,0,1] + nostatus: 0 + orientation: roty0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s=world.getSize() + for m in [ [1,KikiWall], [2,KikiStone] ] + for (k,l) in [[i,j] for i in [-1*m[0],1*m[0]] for j in [-1*m[0],1*m[0]]] + world.addObjectLine(m[1], KikiPos(s.x/2+k, s.y/2+l ,0), KikiPos(s.x/2+k, s.y/2+l ,3)) + world.addObjectLine(m[1], KikiPos(s.x/2+k, s.y/2+l ,8), KikiPos(s.x/2+k, s.y/2+l ,s.z)) + + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), world.decenter(1,0,0)) + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), world.decenter(-1,0,0)) + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), world.decenter(0,1,0)) + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), world.decenter(0,-1,0)) + \ No newline at end of file diff --git a/levels/gamma.coffee b/levels/gamma.coffee new file mode 100644 index 0000000..36f4c24 --- /dev/null +++ b/levels/gamma.coffee @@ -0,0 +1,76 @@ +# level design by Michael Abel + +schemes=[test_scheme, tron_scheme,candy_scheme, default_scheme, + green_scheme, yellow_scheme, blue_scheme, red_scheme, metal_scheme, bronze_scheme] + +module.exports = + name: "gamma" + scheme: "tron_scheme" + size: [10,10,10] + intro: "gamma" + help: """ + $scale(1.5)mission: + activate the exit! + + shoot at the 3 switches to activate the exit + """ + player: + coordinates: [0,5,0] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + coordinates: [2,7,4] #absolute coord + ] + create: -> + s = world.getSize() + world.switch_countera = 0 + world.switch_counter = 0 + + aswitched = () -> + applyColorScheme (schemes[world.switch_countera]) + if world.switch_countera==schemes.length-1 + world.switch_countera=0 + else + world.switch_countera+=1 + switched = (switch) -> + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate(world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 4) + + aswitch = KikiSwitch() + bswitch = KikiSwitch() + cswitch = KikiSwitch() + dswitch = KikiSwitch() + eswitch = KikiSwitch() + + aswitch.getEventWithName("switched").addAction(continuous( aswitched )) + bswitch.getEventWithName("switched").addAction(continuous(()-> s= bswitch : switched(s) )) + cswitch.getEventWithName("switched").addAction(continuous(()-> s= cswitch : switched(s) )) + dswitch.getEventWithName("switched").addAction(continuous(()-> s= dswitch : switched(s) )) + eswitch.getEventWithName("switched").addAction(continuous(()-> s= eswitch : switched(s) )) + + world.addObjectAtPos(aswitch , KikiPos (s.x-1,0,0)) + world.addObjectAtPos(bswitch , KikiPos (0,0,0)) + + world.addObjectAtPos(KikiMutant() , KikiPos (s.x/2,0,0)) + world.addObjectLine(KikiWall, KikiPos(0,0,1), KikiPos(s.x,0,1)) + world.addObjectLine(KikiWall, KikiPos(0,1,0), KikiPos(s.x,1,0)) + + world.addObjectLine(KikiWall, KikiPos(0,2,2), KikiPos(s.x-3,2,2)) + world.addObjectAtPos(KikiSwitch() , KikiPos (s.x-3,2,2)) + world.addObjectLine(KikiWall, KikiPos(2,2,2), KikiPos(2,2,s.z-3)) + world.addObjectAtPos(KikiSwitch() , KikiPos (2,2,s.z-3)) + world.addObjectLine(KikiWall, KikiPos(2,2,4), KikiPos(2,s.y-3,4)) + #exit + world.addObjectAtPos(KikiSwitch() , KikiPos (2,s.y-3,4)) + + world.addObjectLine(KikiWall, KikiPos(2,4,4), KikiPos(s.x-4,4,4)) + world.addObjectAtPos(cswitch , KikiPos (s.x-3,4,4)) + + world.addObjectLine(KikiWall, KikiPos(4,4,4), KikiPos(4,4,s.z-4)) + world.addObjectAtPos(dswitch , KikiPos (4,4,s.z-3)) + + world.addObjectLine(KikiWall, KikiPos(4,4,6), KikiPos(4,s.y-4,6)) + world.addObjectAtPos(eswitch , KikiPos (4,s.y-3,6)) + \ No newline at end of file diff --git a/levels/gears.coffee b/levels/gears.coffee new file mode 100644 index 0000000..622ef08 --- /dev/null +++ b/levels/gears.coffee @@ -0,0 +1,60 @@ +module.exports = + name: "gears" + scheme: "blue_scheme" + size: [9,9,9] + intro: "gears" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit + feed it with electricity: + + connect the generator + with the motor + and close the circuit + with the wire stones + """ + player: position: [0,0,0] + exits: [ + name: "exit" + active: 0 + position: [0,4,0] + ] + create: -> + s = world.getSize() + + world.addObjectAtPos(KikiWireStone(), world.decenter(-1, 0, 0)) + world.addObjectAtPos(KikiWireStone(), world.decenter( 1, 0, 0)) + world.addObjectAtPos(KikiWireStone(), world.decenter( 0,-1, 0)) + world.addObjectAtPos(KikiWireStone(), world.decenter( 0, 1, 0)) + world.addObjectAtPos(KikiWireStone(), world.decenter( 0, 0,-1)) + world.addObjectAtPos(KikiWireStone(), world.decenter( 0, 0, 1)) + + world.addObjectAtPos(KikiGear(KikiFace.PY), KikiPos(s.x/2-1, 0, s.z/2-1)) + world.addObjectAtPos(KikiGear(KikiFace.PY), KikiPos(s.x/2+1, 0, s.z/2-1)) + world.addObjectAtPos(KikiGear(KikiFace.PY), KikiPos(s.x/2-1, 0, s.z/2+1)) + + d = 3 + world.addObjectAtPos(KikiGenerator(KikiFace.PY), KikiPos(s.x/2+1, 0, s.z/2+1)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), KikiPos(s.x/2, 1, s.z/2)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), KikiPos(s.x/2, 0, s.z/2)) + + # floor wire square + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2-d), KikiPos(s.x/2+d, 0, s.z/2-d)) + world.addObjectLine("KikiWire(KikiFace.PY, 10)", KikiPos(s.x/2-d+1, 0, s.z/2+d), KikiPos(s.x/2+d, 0, s.z/2+d)) + world.addObjectLine("KikiWire(KikiFace.PY, 5)", KikiPos(s.x/2-d, 0, s.z/2-d+1), KikiPos(s.x/2-d, 0, s.z/2+d)) + world.addObjectLine("KikiWire(KikiFace.PY, 5)", KikiPos(s.x/2+d, 0, s.z/2-d+1), KikiPos(s.x/2+d, 0, s.z/2+d)) + # corners of wire square + world.addObjectAtPos(KikiWire(KikiFace.PY, 6), KikiPos(s.x/2-d, 0, s.z/2-d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 3), KikiPos(s.x/2-d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 9), KikiPos(s.x/2+d, 0, s.z/2+d)) + world.addObjectAtPos(KikiWire(KikiFace.PY, 12), KikiPos(s.x/2+d, 0, s.z/2-d)) + + world.addObjectAtPos(KikiWire(KikiFace.PX, 1), KikiPos(0, 0, s.z/2)) + world.addObjectAtPos(KikiWire(KikiFace.NX, 1), KikiPos(s.x-1, 0, s.z/2)) + + world.addObjectLine("KikiWire(KikiFace.PX, 5)", KikiPos( 0, 1, s.z/2), KikiPos( 0, s.y, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NX, 5)", KikiPos(s.x-1, 1, s.z/2), KikiPos(s.x-1, s.y, s.z/2)) + world.addObjectLine("KikiWire(KikiFace.NY, 10)", KikiPos(0, s.y-1, s.z/2), KikiPos(s.x, s.y-1, s.z/2)) + \ No newline at end of file diff --git a/levels/gold.coffee b/levels/gold.coffee new file mode 100644 index 0000000..340bbee --- /dev/null +++ b/levels/gold.coffee @@ -0,0 +1,24 @@ +module.exports = + name: "gold" + scheme: "yellow_scheme" + size: [3,11,3] + intro: "gold" + help: """ + $scale(1.5)mission: + get to the exit! + + move the stones to reach it + """ + player: + position: [0,-4,0] + exits: [ + name: "exit" + active: 1 + position: [0,4,0] + ] + create: -> + s = world.getSize() + for y in range(-s.y/2+3, s.y/2, 2) + for x in range(-s.x/2+1, s.x/2+1) + for z in range(-s.z/2+1, s.z/2+1) + world.addObjectAtPos(KikiStone(), world.decenter(x, y, z)) diff --git a/levels/grasp.coffee b/levels/grasp.coffee new file mode 100644 index 0000000..0282644 --- /dev/null +++ b/levels/grasp.coffee @@ -0,0 +1,45 @@ +# level design by Owen Hay + +module.exports = + name: "grasp" + scheme: "blue_scheme" + intro: "grasp" + size: [11,11,11] + help: """ + $scale(1.5)mission:activate the exit! + + to shoot, press $key(shoot) + """ + player: + coordinates: [3,0,3] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ] + create: -> + + s = world.getSize() + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2+1, 0)) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-2, s.y/2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2, 4)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-2, s.y/2, 4)) + + exit_switch = KikiSwitch() + exit_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit"))) + world.addObjectAtPos(exit_switch, KikiPos(s.x/2, s.y/2, 0)) + \ No newline at end of file diff --git a/levels/green.coffee b/levels/green.coffee new file mode 100644 index 0000000..1010b5c --- /dev/null +++ b/levels/green.coffee @@ -0,0 +1,65 @@ +module.exports = + name: "green" + scheme: "green_scheme" + size: [13,5,13] + intro: "green" + help: """ + $scale(1.5)mission: + activate the exit! + + place a powered + wire stone next to it. + a wirestone is powered by + a rotating generator + or it shares at least one edge with + another powered wirestone. + this one is hard, really hard, but it's possible. + good luck! + """ + player: position: [1,1,1] + exits: [ + name: "exit" + active: 0 + position: [0,0,4] + ] + create: -> +# + sx, sy, sz = 13,5,13 + + for z in range(-sz/2+2, sz/2) + + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+2, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2-1, 0, z)) + + for z in range(-sz/2+4, sz/2-2) + + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+4, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2-3, 0, z)) + + for x in range(-sx/2+3, sx/2-1) + + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, -sz/2+2)) + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, sz/2-1)) + + for x in range(-sx/2+4, sx/2-2) + + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, -sz/2+4)) + world.addObjectAtPos(KikiWall(), world.decenter(x, 0, sz/2-3)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(0,-1,0)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), world.decenter(0,0,0)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), world.decenter(0,1,0)) + + world.addObjectAtPos(KikiGenerator(KikiFace.PY), world.decenter(0,0,-4)) + world.addObjectAtPos(KikiWireStone(), world.decenter(4,0,0)) + world.addObjectAtPos(KikiWireStone(), world.decenter(-4,0,0)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(0,-2,0)) + world.addObjectAtPos(KikiBomb(), world.decenter(0, 2,0)) + + world.addObjectAtPos(KikiBomb(), world.decenter( 1, 0,0)) + world.addObjectAtPos(KikiBomb(), world.decenter(-1, 0,0)) + + world.removeObject(world.getOccupantAtPos(world.decenter(0, 0, 3))) + world.addObjectAtPos(KikiWireStone(), world.decenter(0,0,3)) + diff --git a/levels/grid.coffee b/levels/grid.coffee new file mode 100644 index 0000000..252d904 --- /dev/null +++ b/levels/grid.coffee @@ -0,0 +1,37 @@ +module.exports = + name: "grid" + scheme: "candy_scheme" + size: [9,9,9] + intro: "grid" + help: """ + $scale(1.5)mission: + get to the exit! + to get to the exit, + use the stones + """ + player: position: [1,0,1] + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> +# + s = world.getSize() + + for y in [-1, 1] + for x in range(-s.x/2+3, s.x/2-1, 2) + for z in range(-s.z/2+3, s.z/2-1, 2) + world.addObjectAtPos(KikiWall (), world.decenter(x, y, z)) + + for y in [-4, 4] + for x in range(-s.x/2+1, s.x/2+1, 2) + for z in range(-s.z/2+1, s.z/2+1, 2) + world.addObjectAtPos(KikiWall (), world.decenter(x, y, z)) + + world.addObjectAtPos(KikiStone (), world.decenter(3,-3,0)) + world.addObjectAtPos(KikiStone (), world.decenter(-3,-3,0)) + world.addObjectAtPos(KikiStone (), world.decenter(3,3,0)) + world.addObjectAtPos(KikiStone (), world.decenter(-3,3,0)) + world.addObjectAtPos(KikiStone (), world.decenter(0,-3,0)) + world.addObjectAtPos(KikiStone (), world.decenter(0,3,0)) \ No newline at end of file diff --git a/levels/hidden.coffee b/levels/hidden.coffee new file mode 100644 index 0000000..fa4fc7c --- /dev/null +++ b/levels/hidden.coffee @@ -0,0 +1,75 @@ +module.exports = + name: "hidden" + scheme: "metal_scheme" + size: [9,9,9] + intro: "hidden" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + activate the 5 switches + + use the stones to + reach the exit + """ + player: position: [0,-3,1] + + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ], + create: -> + s = world.getSize() + + world.addObjectAtPos(KikiStone(), KikiPos(0,0,1)) + world.addObjectAtPos(KikiStone(), KikiPos(0,1,0)) + world.addObjectAtPos(KikiStone(), KikiPos(1,0,1)) + world.addObjectAtPos(KikiStone(), KikiPos(1,1,0)) + world.addObjectAtPos(KikiStone(), KikiPos(2,0,0)) + switch1 = KikiSwitch() + world.addObjectAtPos(switch1, KikiPos(1,0,0)) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x-1,0,1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-1,1,0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-2,0,1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-2,1,0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-3,0,0)) + switch2 = KikiSwitch() + world.addObjectAtPos(switch2, KikiPos(s.x-2,0,0)) + + world.addObjectAtPos(KikiStone(), KikiPos(0,0,s.z-2)) + world.addObjectAtPos(KikiStone(), KikiPos(0,1,s.z-1)) + world.addObjectAtPos(KikiStone(), KikiPos(1,0,s.z-2)) + world.addObjectAtPos(KikiStone(), KikiPos(1,1,s.z-1)) + world.addObjectAtPos(KikiStone(), KikiPos(2,0,s.z-1)) + switch3 = KikiSwitch() + world.addObjectAtPos(switch3, KikiPos(1,0,s.z-1)) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x-1,0,s.z-2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-1,1,s.z-1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-2,0,s.z-2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-2,1,s.z-1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x-3,0,s.z-1)) + switch4 = KikiSwitch() + world.addObjectAtPos(switch4, KikiPos(s.x-2,0,s.z-1)) + + world.addObjectPoly(KikiStone, [KikiPos(s.x/2-1,s.y-1,s.z/2-1), KikiPos(s.x/2-1,s.y-1,s.z/2+1), \ + KikiPos(s.x/2+1,s.y-1,s.z/2+1), KikiPos(s.x/2+1,s.y-1,s.z/2-1)]) + switch5 = KikiSwitch() + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2,s.y-2,s.z/2)) + world.addObjectAtPos(switch5, KikiPos(s.x/2,s.y-1,s.z/2)) + + world.switch_counter = 0 + + switched = (switch) -> + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate(world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 5) + + switch1.getEventWithName("switched").addAction(continuous(()-> s=switch1: switched(s))) + switch2.getEventWithName("switched").addAction(continuous(()-> s=switch2: switched(s))) + switch3.getEventWithName("switched").addAction(continuous(()-> s=switch3: switched(s))) + switch4.getEventWithName("switched").addAction(continuous(()-> s=switch4: switched(s))) + switch5.getEventWithName("switched").addAction(continuous(()-> s=switch5: switched(s))) diff --git a/levels/invisimaze.coffee b/levels/invisimaze.coffee new file mode 100644 index 0000000..367c0f2 --- /dev/null +++ b/levels/invisimaze.coffee @@ -0,0 +1,129 @@ +# level design by Owen Hay + +module.exports = + name: "invisimaze" + scheme: "yellow_scheme" + size: [9,5,5] + intro: "invisimaze" + help: """ + blindly fumbling through the maze + + the switches move every time you play + there is only one way out! + """ + player: position: [0,1,0] + exits: [ + name: "exit1" + active: 0 + position: [-4,0,0] + , + name: "exit2" + active: 0 + position: [4,0,0] + world: () -> outro() + ] + create: -> + + s = world.getSize() + + def switched(switch): + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate(world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 5) + + def switchBoth(): + world.toggle("exit1") + world.toggle("exit2") + + #randomly assign the switches to different locations + tup_array = [(0,0,0),( 2, 1, -2),( -2, -2, 0),( -1, 2, 1),( -2, -2, -1),( 1, -1,2),] + random.shuffle(tup_array) + + i0 = tup_array[0] + i1 = tup_array[1] + i2 = tup_array[2] + i3 = tup_array[3] + i4 = tup_array[4] + i5 = tup_array[5] + + exit_switch = KikiSwitch() + exit_switch.getEventWithName("switched").addAction(continuous(()-> : switchBoth())) + world.addObjectAtPos(exit_switch, world.decenter(i0) ) + + exit2_switch = KikiSwitch() + exit2_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit2"))) + world.addObjectAtPos(exit2_switch, world.decenter(i1)) + + exit3_switch = KikiSwitch() + exit3_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit1"))) + world.addObjectAtPos(exit3_switch, world.decenter(i2)) + + exit4_switch = KikiSwitch() + exit4_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit1"))) + world.addObjectAtPos(exit4_switch, world.decenter(i3)) + + exit5_switch = KikiSwitch() + exit5_switch.getEventWithName("switched").addAction(continuous(()-> : world.toggle("exit1"))) + world.addObjectAtPos(exit5_switch, world.decenter(i4)) + + # Invisimaze + for y in [0, 1, ]: + world.addObjectLine(KikiStone, KikiPos(4, y, 2), KikiPos(4, y, 5)) + world.addObjectLine(KikiStone, KikiPos(5, y, 2), KikiPos(7, y, 2)) + + for y in [0,]: + for x in [2]: + world.addObjectPoly(KikiStone, [world.decenter(-2, 0, -2), world.decenter(-2, 0, 2), \ + world.decenter(2, 0, 2), world.decenter(2, 0, -2)]) + + world.addObjectPoly(KikiStone, [KikiPos(2, 4, 2), KikiPos(2, 4, 4), \ + KikiPos(4, 4, 4), KikiPos(4, 4, 2)]) + + world.addObjectAtPos(KikiStone(), KikiPos(2, 3, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(6, 3, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(6, 3, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(2, 1, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(3, 0, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(2, 1, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(2, 0, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(4, 2, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(5, 2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(5, 2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(4, 2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(3, 2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(3, 2, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(5, 3, 0)) + + world.addObjectAtPos(KikiStone(), KikiPos(6, 4, 0)) + + #the bombLock + world.addObjectAtPos(KikiStone(), KikiPos(7, 1, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(7, 1, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(7, 3, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(7, 2, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(7, 2, 2)) + world.addObjectAtPos(KikiBomb(), KikiPos(7, 2, 2)) + + # Exit 1 is blocked!!! + world.addObjectAtPos(KikiMotorCylinder(), KikiPos(1, 2, 2)) + + # Walls + for y in [-4,]: + for x in [1, -1]: + world.addObjectPoly(KikiWall, [world.decenter(y, -x, -x), world.decenter(y, -x, x), \ + world.decenter(y, x, x), world.decenter(y, x, -x)]) + for y in [-3]: + for x in [2, -2]: + world.addObjectPoly(KikiWall, [world.decenter(y, -x, -x), world.decenter(y, -x, x), \ + world.decenter(y, x, x), world.decenter(y, x, -x)]) + + for y in [4,]: + for x in [1, -1]: + world.addObjectPoly(KikiWall, [world.decenter(y, -x, -x), world.decenter(y, -x, x), \ + world.decenter(y, x, x), world.decenter(y, x, -x)]) + for y in [3]: + for x in [2, -2]: + world.addObjectPoly(KikiWall, [world.decenter(y, -x, -x), world.decenter(y, -x, x), \ + world.decenter(y, x, x), world.decenter(y, x, -x)]) + + \ No newline at end of file diff --git a/levels/jump.coffee b/levels/jump.coffee new file mode 100644 index 0000000..e2c7fd0 --- /dev/null +++ b/levels/jump.coffee @@ -0,0 +1,31 @@ +module.exports = + name: "jump" + scheme: "red_scheme" + size: [7,7,13] + intro: "jump" + help: """ + $scale"""1.5)mission: + get to the exit! + + jump on the stones to reach it + + you can attach to a stone when falling by + if you move into its direction + """ + player: position: [0,0,5] + exits: [ + name: "exit" + active: 1 + position: [0,0,4] + ] + create: -> + + s = world.getSize() + + world.addObjectAtPos(KikiWall(), world.decenter(0,0,1 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(0,0,3 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(0,0,6 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(0,1,10 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(1,0,10 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(-1,0,10 - s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(0,-1,10 - s.z/2)) \ No newline at end of file diff --git a/levels/love.coffee b/levels/love.coffee new file mode 100644 index 0000000..b05159a --- /dev/null +++ b/levels/love.coffee @@ -0,0 +1,23 @@ +module.exports = + name: "love" + scheme: "red_scheme" + size: [13,13,13] + intro: "love" + help: "$scale(1.5)mission:\nget to the exit!" + player: + position: [0,1,-4] + orientation: rot0 + exits: [ + name: "peace" + active: 1 + position: [0,0,4] + ] + create: -> + + heart = [[0,0], [ 1,1], [ 2,1], [ 3,0], [ 3,-1], [ 2,-2], [ 1,-3], [0,-4], + [-1,1], [-2,1], [-3,0], [-3,-1], [-2,-2], [-1,-3]] + for h in heart + world.addObjectAtPos(KikiBomb(), world.decenter(h[0],h[1]+1,4)) + world.addObjectAtPos(KikiStone(), world.decenter(h[0],h[1]+1,-4)) + + world.addObjectAtPos(KikiMutant(), world.decenter(0,-4,0)) \ No newline at end of file diff --git a/levels/machine.coffee b/levels/machine.coffee new file mode 100644 index 0000000..1eda42b --- /dev/null +++ b/levels/machine.coffee @@ -0,0 +1,43 @@ +# level design by Michael Abel + +module.exports = + name: "machine" + scheme: "tron_scheme" + size: [5,5,9] + intro: "machine" + help: "$scale(1.5)mission:\nactivate the exit!" + player: + position: [0,0,0] + orientation: roty270 + exits: [ + name: "exit" + active: 0 + coordinates: [1,2,8] + ] + create: + s = world.getSize() + world.addObjectAtPos(KikiMotorGear(KikiFace.X), KikiPos(0,2,4)) + world.addObjectAtPos(KikiWall(), KikiPos(0,2,3)) + world.addObjectAtPos(KikiWall(), KikiPos(0,2,5)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.X), KikiPos(1,2,4)) + + world.addObjectAtPos(KikiWireStone(), KikiPos(0,2,6)) + + for i in range(1,9,2) + world.addObjectAtPos(KikiWall(), KikiPos(4,0,i)) + world.addObjectAtPos(KikiWall(), KikiPos(4,4,i)) + world.addObjectAtPos(KikiWall(), KikiPos(0,0,i)) + world.addObjectAtPos(KikiWall(), KikiPos(0,4,i)) + for i in range(2,8,2) + gear = KikiGear(KikiFace.X) + world.addObjectAtPos(gear, KikiPos(0,1,i)) + if i == 4 + gear.setActive(true) + gear = KikiGear(KikiFace.X) + world.addObjectAtPos(gear, KikiPos(0,3,i)) + if i == 4 + gear.setActive(true) + + world.addObjectAtPos(KikiGenerator(KikiFace.X), KikiPos(0,2,2)) + + \ No newline at end of file diff --git a/levels/maze.coffee b/levels/maze.coffee new file mode 100644 index 0000000..d7bc05a --- /dev/null +++ b/levels/maze.coffee @@ -0,0 +1,77 @@ +# level design by Michael Abel + +module.exports = + + name: "maze" + scheme: "default_scheme" + size: [4,4,4] + intro: "maze" + help: """ + $scale(1.5)mission: + get to the exit! + but don't get confused :) + """ + player: + coordinates: [3,0,0] + nostatus: 0 + orientation: rotz90 + exits: [ + name: "exit" + active: 1 + coordinates: [3,3,1] #absolute coord + ] + create: -> + #level 0| # | + # | # | ^ y + # | #| | + # | ##k| -> x + + world.addObjectAtPos(KikiWall(), KikiPos(1,0,0)) + world.addObjectAtPos(KikiWall(), KikiPos(2,0,0)) + world.addObjectAtPos(KikiWall(), KikiPos(3,1,0)) + world.addObjectAtPos(KikiWall(), KikiPos(1,2,0)) + world.addObjectAtPos(KikiWall(), KikiPos(2,3,0)) + + #level 1|# # | + # |# ##| + # |## #| + # | # | + world.addObjectAtPos(KikiWall(), KikiPos(2,0,1)) + world.addObjectAtPos(KikiWall(), KikiPos(0,1,1)) + world.addObjectAtPos(KikiWall(), KikiPos(1,1,1)) + world.addObjectAtPos(KikiWall(), KikiPos(3,1,1)) + world.addObjectAtPos(KikiWall(), KikiPos(0,2,1)) + world.addObjectAtPos(KikiWall(), KikiPos(2,2,1)) + world.addObjectAtPos(KikiWall(), KikiPos(3,2,1)) + world.addObjectAtPos(KikiWall(), KikiPos(0,3,1)) + world.addObjectAtPos(KikiWall(), KikiPos(2,3,1)) + + #level 2| ###| + # |# ##| + # | #e#| + # |### | + world.addObjectAtPos(KikiWall(), KikiPos(0,0,2)) + world.addObjectAtPos(KikiWall(), KikiPos(1,0,2)) + world.addObjectAtPos(KikiWall(), KikiPos(2,0,2)) + world.addObjectAtPos(KikiWall(), KikiPos(1,1,2)) + world.addObjectAtPos(KikiWall(), KikiPos(3,1,2)) + world.addObjectAtPos(KikiWall(), KikiPos(0,2,2)) + world.addObjectAtPos(KikiWall(), KikiPos(2,2,2)) + world.addObjectAtPos(KikiWall(), KikiPos(3,2,2)) + world.addObjectAtPos(KikiWall(), KikiPos(1,3,2)) + world.addObjectAtPos(KikiWall(), KikiPos(2,3,2)) + world.addObjectAtPos(KikiWall(), KikiPos(3,3,2)) + + #level 3| # | + # | # | + # | ## | + # | | + world.addObjectAtPos(KikiWall(), KikiPos(1,1,3)) + world.addObjectAtPos(KikiWall(), KikiPos(2,1,3)) + world.addObjectAtPos(KikiWall(), KikiPos(2,2,3)) + world.addObjectAtPos(KikiWall(), KikiPos(1,3,3)) + + world.addObjectAtPos(KikiLight(), KikiPos(3,0,0)) + + world.setCameraMode(world.CAMERA_INSIDE) + \ No newline at end of file diff --git a/levels/mesh.coffee b/levels/mesh.coffee new file mode 100644 index 0000000..2c5ba5c --- /dev/null +++ b/levels/mesh.coffee @@ -0,0 +1,30 @@ +# level design by Michael Abel +module.exports = + name: "mesh" + scheme: "default_scheme" + size: [11,11,11] + intro: "mesh" + help: "$scale(1.5)mission:\nget to the exit!" + player: coordinates: [0,0,5] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s=world.getSize() + + middlemax = (u,v,w) -> + s=world.getSize() + d= 3.0/( (u-s.x/2.0)**2+ (v-s.y/2.0)**2 + (w-s.z/2.0)**2 + 1 ) + return min(1.0 ,max(0.2,d)) + middlemin = (u,v,w) -> + s=world.getSize() + d= ( (u-s.x/2.0)**2+ (v-s.y/2.0)**2 + (w-s.z/2.0)**2 )/25 + return min(1.0 ,max(0.4,d)) + + for (i,j,l) in [ (m,n,o) for m in range(s.x) for n in range(s.y) for o in range(s.z)] + if (i+1)%2 and (j+1)%2 and (l+1)%2 + world.addObjectAtPos(KikiStone(KColor(0.1*i,0.1*j,0.1*l,middlemin(i,j,l)), true) , KikiPos(i,j,l)) + \ No newline at end of file diff --git a/levels/mini.coffee b/levels/mini.coffee new file mode 100644 index 0000000..0f171dd --- /dev/null +++ b/levels/mini.coffee @@ -0,0 +1,35 @@ +# level design by Michael Abel + +module.exports = + name: "mini" + scheme: "tron_scheme" + size: [5,5,7] + intro: "mini" + help: "$scale(1.5)mission:\nget to the exit!" + player: + coordinates: [2,4,4] + nostatus: 0, + orientation: rotx90 + exits: [ + name: "exit" + active: 1 + position: [0,0,1] + ] + create: -> + world.addObjectAtPos( KikiWall(), KikiPos(1,1,0)) + world.addObjectAtPos( KikiWall(), KikiPos(3,1,0)) + world.addObjectAtPos( KikiWall(), KikiPos(1,3,0)) + world.addObjectAtPos( KikiWall(), KikiPos(3,3,0)) + + world.addObjectAtPos( KikiWall(), KikiPos(1,1,6)) + world.addObjectAtPos( KikiWall(), KikiPos(3,1,6)) + world.addObjectAtPos( KikiWall(), KikiPos(1,3,6)) + world.addObjectAtPos( KikiWall(), KikiPos(3,3,6)) + + world.addObjectAtPos( KikiStone(), KikiPos(1,1,1)) + world.addObjectAtPos( KikiStone(), KikiPos(3,1,1)) + world.addObjectAtPos( KikiStone(), KikiPos(1,3,1)) + world.addObjectAtPos( KikiStone(), KikiPos(3,3,1)) + + world.addObjectAtPos( KikiStone(), KikiPos(2,4,0)) + \ No newline at end of file diff --git a/levels/move.coffee b/levels/move.coffee new file mode 100644 index 0000000..c97e486 --- /dev/null +++ b/levels/move.coffee @@ -0,0 +1,40 @@ +module.exports = + name: "move" + scheme: "red_scheme" + intro: "move" + size: [7,7,7] + help: """ + $scale(1.5)mission: activate the exit! + to activate the exit, activate the switch + to activate the switch,shoot it + to be able to shoot the switch, move the stones + to move a stone, press "$key(push)" while moving + to shoot, press "$key(shoot)" + """ + player: + coordinates: [3,5,5] + orientation: roty180 + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ] + create: -> +# + s = world.getSize() + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2+1, 0)) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2, 1)) + + exit_switch = KikiSwitch() + exit_switch.getEventWithName("switched").addAction(continuous(()-> world.toggle("exit"))) + world.addObjectAtPos(exit_switch, KikiPos(s.x/2, s.y/2, 0)) diff --git a/levels/mutants.coffee b/levels/mutants.coffee new file mode 100644 index 0000000..7feb468 --- /dev/null +++ b/levels/mutants.coffee @@ -0,0 +1,47 @@ +module.exports = + name: "mutants" + scheme: "blue_scheme" + size: [9,9,9] + intro: "mutants" + help: """ + $scale(1.5)mission: + deactivate the mutants! + + to deactivate a mutant, + shoot him until it get's transparent + + the exit will open, + when all mutant bots + are deactivated + """ + player: position: [0,-1,0] + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + world: ()-> outro() + ] + create: -> +# + s = world.getSize() + + world.addObjectLine(KikiWall, [2, 2, 2], [s.x - 3, 2, 2]) + world.addObjectLine(KikiWall, [s.x - 3, 2, 2], [s.x - 3, s.y - 3, 2]) + world.addObjectLine(KikiWall, [s.x - 3, s.y - 3, 2], [s.x - 3, s.y - 3, s.z - 3]) + world.addObjectLine(KikiWall, [s.x - 3, s.y - 3, s.z - 3], [2, s.y - 3, s.z - 3]) + world.addObjectLine(KikiWall, [2, s.y - 3, s.z - 3], [2, 2, s.z - 3]) + world.addObjectLine(KikiWall, [2, 2, s.z - 3], [2, 2, 2]) + + world.num_mutants = 5 + world.death_counter = 0 + + botDied =() -> + world.death_counter += 1 + if world.death_counter >= world.num_mutants + world.activate("exit") + + for i in range(world.num_mutants) + mutant = KikiMutant() + mutant.getEventWithName("died").addAction(once(botDied)) + world.setObjectRandom(mutant) + \ No newline at end of file diff --git a/levels/nice.coffee b/levels/nice.coffee new file mode 100644 index 0000000..084afeb --- /dev/null +++ b/levels/nice.coffee @@ -0,0 +1,42 @@ +# level design by Michael Abel + +module.exports = + + name: "nice" + scheme: "tron_scheme" + size: [11,11,11] + intro: "nice" + help: "$scale(1.5)mission:\nget to the exit!" + player: position: [2,-1,0] + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + + supercube = (point=(5,5,5),size=2,obj=KikiWall) -> + p=point + s=size + world.addObjectPoly(obj,[KikiPos(p[0]+s,p[1]+s,p[2]), + KikiPos(p[0]+s,p[1]-s,p[2]), + KikiPos(p[0]-s,p[1]-s,p[2]), + KikiPos(p[0]-s,p[1]+s,p[2]) ]) + world.addObjectPoly(obj,[KikiPos(p[0]+s,p[1],p[2]+s), + KikiPos(p[0]+s,p[1],p[2]-s), + KikiPos(p[0]-s,p[1],p[2]-s), + KikiPos(p[0]-s,p[1],p[2]+s) ]) + world.addObjectPoly(obj,[KikiPos(p[0],p[1]+s,p[2]+s), + KikiPos(p[0],p[1]+s,p[2]-s), + KikiPos(p[0],p[1]-s,p[2]-s), + KikiPos(p[0],p[1]-s,p[2]+s) ]) + + s = world.getSize() + world.addObjectLine(KikiWall, KikiPos(1,1,1) , KikiPos(9,9,9) ) + world.addObjectLine(KikiWall, KikiPos(1,1,9) , KikiPos(9,9,1) ) + world.addObjectLine(KikiWall, KikiPos(1,9,1) , KikiPos(9,1,9) ) + world.addObjectLine(KikiWall, KikiPos(9,1,1) , KikiPos(1,9,9) ) + world.deleteObject(world.getOccupantAtPos(world.decenter(0,0,0))) + supercube(point=(5,5,5),size=5,obj=KikiWall) + supercube(point=(5,5,5),size=3,obj=KikiStone) + \ No newline at end of file diff --git a/levels/plate.coffee b/levels/plate.coffee new file mode 100644 index 0000000..c1e230d --- /dev/null +++ b/levels/plate.coffee @@ -0,0 +1,34 @@ +# level design by Michael Abel + +module.exports = + name: "plate" + scheme: "blue_scheme" + size: [7,7,9] + intro: "plate" + help: """ + $scale(1.5)mission:\nget to the exit! + + use the bombs :) + """ + player: + coordinates: [3,2,1] + nostatus: 0 + orientation: KQuaternion.rotationAroundVector(270, KVector(1,0,0)) + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + + stone = () -> KikiStone(KColor(0.6,0.6,0.6),true) + world.addObjectAtPos(KikiStone(KColor(0.8,0.8,0.3),true), world.decenter(0,0,0)) + + world.addObjectPoly(stone, [world.decenter(1,1,0),world.decenter(1,-1,0), world.decenter(-1,-1,0),world.decenter(-1,1,0)], 1) + + world.addObjectAtPos(KikiBomb(), world.decenter(0,1,-4)) + world.addObjectAtPos(KikiBomb(), world.decenter(0,-1,-4)) + world.addObjectAtPos(KikiBomb(), world.decenter(1,0,-4)) + world.addObjectAtPos(KikiBomb(), world.decenter(-1,0,-4)) + + world.addObjectAtPos(KikiBomb(), world.decenter(0,0,-2)) diff --git a/levels/pool.coffee b/levels/pool.coffee new file mode 100644 index 0000000..2471d2a --- /dev/null +++ b/levels/pool.coffee @@ -0,0 +1,35 @@ +# level design by Michael Abel + +module.exports = + name: "pool" + scheme: "green_scheme" + size: [11,11,11] + intro: "pool" + help: "$scale(1.5)mission:\nget to the exit!" + player: + coordinates: [5,10,5] + nostatus: 0 + orientation: rotx90 + exits: [ + name: "exit" + active: 1 + position: [0,0,-1] + ] + create: + s=world.getSize() + d=1 + for (i,j,l) in [ (m,n,o) for m in range(s.x) for n in range(s.y) for o in range( s.z/2-1)] + if (-1)**(i+j+l) ==1 and not ( d<=i<=s.x-d-1 and d<=j<=s.y-d-1 and d<=l ) + world.addObjectAtPos(KikiStone(KColor(0.3,0.3,1.0,0.9), true) , KikiPos(i,j,l)) + + stone=KikiWall + + for h in [ s.z/2 -1, s.z-5] + world.addObjectPoly(stone,[ KikiPos(0,0,h),KikiPos(s.x-1,0,h),KikiPos(s.x-1,s.y-1,h),KikiPos(0,s.y-1,h)],close=1) + + for (i,j) in [ (m,n) for m in range(s.x) for n in range(s.y) ] + if (-1)**(i+j) == 1 + world.addObjectAtPos(KikiWall(), KikiPos(i,j,s.z-1)) + world.addObjectAtPos(KikiWall(), KikiPos(i,j,s.z-2)) + world.addObjectAtPos(KikiWall(), KikiPos(i,j,s.z-3)) + \ No newline at end of file diff --git a/levels/random.coffee b/levels/random.coffee new file mode 100644 index 0000000..e6bc14d --- /dev/null +++ b/levels/random.coffee @@ -0,0 +1,236 @@ +# level design by Michael Abel + +module.exports = + name: "random" + scheme: "default_scheme" + size: [21,21,21] + intro: "random" + help: """ + $scale(1.5)mission: + get to the exit! + + jump and try + """ + player: + coordinates: [1,3,2] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + #startblock + world.addObjectAtPos(KikiWall(), KikiPos(1,2,2)) + world.addObjectAtPos(KikiWall(), KikiPos(1,18,2)) + world.addObjectAtPos(KikiWall(), KikiPos(1,2,18)) + world.addObjectAtPos(KikiWall(), KikiPos(1,18,18)) + + world.addObjectAtPos(KikiWall(), KikiPos(19,2,2)) + world.addObjectAtPos(KikiWall(), KikiPos(19,18,2)) + world.addObjectAtPos(KikiWall(), KikiPos(19,2,18)) + world.addObjectAtPos(KikiWall(), KikiPos(19,18,18)) + + world.addObjectAtPos(KikiLight(), KikiPos(0,0,0)) + world.addObjectAtPos(KikiLight(), KikiPos(20,20,20)) + + world.addObjectAtPos(KikiStone(), KikiPos(3,2,6)) + world.addObjectAtPos(KikiStone(), KikiPos(5,2,6)) + world.addObjectAtPos(KikiStone(), KikiPos(12,4,6)) + world.addObjectAtPos(KikiStone(), KikiPos(14,16,6)) + world.addObjectAtPos(KikiStone(), KikiPos(2,16,4)) + world.addObjectAtPos(KikiStone(), KikiPos(2,14,15)) + world.addObjectAtPos(KikiStone(), KikiPos(2,12,13)) + world.addObjectAtPos(KikiStone(), KikiPos(4,4,13)) + world.addObjectAtPos(KikiStone(), KikiPos(6,4,11)) + world.addObjectAtPos(KikiStone(), KikiPos(8,4,13)) + world.addObjectAtPos(KikiStone(), KikiPos(8,6,11)) + world.addObjectAtPos(KikiStone(), KikiPos(6,6,4)) + world.addObjectAtPos(KikiStone(), KikiPos(8,5,4)) + world.addObjectAtPos(KikiStone(), KikiPos(10,6,4)) + world.addObjectAtPos(KikiStone(), KikiPos(8,17,4)) + world.addObjectAtPos(KikiStone(), KikiPos(10,15,4)) + world.addObjectAtPos(KikiStone(), KikiPos(8,15,6)) + world.addObjectAtPos(KikiStone(), KikiPos(8,13,10)) + world.addObjectAtPos(KikiStone(), KikiPos(6,13,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,15,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,15,14)) + world.addObjectAtPos(KikiStone(), KikiPos(3,17,14)) + world.addObjectAtPos(KikiStone(), KikiPos(15,15,14)) + world.addObjectAtPos(KikiStone(), KikiPos(9,13,14)) + world.addObjectAtPos(KikiStone(), KikiPos(7,13,14)) + world.addObjectAtPos(KikiStone(), KikiPos(7,15,12)) + world.addObjectAtPos(KikiStone(), KikiPos(7,13,7)) + world.addObjectAtPos(KikiStone(), KikiPos(7,12,5)) + world.addObjectAtPos(KikiStone(), KikiPos(5,12,11)) + world.addObjectAtPos(KikiStone(), KikiPos(7,7,11)) + world.addObjectAtPos(KikiStone(), KikiPos(5,7,13)) + world.addObjectAtPos(KikiStone(), KikiPos(3,17,13)) + world.addObjectAtPos(KikiStone(), KikiPos(18,17,11)) + world.addObjectAtPos(KikiStone(), KikiPos(18,7,9)) + world.addObjectAtPos(KikiStone(), KikiPos(15,9,9)) + world.addObjectAtPos(KikiStone(), KikiPos(17,11,9)) + world.addObjectAtPos(KikiStone(), KikiPos(15,11,5)) + world.addObjectAtPos(KikiStone(), KikiPos(13,11,3)) + world.addObjectAtPos(KikiStone(), KikiPos(2,11,5)) + world.addObjectAtPos(KikiStone(), KikiPos(2,13,18)) + world.addObjectAtPos(KikiStone(), KikiPos(7,11,18)) + world.addObjectAtPos(KikiStone(), KikiPos(7,9,18)) + world.addObjectAtPos(KikiStone(), KikiPos(3,11,18)) + world.addObjectAtPos(KikiStone(), KikiPos(3,9,10)) + world.addObjectAtPos(KikiStone(), KikiPos(3,11,4)) + world.addObjectAtPos(KikiStone(), KikiPos(3,13,10)) + world.addObjectAtPos(KikiStone(), KikiPos(3,8,8)) + world.addObjectAtPos(KikiStone(), KikiPos(3,6,16)) + world.addObjectAtPos(KikiStone(), KikiPos(3,4,5)) + world.addObjectAtPos(KikiStone(), KikiPos(18,6,5)) + world.addObjectAtPos(KikiStone(), KikiPos(15,8,5)) + world.addObjectAtPos(KikiStone(), KikiPos(15,6,8)) + world.addObjectAtPos(KikiStone(), KikiPos(10,6,6)) + world.addObjectAtPos(KikiStone(), KikiPos(8,6,10)) + world.addObjectAtPos(KikiStone(), KikiPos(8,4,7)) + world.addObjectAtPos(KikiStone(), KikiPos(10,4,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,4,14)) + world.addObjectAtPos(KikiStone(), KikiPos(8,6,14)) + world.addObjectAtPos(KikiStone(), KikiPos(7,4,14)) + world.addObjectAtPos(KikiStone(), KikiPos(7,6,16)) + world.addObjectAtPos(KikiStone(), KikiPos(8,8,16)) + world.addObjectAtPos(KikiStone(), KikiPos(8,10,7)) + world.addObjectAtPos(KikiStone(), KikiPos(8,13,9)) + world.addObjectAtPos(KikiStone(), KikiPos(8,15,4)) + world.addObjectAtPos(KikiStone(), KikiPos(8,13,10)) + world.addObjectAtPos(KikiStone(), KikiPos(8,7,8)) + world.addObjectAtPos(KikiStone(), KikiPos(8,13,6)) + world.addObjectAtPos(KikiStone(), KikiPos(4,13,8)) + world.addObjectAtPos(KikiStone(), KikiPos(4,15,15)) + world.addObjectAtPos(KikiStone(), KikiPos(4,18,17)) + world.addObjectAtPos(KikiStone(), KikiPos(6,18,2)) + world.addObjectAtPos(KikiStone(), KikiPos(10,18,4)) + world.addObjectAtPos(KikiStone(), KikiPos(4,18,2)) + world.addObjectAtPos(KikiStone(), KikiPos(18,16,2)) + world.addObjectAtPos(KikiStone(), KikiPos(18,18,4)) + world.addObjectAtPos(KikiStone(), KikiPos(16,5,4)) + world.addObjectAtPos(KikiStone(), KikiPos(16,3,4)) + world.addObjectAtPos(KikiStone(), KikiPos(3,5,4)) + world.addObjectAtPos(KikiStone(), KikiPos(3,7,2)) + world.addObjectAtPos(KikiStone(), KikiPos(13,9,2)) + world.addObjectAtPos(KikiStone(), KikiPos(8,9,4)) + world.addObjectAtPos(KikiStone(), KikiPos(2,9,2)) + world.addObjectAtPos(KikiStone(), KikiPos(2,11,2)) + world.addObjectAtPos(KikiStone(), KikiPos(4,11,12)) + world.addObjectAtPos(KikiStone(), KikiPos(17,9,12)) + world.addObjectAtPos(KikiStone(), KikiPos(17,7,14)) + world.addObjectAtPos(KikiStone(), KikiPos(15,7,8)) + world.addObjectAtPos(KikiStone(), KikiPos(17,15,8)) + world.addObjectAtPos(KikiStone(), KikiPos(17,13,15)) + world.addObjectAtPos(KikiStone(), KikiPos(6,11,15)) + world.addObjectAtPos(KikiStone(), KikiPos(6,13,10)) + world.addObjectAtPos(KikiStone(), KikiPos(6,2,12)) + world.addObjectAtPos(KikiStone(), KikiPos(10,4,12)) + world.addObjectAtPos(KikiStone(), KikiPos(12,4,10)) + world.addObjectAtPos(KikiStone(), KikiPos(14,4,11)) + world.addObjectAtPos(KikiStone(), KikiPos(14,2,12)) + world.addObjectAtPos(KikiStone(), KikiPos(3,4,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,14,12)) + world.addObjectAtPos(KikiStone(), KikiPos(7,7,12)) + world.addObjectAtPos(KikiStone(), KikiPos(7,5,2)) + world.addObjectAtPos(KikiStone(), KikiPos(3,3,2)) + world.addObjectAtPos(KikiStone(), KikiPos(3,5,9)) + world.addObjectAtPos(KikiStone(), KikiPos(5,5,7)) + world.addObjectAtPos(KikiStone(), KikiPos(7,6,7)) + world.addObjectAtPos(KikiStone(), KikiPos(10,4,7)) + world.addObjectAtPos(KikiStone(), KikiPos(12,10,7)) + world.addObjectAtPos(KikiStone(), KikiPos(3,12,7)) + world.addObjectAtPos(KikiStone(), KikiPos(5,12,7)) + world.addObjectAtPos(KikiStone(), KikiPos(13,12,5)) + world.addObjectAtPos(KikiStone(), KikiPos(8,12,3)) + world.addObjectAtPos(KikiStone(), KikiPos(8,10,2)) + world.addObjectAtPos(KikiStone(), KikiPos(8,8,13)) + world.addObjectAtPos(KikiStone(), KikiPos(8,10,15)) + world.addObjectAtPos(KikiStone(), KikiPos(8,12,17)) + world.addObjectAtPos(KikiStone(), KikiPos(10,3,17)) + world.addObjectAtPos(KikiStone(), KikiPos(11,3,15)) + world.addObjectAtPos(KikiStone(), KikiPos(13,3,13)) + world.addObjectAtPos(KikiStone(), KikiPos(13,5,12)) + world.addObjectAtPos(KikiStone(), KikiPos(14,7,12)) + world.addObjectAtPos(KikiStone(), KikiPos(16,18,12)) + world.addObjectAtPos(KikiStone(), KikiPos(14,18,6)) + world.addObjectAtPos(KikiStone(), KikiPos(12,18,14)) + world.addObjectAtPos(KikiStone(), KikiPos(16,18,16)) + world.addObjectAtPos(KikiStone(), KikiPos(2,18,14)) + world.addObjectAtPos(KikiStone(), KikiPos(10,18,16)) + world.addObjectAtPos(KikiStone(), KikiPos(7,18,14)) + world.addObjectAtPos(KikiStone(), KikiPos(5,18,5)) + world.addObjectAtPos(KikiStone(), KikiPos(3,18,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,16,12)) + world.addObjectAtPos(KikiStone(), KikiPos(5,16,14)) + world.addObjectAtPos(KikiStone(), KikiPos(5,14,2)) + world.addObjectAtPos(KikiStone(), KikiPos(8,12,2)) + world.addObjectAtPos(KikiStone(), KikiPos(10,12,12)) + world.addObjectAtPos(KikiStone(), KikiPos(12,6,12)) + world.addObjectAtPos(KikiStone(), KikiPos(14,6,12)) + world.addObjectAtPos(KikiStone(), KikiPos(14,9,14)) + world.addObjectAtPos(KikiStone(), KikiPos(14,3,12)) + world.addObjectAtPos(KikiStone(), KikiPos(11,3,10)) + world.addObjectAtPos(KikiStone(), KikiPos(9,3,12)) + world.addObjectAtPos(KikiStone(), KikiPos(7,3,12)) + world.addObjectAtPos(KikiStone(), KikiPos(7,5,3)) + world.addObjectAtPos(KikiStone(), KikiPos(7,7,14)) + world.addObjectAtPos(KikiStone(), KikiPos(7,15,12)) + world.addObjectAtPos(KikiStone(), KikiPos(18,17,12)) + world.addObjectAtPos(KikiStone(), KikiPos(17,17,10)) + world.addObjectAtPos(KikiStone(), KikiPos(17,15,15)) + world.addObjectAtPos(KikiStone(), KikiPos(10,13,15)) + world.addObjectAtPos(KikiStone(), KikiPos(8,11,15)) + world.addObjectAtPos(KikiStone(), KikiPos(8,7,17)) + world.addObjectAtPos(KikiStone(), KikiPos(18,9,17)) + world.addObjectAtPos(KikiStone(), KikiPos(16,7,17)) + world.addObjectAtPos(KikiStone(), KikiPos(14,3,17)) + world.addObjectAtPos(KikiStone(), KikiPos(16,6,17)) + world.addObjectAtPos(KikiStone(), KikiPos(14,6,14)) + world.addObjectAtPos(KikiStone(), KikiPos(15,8,14)) + world.addObjectAtPos(KikiStone(), KikiPos(17,8,12)) + world.addObjectAtPos(KikiStone(), KikiPos(14,8,14)) + world.addObjectAtPos(KikiStone(), KikiPos(16,2,14)) + world.addObjectAtPos(KikiStone(), KikiPos(14,6,14)) + world.addObjectAtPos(KikiStone(), KikiPos(16,6,14)) + world.addObjectAtPos(KikiStone(), KikiPos(18,6,12)) + world.addObjectAtPos(KikiStone(), KikiPos(18,4,12)) + world.addObjectAtPos(KikiStone(), KikiPos(3,6,12)) + world.addObjectAtPos(KikiStone(), KikiPos(3,6,14)) + world.addObjectAtPos(KikiStone(), KikiPos(6,6,12)) + world.addObjectAtPos(KikiStone(), KikiPos(10,4,12)) + world.addObjectAtPos(KikiStone(), KikiPos(3,2,12)) + world.addObjectAtPos(KikiStone(), KikiPos(3,2,10)) + world.addObjectAtPos(KikiStone(), KikiPos(2,2,8)) + world.addObjectAtPos(KikiStone(), KikiPos(2,4,13)) + world.addObjectAtPos(KikiStone(), KikiPos(15,4,15)) + world.addObjectAtPos(KikiStone(), KikiPos(13,4,15)) + world.addObjectAtPos(KikiStone(), KikiPos(13,2,7)) + world.addObjectAtPos(KikiStone(), KikiPos(11,15,7)) + world.addObjectAtPos(KikiStone(), KikiPos(9,11,7)) + world.addObjectAtPos(KikiStone(), KikiPos(7,2,7)) + world.addObjectAtPos(KikiStone(), KikiPos(9,2,14)) + world.addObjectAtPos(KikiStone(), KikiPos(9,4,18)) + world.addObjectAtPos(KikiStone(), KikiPos(9,2,15)) + world.addObjectAtPos(KikiStone(), KikiPos(7,2,4)) + world.addObjectAtPos(KikiStone(), KikiPos(5,4,4)) + world.addObjectAtPos(KikiStone(), KikiPos(5,6,2)) + world.addObjectAtPos(KikiStone(), KikiPos(12,4,2)) + world.addObjectAtPos(KikiStone(), KikiPos(3,4,4)) + world.addObjectAtPos(KikiStone(), KikiPos(3,12,6)) + world.addObjectAtPos(KikiStone(), KikiPos(2,12,4)) + world.addObjectAtPos(KikiStone(), KikiPos(15,14,4)) + world.addObjectAtPos(KikiStone(), KikiPos(7,12,4)) + world.addObjectAtPos(KikiStone(), KikiPos(9,12,2)) + world.addObjectAtPos(KikiStone(), KikiPos(14,12,4)) + world.addObjectAtPos(KikiStone(), KikiPos(12,3,4)) + world.addObjectAtPos(KikiStone(), KikiPos(14,10,4)) + world.addObjectAtPos(KikiStone(), KikiPos(16,10,13)) + world.addObjectAtPos(KikiStone(), KikiPos(15,8,13)) + world.addObjectAtPos(KikiStone(), KikiPos(15,6,8)) + world.addObjectAtPos(KikiStone(), KikiPos(17,15,8)) + world.addObjectAtPos(KikiStone(), KikiPos(6,15,10)) + world.addObjectAtPos(KikiStone(), KikiPos(3,13,10)) + world.addObjectAtPos(KikiStone(), KikiPos(15,15,10)) + world.addObjectAtPos(KikiStone(), KikiPos(19,4,4)) diff --git a/levels/regal.coffee b/levels/regal.coffee new file mode 100644 index 0000000..0c32a80 --- /dev/null +++ b/levels/regal.coffee @@ -0,0 +1,44 @@ +module.exports = + name: "regal" + scheme: "bronze_scheme" + size: [7,3,9] + intro: "regal" + help: "$scale(1.5)mission:\nactivate the exit!" + player: position: [0,0,0] + exits: [ + name: "exit" + active: 0 + position: [0,0,4] + ] + create: -> + + sx, sy, sz = 7,3,9 + + for z in range(-sz/2+1, sz/2+1) + + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+1, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2, 0, z)) + + if z + world.addObjectAtPos(KikiWall(), world.decenter(-sx/2+2, 0, z)) + world.addObjectAtPos(KikiWall(), world.decenter( sx/2-1, 0, z)) + if z <> 4 and z <> -4 + world.addObjectAtPos(KikiWall(), world.decenter(0, -sy/2+1, z)) + if z <> 1 and z <> -1 + world.addObjectAtPos(KikiWall(), world.decenter(0, sy/2, z)) + + + for z in [-3, -1, 1, 3] + world.addObjectAtPos(KikiGear(KikiFace.PY), world.decenter(-sx/2+1, 1, z)) + + for z in [-3, 3] + world.addObjectAtPos(KikiGear(KikiFace.PY), world.decenter( sx/2, 1, z)) + + for z in [-1, 1] + world.addObjectAtPos(KikiGenerator(KikiFace.PY), world.decenter( sx/2, 1, z)) + world.addObjectAtPos(KikiMotorGear(KikiFace.PY), world.decenter( 0, 0, z)) + world.addObjectAtPos(KikiMotorCylinder(KikiFace.PY), world.decenter( 0, 1, z)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(-sx/2+2, 1, 0)) + world.addObjectAtPos(KikiWireStone(), world.decenter( sx/2-1, 1, 0)) + \ No newline at end of file diff --git a/levels/rings.coffee b/levels/rings.coffee new file mode 100644 index 0000000..a823938 --- /dev/null +++ b/levels/rings.coffee @@ -0,0 +1,31 @@ +module.exports = + name: "rings" + scheme: "default_scheme" + size: [9,7,9] + intro: "rings" + help: """ + $scale(1.5)mission: + get to the exit! + to get to the exit, + use the stones + """ + player: position: [0,-1,0] + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + + s = world.getSize() + + for y in [-1, 1] + x = 3 + world.addObjectPoly (KikiStone, [world.decenter(-x, y, -x), world.decenter(-x, y, x), \ + world.decenter(x, y, x), world.decenter(x, y, -x)]) + + for y in [-3, 3] + for x in [-3, -1, 1, 3] + world.addObjectPoly (KikiStone, [world.decenter(-x, y, -x), world.decenter(-x, y, x), \ + world.decenter(x, y, x), world.decenter(x, y, -x)]) + \ No newline at end of file diff --git a/levels/sandbox.coffee b/levels/sandbox.coffee new file mode 100644 index 0000000..825f714 --- /dev/null +++ b/levels/sandbox.coffee @@ -0,0 +1,56 @@ +# level design by Michael Abel +module.exports = + name: "sandbox" + scheme: "bronze_scheme" + size: [9,9,6] + intro: "sandbox" + help: """ + $scale(1.5)mission: + activate the exit! + + All you have to do + is to put nine stones + into the sandbox + and shoot at the switch + """ + player: + coordinates: [4,6,2] + orientation: rotx90 + exits: [ + name: "exit" + active: 0 + position: [0,0,0] + ] + create: -> + + switched = -> + unoccupied = false + for (i,j) in [ (i,j) for i in range(3,6) for j in range(3,6) ] + if world.isUnoccupiedPos(KikiPos(i,j,0)) + unoccupied=True + + if not unoccupied: + world.toggle("exit") + + switch = KikiSwitch() + switch.getEventWithName("switched").addAction ( continuous ( switched )) + + world.addObjectAtPos(switch , KikiPos (0,5,0)) + world.addObjectPoly(KikiWall, [ KikiPos(2,2,0),KikiPos(2,6,0),KikiPos(6,6,0),KikiPos(6,2,0)], 1) + + #inside + world.addObjectAtPos(KikiStone() , KikiPos(3,4,2)) + world.addObjectAtPos(KikiStone() , KikiPos(3,5,1)) + world.addObjectAtPos(KikiStone() , KikiPos(5,3,1)) + world.addObjectAtPos(KikiStone() , KikiPos(5,4,2)) + #border + world.addObjectAtPos(KikiStone() , KikiPos(3,6,1)) + world.addObjectAtPos(KikiStone() , KikiPos(4,6,1)) + world.addObjectAtPos(KikiStone() , KikiPos(3,2,1)) + world.addObjectAtPos(KikiStone() , KikiPos(5,2,1)) + world.addObjectAtPos(KikiStone() , KikiPos(6,4,1)) + world.addObjectAtPos(KikiStone() , KikiPos(6,3,1)) + #outside + world.addObjectAtPos(KikiStone() , KikiPos(5,1,0)) + world.addObjectAtPos(KikiStone() , KikiPos(1,7,0)) + \ No newline at end of file diff --git a/levels/slick.coffee b/levels/slick.coffee new file mode 100644 index 0000000..c880751 --- /dev/null +++ b/levels/slick.coffee @@ -0,0 +1,31 @@ +# level design by Michael Abel + +module.exports = + + name: "slick" + scheme: "tron_scheme" + size: (9,11,15) + intro: "slick" + help: """ + $scale(1.5)mission: + get to the exit! + The green stone is slicky + you can't grab it while falling + """ + player: + coordinates: [4,10,0] + orientation: rotx90 + exits: [ + name: "exit" + active: 1 + position: [0,0,4] + ] + create: + s=world.getSize() + for b in range(1,4) + for (k,l) in [ (i,j) for i in range(b+1,s.x-b-1) for j in range(b+1,s.y-b-1) ] + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), KikiPos(k,l,b*3)) + + world.addObjectAtPos(KikiWall(), KikiPos(s.x/2,s.y/2,0)) + world.addObjectAtPos(KikiStone(KColor(0,1,0,0.5), true), KikiPos(s.x/2,s.y/2,2)) + \ No newline at end of file diff --git a/levels/spiral.coffee b/levels/spiral.coffee new file mode 100644 index 0000000..1721e3a --- /dev/null +++ b/levels/spiral.coffee @@ -0,0 +1,48 @@ +# level design by Owen Hay + +module.exports = + name: "spiral" + scheme: "zen_scheme" + intro: "spiral" + size: [5,25,5] + help: "Down the Rabbit Hole" + player: + coordinates: [3,1,3] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,11,0] + ] + create: -> + + s = world.getSize() + + for y in [ -7, -3, 1, 5] + x = 1 + world.addObjectPoly(KikiStone, [world.decenter(-x, y, -x), world.decenter(-x, y, x), world.decenter(x, y, x), ]) + + for y in [-9, -5, -1, 3] + x = 1 + world.addObjectPoly(KikiStone, [world.decenter(x, y, x), world.decenter(x, y, -x), world.decenter(-x, y, -x), ]) + + for y in [12, 11] + x = 2 + world.addObjectPoly(KikiWireStone, [world.decenter(-x, y, -x), world.decenter(-x, y, x), world.decenter(x, y, x), world.decenter(x, y, -x)]) + + # KEY GEAR + world.addObjectAtPos(KikiGear(KikiFace.NY), world.decenter(0, -10, 0)) + + # LOCK MECHANISM + world.addObjectAtPos(KikiGenerator(KikiFace.NY), world.decenter(-1, 12, 0)) + world.addObjectAtPos(KikiGenerator(KikiFace.NY), world.decenter(-1, 11, 0)) + + world.addObjectAtPos(KikiMotorCylinder(KikiFace.NY), world.decenter(1, 11, 0)) + world.addObjectAtPos(KikiMotorGear(KikiFace.NY), world.decenter(1, 12, 0)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(0, 11, 1)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0, 12, 1)) + + world.addObjectAtPos(KikiWireStone(), world.decenter(0, 11, -1)) + world.addObjectAtPos(KikiWireStone(), world.decenter(0, 12, -1)) + \ No newline at end of file diff --git a/levels/start.coffee b/levels/start.coffee new file mode 100644 index 0000000..5ec3051 --- /dev/null +++ b/levels/start.coffee @@ -0,0 +1,31 @@ +module.exports = + name: "start" + scheme: "default_scheme" + size: [7,7,11] + intro: "start" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + jump on the stone + to jump, + press "$key(jump)" + while movin + to move, press "$key(move forward)" or "$key(move backward)" + to turn, press "$key(turn left)" or "$key(turn right)" + """ + player: + coordinates: [3,0,3] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [0,0,3] + ] + create: -> + + world.addObjectAtPos(KikiWall(), world.decenter(0,0,-2)) + world.addObjectAtPos(KikiWall(), world.decenter(0,0,-4)) + world.addObjectAtPos(KikiWall(), world.decenter(0,0,1)) + \ No newline at end of file diff --git a/levels/steps.coffee b/levels/steps.coffee new file mode 100644 index 0000000..8085639 --- /dev/null +++ b/levels/steps.coffee @@ -0,0 +1,30 @@ +module.exports = + name: "steps" + scheme: "blue_scheme" + size: [7,7,13] + intro: "steps" + help: """ + $scale(1.5)mission: + get to the exit! + + to get to the exit, + jump on the stones + to jump, press "$key(jump)" while moving + to move, press "$key(move forward)" or "$key(move backward)", + to turn, press "$key(turn left)" or "$key(turn right)" + """ + player: + coordinates: [3,0,6] + nostatus: 0 + exits: + name: "exit" + active: 1 + position: [0,1,3] + ] + create: -> + + world.addObjectAtPos(KikiWall(), world.decenter(0,0,3)) + world.addObjectAtPos(KikiWall(), world.decenter(0,-1,1)) + world.addObjectAtPos(KikiWall(), world.decenter(0,-2,-1)) + world.addObjectAtPos(KikiWall(), world.decenter(0,-3,-3)) + \ No newline at end of file diff --git a/levels/stones.coffee b/levels/stones.coffee new file mode 100644 index 0000000..0d67379 --- /dev/null +++ b/levels/stones.coffee @@ -0,0 +1,43 @@ +module.exports = + name: "stones" + scheme: "blue_scheme", + size: (11,11,12), + intro: "stones", + help: """ + $scale(1.5)mission: + get to the exit! + + use the stones. + to move a stone, + press "$key(push)" + while moving + """ + player: + position: [0,-1,-1] + orientation: rotx90 * roty180 + exits: [ + name: "exit" + active: 1 + coordinates: [5,5,6] + ] + create: -> + + s = world.getSize() + + num = 4 + for i in range(1,num+1): + world.addObjectPoly (KikiWall, [(s.x/2-i, s.y/2-i, i-1), + (s.x/2+i, s.y/2-i, i-1), + (s.x/2+i, s.y/2+i, i-1), + (s.x/2-i, s.y/2+i, i-1)]) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-2, s.y/2, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+2, s.y/2, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2+2, 3)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-2, 3)) + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2+1, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2-1, 2)) + \ No newline at end of file diff --git a/levels/switch.coffee b/levels/switch.coffee new file mode 100644 index 0000000..b6254d3 --- /dev/null +++ b/levels/switch.coffee @@ -0,0 +1,87 @@ +module.exports = + name: "switch" + scheme: "yellow_scheme" + size: [7,7,7] + intro: "switch" + help: """ + $scale(1.5)mission: + activate the exit! + + to activate the exit, + activate the 4 switches + + to activate the switches, + shoot them + + to be able to shoot the switches, + move the center stone + to move the center stone, + use the bomb. + + the bomb will detonate if you shoot it + """ + player: + coordinates: [3,0,3] + nostatus: 0 + exits: [ + name: "exit" + active: 0 + position: [0,-1,0] + ] + create: -> + # + s = world.getSize () + h = 0 + # bomb and stones + + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y/2, s.z/2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2, s.y-2, s.z/2)) + + world.addObjectAtPos(KikiBomb(), KikiPos(s.x/2, 1, s.z/2)) + + # stone frames for switches + + world.addObjectAtPos(KikiWall(), world.decenter( 0, h-1, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, h+1, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter( 1, h, s.z/2)) + world.addObjectAtPos(KikiWall(), world.decenter(-1, h, s.z/2)) + + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, h-1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, h+1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, h, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(s.x/2, h, -1)) + + world.addObjectAtPos(KikiWall(), world.decenter( 0, h-1, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter( 0, h+1, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter( 1, h, -s.z/2+1)) + world.addObjectAtPos(KikiWall(), world.decenter(-1, h, -s.z/2+1)) + + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, h-1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, h+1, 0)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, h, 1)) + world.addObjectAtPos(KikiWall(), world.decenter(-s.x/2+1, h, -1)) + + # switches + + world.switch_counter = 0 + + switched = (switch) -> + world.switch_counter += switch.isActive() and 1 or -1 + exit = kikiObjectToGate(world.getObjectWithName("exit")) + exit.setActive(world.switch_counter == 4) + + switch1 = KikiSwitch() + switch1.getEventWithName("switched").addAction (continuous (()-> s=switch1: switched(s))) + switch2 = KikiSwitch() + switch2.getEventWithName("switched").addAction (continuous (()-> s=switch2: switched(s))) + switch3 = KikiSwitch() + switch3.getEventWithName("switched").addAction (continuous (()-> s=switch3: switched(s))) + switch4 = KikiSwitch() + switch4.getEventWithName("switched").addAction (continuous (()-> s=switch4: switched(s))) + + world.addObjectAtPos(switch1, world.decenter(-s.x/2+1, 0, 0)) + world.addObjectAtPos(switch2, world.decenter( s.x/2, 0, 0)) + world.addObjectAtPos(switch3, world.decenter(0, 0, -s.z/2+1)) + + world.addObjectAtPos(switch4, world.decenter(0, 0, s.z/2)) + \ No newline at end of file diff --git a/levels/throw.coffee b/levels/throw.coffee new file mode 100644 index 0000000..9ed56ae --- /dev/null +++ b/levels/throw.coffee @@ -0,0 +1,32 @@ +# level design by Michael Abel + +module.exports = + + name: "throw" + scheme: "tron_scheme" + size: [5,7,7] + intro: "throw" + help: """ + "$scale(1.5)mission: + get to the exit! + + use the stones to reach it + + push a stone and it will fall down + if nothing is below it + but remember: + you decide where down and below is! + """ + player: + position: [0,1,2] + orientation: rotx90 * rotx180 * roty270 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + world.addObjectAtPos( KikiWall(), world.decenter(-2,0,2)) + world.addObjectAtPos( KikiStone(), world.decenter(0,1,3)) + world.addObjectAtPos( KikiStone(), world.decenter(0,-1,3)) + diff --git a/levels/towers.coffee b/levels/towers.coffee new file mode 100644 index 0000000..8ba5476 --- /dev/null +++ b/levels/towers.coffee @@ -0,0 +1,25 @@ +# level design by Ben "mrthoughtful" Griffin + +module.exports = + name: "towers" + scheme: "metal_scheme" + size: [9,9,15] + intro: "towers" + help: "$scale(1.5)mission:\nget to the exit!\n\nto get to the exit,\nmove the stones" + player: + coordinates: [4,5,0] + orientation: rotx90 + exits: [ + name: "exit" + active: 1 + position: [0,0,-3] + ], + create: -> + s = world.getSize() + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2+1, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2-1, s.y/2+1, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 0)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 1)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 2)) + world.addObjectAtPos(KikiStone(), KikiPos(s.x/2+1, s.y/2+1, 3)) diff --git a/levels/walls.coffee b/levels/walls.coffee new file mode 100644 index 0000000..a03ef46 --- /dev/null +++ b/levels/walls.coffee @@ -0,0 +1,41 @@ +# level design by Michael Abel + +module.exports = + name: "walls" + scheme: "default_scheme" + size: [7,5,5] + intro: "walls" + help: """ + $scale(1.5)mission: + + get to the exit! + + The exit is hidden + in the middle of + the central wall + """ + player: + coordinates: [0,0,2] + nostatus: 0 + exits: [ + name: "exit" + active: 1 + position: [0,0,0] + ] + create: -> + s=world.getSize() + + middlemax = (u,v,w) -> + s=world.getSize() + d= 3.0/( (u-s.x/2.0)**2+ (v-s.y/2.0)**2 + (w-s.z/2.0)**2 + 1 ) + return min(1.0 ,max(0.2,d)) + + middlemin = (u,v,w) -> + s=world.getSize() + d= 2* ( (u-s.x/2.0)**2+ (v-s.y/2.0)**2 + (w-s.z/2.0)**2 )/25 + return min(1.0 ,max(0.4,d)) + + for (i,j,l) in [ (m,n,o) for m in range(s.x) for n in range(s.y) for o in range(s.z)] + if i==s.x/2 or i==s.x/2-2 or i==s.x/2+2 + world.addObjectAtPos(KikiStone(KColor(0.1*i,0.1*j,0.1*l,0.6) , false) , KikiPos(i,j,l)) + \ No newline at end of file