diff --git a/RootDesk/MyDesk/CombatMonster.codeblock b/RootDesk/MyDesk/CombatMonster.codeblock index 5417df0..1989060 100644 --- a/RootDesk/MyDesk/CombatMonster.codeblock +++ b/RootDesk/MyDesk/CombatMonster.codeblock @@ -64,4 +64,4 @@ "EntityEventHandlers": [] } } -} \ No newline at end of file +} diff --git a/tools/monster/gen-combat-monster.mjs b/tools/monster/gen-combat-monster.mjs index ecbbe4e..16b33dc 100644 --- a/tools/monster/gen-combat-monster.mjs +++ b/tools/monster/gen-combat-monster.mjs @@ -42,10 +42,10 @@ eventId = _TimerService:SetTimerRepeat(reg, 0.1)`), EntityEventHandlers: [], } }, }; - writeFileSync('RootDesk/MyDesk/CombatMonster.codeblock', JSON.stringify(cb, null, 2), 'utf8'); + writeFileSync('RootDesk/MyDesk/CombatMonster.codeblock', JSON.stringify(cb, null, 2) + '\n', 'utf8'); } -const isMonster = (e) => (e.componentNames || '').includes('script.Monster'); +const isMonster = (e) => typeof e.componentNames === 'string' && e.componentNames.includes('script.Monster'); function patchMap(nn) { const tag = String(nn).padStart(2, '0'); @@ -53,9 +53,13 @@ function patchMap(nn) { const map = JSON.parse(readFileSync(file, 'utf8')); let count = 0; for (const e of map.ContentProto.Entities.filter(isMonster)) { + const comps = e.jsonString && e.jsonString['@components']; + if (!Array.isArray(comps)) { + console.warn(`[gen-combat-monster] entity "${(e.jsonString && e.jsonString.name) || e.path}" has no @components — skipped`); + continue; + } const name = (e.jsonString && e.jsonString.name) || ''; const enemyId = NAME_TO_ENEMY[name] || DEFAULT_ENEMY; - const comps = e.jsonString['@components']; e.jsonString['@components'] = comps.filter((c) => c['@type'] !== 'script.CombatMonster'); e.jsonString['@components'].push({ '@type': 'script.CombatMonster', Enable: true, EnemyId: enemyId }); const names = (e.componentNames || '').split(',').filter((s) => s && s !== 'script.CombatMonster');