fix(ludic.npc): a name picked and a name let go build nothing - the body's names counted in place, the last eight who left in a ring made with the state
ludic deps --allocs (25.2) found npc_pick_name making a list of the body's names at every spawn and np_left making a new list of the recent names at every retire. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
dec64e8a59
commit
58f0dbbc84
3 changed files with 31 additions and 13 deletions
|
|
@ -7,30 +7,47 @@ export function npc_name_used(npc_st: NpcState, n: string) -> bool {
|
||||||
for i in 0 .. len(all) { if all[i].active and all[i].name == n { return true } }
|
for i in 0 .. len(all) { if all[i].active and all[i].name == n { return true } }
|
||||||
let posts = npc_posts(npc_st)
|
let posts = npc_posts(npc_st)
|
||||||
for i in 0 .. len(posts) { if posts[i].active and posts[i].name == n { return true } }
|
for i in 0 .. len(posts) { if posts[i].active and posts[i].name == n { return true } }
|
||||||
if npc_st.np_recent != null { for i in 0 .. len(npc_st.np_recent) { if npc_st.np_recent[i] == n { return true } } }
|
for i in 0 .. len(npc_st.np_recent) { if npc_st.np_recent[i] != "" and npc_st.np_recent[i] == n { return true } }
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
# a free name from the body's pool, from a place in it the dice choose ("" when the pool is empty)
|
# a free name from the body's pool, from a place in it the dice choose ("" when the pool is empty)
|
||||||
export function npc_pick_name(npc_st: NpcState, body: int) -> string {
|
export function npc_pick_name(npc_st: NpcState, body: int) -> string {
|
||||||
let pool = new []string
|
var n = 0
|
||||||
for i in 0 .. NPCN_COUNT { if NpcNames[i].body == body { push(pool, NpcNames[i].name) } }
|
for i in 0 .. NPCN_COUNT { if NpcNames[i].body == body { n += 1 } }
|
||||||
let n = len(pool)
|
|
||||||
if n == 0 { return "" }
|
if n == 0 { return "" }
|
||||||
let start = npc_between(npc_st, 0, n - 1)
|
let start = npc_between(npc_st, 0, n - 1)
|
||||||
for k in 0 .. n {
|
for k in 0 .. n {
|
||||||
let name = pool[(start + k) % n]
|
let name = np_name_nth(body, (start + k) % n)
|
||||||
if not npc_name_used(npc_st, name) { return name }
|
if not npc_name_used(npc_st, name) { return name }
|
||||||
}
|
}
|
||||||
return pool[start]
|
return np_name_nth(body, start)
|
||||||
|
}
|
||||||
|
# the body's j-th name in the table, counted in place rather than gathered into a list
|
||||||
|
function np_name_nth(body: int, j: int) -> string {
|
||||||
|
var seen = 0
|
||||||
|
for i in 0 .. NPCN_COUNT {
|
||||||
|
if NpcNames[i].body == body {
|
||||||
|
if seen == j { return NpcNames[i].name }
|
||||||
|
seen += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# the last eight who left, in a ring of slots made with the state
|
||||||
function np_left(npc_st: mut NpcState, name: string) -> void {
|
function np_left(npc_st: mut NpcState, name: string) -> void {
|
||||||
push(npc_st.np_recent, name)
|
npc_st.np_recent[npc_st.np_rnext] = name
|
||||||
if len(npc_st.np_recent) <= 8 { return }
|
npc_st.np_rnext = (npc_st.np_rnext + 1) % len(npc_st.np_recent)
|
||||||
let keep = new []string
|
}
|
||||||
for i in len(npc_st.np_recent) - 8 .. len(npc_st.np_recent) { push(keep, npc_st.np_recent[i]) }
|
function np_recent_new() -> []string {
|
||||||
npc_st.np_recent = keep
|
let l = new []string
|
||||||
|
for i in 0 .. 8 { push(l, "") }
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
function np_recent_clear(npc_st: mut NpcState) -> void {
|
||||||
|
for i in 0 .. len(npc_st.np_recent) { npc_st.np_recent[i] = "" }
|
||||||
|
npc_st.np_rnext = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# how many pairs share a name, the place's own names included
|
# how many pairs share a name, the place's own names included
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@ export state NpcState {
|
||||||
np_wx: float = 0.0
|
np_wx: float = 0.0
|
||||||
np_wz: float = 0.0
|
np_wz: float = 0.0
|
||||||
np_clock: float = 0.0
|
np_clock: float = 0.0
|
||||||
np_recent: []string = new []string # the last few names that left
|
np_recent: []string = np_recent_new() # the last few names that left, a ring
|
||||||
|
np_rnext: int = 0
|
||||||
np_walkers: []NpcPerson = new []NpcPerson
|
np_walkers: []NpcPerson = new []NpcPerson
|
||||||
np_posts: []NpcPerson = new []NpcPerson
|
np_posts: []NpcPerson = new []NpcPerson
|
||||||
np_max: int = 10 # walkers at most
|
np_max: int = 10 # walkers at most
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ export function npc_reset(npc_st: mut NpcState) -> void {
|
||||||
npc_st.np_n = 0
|
npc_st.np_n = 0
|
||||||
npc_st.np_next_h = 0.0
|
npc_st.np_next_h = 0.0
|
||||||
npc_st.np_hold = false
|
npc_st.np_hold = false
|
||||||
npc_st.np_recent = new []string
|
np_recent_clear(npc_st)
|
||||||
q_clear(npc_facts(npc_st))
|
q_clear(npc_facts(npc_st))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue