feat: expand ISAC content modeling
Validate and deploy production / validate (push) Canceled after 0s
Validate and deploy production / deploy (push) Canceled after 0s
Validate and deploy staging / validate (push) Successful in 28s
Validate and deploy staging / deploy (push) Successful in 1m3s

This commit is contained in:
jb
2026-08-03 01:23:20 -04:00
parent d9924a95b9
commit 57068b61cd
90 changed files with 9635 additions and 1270 deletions
+54 -2
View File
@@ -187,6 +187,7 @@ describe('conditional mechanic persistence adapter', () => {
value_scaling TEXT, unit TEXT, damage_basis TEXT, application_phase TEXT,
combat_timing TEXT, resource_kind TEXT, delivery_mode TEXT,
delivery_duration_seconds REAL, targeting_json TEXT, min_state_value REAL, max_state_value REAL,
probability_percent REAL,
description_slot INTEGER, sort_order INTEGER, created_at TEXT, updated_at TEXT
)`);
@@ -220,6 +221,8 @@ describe('conditional mechanic persistence adapter', () => {
key: 'weapon-kill',
label: 'Weapon kill',
event: 'enemy_killed',
procChancePercent: 29,
requiresAssignedAbilityActive: true,
if: {
kind: 'compare',
left: {
@@ -255,6 +258,7 @@ describe('conditional mechanic persistence adapter', () => {
population: 'allies',
radiusMeters: 40,
},
probabilityPercent: 29,
variants: {
I: { value: 240 },
II: { value: 336 },
@@ -263,12 +267,18 @@ describe('conditional mechanic persistence adapter', () => {
{
key: 'target-detonation',
label: 'Target Detonation',
phase: 'on_exit',
phase: 'after_event',
kind: 'direct_damage',
scope: 'target',
basis: 'flat',
statePool: 'marked-target',
perStack: true,
targeting: {
kind: 'event_target_area',
center: 'event_target',
validTargets: 'enemies',
radiusMeters: 5,
},
variants: {
I: {
value: 240,
@@ -322,6 +332,23 @@ describe('conditional mechanic persistence adapter', () => {
mutations: [],
outcomes: [],
},
{
key: 'tactical-link-assist',
label: 'Tactical Link assist',
event: 'assist',
if: {
kind: 'compare',
left: {
source: 'event',
path: 'values.assignedAbilityActive',
},
operator: 'eq',
right: true,
},
reducer: { kind: 'none' },
mutations: [],
outcomes: [],
},
],
},
);
@@ -366,11 +393,23 @@ describe('conditional mechanic persistence adapter', () => {
population: 'allies',
radiusMeters: 40,
},
probabilityPercent: 29,
variants: {
I: { value: 240 },
II: { value: 336 },
},
});
expect(loaded?.clauses[0].outcomes[1]).toMatchObject({
phase: 'after_event',
kind: 'direct_damage',
scope: 'target',
targeting: {
kind: 'event_target_area',
center: 'event_target',
validTargets: 'enemies',
radiusMeters: 5,
},
});
expect(loaded?.clauses[0].if).toEqual({
kind: 'compare',
left: {
@@ -381,6 +420,10 @@ describe('conditional mechanic persistence adapter', () => {
operator: 'lt',
right: 75,
});
expect(loaded?.clauses[0]).toMatchObject({
procChancePercent: 29,
requiresAssignedAbilityActive: true,
});
expect(loaded?.pools[0]).toMatchObject({
key: 'marked-target',
stateKind: 'target_mark',
@@ -399,7 +442,7 @@ describe('conditional mechanic persistence adapter', () => {
},
]);
expect(loaded?.clauses[0].outcomes[1]).toMatchObject({
phase: 'on_exit',
phase: 'after_event',
kind: 'direct_damage',
scope: 'target',
statePool: 'marked-target',
@@ -430,5 +473,14 @@ describe('conditional mechanic persistence adapter', () => {
right: true,
},
});
expect(loaded?.clauses[2]).toMatchObject({
event: 'assist',
if: {
kind: 'compare',
left: { source: 'event', path: 'values.assignedAbilityActive' },
operator: 'eq',
right: true,
},
});
});
});