aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/static/itemeditor.js
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-05 19:18:50 -0400
committerhistoria <[not public]>2026-07-05 19:18:50 -0400
commit7b5ed92e003d8a4bf9bdc69d43b7354eb2260dfa (patch)
tree04310b22c25e2d9fe86b2c06e78e12d8f4caa61b /internal/admin/static/itemeditor.js
parent6bd5365cc22f84c047c1585e3f54571af46f53e5 (diff)
downloadthehouseoficarus-7b5ed92e003d8a4bf9bdc69d43b7354eb2260dfa.tar.gz
feat: duplicate items/obj/mobs from sidebar. item inputs fields changed to search fields
Diffstat (limited to 'internal/admin/static/itemeditor.js')
-rw-r--r--internal/admin/static/itemeditor.js90
1 files changed, 71 insertions, 19 deletions
diff --git a/internal/admin/static/itemeditor.js b/internal/admin/static/itemeditor.js
index ac76f94..ed32267 100644
--- a/internal/admin/static/itemeditor.js
+++ b/internal/admin/static/itemeditor.js
@@ -10,9 +10,9 @@ var SECTIONS = [
fields: [
['name', 'Name', 'text', 'Copper Ore'],
['color', 'Color', 'color', 'B2'],
- ['value', 'Value', 'number', '0'],
+ ['value', 'Value', 'number', '100'],
['stackable', 'Stackable', 'checkbox'],
- ['max_quality', 'Quality', 'number', ''],
+ ['max_quality', 'Quality', 'number', '100', 'narrow'],
['aliases', 'Aliases', 'text', 'comma separated'],
['description', 'Description', 'textarea', 'A chunk of copper ore.'],
]
@@ -55,7 +55,7 @@ var SECTIONS = [
['output_qty', 'Output Qty', 'number', '', 'narrow'],
['station', 'Station', 'select', '|anvil|cooking_range|fire|furnace|pottery_oven|pottery_wheel|spinning_wheel|workbench'],
['tool', 'Tool', 'select', '|pickaxe|axe|fire|chisel|hammer|knife|needle|rake|saw|shears|spade|watering_can|fishing_rod|fly_rod|harpoon|small_net|big_net|lobster_pot'],
- ['fail', 'Fail Item', 'search', '', '', null, 'items'],
+ ['fail', 'Fail Item', 'search', 'e.g. burnt_fish', '', null, 'items'],
['success_base', 'Base', 'number', '0.5', 'narrow'],
['success_per_level', 'Per Lvl', 'number', '0.01', 'narrow'],
['success_cap', 'Cap', 'number', '0.95', 'narrow'],
@@ -76,8 +76,8 @@ var SECTIONS = [
['quantity', 'Qty', 'number', '1', 'narrow'],
]},
{label:'Steps', key:'steps', fields:[
- ['delay', 'Delay (ticks)', 'number', '', 'narrow'],
- ['message', 'Message', 'text', '', 'wide'],
+ ['delay', 'Delay (ticks)', 'number', '3', 'narrow'],
+ ['message', 'Message', 'text', 'You turn the handle...', 'wide'],
]},
],
}
@@ -87,8 +87,8 @@ var SECTIONS = [
id: 'search', label: 'Search',
detect: function(d) { return d.search_table || d.search_ticks; },
fields: [
- ['search_table', 'Search Table', 'search', '', '', null, 'drops'],
- ['search_ticks', 'Search Ticks', 'number', '', 'narrow'],
+ ['search_table', 'Search Table', 'search', 'e.g. gem_table', '', null, 'drops'],
+ ['search_ticks', 'Search Ticks', 'number', '8', 'narrow'],
['search_message', 'Search Message', 'text', 'You search...', 'wide'],
]
},
@@ -96,7 +96,7 @@ var SECTIONS = [
id: 'food', label: 'Food',
detect: function(d) { return d.heal_value || d.eat_message; },
fields: [
- ['heal_value', '+HP', 'number', '', 'narrow'],
+ ['heal_value', '+HP', 'number', '10', 'narrow'],
['eat_message', 'Eat Message', 'text', 'You eat the...', 'wide'],
]
},
@@ -105,22 +105,22 @@ var SECTIONS = [
detect: function(d) { return d.farm_patch_type; },
fields: [
['farm_patch_type', 'Patch Type', 'select', 'herb|allotment|flower|bush|tree'],
- ['farm_level', 'Farm Level', 'number', '', 'narrow'],
- ['farm_plant_xp', 'Plant XP', 'number', '', 'narrow'],
- ['farm_harvest_xp', 'Harvest XP', 'number', '', 'narrow'],
- ['farm_stages', 'Stages', 'number', '', 'narrow'],
- ['farm_product', 'Product', 'search', '', '', null, 'items'],
- ['farm_min_yield', 'Min Yield', 'number', '', 'narrow'],
- ['farm_max_yield', 'Max Yield', 'number', '', 'narrow'],
+ ['farm_product', 'Product', 'search', 'e.g. tomato', '', null, 'items'],
+ ['farm_plant_xp', 'Plant XP', 'number', '5', 'narrow'],
+ ['farm_harvest_xp', 'Harvest XP', 'number', '10', 'narrow'],
+ ['farm_level', 'Farm Level', 'number', '1', 'narrow'],
+ ['farm_stages', 'Stages', 'number', '4', 'narrow'],
+ ['farm_min_yield', 'Min Yield', 'number', '1', 'narrow'],
+ ['farm_max_yield', 'Max Yield', 'number', '5', 'narrow'],
]
},
{
id: 'potions', label: 'Potions',
detect: function(d) { return d.potion_effect; },
fields: [
- ['potion_effect', 'Effect', 'text', 'strength, accuracy, heal'],
- ['potion_bonus', 'Bonus', 'number', '', 'narrow'],
- ['potion_duration', 'Duration', 'number', '', 'narrow'],
+ ['potion_effect', 'Effect', 'select', 'heal|battery|all_combat|accuracy|strength|defense|ranged|science'],
+ ['potion_bonus', 'Bonus', 'number', '10', 'narrow'],
+ ['potion_duration', 'Duration', 'number', '50', 'narrow'],
]
},
];
@@ -255,6 +255,10 @@ function renderCard(sec, data) {
h += renderCoreCard(data);
} else if (sec.id === 'equipment') {
h += renderEquipmentCard(data);
+ } else if (sec.id === 'farming') {
+ h += renderFarmingCard(data);
+ } else if (sec.id === 'potions') {
+ h += renderPotionsCard(data);
} else {
h += '<div class="obj-card-grid">';
if (sec.fields) sec.fields.forEach(function(f) {
@@ -316,6 +320,41 @@ function renderCoreCard(data) {
return h;
}
+function renderFarmingCard(data) {
+ var sec = SECTIONS.find(function(s) { return s.id === 'farming'; });
+ var byKey = {};
+ sec.fields.forEach(function(f) { byKey[f[0]] = f; });
+ var h = '<div class="obj-core-row">';
+ h += renderField(sec, byKey['farm_patch_type'], data, -1);
+ h += renderField(sec, byKey['farm_product'], data, -1, null, 'flex:1');
+ h += '</div>';
+ h += '<div class="obj-core-row">';
+ h += renderField(sec, byKey['farm_plant_xp'], data, -1);
+ h += renderField(sec, byKey['farm_harvest_xp'], data, -1);
+ h += renderField(sec, byKey['farm_level'], data, -1);
+ h += '</div>';
+ h += '<div class="obj-core-row">';
+ h += renderField(sec, byKey['farm_stages'], data, -1);
+ h += renderField(sec, byKey['farm_min_yield'], data, -1);
+ h += renderField(sec, byKey['farm_max_yield'], data, -1);
+ h += '</div>';
+ return h;
+}
+
+function renderPotionsCard(data) {
+ var sec = SECTIONS.find(function(s) { return s.id === 'potions'; });
+ var byKey = {};
+ sec.fields.forEach(function(f) { byKey[f[0]] = f; });
+ var h = '<div class="obj-core-row">';
+ h += renderField(sec, byKey['potion_effect'], data, -1, null, 'flex:1');
+ h += '</div>';
+ h += '<div class="obj-core-row">';
+ h += renderField(sec, byKey['potion_bonus'], data, -1);
+ h += renderField(sec, byKey['potion_duration'], data, -1);
+ h += '</div>';
+ return h;
+}
+
// =========================================================================
// Equipment card (custom render with 3 stat blocks)
// =========================================================================
@@ -1551,8 +1590,21 @@ function duplicateItem() {
delete copy._path;
copy.id = newID;
+ var dir = '';
+ if (itemData._path) {
+ var parts = itemData._path.split('/');
+ var parentDir = parts[parts.length - 2];
+ if (parentDir !== 'items') dir = parentDir;
+ }
+
API.post('/api/items', {id: newID}).then(function() {
- return API.put('/api/items/' + encodeURIComponent(newID), copy);
+ var putOp = API.put('/api/items/' + encodeURIComponent(newID), copy);
+ if (dir) {
+ return putOp.then(function() {
+ return API.post('/api/items/move', {id: newID, dir: dir});
+ });
+ }
+ return putOp;
}).then(function() {
notify('Duplicated as ' + newID, 'success');
updateUndoBar();