Go to file
Alexandre ecd14cbe55 adding guns 2025-05-12 09:53:19 +02:00
.vscode adding guns 2025-05-12 09:53:19 +02:00
bin adding guns 2025-05-12 09:53:19 +02:00
include IM FREEEEEEEEE 2025-01-30 21:45:46 +01:00
levels But then I had a very good idea. I added F5. 2025-05-11 16:49:14 +02:00
obj adding guns 2025-05-12 09:53:19 +02:00
res added mods 2025-03-16 22:10:02 +01:00
sound added remaining kahoot music 2025-02-28 19:37:41 +01:00
src adding guns 2025-05-12 09:53:19 +02:00
templates added cannons + fixed time changing when FPS is changed + rebalanced some levels to adjust timings 2025-03-16 12:41:30 +01:00
Makefile adding guns 2025-05-12 09:53:19 +02:00
README.md added entity2 + added drag speeds (separate from the player's) 2025-03-23 11:56:46 +01:00

README.md

--| 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
    ESC - exit application

  • creative tools: Y select level destination
    R warp to targetted level (resets player's position)
    T warp to targetted level (no update top player's position)

  • while in menus:
    <!> when editing a value : A (add), S (subtract), M (multiply), D (divide), ENTER/SPACE (proceed)

--| Mods (in case you find it easy) |--

Hidden (HD) : makes the terrain blink to be totally invisible sometimes
HardRock (HR) : multiplies damage taken, enables fall damage and kills you upon falling into the void
DoubleTime (DT) : makes everything faster
SuddenDeath (SD) : sets your HP at 1 and disables healing
Flashlight (FL) : drastically lowers your view distance
Speedy (SP) : makes you lose HP over time
Flip (FP) : flips the screen over the Y axis, inverting some directions

--| 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

. at the end of each file, the weight of the room is required (can be any positive integer)
if there is only one file (==> its name is room_0) AND weight is 0, the room will only generate at the central chunk (any other will be NULL)
use this if you want to create parkour levels, puzzles...
else, make sure the total weight (the sum of all) is not equal to 0 (you may end up with a floating point exception)

. no matter what, room_0 will always generate at chunk (0, 0)

  1. 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) -> HP 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 (towards player), 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 (movable block)
        [.. friction, mass] with
            friction = double[>0.0]
            mass = double[>0.0] (in kg)

    -> 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)

    -> 14 (movable object-related button)
        [.. freq] with
            freq = int[0 - 15]

    -> 15 (gun)
        [.. vx, vy, vz, ax, ay, az, cooldown, phase, ttl, dmg, psize_x, psize_y, psize_z] with
            all\{dmg} = double (cooldown > 0.0 and ttl > 0.0 and psize_{x,y,z} > 0.0)
            dmg = int (>0)

    -> 16 (type 1 entity)
        [.. speed, jump_height, dmg, kbPlayer, {buttonActivation}] with
            all\{dmg} = double[>=0.0]
            dmg = int (>=0)
            buttonActivation = int[0-16]

    -> 17 (type 2 entity)
        [.. speed, jump_height, dmg, kbPlayer, kbEntity, {buttonActivation}] with
            all\{dmg} = double[>=0.0]
            dmg = int (>=0)
            buttonActivation = int[0-16]