diff options
| author | historia <[not public]> | 2026-07-06 23:05:04 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-06 23:05:04 -0400 |
| commit | 9292634f2f8d71a53879ff07e1330c671b207d51 (patch) | |
| tree | dcffadf7f697e8ad0705d787d8f599bdeeedb812 /internal/admin/static/map.js | |
| parent | 911aae15f4e869c93239ef7c630c61e1d9d4ef3f (diff) | |
| download | thehouseoficarus-9292634f2f8d71a53879ff07e1330c671b207d51.tar.gz | |
feat: split the concept of hidden and impassable exits. add player_flag for discovered hidden exits.
Diffstat (limited to 'internal/admin/static/map.js')
| -rw-r--r-- | internal/admin/static/map.js | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/internal/admin/static/map.js b/internal/admin/static/map.js index 0dab98c..8080451 100644 --- a/internal/admin/static/map.js +++ b/internal/admin/static/map.js @@ -253,10 +253,12 @@ function renderMap(data) { if (!fr || !tr) return; var x1 = fr.x * CELL + CELL/2, y1 = fr.y * CELL + CELL/2; var x2 = tr.x * CELL + CELL/2, y2 = tr.y * CELL + CELL/2; + if (l.always_blocked) { + g += '<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" stroke="#C44" stroke-width="5" opacity="0.75" stroke-dasharray="6,3" vector-effect="non-scaling-stroke"/>'; + return; + } if (l.hidden) { - // Hidden course-link exit: distinct color (map_course, ~#1B6FC0) and - // tighter dashed arrow style. - g += '<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" stroke="#1B6FC0" stroke-width="5" opacity="0.75" stroke-dasharray="2,2" vector-effect="non-scaling-stroke"/>'; + g += '<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" stroke="#C7C" stroke-width="5" opacity="0.7" stroke-dasharray="2,2" vector-effect="non-scaling-stroke"/>'; return; } var c = blendColors(fr.color, tr.color).replace('#',''); @@ -1232,15 +1234,18 @@ function renderExitsSection(r) { var setFlags = (typeof exit === 'object' && exit.set_flags) ? exit.set_flags : null; var setPlayerFlags = (typeof exit === 'object' && exit.set_player_flags) ? exit.set_player_flags : null; var hidden = (typeof exit === 'object' && exit.hidden) ? exit.hidden : false; - var isConditional = !!(cond || bmsg || setFlags || setPlayerFlags || hidden); + var alwaysBlocked = (typeof exit === 'object' && exit.always_blocked) ? exit.always_blocked : false; + var isConditional = !!(cond || bmsg || setFlags || setPlayerFlags || hidden || alwaysBlocked); var isBidi = mapData && mapData.links && mapData.links.some(function(l) { return l.bidirectional && ((l.from === r.id && l.to === target) || (l.from === target && l.to === r.id)); }); h += '<div class="exit-row" data-dir="' + d + '">'; h += '<span class="exit-dir"' + (isConditional ? ' style="color:#f55"' : '') + '>' + d + '</span>'; h += '<span class="exit-target" onclick="selectRoom(' + target + ')"># ' + target + '</span>'; + if (alwaysBlocked) h += '<span class="exit-meta">Impassable</span>'; if (bmsg) h += '<span class="exit-meta">Blocked: ' + esc(bmsg) + '</span>'; if (cond) h += '<span class="exit-meta">Conditional</span>'; + if (hidden) h += '<span class="exit-meta" style="color:#c7c">Hidden</span>'; h += '<button class="btn btn-sm" onclick="editExitCondition(\'' + d + '\')">Edit</button>'; if (isBidi) h += '<button class="btn btn-sm" onclick="deleteLink(' + target + ',' + r.id + ',\'from\')" title="Remove reverse exit to make one-way">\u21C6</button>'; h += '<button class="btn btn-sm btn-danger" onclick="deleteExit(\'' + d + '\', ' + target + ')">X</button>'; @@ -1271,6 +1276,7 @@ function editExitCondition(dir) { var setFlags = exit.set_flags || null; var setPlayerFlags = exit.set_player_flags || null; var hidden = exit.hidden || false; + var alwaysBlocked = exit.always_blocked || false; var flagsStr = ''; if (setFlags) flagsStr = Object.keys(setFlags).map(function(k) { return k + '=' + setFlags[k]; }).join(', '); @@ -1290,6 +1296,7 @@ function editExitCondition(dir) { h += '<div class="form-group"><label>Set Player Flags (key=value, comma separated)</label><input id="exitPFlags" value="' + escAttr(pflagsStr) + '"></div>'; h += '<div class="form-group"><label>Blocked Message</label><textarea id="exitBmsg" rows="2">' + esc(bmsg) + '</textarea></div>'; h += '<div class="form-group"><label><input type="checkbox" id="exitHidden"' + (hidden ? ' checked' : '') + '> Hidden</label></div>'; + h += '<div class="form-group"><label><input type="checkbox" id="exitAlwaysBlocked"' + (alwaysBlocked ? ' checked' : '') + '> Always Blocked (impassable, shown on map)</label></div>'; h += '<div style="margin-top:10px;border-top:1px solid var(--border);padding-top:8px">'; h += '<label style="font-size:11px;color:#aaa;text-transform:uppercase;letter-spacing:.5px">Conditions</label>'; @@ -1429,6 +1436,8 @@ function saveExitCondition() { exit.blocked_message = (bmsg && bmsg.value) ? bmsg.value : ''; var hiddenEl = document.getElementById('exitHidden'); exit.hidden = hiddenEl ? hiddenEl.checked : false; + var alwaysBlockedEl = document.getElementById('exitAlwaysBlocked'); + exit.always_blocked = alwaysBlockedEl ? alwaysBlockedEl.checked : false; var flagsStr = document.getElementById('exitFlags'); var pflagsStr = document.getElementById('exitPFlags'); exit.set_flags = parseFlagInput(flagsStr ? flagsStr.value : ''); @@ -1475,6 +1484,10 @@ function clearExitCondition() { if (ef) ef.value = ''; var pf = document.getElementById('exitPFlags'); if (pf) pf.value = ''; + var hx = document.getElementById('exitHidden'); + if (hx) hx.checked = false; + var ab = document.getElementById('exitAlwaysBlocked'); + if (ab) ab.checked = false; } function parseFlagInput(val) { |
