# --| Controls |-- - in-game: **WASD/ZQSD** (depends on keyboard, usually WASD) - movement **QE/AE** (depends on keyboard, usually QE)- horizontal camera rotation **PM** - vertical camera rotation **R** - ***teleport to level_00*** **ESC** - exit application - while in menus: when editing a value : **A** (add), **S** (subtract), **M** (multiply), **D** (divide), **ENTER/SPACE** (proceed) # --| Syntax for level files |-- 1) **General rules** . each file must be named "room_k" where k is a positive integer if "room_k" exists then all "room_u" where 0 <= u < k exists . you can add text at the end of each line as comments but *do not use caps*, *this might confuse the parser* 2) **Data structure** below is a detailled list for all block types ; each block type (Blocks, Teleporters, Entities) must have the corresponding word directly above it not all three keywords have to be written [] is mandatory data {} is optionnal data *Data-specific structure :* ``` blocks: [x, y, z, w, h, d, rhz, rvt, r, g, b] teleporters: [x, y, z, w, h, d, rhz, rvt, r, g, b, dest_chx, dest_chy] entities: [x, y, z, w, h, d, rhz, rvt, r, g, b, hp, damage, entityType ..] |> if entityType >= 4, use 1 for HP and 0 for damage <| |> *Entity types are :* <| -> 0 (coin) -> damage equals the coin's value -> 1 (non-moving explosive) -> 2 (damaging firebar/spinning platform (set damage to 0)) [.. hz_rps, vt_rps, x_offset, y_offset, z_offset, dps] with {hz,vt}_rps = double hz0, vt_0 = double {x,y,z}_offset = double // if all is 0.0, the solid will rotate according to its center of mass, this shifts that center dps = int[>0] -> 3 (shooting, maybe moving explosive) [.. proj_speed, shoot_speed, shot_freq, shot_ttl] with {all} = double[>= 0.0] -> 4 (moving platform) [.. amplitude_x, amplitude_y, amplitude_z, mult, divd, phase, {initialState, triggerButton}] with amplitude_{x,y,z} = double[>= 0.0] {mult,divd} = int {phase} = int[0, 360] {..} = int(>=0) -> 5 (linear moving platform) [.. amplitude_x, amplitude_y, amplitude_z, speed_x, speed_y, speed_z, {initialState, triggerButton}] with amplitude_{x,y,z} = double[>= 0.0] speed_{x,y,z} = double {..} = int(>=0) -> 6 (text box) [.. text, tred, tgreen, tblue] with text = {char*} -> 7 (warp text box) [.. dest_folder, room_count, text, tred, tgreen, tblue] with {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] -> 8 (lock box) [.. cost, doPay, tred, tgreen, tblue] with cost = int[> 0] (0 breaks) doPay = {0, 1} (bool) -> 9 (beat block) [.. ontime, offtime, start] with {ontime,offtime} = double[>0.0] start = {0,1} -> 10 UNUSED -> 11 (button trigger) [.. freq, dtime] with freq = int[0 - 15] dtime = double([>0.0] for time-limited press, or use -1.0 if no deactivation) -> 12 (button block) [.. freq, defaultState] with freq = int[0 - 15] defaultState = {0, 1} -> 13 (math block) [.. defaultState, timeOff] with defaultState = {0, 1} dtime = double([>0.0] for time-limited press, or use -1.0 if no deactivation) ```