home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 August / GSSH0804.iso / Geschicklichkeit / Enigma / Enigma-081.exe / data / levels / nat10.lua < prev    next >
Text File  |  2003-06-26  |  4KB  |  145 lines

  1. -- When Gravity Fails
  2. -- A level for Enigma
  3. -- (c) 2003 Nat Pryce
  4. -- Licensed under GPL v2.0 or above
  5. -- 2003-06-24: [ant]: changes in AddConstantForce
  6.  
  7. dofile(enigma.FindDataFile("levels/natmaze.lua"))
  8.  
  9. -----------------------------------------------------------------------------
  10. LEVEL_WIDTH = 39
  11. LEVEL_HEIGHT = 25
  12. MAZE_WIDTH = 14
  13. MAZE_HEIGHT = 12
  14. MAZE_X = 6
  15. MAZE_Y = 1
  16. MAZE_CELL_WIDTH = 2
  17. MAZE_CELL_HEIGHT = 2
  18.  
  19. function cellx_to_level( cellx )
  20.     return MAZE_X + cellx*MAZE_CELL_WIDTH
  21. end
  22.  
  23. function celly_to_level( celly )
  24.     return MAZE_Y + celly*MAZE_CELL_HEIGHT
  25. end
  26.  
  27. function cell_to_level( cellx, celly )
  28.     return cellx_to_level(cellx), celly_to_level(celly)
  29. end
  30.  
  31. function maze_floor( x, y, w, h )
  32.     w = w or 1
  33.     h = h or 1
  34.     fill_floor( "fl-samba", x, y, w, h )
  35. end
  36.  
  37. function maze_wall( x, y )
  38.     set_stone( "st-rock2", x, y );
  39. end
  40.  
  41. function render_cell( maze, cellx, celly )
  42.     local x,y = cell_to_level(cellx, celly)
  43.     
  44.     maze_floor( x, y, 2, 2 )
  45.     if not maze:can_go_east(cellx,celly) then
  46.         maze_wall(x+1,y);
  47.     end
  48.     if not maze:can_go_south(cellx,celly) then
  49.         maze_wall(x,y+1);
  50.     end
  51.     maze_wall(x+1,y+1);
  52. end
  53.  
  54. function draw_maze( maze )
  55.     render_maze( maze, render_cell )
  56.     draw_stones( "st-rock2", {MAZE_X-1, MAZE_Y-1}, {1,0}, 
  57.                  MAZE_WIDTH*MAZE_CELL_WIDTH + 1 )
  58.     draw_stones( "st-rock2", {MAZE_X-1, MAZE_Y}, {0,1}, 
  59.                  MAZE_HEIGHT*MAZE_CELL_HEIGHT )
  60. end
  61.  
  62. function set_stone_in_cell( st_type, cellx, celly, offsetx, offsety, attribs )
  63.     x, y = cell_to_level(cellx,celly)
  64.     x = x + offsetx
  65.     y = y + offsety
  66.     
  67.     set_stone( st_type, x, y, attribs or {} )
  68. end
  69.  
  70. function create_oxyd_platforms()
  71.     for celly = 2, MAZE_HEIGHT-1, 3 do
  72.         west_oxyd_platform( celly )
  73.         east_oxyd_platform( celly )
  74.     end
  75.     oxyd_shuffle()
  76. end
  77.  
  78. function west_oxyd_platform( cell_y )
  79.     x = 1
  80.     y = celly_to_level( cell_y-1 ) - 1
  81.     
  82.     oxyd_platform(x,y)
  83.     maze_floor( x+3, y+1 )
  84.     maze_gateway( x+4, y+1 )
  85. end
  86.  
  87. function east_oxyd_platform( cell_y )
  88.     x = level_width - 4
  89.     y = celly_to_level( cell_y-1 ) - 1
  90.     
  91.     oxyd_platform(x,y)
  92.     maze_floor( x-1, y+1 )
  93.     maze_gateway( x-2, y+1 )
  94. end
  95.  
  96. function oxyd_platform( x, y )
  97.     maze_floor( x, y, 3, 3 )
  98.     oxyd( x+1, y+1 )
  99. end
  100.  
  101. function maze_gateway( x, y )
  102.     set_stone( "st-grate1", x, y )
  103.     maze_floor( x, y )
  104. end
  105.  
  106. -----------------------------------------------------------------------------
  107.  
  108. TIMER_INTERVAL = 0.1
  109. LOOP_DURATION = 60.0
  110. TICK_ANGLE_DELTA = 360.0 * TIMER_INTERVAL/LOOP_DURATION
  111. GRAVITY = 20.0
  112.  
  113. angle = 90.0
  114. gravity_x = 0
  115. gravity_y = 0
  116.  
  117. function spin_gravity()
  118.     angle = mod( angle + TICK_ANGLE_DELTA, 360.0 )
  119.     set_gravity()
  120. end
  121.  
  122. function set_gravity()
  123.     gravity_x = cos(angle) * GRAVITY
  124.     gravity_y = sin(angle) * GRAVITY
  125.     enigma.AddConstantForce( gravity_x, gravity_y )
  126. end
  127.  
  128. -----------------------------------------------------------------------------
  129.  
  130. create_world(39,25)
  131.  
  132. fill_floor("fl-abyss", 0, 0, level_width, level_height )
  133. draw_maze( new_kruskal_maze(MAZE_WIDTH, MAZE_HEIGHT) )
  134. create_oxyd_platforms()
  135.  
  136. mid_x, mid_y = cell_to_level( MAZE_WIDTH/2 - 1, MAZE_HEIGHT / 2 - 1 )
  137. set_stone( "st-timer", mid_x+1, mid_y+1,
  138.            {target="spin_gravity", action="callback",
  139.             name="timer", interval=0.1} )
  140.  
  141. set_actor("ac-blackball", MAZE_X+0.5, MAZE_Y+0.5, {player=0})
  142.  
  143. set_gravity()
  144.  
  145.