pxl8/demo/main.fnl
asrael 39b604b333 refactor: reorganize pxl8 into client/src/ module structure
- core/: main entry, types, logging, I/O, RNG
- asset/: ase loader, cart, save, embed
- gfx/: graphics, animation, atlas, fonts, tilemap, transitions
- sfx/: audio
- script/: lua/fennel runtime, REPL
- hal/: platform abstraction (SDL3)
- world/: BSP, world, procedural gen
- math/: math utilities
- game/: GUI, replay
- lua/: Lua API modules
2026-01-15 08:51:08 -06:00

184 lines
6 KiB
Fennel

(local pxl8 (require :pxl8))
(local menu (require :mod.menu))
(local music (require :mod.music))
(local worldgen (require :mod.worldgen))
(var time 0)
(var active-demo :logo)
(var particles nil)
(var particles2 nil)
(var fire-init? false)
(var rain-init? false)
(var snow-init? false)
(var snow-init2? false)
(var use-famicube-palette? false)
(var logo-x 256)
(var logo-y 148)
(var logo-dx 100)
(var logo-dy 80)
(var logo-sprite nil)
(var transition nil)
(var transition-pending nil)
(fn switch-demo [new-demo]
(when (and (not= active-demo new-demo) (not transition))
(set transition-pending new-demo)
(set transition (pxl8.create_transition :pixelate 0.5))
(transition:set_color 0xFF000000)
(transition:start)))
(global init (fn []
(pxl8.load_palette "res/sprites/pxl8_logo.ase")
(set logo-sprite (pxl8.load_sprite "res/sprites/pxl8_logo.ase"))
(set particles (pxl8.create_particles 1000))
(set particles2 (pxl8.create_particles 500))
(music.init)
(music.start)
(worldgen.init)))
(global update (fn [dt]
(when (pxl8.key_pressed "escape")
(menu.toggle)
(when (= active-demo :worldgen)
(pxl8.set_relative_mouse_mode (not (menu.is-paused)))))
(when (not (menu.is-paused))
(set time (+ time dt))
(when transition
(transition:update dt)
(when (transition:is_complete)
(when transition-pending
(when (and (= active-demo :worldgen) (not= transition-pending :worldgen))
(pxl8.set_relative_mouse_mode false))
(when (and (not= active-demo :worldgen) (= transition-pending :worldgen))
(pxl8.set_relative_mouse_mode true))
(set active-demo transition-pending)
(set transition-pending nil)
(when (= active-demo :fire) (set fire-init? false))
(when (= active-demo :rain) (set rain-init? false))
(when (= active-demo :snow) (set snow-init? false) (set snow-init2? false)))
(transition:destroy)
(set transition nil)))
(when (pxl8.key_pressed "1") (switch-demo :logo))
(when (pxl8.key_pressed "2") (switch-demo :plasma))
(when (pxl8.key_pressed "3") (switch-demo :tunnel))
(when (pxl8.key_pressed "4") (switch-demo :raster))
(when (pxl8.key_pressed "5") (switch-demo :fire))
(when (pxl8.key_pressed "6") (switch-demo :rain))
(when (pxl8.key_pressed "7") (switch-demo :snow))
(when (pxl8.key_pressed "8") (switch-demo :worldgen))
(when (pxl8.key_pressed "=")
(set use-famicube-palette? (not use-famicube-palette?))
(local palette-path (if use-famicube-palette? "res/palettes/famicube.ase" "res/sprites/pxl8_logo.ase"))
(pxl8.load_palette palette-path))
(case active-demo
:logo (do
(set logo-x (+ logo-x (* logo-dx dt)))
(set logo-y (+ logo-y (* logo-dy dt)))
(when (< logo-x 0)
(set logo-x 0)
(set logo-dx (math.abs logo-dx)))
(when (> logo-x 512)
(set logo-x 512)
(set logo-dx (- (math.abs logo-dx))))
(when (< logo-y 0)
(set logo-y 0)
(set logo-dy (math.abs logo-dy)))
(when (> logo-y 296)
(set logo-y 296)
(set logo-dy (- (math.abs logo-dy)))))
:worldgen (worldgen.update dt))
(music.update dt)
(when particles
(particles:update dt))
(when particles2
(particles2:update dt)))
(when (menu.is-paused)
(menu.update))))
(global frame (fn []
(case active-demo
:logo (do
(pxl8.clear 0)
(when logo-sprite
(pxl8.sprite logo-sprite logo-x logo-y 128 64 (< logo-dx 0) (< logo-dy 0))))
:plasma (do
(pxl8.clear 0)
(pxl8.text "Plasma (TODO: Fennel impl)" 200 170 1))
:tunnel (do
(pxl8.clear 0)
(pxl8.text "Tunnel (TODO: Fennel impl)" 200 170 1))
:raster (do
(pxl8.clear 0)
(pxl8.text "Raster Bars (TODO: Fennel impl)" 180 170 1))
:fire (do
(pxl8.clear 0)
(when particles
(when (not fire-init?)
(particles:clear)
(particles:set_position 320 360)
(particles:set_spread 320 0)
(particles:set_gravity 0 -80)
(particles:set_drag 0.98)
(particles:set_turbulence 60)
(particles:set_spawn_rate 200)
(particles:set_colors 1 9)
(particles:set_life 2.0 5.0)
(particles:set_velocity -30 30 -120 -60)
(set fire-init? true))
(particles:render)))
:rain (do
(pxl8.clear 0)
(when particles
(when (not rain-init?)
(particles:clear)
(particles:set_position 320 -10)
(particles:set_spread 340 0)
(particles:set_gravity 30 80)
(particles:set_drag 1.0)
(particles:set_turbulence 5)
(particles:set_spawn_rate 500)
(particles:set_colors 20 22)
(particles:set_life 2.0 3.0)
(particles:set_velocity -20 20 400 600)
(set rain-init? true))
(particles:render)))
:snow (do
(pxl8.clear 0)
(when particles
(when (not snow-init?)
(particles:clear)
(particles:set_position 320 -10)
(particles:set_spread 340 0)
(particles:set_gravity 0 25)
(particles:set_drag 1.0)
(particles:set_turbulence 100)
(particles:set_spawn_rate 100)
(particles:set_life 8.0 12.0)
(particles:set_colors 10 15)
(particles:set_velocity -50 50 30 50)
(set snow-init? true))
(particles:render)))
:worldgen (worldgen.frame)
_ (pxl8.clear 0))
(when transition
(transition:render))
(when (menu.is-paused)
(menu.draw))))