diff --git a/assets/npc-art/abilities/attack.png b/assets/npc-art/abilities/attack.png new file mode 100644 index 0000000..a2b339a Binary files /dev/null and b/assets/npc-art/abilities/attack.png differ diff --git a/assets/npc-art/abilities/contagion.png b/assets/npc-art/abilities/contagion.png new file mode 100644 index 0000000..3c47ef7 Binary files /dev/null and b/assets/npc-art/abilities/contagion.png differ diff --git a/assets/npc-art/abilities/enemy.png b/assets/npc-art/abilities/enemy.png new file mode 100644 index 0000000..b989b47 Binary files /dev/null and b/assets/npc-art/abilities/enemy.png differ diff --git a/assets/npc-art/abilities/fast-reflexes.png b/assets/npc-art/abilities/fast-reflexes.png new file mode 100644 index 0000000..0055459 Binary files /dev/null and b/assets/npc-art/abilities/fast-reflexes.png differ diff --git a/assets/npc-art/abilities/hard-hitting.png b/assets/npc-art/abilities/hard-hitting.png new file mode 100644 index 0000000..5bb7b4c Binary files /dev/null and b/assets/npc-art/abilities/hard-hitting.png differ diff --git a/assets/npc-art/abilities/menacing.png b/assets/npc-art/abilities/menacing.png new file mode 100644 index 0000000..6094520 Binary files /dev/null and b/assets/npc-art/abilities/menacing.png differ diff --git a/assets/npc-art/abilities/psychosis.png b/assets/npc-art/abilities/psychosis.png new file mode 100644 index 0000000..9acb50a Binary files /dev/null and b/assets/npc-art/abilities/psychosis.png differ diff --git a/assets/npc-art/abilities/regeneration.png b/assets/npc-art/abilities/regeneration.png new file mode 100644 index 0000000..5cbeeaa Binary files /dev/null and b/assets/npc-art/abilities/regeneration.png differ diff --git a/assets/npc-art/armor/combat.png b/assets/npc-art/armor/combat.png new file mode 100644 index 0000000..151d457 Binary files /dev/null and b/assets/npc-art/armor/combat.png differ diff --git a/assets/npc-art/armor/exo.png b/assets/npc-art/armor/exo.png new file mode 100644 index 0000000..fb86703 Binary files /dev/null and b/assets/npc-art/armor/exo.png differ diff --git a/assets/npc-art/armor/heavy.png b/assets/npc-art/armor/heavy.png new file mode 100644 index 0000000..921b9cb Binary files /dev/null and b/assets/npc-art/armor/heavy.png differ diff --git a/assets/npc-art/armor/light.png b/assets/npc-art/armor/light.png new file mode 100644 index 0000000..7f38ef6 Binary files /dev/null and b/assets/npc-art/armor/light.png differ diff --git a/assets/npc-art/armor/medium.png b/assets/npc-art/armor/medium.png new file mode 100644 index 0000000..ed4007e Binary files /dev/null and b/assets/npc-art/armor/medium.png differ diff --git a/assets/npc-art/armor/street.png b/assets/npc-art/armor/street.png new file mode 100644 index 0000000..35ee14c Binary files /dev/null and b/assets/npc-art/armor/street.png differ diff --git a/assets/npc-art/portraits/carrion.png b/assets/npc-art/portraits/carrion.png new file mode 100644 index 0000000..c48da90 Binary files /dev/null and b/assets/npc-art/portraits/carrion.png differ diff --git a/assets/npc-art/portraits/enemy-generic.png b/assets/npc-art/portraits/enemy-generic.png new file mode 100644 index 0000000..b989b47 Binary files /dev/null and b/assets/npc-art/portraits/enemy-generic.png differ diff --git a/assets/npc-art/portraits/machine.png b/assets/npc-art/portraits/machine.png new file mode 100644 index 0000000..41746fd Binary files /dev/null and b/assets/npc-art/portraits/machine.png differ diff --git a/assets/npc-art/portraits/monstaret.png b/assets/npc-art/portraits/monstaret.png new file mode 100644 index 0000000..425b979 Binary files /dev/null and b/assets/npc-art/portraits/monstaret.png differ diff --git a/assets/npc-art/portraits/serialkiller.png b/assets/npc-art/portraits/serialkiller.png new file mode 100644 index 0000000..70cb6c4 Binary files /dev/null and b/assets/npc-art/portraits/serialkiller.png differ diff --git a/assets/npc-art/portraits/streetgang.png b/assets/npc-art/portraits/streetgang.png new file mode 100644 index 0000000..40257d1 Binary files /dev/null and b/assets/npc-art/portraits/streetgang.png differ diff --git a/assets/npc-art/weapons/baton.png b/assets/npc-art/weapons/baton.png new file mode 100644 index 0000000..4550e99 Binary files /dev/null and b/assets/npc-art/weapons/baton.png differ diff --git a/assets/npc-art/weapons/blade.png b/assets/npc-art/weapons/blade.png new file mode 100644 index 0000000..1e2ad10 Binary files /dev/null and b/assets/npc-art/weapons/blade.png differ diff --git a/assets/npc-art/weapons/chainsaw.png b/assets/npc-art/weapons/chainsaw.png new file mode 100644 index 0000000..a475ace Binary files /dev/null and b/assets/npc-art/weapons/chainsaw.png differ diff --git a/assets/npc-art/weapons/claws.png b/assets/npc-art/weapons/claws.png new file mode 100644 index 0000000..2066b51 Binary files /dev/null and b/assets/npc-art/weapons/claws.png differ diff --git a/assets/npc-art/weapons/club.png b/assets/npc-art/weapons/club.png new file mode 100644 index 0000000..4c1ce1a Binary files /dev/null and b/assets/npc-art/weapons/club.png differ diff --git a/assets/npc-art/weapons/combat-knife.png b/assets/npc-art/weapons/combat-knife.png new file mode 100644 index 0000000..07f8404 Binary files /dev/null and b/assets/npc-art/weapons/combat-knife.png differ diff --git a/assets/npc-art/weapons/hatchet.png b/assets/npc-art/weapons/hatchet.png new file mode 100644 index 0000000..73d97b6 Binary files /dev/null and b/assets/npc-art/weapons/hatchet.png differ diff --git a/assets/npc-art/weapons/heavy.png b/assets/npc-art/weapons/heavy.png new file mode 100644 index 0000000..1afaef9 Binary files /dev/null and b/assets/npc-art/weapons/heavy.png differ diff --git a/assets/npc-art/weapons/knife.png b/assets/npc-art/weapons/knife.png new file mode 100644 index 0000000..e58d164 Binary files /dev/null and b/assets/npc-art/weapons/knife.png differ diff --git a/assets/npc-art/weapons/machine-pistol.png b/assets/npc-art/weapons/machine-pistol.png new file mode 100644 index 0000000..43fab81 Binary files /dev/null and b/assets/npc-art/weapons/machine-pistol.png differ diff --git a/assets/npc-art/weapons/natural-weapon.png b/assets/npc-art/weapons/natural-weapon.png new file mode 100644 index 0000000..3daa78a Binary files /dev/null and b/assets/npc-art/weapons/natural-weapon.png differ diff --git a/assets/npc-art/weapons/pistol.png b/assets/npc-art/weapons/pistol.png new file mode 100644 index 0000000..c10de64 Binary files /dev/null and b/assets/npc-art/weapons/pistol.png differ diff --git a/assets/npc-art/weapons/rifle.png b/assets/npc-art/weapons/rifle.png new file mode 100644 index 0000000..6dc0a08 Binary files /dev/null and b/assets/npc-art/weapons/rifle.png differ diff --git a/assets/npc-art/weapons/sabre.png b/assets/npc-art/weapons/sabre.png new file mode 100644 index 0000000..e4d2824 Binary files /dev/null and b/assets/npc-art/weapons/sabre.png differ diff --git a/assets/npc-art/weapons/shotgun.png b/assets/npc-art/weapons/shotgun.png new file mode 100644 index 0000000..b40cba1 Binary files /dev/null and b/assets/npc-art/weapons/shotgun.png differ diff --git a/assets/npc-art/weapons/smg.png b/assets/npc-art/weapons/smg.png new file mode 100644 index 0000000..fb82fd3 Binary files /dev/null and b/assets/npc-art/weapons/smg.png differ diff --git a/assets/npc-art/weapons/sniper.png b/assets/npc-art/weapons/sniper.png new file mode 100644 index 0000000..b41de39 Binary files /dev/null and b/assets/npc-art/weapons/sniper.png differ diff --git a/system.json b/system.json index a3383bf..aa71130 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "zero-engine", "title": "Zero Engine (SLA Industries)", "description": "A basic game system for SLA Industries using the Zero Engine rules.", - "version": "1.5.6", + "version": "1.5.7", "compatibility": { "minimum": 13, "verified": "14.359" diff --git a/zero-engine.mjs b/zero-engine.mjs index 321620a..f55dec5 100644 --- a/zero-engine.mjs +++ b/zero-engine.mjs @@ -6118,66 +6118,94 @@ class SLAGroupNPCTool extends Application { }; } - // ── Icon helpers ───────────────────────────────────────────────────────── + // ── Icon helpers — SLA-specific art ───────────────────────────────────── + static _SLA = 'systems/zero-engine/assets/npc-art'; /** Portrait icon for the NPC actor based on type */ _getNPCIcon(typeKey) { + const p = SLAGroupNPCTool._SLA + '/portraits'; return { - streetgang: 'icons/svg/mystery-man.svg', - carrion: 'icons/svg/skull.svg', - serialkiller: 'icons/svg/skull.svg', - monstaret: 'icons/svg/hazard.svg', - machine: 'icons/svg/daze.svg', - }[typeKey] ?? 'icons/svg/mystery-man.svg'; + streetgang: `${p}/streetgang.png`, + carrion: `${p}/carrion.png`, + serialkiller: `${p}/serialkiller.png`, + monstaret: `${p}/monstaret.png`, + machine: `${p}/machine.png`, + }[typeKey] ?? `${p}/enemy-generic.png`; } - /** Choose weapon item icon based on name / range */ + /** Choose weapon item icon from SLA art */ _getWeaponIcon(weapon) { const n = (weapon.name || '').toLowerCase(); const r = (weapon.range || '').toLowerCase(); + const W = SLAGroupNPCTool._SLA + '/weapons'; // Natural - if (n.includes('bite') || n.includes('mandible') || n.includes('screech')) - return 'icons/skills/melee/unarmed-punch-fist.webp'; - if (n.includes('claw') || n.includes('rend') || n.includes('constrict') || n.includes('tentacle') || n.includes('grip') || n.includes('fist')) - return 'icons/skills/melee/unarmed-punch-fist.webp'; - if (n.includes('spit') || n.includes('acid')) + if (n.includes('bite') || n.includes('mandible') || n.includes('constrict') || n.includes('grip')) + return `${W}/natural-weapon.png`; + if (n.includes('claw') || n.includes('rend') || n.includes('tentacle') || n.includes('talon')) + return `${W}/claws.png`; + if (n.includes('spit') || n.includes('acid') || n.includes('screech') || n.includes('sonic')) return 'icons/svg/aura.svg'; // Ranged - if (n.includes('rifle') || n.includes('minigun') || n.includes('sniper')) - return 'icons/weapons/guns/rifle-bayonet.webp'; - if (n.includes('shotgun') || n.includes('blunderbuss')) - return 'icons/weapons/guns/gun-blunderbuss.webp'; - if (n.includes('pistol') || n.includes('smg') || n.includes('dart') || n.includes('crossbow')) - return 'icons/weapons/guns/gun-pistol-flintlock-metal.webp'; - if (n.includes('flamethrower') || n.includes('laser') || n.includes('taser') || n.includes('shock')) - return 'icons/weapons/guns/gun-pistol-flintlock-metal.webp'; - // Blunt melee - if (n.includes('pipe') || n.includes('bat') || n.includes('baton') || n.includes('chain') || n.includes('crowbar') || n.includes('knuckle') || n.includes('wrench') || n.includes('fist')) - return 'icons/weapons/clubs/club-simple-black.webp'; - // Sharp melee - if (n.includes('knife') || n.includes('blade') || n.includes('scalpel') || n.includes('stiletto') || n.includes('cleaver') || n.includes('machete') || n.includes('hatchet') || n.includes('axe') || n.includes('wire') || n.includes('saw')) - return 'icons/weapons/daggers/dagger-straight-sharp.webp'; + if (n.includes('sniper') || n.includes('marksman')) + return `${W}/sniper.png`; + if (n.includes('rifle') || n.includes('minigun') || n.includes('autocannon') || n.includes('lmg') || n.includes('flamethrower')) + return `${W}/rifle.png`; + if (n.includes('shotgun') || n.includes('street sweeper') || n.includes('sawn')) + return `${W}/shotgun.png`; + if (n.includes('smg') || n.includes('submachine')) + return `${W}/smg.png`; + if (n.includes('pistol') || n.includes('handgun') || n.includes('dart') || n.includes('taser') || n.includes('shock') || n.includes('laser')) + return `${W}/pistol.png`; + if (n.includes('crossbow')) + return `${W}/pistol.png`; + // Melee — blunt + if (n.includes('pipe') || n.includes('bat') || n.includes('baton') || n.includes('chain') || n.includes('crowbar') || n.includes('knuckle') || n.includes('wrench') || n.includes('hammer')) + return `${W}/baton.png`; + // Melee — cutting + if (n.includes('chainsaw') || n.includes('saw')) + return `${W}/chainsaw.png`; + if (n.includes('hatchet') || n.includes('axe') || n.includes('cleaver')) + return `${W}/hatchet.png`; + if (n.includes('machete') || n.includes('sabre') || n.includes('sword') || n.includes('blade') || n.includes('vibro')) + return `${W}/sabre.png`; + if (n.includes('wire') || n.includes('stiletto') || n.includes('scalpel') || n.includes('bone saw')) + return `${W}/combat-knife.png`; + if (n.includes('knife') || n.includes('dagger')) + return `${W}/knife.png`; + if (n.includes('fist') || n.includes('punch') || n.includes('slam')) + return `${W}/natural-weapon.png`; // Fallback by range - if (r && r !== 'engaged') return 'icons/weapons/guns/gun-pistol-flintlock-metal.webp'; - return 'icons/weapons/daggers/dagger-straight-sharp.webp'; + if (r && r !== 'engaged') return `${W}/pistol.png`; + return `${W}/knife.png`; } - /** Choose ability/specialty icon based on text */ + /** Choose ability/specialty icon — SLA trait art where possible */ _getAbilityIcon(text) { const t = (text || '').toLowerCase(); + const A = SLAGroupNPCTool._SLA + '/abilities'; if (t.includes('stealth') || t.includes('camouflage') || t.includes('hidden') || t.includes('ambush')) return 'icons/svg/cowled.svg'; - if (t.includes('acid') || t.includes('poison') || t.includes('contagion') || t.includes('venom')) - return 'icons/svg/aura.svg'; + if (t.includes('acid') || t.includes('contagion') || t.includes('venom') || t.includes('poison') || t.includes('dissolve')) + return `${A}/contagion.png`; if (t.includes('fire') || t.includes('burn') || t.includes('flame')) return 'icons/svg/fire.svg'; - if (t.includes('stun') || t.includes('emp') || t.includes('shock') || t.includes('electric')) + if (t.includes('stun') || t.includes('emp') || t.includes('shock') || t.includes('paralys')) return 'icons/svg/daze.svg'; - if (t.includes('bleed') || t.includes('rend') || t.includes('gore')) + if (t.includes('bleed') || t.includes('rend') || t.includes('gore') || t.includes('bite')) return 'icons/svg/blood.svg'; if (t.includes('heal') || t.includes('repair') || t.includes('recover') || t.includes('diagnos')) - return 'icons/svg/regen.svg'; - return 'icons/svg/lightning.svg'; + return `${A}/regeneration.png`; + if (t.includes('pack') || t.includes('swarm') || t.includes('gang') || t.includes('mob') || t.includes('flank')) + return `${A}/enemy.png`; + if (t.includes('frenzy') || t.includes('unstoppable') || t.includes('brutal') || t.includes('hard hit')) + return `${A}/hard-hitting.png`; + if (t.includes('fast') || t.includes('speed') || t.includes('sprint') || t.includes('leap') || t.includes('pounce')) + return `${A}/fast-reflexes.png`; + if (t.includes('intimidat') || t.includes('menac') || t.includes('fear') || t.includes('screech')) + return `${A}/menacing.png`; + if (t.includes('psycho') || t.includes('endurance') || t.includes('mindless') || t.includes('ignore')) + return `${A}/psychosis.png`; + return `${A}/attack.png`; } /** Find or create an Actor folder by name, optionally under a parent */ @@ -6558,12 +6586,14 @@ class SLAGroupNPCTool extends Application { // Armor item if (npc.armor > 0 && npc.armorDesc && npc.armorDesc !== 'None' && !npc.armorDesc.startsWith('Built-in')) { const armorName = npc.armorDesc.replace(/\s*\(ARM \d+\)/, '').trim() || 'Armour'; - const heavyArmor = npc.armor >= 3; + const ART = SLAGroupNPCTool._SLA + '/armor'; + const armorImg = npc.armor >= 5 ? `${ART}/exo.png` + : npc.armor >= 3 ? `${ART}/heavy.png` + : npc.armorDesc.toLowerCase().includes('street') ? `${ART}/street.png` + : `${ART}/light.png`; embeds.push({ name: armorName, type: 'armor', - img: heavyArmor - ? 'icons/equipment/chest/breastplate-banded-steel.webp' - : 'icons/equipment/chest/vest-simple-leather-brown.webp', + img: armorImg, system: { description: npc.armorDesc, armorDice: npc.armor, armorAuto: 0, armorRating: npc.armor, statMod: 0, skillMod: 0, statModTarget: '',