Browse Source

Add clone button for monsters in admin panel

- 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 <noreply@anthropic.com>
master
HikeMap User 1 month ago
parent
commit
49ec0b7f3c
  1. 38
      admin.html

38
admin.html

@ -902,6 +902,7 @@
</td> </td>
<td class="actions"> <td class="actions">
<button class="btn btn-secondary btn-small" onclick="editMonster('${m.id}')">Edit</button> <button class="btn btn-secondary btn-small" onclick="editMonster('${m.id}')">Edit</button>
<button class="btn btn-secondary btn-small" onclick="cloneMonster('${m.id}')">Clone</button>
<button class="btn btn-danger btn-small" onclick="deleteMonster('${m.id}')">Delete</button> <button class="btn btn-danger btn-small" onclick="deleteMonster('${m.id}')">Delete</button>
</td> </td>
</tr> </tr>
@ -962,6 +963,43 @@
document.getElementById('monsterModal').classList.add('active'); 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('addMonsterBtn').addEventListener('click', () => {
document.getElementById('monsterModalTitle').textContent = 'Add Monster'; document.getElementById('monsterModalTitle').textContent = 'Add Monster';
document.getElementById('monsterForm').reset(); document.getElementById('monsterForm').reset();

Loading…
Cancel
Save