become(9.9節)。行き先は識別子ではなく座標——動かす軸とその値——で渡す(3.5節)。
どの型になるかは対象が今居る座標との組み合わせで決まるので、宣言だけでは定まらない。
条件つきの効果(rangeイベントのconditions、6.3節)。排他な二択を、排他なまま渡す——
満たした回の効果と満たさない回の効果を並べて渡すと、宣言順を「順に起こる」と読む読み手が、
起こりえない組み合わせを1つの場合として畳む。
pickと違い重みが無いので、どちらへ倒れるかは確率としては言えない。枝を読ませる口は
読み上げ(ConditionalReading)自身が持つので、読み手は自分の問いに合う口を呼ぶだけでよい
——どれが自分の問いに合うかは、口それぞれの説明が持つ。
destroy(9.3節)。reasonはこの消滅が名乗る名前で、書かれていなければundefined
(名乗らない消滅は、消された側にも何も残らない)。
move(9.6節)。オブジェクトの居場所を変えるだけで、値も個数も動かさない。
slotGlobalIdは名指しの行き先スロット(to_slot)で、undefinedなら宣言順で最初に受け入れた枠。
pick(10節)。重みは宣言のまま(リテラルか参照)渡す。確率へ直すのも、全部0のときに
先頭を選ぶ規約(PickEffect.selectWeighted)を当てはめるのも読み手の側。
候補を読ませる口は読み上げ(PickReading)自身が持つので、読み手は自分の問いに合う口を 呼ぶだけでよい——どれが自分の問いに合うかは、口それぞれの説明が持つ。
set(9.2節)。絶対値を代入する。
signal(9.8節)。世界の形は何も変わらない。
誰の身に起きたかは渡さない。 「避けた」のか「避けられた」のかは識別子を付けた側の裁量で、 読む側がその意味に関心を持てない以上、対象にも関心を持てない。
spawn(9.4節)。配置先(into)は読み上げない——どこへ入るかは世界の形の話で、宣言の意味ではない。
一時的な効果(9・10節)が何を宣言しているかを読み上げる相手(ActiveEffect.readBy)。
効果の木そのものは外へ出さない。出すのは「setがある」「pickの候補が3つあって重みはこれ」という 宣言の読み上げだけで、それをどう解釈するか(重みを確率へ直す・期待値を取る・値域の端を割ったと みなす)は読み手の裁量——定義から数値を導く近似は、ドメインではなく解析側(
src/analysis)に置く。動詞ごとにメソッドを持つのは、効果を1つ足したときに読み手が黙って取りこぼさないようにするため (
readByは抽象なので、実装を書かない効果はコンパイルが通らない)。