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:
parent
e146c7a337
commit
411206e45a
14 changed files with 984 additions and 0 deletions
71
packages/ludic.jobs/save.ludic
Normal file
71
packages/ludic.jobs/save.ludic
Normal 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]
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue