Third tab lets users step through detection state changes by choosing
Hide, Sneak, or Seek actions and selecting roll outcomes to see how
the Observed/Hidden/Undetected/Unnoticed state evolves, with a
history trail and start-as state picker.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
effects: 'Opponents perceive you clearly. You can be targeted normally. If also <strong>Concealed</strong>, they need a DC 5 flat check.',
},
HIDDEN: {
label: 'Hidden',
cssClass: 'hidden',
effects: 'Opponents know your general location but not your exact square. You are <strong>off-guard</strong> to them. They need a DC 11 flat check to affect you.',
},
UNDETECTED: {
label: 'Undetected',
cssClass: 'undetected',
effects: 'No opponent knows which square you occupy. You are <strong>off-guard</strong> to them. They must guess a square; the GM rolls secretly.',
},
UNNOTICED: {
label: 'Unnoticed',
cssClass: 'unnoticed',
effects: 'No opponent even knows you exist nearby. You cannot be targeted at all.',
},
};
const SIM_ACTIONS = {
OBSERVED: [
{
id: 'hide',
name: 'Use HIDE',
hint: 'Requires cover or concealment',
needsRoll: true,
rollLabel: 'HIDE — select the outcome (Stealth vs Perception DC):',
outcomes: [
{ label: '✓ Success', newState: 'HIDDEN', msg: 'You slip out of sight. Opponents know your general area but not your exact square.' },
{ label: '✗ Failure', newState: 'OBSERVED', msg: 'You fail to conceal yourself. You remain fully observed.' },
],
},
],
HIDDEN: [
{
id: 'sneak',
name: 'Use SNEAK',
hint: 'Move ≤ half Speed, cover at start & end',
needsRoll: true,
rollLabel: 'SNEAK — select the outcome (Stealth vs Perception DC):',
outcomes: [
{ label: '✓ Success', newState: 'UNDETECTED', msg: 'You move silently. No opponent knows your new location.' },
{ label: '✗ Failure', newState: 'HIDDEN', msg: 'You make some noise but stay in the same known area. You remain hidden.' },
{ label: '✗✗ Crit Fail', newState: 'OBSERVED', msg: 'You give away your position. You are spotted! (If invisible, you become Hidden instead.)' },
],
},
{
id: 'seek',
name: 'Someone SEEKs me',
hint: 'Opponent rolls Perception vs your Stealth DC',
needsRoll: true,
rollLabel: 'SEEK — select the outcome (their Perception vs your Stealth DC):',
outcomes: [
{ label: '✓✓ Crit Success', newState: 'OBSERVED', msg: 'The seeker pinpoints you precisely with a precise sense. You are now fully observed.' },
{ label: '✓ Success (precise sense)', newState: 'OBSERVED', msg: 'The seeker locates you precisely. You are observed.' },
{ label: '✓ Success (imprecise / you\'re invisible)', newState: 'HIDDEN', msg: 'The seeker narrows down your area but cannot see you precisely. You remain hidden.' },
{ label: '✗ Failure', newState: 'HIDDEN', msg: 'The seeker finds nothing new. You remain hidden.' },
],
},
{
id: 'nonstealthy',
name: 'Non-stealthy action / Strike',
hint: 'Attack, cast a spell, or act openly',
needsRoll: false,
newState: 'OBSERVED',
msg: 'Acting openly reveals your position. You are now observed.',
},
{
id: 'step',
name: 'STEP with cover / concealment',
hint: 'One square while remaining covered',
needsRoll: false,
newState: 'HIDDEN',
msg: 'You step carefully while staying concealed. You remain hidden.',
},
{
id: 'unobtrusive',
name: 'Unobtrusive action',
hint: 'Draw an item, open a door — GM may call for Stealth',
needsRoll: false,
newState: 'HIDDEN',
msg: 'You act quietly. You remain hidden.',
},
],
UNDETECTED: [
{
id: 'sneak',
name: 'Use SNEAK',
hint: 'Move ≤ half Speed, cover at start & end',
needsRoll: true,
rollLabel: 'SNEAK — select the outcome (Stealth vs Perception DC):',
{ label: '✗ Failure', newState: 'HIDDEN', msg: 'You make some noise. Opponents now know your general area but not your exact square.' },
{ label: '✗✗ Crit Fail', newState: 'OBSERVED', msg: 'You completely give away your position. You are spotted! (If invisible, you become Hidden instead.)' },
],
},
{
id: 'seek',
name: 'Someone SEEKs me',
hint: 'Opponent rolls Perception vs your Stealth DC (GM rolls secretly)',
needsRoll: true,
rollLabel: 'SEEK — select the outcome (their Perception vs your Stealth DC):',
outcomes: [
{ label: '✓✓ Crit Success', newState: 'OBSERVED', msg: 'The seeker pinpoints you precisely. You are now fully observed.' },
{ label: '✓ Success', newState: 'HIDDEN', msg: 'The seeker narrows down your location. You are now hidden — they know the general area.' },
{ label: '✗ Failure', newState: 'UNDETECTED', msg: 'The seeker fails to find you. You remain undetected.' },
],
},
{
id: 'speak',
name: 'Speak or make a loud noise',
hint: 'Anything that reveals your presence',
needsRoll: false,
newState: 'OBSERVED',
msg: 'Sound reveals your location. You are now observed.',
},
],
UNNOTICED: [
{
id: 'seek',
name: 'Someone SEEKs the area',
hint: 'Rare — seeker sweeps without knowing you\'re there',
needsRoll: true,
rollLabel: 'SEEK — select the outcome (their Perception vs your Stealth DC):',
outcomes: [
{ label: '✓✓ Crit Success', newState: 'OBSERVED', msg: 'The seeker detects you completely. You are now observed.' },
{ label: '✓ Success', newState: 'HIDDEN', msg: 'The seeker notices something. You are now hidden — they know the general area.' },
{ label: '✗ Failure', newState: 'UNNOTICED', msg: 'The seeker notices nothing unusual. You remain unnoticed.' },
],
},
{
id: 'speak',
name: 'Speak or make a loud noise',
hint: 'Anything that reveals your existence',
needsRoll: false,
newState: 'OBSERVED',
msg: 'Sound reveals your presence. You are now observed.',
},
{
id: 'nonstealthy',
name: 'Non-stealthy action',
hint: 'Attack, cast a spell, or act openly',
needsRoll: false,
newState: 'OBSERVED',
msg: 'Acting openly reveals you. You are now observed.',