aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/static
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-01 03:21:52 -0400
committerhistoria <[not public]>2026-07-01 03:21:52 -0400
commitfbe5090ac3325ff8ea6989cdf4515c7f077c975b (patch)
tree1811ad9c6a596e7177bb2c42944c389c0a120066 /internal/admin/static
parent5f37dc9b6f6b79da04da70ae0c33ec8d02998587 (diff)
downloadthehouseoficarus-fbe5090ac3325ff8ea6989cdf4515c7f077c975b.tar.gz
feat: item messaging standardized, custom messages for production paths implemented
Diffstat (limited to 'internal/admin/static')
-rw-r--r--internal/admin/static/itemeditor.js48
1 files changed, 38 insertions, 10 deletions
diff --git a/internal/admin/static/itemeditor.js b/internal/admin/static/itemeditor.js
index d02e7ab..d02945a 100644
--- a/internal/admin/static/itemeditor.js
+++ b/internal/admin/static/itemeditor.js
@@ -59,24 +59,24 @@ var SECTIONS = [
['success_base', 'Base', 'number', '', 'narrow'],
['success_per_level', 'Per Lvl', 'number', '', 'narrow'],
['success_cap', 'Cap', 'number', '', 'narrow'],
- ['start_message', 'Start Message', 'text', '', 'wide'],
- ['message', 'Message', 'text', '', 'wide'],
- ['fail_message', 'Fail Message', 'text', '', 'wide', function(item) { return item.type === 'cooking' || item.subtype === 'smelt'; }],
- ['end_message', 'End Message', 'text', '', 'wide'],
+ ['start_message', 'Start Message', 'text', 'e.g. You begin smithing %i1.', 'wide'],
+ ['success_message', 'Success Message', 'text', 'e.g. You smith a %n.', 'wide'],
+ ['fail_message', 'Fail Message', 'text', 'e.g. You accidentally burn the %i1.', 'wide', function(item) { return item.type === 'cooking' || item.subtype === 'smelt'; }],
+ ['end_message', 'End Message', 'text', 'e.g. You\'ve finished smithing.', 'wide'],
],
fieldGroups: [
['type', 'subtype', 'level', 'xp', 'wait', 'output_qty'],
{fields: ['station', 'tool'], right: true},
{label: 'Success', fields: ['success_base', 'success_per_level', 'success_cap', 'fail']},
- ['start_message', 'message', 'fail_message', 'end_message'],
+ ['start_message', 'success_message', 'fail_message', 'end_message'],
],
subSubtables: [
{label:'Ingredients', key:'ingredients', fields:[
['quantity', 'Qty', 'number', '1', 'narrow'],
]},
{label:'Steps', key:'steps', fields:[
- ['tick', 'Ticks', 'number', '', 'narrow'],
- ['message', 'Message', 'text', '', 'wide'],
+ ['delay', 'Delay (ticks)', 'number', '', 'narrow'],
+ ['message', 'Message', 'text', '', 'wide'],
]},
],
}
@@ -556,6 +556,8 @@ function renderSubFieldHTML(sec, stKey, idx, f, val) {
if (f[4] === 'narrow') extraCls = ' obj-narrow';
else if (f[4] === 'grow') extraCls = ' obj-grow';
if (f[4] === 'wide') extraStyle = ' style="flex:1 1 100%"';
+ var defaultPh = '';
+ if (f[3]) defaultPh = ' placeholder="' + escAttr(f[3]) + '"';
if (f[2] === 'search') {
var entity = f[6] || 'items';
var ph = f[3] ? ' placeholder="' + escAttr(f[3]) + '"' : ' placeholder="Search ' + entity + '..."';
@@ -573,7 +575,7 @@ function renderSubFieldHTML(sec, stKey, idx, f, val) {
sel += '</select></label>';
return sel;
}
- return '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"></label>';
+ return '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + defaultPh + '></label>';
}
function renderSubtable(sec, st, data) {
@@ -653,7 +655,7 @@ function renderSubtable(sec, st, data) {
if (sst.key === 'steps') {
var stepsArr = item[sst.key];
if (!stepsArr || !Array.isArray(stepsArr) || stepsArr.length === 0) {
- h += '<button class="btn btn-sm obj-sub-add" style="margin-top:4px" onclick="addSubSubRow(\'' + sec.id + '\',\'' + st.key + '\',' + idx + ',\'' + sst.key + '\')">+ Add Custom Delay/Message</button>';
+ h += '<button class="btn btn-sm obj-sub-add" data-section="steps-add-' + idx + '" style="margin-top:4px" onclick="addSubSubRow(\'' + sec.id + '\',\'' + st.key + '\',' + idx + ',\'' + sst.key + '\')">+ Add Custom Delay/Message</button>';
return;
}
}
@@ -721,7 +723,9 @@ function removeConsumePair(secID, subKey, rowIdx, subSubKey, subIdx, pairIdx) {
function renderSubSubtable(sec, st, rowIdx, sst, parentItem) {
var arr = parentItem[sst.key] || [];
var isIngredients = sst.key === 'ingredients';
- var h = '<div class="obj-subtable" style="margin:6px 0 6px 12px;border-left:2px solid var(--accent)">';
+ var isSteps = sst.key === 'steps';
+ var stepsAttr = isSteps ? ' data-section="steps-section"' : '';
+ var h = '<div class="obj-subtable"' + stepsAttr + ' style="margin:6px 0 6px 12px;border-left:2px solid var(--accent)">';
if (!isIngredients) {
h += '<div class="obj-subtable-header">' + esc(sst.label) + '</div>';
}
@@ -1035,6 +1039,11 @@ function setupCraftTypeChange() {
var xpField = document.getElementById(id.replace(/_type$/, '_xp'));
var stationField = document.getElementById(id.replace(/_type$/, '_station'));
+ var combineHideFields = ['success_message', 'fail_message', 'tool', 'wait',
+ 'success_base', 'success_per_level', 'success_cap', 'fail'];
+
+ var recipeRow = typeSelect.closest('.obj-sub-row');
+
function update() {
var t = typeSelect.value;
@@ -1049,6 +1058,25 @@ function setupCraftTypeChange() {
if (sLbl) sLbl.style.display = (t === 'fletching' || t === 'combine' || t === 'pharmacy') ? 'none' : '';
}
+ combineHideFields.forEach(function(fKey) {
+ var el = document.getElementById(id.replace(/_type$/, '_' + fKey));
+ if (!el) return;
+ var lbl = el.closest('.obj-field');
+ if (lbl) lbl.style.display = t === 'combine' ? 'none' : '';
+ });
+
+ var successGroup = document.querySelector('.success-group');
+ if (successGroup) successGroup.style.display = t === 'combine' ? 'none' : '';
+ var successBtn = document.getElementById(successGroup ? successGroup.id + '_btn' : '');
+ if (successBtn) successBtn.style.display = t === 'combine' ? 'none' : '';
+
+ var stepsSection = recipeRow.querySelector('[data-section="steps-section"]');
+ var stepsAddBtn = recipeRow.querySelector('[data-section^="steps-add-"]');
+
+ var showSteps = t === 'combine';
+ if (stepsSection) stepsSection.style.display = showSteps ? '' : 'none';
+ if (stepsAddBtn) stepsAddBtn.style.display = showSteps ? '' : 'none';
+
if (subtypeSel) {
var sLbl = subtypeSel.closest('.obj-field');
if (t === 'smithing') {