feat(packages): ludic.jobs - written jobs gated by standing and story, boards of posts rolled by the day on their own dice, progress counted from events and read back from state, handing in, rewards through a port, facts, a save section per scope

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-25 07:35:45 +03:00
parent e146c7a337
commit 411206e45a
14 changed files with 984 additions and 0 deletions

View file

@ -0,0 +1,71 @@
# save.ludic - a scope's jobs and boards in a section of their own, by key: a job the game has since
# removed is dropped, a new one starts offered
function jobs__reset_scope(sc: int) -> void {
jobs__ensure()
for i in 0 .. JOB_COUNT {
if Jobs[i].scope != sc { continue }
jobs__st[i] = JOBS_OFFERED
jobs__hv[i] = 0
}
for b in 0 .. BOARD_COUNT {
if JobBoards[b].scope != sc { continue }
for s in 0 .. JobBoards[b].slots { jobs__clear(jobs__off[b] + s) }
jobs__total[b] = 0
jobs__serial[b] = 0
}
jobs__primed = false
}
function jobs__save_scope(sc: int) -> Val {
let v = Value.object()
let js = Value.object()
for i in 0 .. JOB_COUNT {
if Jobs[i].scope != sc or jobs__st[i] == JOBS_OFFERED { continue }
sv_put_ints(js, Jobs[i].key, [jobs__st[i], jobs__hv[i]])
}
Value.put(v, "jobs", js)
let bs = Value.object()
for b in 0 .. BOARD_COUNT {
if JobBoards[b].scope != sc { continue }
let o = Value.object()
sv_put_int(o, "total", jobs__total[b])
sv_put_int(o, "serial", jobs__serial[b])
let slots = new []int
for s in 0 .. JobBoards[b].slots {
let k = jobs__off[b] + s
let row = [jobs__pk[k], jobs__pp[k], jobs__pn[k], jobs__ph[k], jobs__pb[k], jobs__pm[k], jobs__pr[k], jobs__ps[k], jobs__pd[k]]
for f in 0 .. len(row) { push(slots, row[f]) }
}
sv_put_ints(o, "slots", slots)
Value.put(bs, JobBoards[b].key, o)
}
Value.put(v, "boards", bs)
return v
}
function jobs__load_scope(sc: int, v: Val) -> void {
jobs__reset_scope(sc)
if Value.has(v, "jobs") != 0 {
let js = Value.get(v, "jobs")
for i in 0 .. JOB_COUNT {
let p = sv_ints(js, Jobs[i].key)
if Jobs[i].scope == sc and len(p) == 2 { jobs_set(i, p[0], p[1]) }
}
}
if Value.has(v, "boards") == 0 { return }
let bs = Value.get(v, "boards")
for b in 0 .. BOARD_COUNT {
if JobBoards[b].scope != sc or Value.has(bs, JobBoards[b].key) == 0 { continue }
let o = Value.get(bs, JobBoards[b].key)
jobs__total[b] = sv_int(o, "total", 0)
jobs__serial[b] = sv_int(o, "serial", 0)
let r = sv_ints(o, "slots")
for s in 0 .. JobBoards[b].slots {
if s * 9 + 8 >= len(r) { break }
let k = jobs__off[b] + s
let q = s * 9
jobs_post_set(b, s, r[q], r[q + 1], r[q + 2], r[q + 3], r[q + 5], r[q + 6], r[q + 7], r[q + 8])
jobs__pb[k] = r[q + 4]
}
}
}