From 49ec0b7f3cc9e241f7ad271107ba59a13b7bfda3 Mon Sep 17 00:00:00 2001 From: HikeMap User Date: Sat, 3 Jan 2026 16:28:40 -0600 Subject: [PATCH] Add clone button for monsters in admin panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Clone copies all monster data with modified key/name - Auto-generates unique key suffix (_copy, _copy1, etc.) - Cloned monster is disabled by default for review 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- admin.html | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/admin.html b/admin.html index b1ab10f..ff2d09b 100644 --- a/admin.html +++ b/admin.html @@ -902,6 +902,7 @@ + @@ -962,6 +963,43 @@ document.getElementById('monsterModal').classList.add('active'); } + function cloneMonster(id) { + const monster = monsters.find(m => m.id === id); + if (!monster) return; + + // Generate unique key suffix + let suffix = '_copy'; + let newKey = monster.key + suffix; + let counter = 1; + while (monsters.some(m => m.key === newKey)) { + newKey = monster.key + suffix + counter; + counter++; + } + + document.getElementById('monsterModalTitle').textContent = 'Clone Monster'; + document.getElementById('monsterId').value = ''; // Empty = create new + document.getElementById('monsterName').value = monster.name + ' (Copy)'; + document.getElementById('monsterKey').value = newKey; + document.getElementById('monsterMinLevel').value = monster.min_level; + document.getElementById('monsterMaxLevel').value = monster.max_level; + document.getElementById('monsterHp').value = monster.base_hp; + document.getElementById('monsterAtk').value = monster.base_atk; + document.getElementById('monsterDef').value = monster.base_def; + document.getElementById('monsterXp').value = monster.base_xp; + document.getElementById('monsterWeight').value = monster.spawn_weight || 100; + document.getElementById('monsterEnabled').checked = false; // Disabled by default + + // Parse and copy dialogues + const dialogues = monster.dialogues ? JSON.parse(monster.dialogues) : {}; + document.getElementById('dialogueAnnoyed').value = (dialogues.annoyed || []).join('\n'); + document.getElementById('dialogueFrustrated').value = (dialogues.frustrated || []).join('\n'); + document.getElementById('dialogueDesperate').value = (dialogues.desperate || []).join('\n'); + document.getElementById('dialoguePhilosophical').value = (dialogues.philosophical || []).join('\n'); + document.getElementById('dialogueExistential').value = (dialogues.existential || []).join('\n'); + + document.getElementById('monsterModal').classList.add('active'); + } + document.getElementById('addMonsterBtn').addEventListener('click', () => { document.getElementById('monsterModalTitle').textContent = 'Add Monster'; document.getElementById('monsterForm').reset();