(local pxl8 (require :pxl8)) (local cube3d (require :mod.cube3d)) (local worldgen (require :mod.worldgen)) (var time 0) (var active-demo :logo) (var particles nil) (var fire-init? false) (var rain-init? false) (var snow-init? 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.transition_create :pixelate 0.5)) (pxl8.transition_set_color transition 0xFF000000) (pxl8.transition_start transition))) (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.particles_new 1000)) (cube3d.init) (worldgen.init))) (global update (fn [dt] (set time (+ time dt)) (when transition (pxl8.transition_update transition dt) (when (pxl8.transition_is_complete transition) (when transition-pending (when (and (= active-demo :worldgen) (not= transition-pending :worldgen)) (pxl8.set_relative_mouse_mode false)) (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))) (pxl8.transition_destroy transition) (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 :cube3d)) (when (pxl8.key_pressed "9") (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 (or (< logo-x 0) (> logo-x 512)) (set logo-dx (- logo-dx))) (when (or (< logo-y 0) (> logo-y 296)) (set logo-dy (- logo-dy)))) :cube3d (cube3d.update dt) :worldgen (worldgen.update dt)) (when particles (pxl8.particles_update particles dt)))) (global frame (fn [] (case active-demo :logo (do (pxl8.clear 0) (when logo-sprite (pxl8.sprite logo-sprite logo-x logo-y 128 64))) :plasma (pxl8.vfx_plasma time 0.10 0.04 1) :tunnel (pxl8.vfx_tunnel time 2.0 0.25) :raster (do (pxl8.clear 0) (local bars [{:base_y 60 :amplitude 30 :height 16 :speed 2.0 :phase 0 :color 1 :fade_color 18} {:base_y 180 :amplitude 35 :height 16 :speed 1.8 :phase 2.0 :color 1 :fade_color 27} {:base_y 300 :amplitude 25 :height 16 :speed 2.2 :phase 4.0 :color 1 :fade_color 24}]) (pxl8.vfx_raster_bars bars time)) :fire (do (pxl8.clear 0) (when particles (when (not fire-init?) (pxl8.particles_clear particles) (pxl8.vfx_fire particles 160 140 100 12) (set fire-init? true)) (pxl8.particles_render particles))) :rain (do (pxl8.clear 0) (when particles (when (not rain-init?) (pxl8.particles_clear particles) (pxl8.vfx_rain particles 320 10.0) (set rain-init? true)) (pxl8.particles_render particles))) :snow (do (pxl8.clear 0) (when particles (when (not snow-init?) (pxl8.particles_clear particles) (pxl8.vfx_snow particles 320 5.0) (set snow-init? true)) (pxl8.particles_render particles))) :cube3d (cube3d.frame) :worldgen (worldgen.frame) _ (pxl8.clear 0)) (when transition (pxl8.transition_render transition))))