c5426ffe34
SpellSpec gains a cast_time field (seven budget codes; the JSON loader also accepts RAW phrasings like "1 round" or "1 minute"). The pure budget filters take a CastTimeResolver so a cast_spell occupies the slot its casting time maps to: standard->standard, swift->swift (competing with deed/inspire courage and dropped by a consumed immediate), immediate/free->free, full_round and one_round->full_round (one_round clamped: resolved end-of-turn, documented approximation), long->dropped before the budget filter with the new downgraded:cast_time reason. The engine binds its registry lookup via _cast_time_of (unknown names fall back to standard, keeping transcripts byte-identical); _choose_spell_action never selects long casts; the staggered filter now drops full-round casts and spell_combat via the effective slot (_FULL_ROUND_KINDS becomes dead and is deleted). Summon Monster I/II are the only data spells marked 1 round. Metamagic full-round casting for spontaneous casters is out of scope (future hook documented in _cast_time_of). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
18 lines
357 B
JSON
18 lines
357 B
JSON
{
|
|
"name": "Summon Monster II",
|
|
"level": 2,
|
|
"school": "conjuration",
|
|
"range": "close",
|
|
"save": "none",
|
|
"base_dc": 10,
|
|
"cast_time": "1 round",
|
|
"effects": [
|
|
{
|
|
"type": "summon",
|
|
"creature": "data/monsters/celestial_wolf.json",
|
|
"duration_rounds": 5
|
|
}
|
|
],
|
|
"description": "Summons a celestial wolf to fight for you."
|
|
}
|