112 lines
3.5 KiB
Fennel
112 lines
3.5 KiB
Fennel
(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)
|
|
|
|
(global init (fn []
|
|
(cube3d.init)
|
|
(worldgen.init)
|
|
(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))))
|
|
|
|
(global update (fn [dt]
|
|
(set time (+ time dt))
|
|
|
|
(when (pxl8.key_pressed "1") (set active-demo :logo))
|
|
(when (pxl8.key_pressed "2") (set active-demo :plasma))
|
|
(when (pxl8.key_pressed "3") (set active-demo :tunnel))
|
|
(when (pxl8.key_pressed "4") (set active-demo :raster))
|
|
(when (pxl8.key_pressed "5")
|
|
(set active-demo :fire)
|
|
(set fire-init? false))
|
|
(when (pxl8.key_pressed "6")
|
|
(set active-demo :rain)
|
|
(set rain-init? false))
|
|
(when (pxl8.key_pressed "7")
|
|
(set active-demo :snow)
|
|
(set snow-init? false))
|
|
(when (pxl8.key_pressed "8") (set active-demo :cube3d))
|
|
(when (pxl8.key_pressed "9") (set active-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.clr 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.clr 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.clr 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.clr 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.clr 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.clr 0))))
|