refactor(runtime,packages,examples): named constants, package enums, idiom sweep

- runtime: HEADLESS_FRAME_PATH, STICK_DEADZONE / STICK_LEFT_X/Y, key and
  byte codes as char literals throughout (`k == 'w'`, `fill(rt_map, ' ', …)`)
- ludic.gameplay/stats: drop the duplicate `stat_field` (it answered "atk"
  for every build stat); Stats.base uses stats_field_name
- ludic.shooter: compare aim modes and fire patterns with AimMode.* and
  WeaponPattern.* instead of raw ints; STICK_RIGHT_X/Y
- ludic.npcai: DecisionMade / brain_set_state use AiState.*
- examples/games/menu.ludic uses Font.load / Ui.* with FONT_PATH and
  BACKDROP named; strings.ludic header says what it prints
- whole tree: `x = x + 1` → `x += 1` (single-term right-hand sides only),
  `0 - x` → `-x`, ASCII codes → char literals; every .ludic and every
  ```ludic fence reformatted with the fixed formatter (whitespace only)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-05 01:12:26 +03:00
parent e3e1bc7784
commit bf36bc8a8f
103 changed files with 1256 additions and 1252 deletions

View file

@ -71,7 +71,7 @@ function rt_decode_png(path: string) -> bool {
let size = rt_file_len
if size < 8 { free(d); return false }
if d[0] != 137 { free(d); return false }
if d[1] != 80 { free(d); return false }
if d[1] != 'P' { free(d); return false }
var w = 0
var h = 0
@ -110,7 +110,7 @@ function rt_decode_png(path: string) -> bool {
}
if png_tag(d, typ, 73, 68, 65, 84) { # IDAT
for k in 0 .. ln { idat[idlen + k] = d[body + k] }
idlen = idlen + ln
idlen += ln
}
if png_tag(d, typ, 73, 69, 78, 68) { done = 1 } # IEND
i = i + 12 + ln
@ -150,8 +150,8 @@ function rt_decode_png(path: string) -> bool {
if y > 0 { b = raw[prev + x] }
if x >= fbpp { if y > 0 { c = raw[prev + x - fbpp] } }
var v = raw[cur + x]
if ft == 1 { v = v + a }
if ft == 2 { v = v + b }
if ft == 1 { v += a }
if ft == 2 { v += b }
if ft == 3 { v = v + (a + b) / 2 }
if ft == 4 {
let p = a + b - c
@ -161,7 +161,7 @@ function rt_decode_png(path: string) -> bool {
var pick = c
if pb <= pc { pick = b }
if pa <= pb { if pa <= pc { pick = a } }
v = v + pick
v += pick
}
raw[cur + x] = (v & 255)
}
@ -228,10 +228,10 @@ function rt_decode_png(path: string) -> bool {
# ---- images ---------------------------------------------------------------
function rt_image_load(path: string) -> int {
if img_n >= IMG_MAX { return 0 - 1 }
if rt_decode_png(path) == false { return 0 - 1 }
if img_n >= IMG_MAX { return -1 }
if rt_decode_png(path) == false { return -1 }
let id = img_n
img_n = img_n + 1
img_n += 1
img_px[id] = png_px
img_w[id] = png_w
img_h[id] = png_h
@ -316,10 +316,10 @@ function rt_draw_9slice(id: int, dx: int, dy: int, dw: int, dh: int, inset: int)
# ---- sprites (16x16 art) --------------------------------------------------
function rt_png_load(path: string) -> int {
if spr_n >= SPR_MAX { return 0 - 1 }
if rt_decode_png(path) == false { return 0 - 1 }
if spr_n >= SPR_MAX { return -1 }
if rt_decode_png(path) == false { return -1 }
let id = spr_n
spr_n = spr_n + 1
spr_n += 1
let base = id * SPR_SZ * SPR_SZ
for y in 0 .. SPR_SZ {
for x in 0 .. SPR_SZ {
@ -395,10 +395,10 @@ function rt_draw_sprite_ex(id: int, px: int, py: int, sc: int, flip: int, tint:
# ---- .lspr sprite sheets (palette + ASCII rows) ---------------------------
function rt_hexval(c: int) -> int {
if c >= 48 { if c <= 57 { return c - 48 } }
if c >= 97 { if c <= 102 { return c - 87 } }
if c >= 65 { if c <= 70 { return c - 55 } }
return 0 - 1
if c >= '0' { if c <= '9' { return c - 48 } }
if c >= 'a' { if c <= 'f' { return c - 87 } }
if c >= 'A' { if c <= 'F' { return c - 55 } }
return -1
}
function rt_sprites_load(path: string) -> void {
@ -407,7 +407,7 @@ function rt_sprites_load(path: string) -> void {
let size = rt_file_len
let pal: words = words(128)
fill(pal, 0, 128 * 4)
var cur = 0 - 1
var cur = -1
var row = 0
var i = 0
while i < size {
@ -416,10 +416,10 @@ function rt_sprites_load(path: string) -> void {
var j = start
while j < size {
let ch = d[j]
if ch == 10 { j = size } else { len = len + 1; j = j + 1 }
if ch == '\n' { j = size } else { len += 1; j += 1 }
}
let c0 = d[start]
if c0 == 112 { # 'p' — "pal <char> <rrggbb>"
if c0 == 'p' { # 'p' — "pal <char> <rrggbb>"
let ch = d[start + 4]
var v = 0
for k in 0 .. 6 {
@ -428,18 +428,18 @@ function rt_sprites_load(path: string) -> void {
}
if ch < 128 { pal[ch] = ((255 << 24) | v) }
}
if c0 == 115 { # 's' — "spr" starts a new sprite
cur = 0 - 1
if c0 == 's' { # 's' — "spr" starts a new sprite
cur = -1
if spr_n < SPR_MAX {
cur = spr_n
spr_n = spr_n + 1
spr_n += 1
fill(offset(spr_px, cur * SPR_SZ * SPR_SZ * 4), 0, SPR_SZ * SPR_SZ * 4)
}
row = 0
}
if c0 != 112 {
if c0 != 115 {
if c0 != 35 { # '#' comment
if c0 != 'p' {
if c0 != 's' {
if c0 != '#' { # '#' comment
if cur >= 0 {
if row < SPR_SZ {
for x in 0 .. SPR_SZ {
@ -447,7 +447,7 @@ function rt_sprites_load(path: string) -> void {
spr_px[cur * SPR_SZ * SPR_SZ + row * SPR_SZ + x] = pal[(d[start + x] & 127)]
}
}
row = row + 1
row += 1
}
}
}