From 14428577e1c7a6c2bdc96f700b7df0d68ec06ba6 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Tue, 7 Jul 2026 23:39:19 -0400 Subject: fix: add respawn on hide field to admin gui, add explanation text to gather card --- internal/admin/static/objecteditor.js | 48 +++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'internal/admin') diff --git a/internal/admin/static/objecteditor.js b/internal/admin/static/objecteditor.js index 2046f2e..b99ca74 100644 --- a/internal/admin/static/objecteditor.js +++ b/internal/admin/static/objecteditor.js @@ -49,7 +49,7 @@ var SECTIONS = [ ['deplete_timer', 'Deplete', 'number', '45', 'narrow', function(d) { return d.skill === 'woodcutting'; }], ['nest_chance', 'Nest 1/n', 'number', '256', 'narrow', function(d) { return d.skill === 'woodcutting'; }], ]}, - {label:'Tools', key:'tools', type:'tools_checkbox'}, + {label:'Tools', key:'tools', type:'tools_checkbox', hint:'any one is sufficient (OR)'}, ], subtables: [ {label:'Drops', key:'drops', fields:[ @@ -67,10 +67,11 @@ var SECTIONS = [ ['tier', 'Tier', 'number', '1', 'narrow'], ['max_block_size', 'Max Block Size', 'select', '|small|medium|large|massive'], ['max_occupants', 'Max Occupants', 'number', '1', 'narrow'], - ['unsafe_chance', 'Unsafe Chance', 'number', '0.05', 'narrow'], - ['decay_ticks', 'Decay Ticks', 'number', '100', 'narrow'], - ['decay_chance', 'Decay Chance', 'number', '0.1', 'narrow'], - ['respawn_ticks', 'Respawn Ticks', 'number', '50', 'narrow'], + ['unsafe_chance', 'Unsafe Chance', 'number', '0 = never, e.g. 0.05', 'narrow'], + ['decay_ticks', 'Decay Ticks', 'number', '0 = never, e.g. 100', 'narrow'], + ['decay_chance', 'Decay Chance', 'number', '0 = never, e.g. 0.01', 'narrow'], + ['respawn_ticks', 'Respawn Ticks', 'number', '0 = no respawn, e.g. 50', 'narrow'], + ['respawn_on_hide', 'Respawn on hide', 'checkbox'], ], subtables: [ {label:'Levels of Decay', key:'levels', fields:[ @@ -298,6 +299,27 @@ function renderCard(sec, data) { h += renderSubtable(sec, st, data); }); } + + if (sec.id === 'safespot') { + var helpCollapsed = window._safespotHelpCollapsed === undefined ? true : window._safespotHelpCollapsed; + h += '
'; + h += '
'; + h += '' + (helpCollapsed ? '▶' : '▼') + ''; + h += 'How Tiers, Levels, Decay & Respawn Work'; + h += '
'; + if (!helpCollapsed) { + h += '
'; + h += 'Tier — Player tier (base 1; +1 with unlocked_rock_cover flag) must be ≥ safespot tier to hide.
'; + h += 'Levels of Decay — Degradation stages (N levels above all subtable entries). Level messages shown when hiding; degrade messages broadcast when damaged. Level 0 = destroyed, all occupants evicted.
'; + h += 'Decay — Two independent paths: decay_ticks (forced degrade after N ticks of use) and decay_chance (per-tick random degrade). Either or both can be set; 0 disables that path.
'; + h += 'Respawn on hide — Resets the cover to full levels when the first person hides on an empty/unused cover.
'; + h += 'Respawn ticks — Auto-reforms the cover after N ticks when fully destroyed (level 0). 0 = instance permanently removed.
'; + h += 'Max Block Size — Determines which mob sizes are blocked (small < medium < large < massive). Empty = blocks everything.
'; + h += 'Unsafe Chance — Per-tick probability of being forced out of cover regardless of decay (0 = never forced out).'; + h += '
'; + } + h += '
'; + } } h += ''; } @@ -688,10 +710,11 @@ function renderToolsCheckbox(sec, il, data) { return 'Loading tool types...'; } if (arr.length === 0) { - return ''; + var hint = il.hint ? '
' + esc(il.hint) + '
' : ''; + return hint + ''; } var h = '
'; - h += '' + esc(il.label) + ''; + h += '' + esc(il.label) + (il.hint ? ' (' + esc(il.hint) + ')' : '') + ''; h += '
'; arr.forEach(function(t, idx) { h += '
'; @@ -751,6 +774,15 @@ function toggleCardWidth(id) { renderCurrent(); } +function toggleSafespotHelp() { + if (window._safespotHelpCollapsed === undefined) { + window._safespotHelpCollapsed = false; + } else { + window._safespotHelpCollapsed = !window._safespotHelpCollapsed; + } + renderCurrent(); +} + function removeSection(id) { var sec = SECTIONS.find(function(s) { return s.id === id; }); if (!sec) return; @@ -778,7 +810,7 @@ function addSection() { } else if (sec.id === 'gather') { objectData[sec.path] = {skill:'', tools:[], success:{base:0, per_level:0, cap:1}, drops:[], gather_message:'', fail_message:'', respawn_timer:0, respawn_broadcast:'', deplete_timer:0, nest_chance:0}; } else if (sec.id === 'safespot') { - objectData[sec.path] = {tier:1, max_block_size:'', max_occupants:1, unsafe_chance:0, decay_ticks:0, decay_chance:0, respawn_on_hide:false, respawn_ticks:0, levels:[]}; + objectData[sec.path] = {tier:1, max_block_size:'', max_occupants:1, unsafe_chance:'', decay_ticks:'', decay_chance:'', respawn_on_hide:false, respawn_ticks:'', levels:[]}; } else { objectData[sec.path] = {}; } -- cgit v1.2.3