Add ISAC mechanic gap handoff actions

This commit is contained in:
JB
2026-07-27 21:10:02 -04:00
parent 6e12b2f3b7
commit 36dd018a4a
9 changed files with 723 additions and 16 deletions
@@ -55,7 +55,7 @@
disabled?: boolean;
} = $props();
let recipeKey = $state<TriggerActionKey>('same_target_hits_within_window');
let recipeKey = $state<TriggerActionKey | ''>('');
let recipeCount = $state(9);
let recipeWindow = $state(3);
let recipeDistance = $state(10);
@@ -118,13 +118,15 @@
}
function applyRecipe(replace = false) {
const result = createMechanicRecipe(recipeKey, recipeParams() as never);
if (!recipeKey) return;
const selectedRecipeKey = recipeKey;
const result = createMechanicRecipe(selectedRecipeKey, recipeParams() as never);
if (result.status !== 'supported') return;
const clauses = result.seed.clauses.map((seed, index): ConditionalMechanicClauseDraft => ({
key: `${slug(recipeKey)}-${rule.clauses.length + index + 1}`,
label: seed.label ?? TRIGGER_ACTION_REGISTRY[recipeKey].label,
key: `${slug(selectedRecipeKey)}-${rule.clauses.length + index + 1}`,
label: seed.label ?? TRIGGER_ACTION_REGISTRY[selectedRecipeKey].label,
event: seed.when,
recipeKey,
recipeKey: selectedRecipeKey,
if: seed.if ?? { kind: 'true' },
reducer: seed.reducer,
cooldownSeconds: seed.cooldownSeconds,
@@ -519,6 +521,7 @@
mode="single"
compact
subjectLabel="RECIPE"
emptySelectionLabel="NO RECIPE SELECTED"
bind:value={recipeKey}
/>
{#if ['same_target_hits_within_window', 'distinct_enemies_within_window', 'consecutive_same_target_hits'].includes(recipeKey)}
@@ -530,8 +533,8 @@
{#if ['target_hit_within_distance', 'within_distance'].includes(recipeKey)}
<label class="field">METERS<input type="number" min="0" step="any" bind:value={recipeDistance}/></label>
{/if}
<button type="button" class="secondary" onclick={() => applyRecipe(false)}>ADD RECIPE BRANCH +</button>
{#if rule.clauses.length}
<button type="button" class="secondary" disabled={!recipeKey} onclick={() => applyRecipe(false)}>ADD RECIPE BRANCH +</button>
{#if rule.clauses.length && recipeKey}
<button type="button" class="danger-quiet" onclick={() => replaceConfirmation = true}>REPLACE PROGRAM</button>
{/if}
</div>