// ==UserScript==
// @name HeroesWM CP (Creature Portrait) Framework
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Classic & Custom Creature Portraits
// @author Penguin
// @include https://*.heroeswm.ru/home.php*
// @include https://*.heroeswm.ru/army.php*
// @include https://*.heroeswm.ru/leader_guild.php
// @include https://*.heroeswm.ru/leader_army.php*
// @include https://*.heroeswm.ru/leader_army_exchange.php*
// @include https://*.heroeswm.ru/pl_info.php*
// @include https://*.heroeswm.ru/war*
// @include https://*.heroeswm.ru/i/portraits/*
// @include https://*.heroeswm.ru/arts_for_monsters.php*
// @include https://*.lordswm.com/home.php*
// @include https://*.lordswm.com/army.php*
// @include https://*.lordswm.com/leader_guild.php
// @include https://*.lordswm.com/leader_army.php*
// @include https://*.lordswm.com/leader_army_exchange.php*
// @include https://*.lordswm.com/pl_info.php*
// @include https://*.lordswm.com/war*
// @include https://*.lordswm.com/i/portraits/*
// @include https://*.lordswm.com/arts_for_monsters.php*
// @exclude https://im.heroeswm.ru*
// @exclude https://im.lordswm.com*
// @exclude https://daily.heroeswm.ru*
// @exclude https://dcdn.heroeswm.ru/i/portraits/*
// @exclude https://dcdn1.heroeswm.ru/i/portraits/*
// @exclude https://dcdn2.heroeswm.ru/i/portraits/*
// @exclude https://dcdn3.heroeswm.ru/i/portraits/*
// @exclude https://www.heroeswm.ru/plstat
// @match https://www.heroeswm.ru/war.php*
// @match https://*.heroeswm.ru/war.php*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// ====================================
// CUSTOM THUMBNAIL/LOGO CONFIGURATION
// ====================================
// Edit the URL below to add your custom thumbnail/logo
const CUSTOM_THUMBNAIL_URL = 'https://dcdn.heroeswm.ru/photo-catalog/0001812/119-d3a40159.png';
// ====================================
// DUAL-RESOLUTION CREATURE CONFIGURATION
// ====================================
const CREATURE_REPLACEMENTS = {
// ========================================
// KNIGHT FACTION
// ========================================
angel: {
displayName: 'Angel',
variants: [
'angelanip60.png',
'angelanip40.png',
'angelani.png',
'angelanip33.png',
'angel_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/634-4f71fa65.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/635-a8ac2d9f.png'
},
archangel: {
displayName: 'Archangel',
variants: [
'archangelanip60.png',
'archangelanip40.png',
'archangelani.png',
'archangelanip33.png',
'archangel_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/636-2226c4c5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/637-a00e6755.png'
},
archer: {
displayName: 'Archer',
variants: [
'archeranip60.png',
'archeranip40.png',
'archerani.png',
'archeranip33.png',
'archer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/604-6e75ab3d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/605-2ac23de3.png'
},
battlegriffon: {
displayName: 'Battlegriffon',
variants: [
'battlegriffonanip60.png',
'battlegriffonanip40.png',
'battlegriffonani.png',
'battlegriffonanip33.png',
'battlegriffon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/620-5160b8b8.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/621-8d9afd45.png'
},
brute: {
displayName: 'Brute',
variants: [
'bruteanip60.png',
'bruteanip40.png',
'bruteani.png',
'bruteanip33.png',
'brute_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/602-f32c6ad3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/603-4467653b.png'
},
knight: {
displayName: 'Knight',
variants: [
'knightanip60.png',
'knightanip40.png',
'knightani.png',
'knightanip33.png',
'knight_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/628-509e6923.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/629-fcae23c9.png'
},
champion: {
displayName: 'Champion',
variants: [
'championanip60.png',
'championanip40.png',
'championani.png',
'championanip33.png',
'champion_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/632-c8e082f4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/633-57c4f4db.png'
},
conscript: {
displayName: 'Conscript',
variants: [
'conscriptanip60.png',
'conscriptanip40.png',
'conscriptani.png',
'conscriptanip33.png',
'conscript_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/600-d07445d0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/601-51745ca9.png'
},
crossbowman: {
displayName: 'Crossbowman',
variants: [
'crossbowmananip60.png',
'crossbowmananip40.png',
'crossbowmanani.png',
'crossbowmananip33.png',
'crossbowman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/608-6e03f257.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/609-dc8d21c3.png'
},
footman: {
displayName: 'Footman',
variants: [
'footmananip60.png',
'footmananip40.png',
'footmanani.png',
'footmananip33.png',
'footman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/610-8d6c4e46.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/611-85f8f5d2.png'
},
griffon: {
displayName: 'Griffon',
variants: [
'griffonanip60.png',
'griffonanip40.png',
'griffonani.png',
'griffonanip33.png',
'griffon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/616-6c247493.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/617-6c854933.png'
},
impergriffin: {
displayName: 'Impergriffin',
variants: [
'impergriffinanip60.png',
'impergriffinanip40.png',
'impergriffinani.png',
'impergriffinanip33.png',
'impergriffin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/618-022e6a84.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/619-aafa9776.png'
},
inquisitor: {
displayName: 'Inquisitor',
variants: [
'inquisitoranip60.png',
'inquisitoranip40.png',
'inquisitorani.png',
'inquisitoranip33.png',
'inquisitor_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/624-682fab4a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/625-711ddf04.png'
},
marksman: {
displayName: 'Marksman',
variants: [
'marksmananip60.png',
'marksmananip40.png',
'marksmanani.png',
'marksmananip33.png',
'marksman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/045-b78111cc.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/046-a09bc4ad.png'
},
paladin: {
displayName: 'Paladin',
variants: [
'paladinanip60.png',
'paladinanip40.png',
'paladinani.png',
'paladinanip33.png',
'paladin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/630-59e9136b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/631-de853c78.png'
},
paesant: {
displayName: 'Paesant',
variants: [
'paesantanip60.png',
'paesantanip40.png',
'paesantani.png',
'paesantanip33.png',
'paesant_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/597-f3a80446.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/598-b5efab44.png'
},
priest: {
displayName: 'Priest',
variants: [
'priestanip60.png',
'priestanip40.png',
'priestani.png',
'priestanip33.png',
'priest_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/622-34c02042.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/623-044c5831.png'
},
seraph2: {
displayName: 'Seraph2',
variants: [
'seraph2anip60.png',
'seraph2anip40.png',
'seraph2ani.png',
'seraph2anip33.png',
'seraph2_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/638-c3f98f52.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/639-d5493c17.png'
},
swordman: {
displayName: 'Swordman',
variants: [
'swordmananip60.png',
'swordmananip40.png',
'swordmanani.png',
'swordmananip33.png',
'swordman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/051-175ab4e1.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/052-1363e7f9.png'
},
vindicator: {
displayName: 'Vindicator',
variants: [
'vindicatoranip60.png',
'vindicatoranip40.png',
'vindicatorani.png',
'vindicatoranip33.png',
'vindicator_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/055-d78759c8.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/056-0ee937ab.png'
},
zealot: {
displayName: 'Zealot',
variants: [
'zealotanip60.png',
'zealotanip40.png',
'zealotani.png',
'zealotanip33.png',
'zealot_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/626-40961e31.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/627-533060d5.png'
},
// ========================================
// NECROMANCER FACTION
// ========================================
archlich: {
displayName: 'Archlich',
variants: [
'archlichanip60.png',
'archlichanip40.png',
'archlichani.png',
'archlichanip33.png',
'archlich_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/668-e4ef3632.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/669-9db16a37.png'
},
banshee: {
displayName: 'Banshee',
variants: [
'bansheeanip60.png',
'bansheeanip40.png',
'bansheeani.png',
'bansheeanip33.png',
'banshee_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/676-ae32c605.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/677-7a6899c2.png'
},
bonedragon: {
displayName: 'Bonedragon',
variants: [
'bonedragonanip60.png',
'bonedragonanip40.png',
'bonedragonani.png',
'bonedragonanip33.png',
'bonedragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/678-f174d292.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/679-e33baa8e.png'
},
ghost: {
displayName: 'Ghost',
variants: [
'ghostanip60.png',
'ghostanip40.png',
'ghostani.png',
'ghostanip33.png',
'ghost_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/654-74650baa.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/655-5290a4c1.png'
},
ghostdragon: {
displayName: 'Ghostdragon',
variants: [
'ghostdragonanip60.png',
'ghostdragonanip40.png',
'ghostdragonani.png',
'ghostdragonanip33.png',
'ghostdragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/092-57b1adca.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/094-9f7c14b3.png'
},
lich: {
displayName: 'Lich',
variants: [
'lichanip60.png',
'lichanip40.png',
'lichani.png',
'lichanip33.png',
'lich_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/666-020d59d5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/667-3c1b74ea.png'
},
masterlich: {
displayName: 'Masterlich',
variants: [
'masterlichanip60.png',
'masterlichanip40.png',
'masterlichani.png',
'masterlichanip33.png',
'masterlich_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/670-394eccf3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/671-89847587.png'
},
plaguezombie: {
displayName: 'Plaguezombie',
variants: [
'plaguezombieanip60.png',
'plaguezombieanip40.png',
'plaguezombieani.png',
'plaguezombieanip33.png',
'plaguezombie_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/650-6724e515.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/651-ab90a448.png'
},
poltergeist: {
displayName: 'Poltergeist',
variants: [
'poltergeistanip60.png',
'poltergeistanip40.png',
'poltergeistani.png',
'poltergeistanip33.png',
'poltergeist_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/658-0b77d92a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/659-720d0bc4.png'
},
rotzombie: {
displayName: 'Rotzombie',
variants: [
'rotzombieanip60.png',
'rotzombieanip40.png',
'rotzombieani.png',
'rotzombieanip33.png',
'rotzombie_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/652-a2374fc2.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/653-6dee41e1.png'
},
sceletonwar: {
displayName: 'Sceletonwar',
variants: [
'sceletonwaranip60.png',
'sceletonwaranip40.png',
'sceletonwarani.png',
'sceletonwaranip33.png',
'sceletonwar_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/646-859c92c8.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/647-ef0eef7f.png'
},
sceleton: {
displayName: 'Sceleton',
variants: [
'sceletonanip60.png',
'sceletonanip40.png',
'sceletonani.png',
'sceletonanip33.png',
'sceleton_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/642-11b72ce9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/643-f09279eb.png'
},
sceletonarcher: {
displayName: 'Sceletonarcher',
variants: [
'sceletonarcheranip60.png',
'sceletonarcheranip40.png',
'sceletonarcherani.png',
'sceletonarcheranip33.png',
'sceletonarcher_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/644-4a0d5ba2.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/645-f129674d.png'
},
spectraldragon: {
displayName: 'Spectraldragon',
variants: [
'spectraldragonanip60.png',
'spectraldragonanip40.png',
'spectraldragonani.png',
'spectraldragonanip33.png',
'spectraldragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/680-84e11a8d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/681-318e5f79.png'
},
spectre: {
displayName: 'Spectre',
variants: [
'spectreanip60.png',
'spectreanip40.png',
'spectreani.png',
'spectreanip33.png',
'spectre_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/656-e87252ae.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/657-dd5ce371.png'
},
vampire: {
displayName: 'Vampire',
variants: [
'vampireanip60.png',
'vampireanip40.png',
'vampireani.png',
'vampireanip33.png',
'vampire_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/660-80ef8344.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/661-0d51d1f2.png'
},
vampirelord: {
displayName: 'Vampirelord',
variants: [
'vampirelordanip60.png',
'vampirelordanip40.png',
'vampirelordani.png',
'vampirelordanip33.png',
'vampirelord_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/662-93c498ee.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/663-a44c6503.png'
},
vampireprince: {
displayName: 'Vampireprince',
variants: [
'vampireprinceanip60.png',
'vampireprinceanip40.png',
'vampireprinceani.png',
'vampireprinceanip33.png',
'vampireprince_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/664-e3cffb50.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/665-2e81601f.png'
},
wight: {
displayName: 'Wight',
variants: [
'wightanip60.png',
'wightanip40.png',
'wightani.png',
'wightanip33.png',
'wight_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/672-18a687bf.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/673-a1e890fa.png'
},
wraith: {
displayName: 'Wraith',
variants: [
'wraithanip60.png',
'wraithanip40.png',
'wraithani.png',
'wraithanip33.png',
'wraith_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/674-b7ccecc0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/675-97c20282.png'
},
zombie: {
displayName: 'Zombie',
variants: [
'zombieanip60.png',
'zombieanip40.png',
'zombieani.png',
'zombieanip33.png',
'zombie_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/648-36156b8c.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/649-d93fcd8b.png'
},
// ========================================
// MAGE FACTION
// ========================================
archmage: {
displayName: 'Archmage',
variants: [
'archmageanip60.png',
'archmageanip40.png',
'archmageani.png',
'archmageanip33.png',
'archmage_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/706-16b169dd.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/707-b2913a17.png'
},
battlemage: {
displayName: 'Battlemage',
variants: [
'battlemageanip60.png',
'battlemageanip40.png',
'battlemageani.png',
'battlemageanip33.png',
'battlemage_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/708-f6509be6.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/709-83b2b261.png'
},
colossus: {
displayName: 'Colossus',
variants: [
'colossusanip60.png',
'colossusanip40.png',
'colossusani.png',
'colossusanip33.png',
'colossus_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/723-86228ef3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/724-9a2e31d4.png'
},
djinn: {
displayName: 'Djinn',
variants: [
'djinnanip60.png',
'djinnanip40.png',
'djinnani.png',
'djinnanip33.png',
'djinn_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/710-8ec4d503.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/711-ae1063a8.png'
},
djinn_sultan: {
displayName: 'Djinn_Sultan',
variants: [
'djinn_sultananip60.png',
'djinn_sultananip40.png',
'djinn_sultanani.png',
'djinn_sultananip33.png',
'djinn_sultan_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/712-fb46a9ab.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/713-568351be.png'
},
djinn_vizier: {
displayName: 'Djinn_Vizier',
variants: [
'djinn_vizieranip60.png',
'djinn_vizieranip40.png',
'djinn_vizierani.png',
'djinn_vizieranip33.png',
'djinn_vizier_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/714-938561b1.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/715-67f08079.png'
},
elgargoly: {
displayName: 'Elgargoly',
variants: [
'elgargolyanip60.png',
'elgargolyanip40.png',
'elgargolyani.png',
'elgargolyanip33.png',
'elgargoly_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/696-fbc9a816.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/697-30555d33.png'
},
gremlin: {
displayName: 'Gremlin',
variants: [
'gremlinanip60.png',
'gremlinanip40.png',
'gremlinani.png',
'gremlinanip33.png',
'gremlin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/686-8bdb49ef.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/687-7e59b98d.png'
},
golem: {
displayName: 'Golem',
variants: [
'golemanip60.png',
'golemanip40.png',
'golemani.png',
'golemanip33.png',
'golem_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/698-97159ccd.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/699-debcac30.png'
},
mage: {
displayName: 'Mage',
variants: [
'mageanip60.png',
'mageanip40.png',
'mageani.png',
'mageanip33.png',
'mage_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/704-72ce6cd4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/705-0968b0af.png'
},
magneticgolem: {
displayName: 'Magneticgolem',
variants: [
'magneticgolemanip60.png',
'magneticgolemanip40.png',
'magneticgolemani.png',
'magneticgolemanip33.png',
'magneticgolem_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/702-ad96e844.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/703-f565efab.png'
},
mastergremlin: {
displayName: 'Mastergremlin',
variants: [
'mastergremlinanip60.png',
'mastergremlinanip40.png',
'mastergremlinani.png',
'mastergremlinanip33.png',
'mastergremlin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/688-970c9823.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/689-fb7f2637.png'
},
obsgargoly: {
displayName: 'Obsgargoly',
variants: [
'obsgargolyanip60.png',
'obsgargolyanip40.png',
'obsgargolyani.png',
'obsgargolyanip33.png',
'obsgargoly_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/694-fe497c72.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/695-26699c96.png'
},
rakshasa_kshatra: {
displayName: 'Rakshasa_Kshatra',
variants: [
'rakshasa_kshatraanip60.png',
'rakshasa_kshatraanip40.png',
'rakshasa_kshatraani.png',
'rakshasa_kshatraanip33.png',
'rakshasa_kshatra_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/721-a1da6a8f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/722-34f22ff5.png'
},
rakshasa_raja: {
displayName: 'Rakshasa_Raja',
variants: [
'rakshasa_rajaanip60.png',
'rakshasa_rajaanip40.png',
'rakshasa_rajaani.png',
'rakshasa_rajaanip33.png',
'rakshasa_raja_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/719-dc6df4e2.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/720-a553035b.png'
},
rakshas: {
displayName: 'Rakshas',
variants: [
'rakshasanip60.png',
'rakshasanip40.png',
'rakshasani.png',
'rakshasanip33.png',
'rakshas_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/717-f7510cc5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/718-3a111916.png'
},
saboteurgremlin: {
displayName: 'Saboteurgremlin',
variants: [
'saboteurgremlinanip60.png',
'saboteurgremlinanip40.png',
'saboteurgremlinani.png',
'saboteurgremlinanip33.png',
'saboteurgremlin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/690-d370e4c1.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/691-2ce9582e.png'
},
steelgolem: {
displayName: 'Steelgolem',
variants: [
'steelgolemanip60.png',
'steelgolemanip40.png',
'steelgolemani.png',
'steelgolemanip33.png',
'steelgolem_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/700-a3aac53f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/701-78c0fe78.png'
},
gargoly: {
displayName: 'Gargoly',
variants: [
'gargolyanip60.png',
'gargolyanip40.png',
'gargolyani.png',
'gargolyanip33.png',
'gargoly_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/692-5da2373e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/693-46641b46.png'
},
stormtitan: {
displayName: 'Stormtitan',
variants: [
'stormtitananip60.png',
'stormtitananip40.png',
'stormtitanani.png',
'stormtitananip33.png',
'stormtitan_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/727-009ce205.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/728-bf7b73de.png'
},
titan: {
displayName: 'Titan',
variants: [
'titananip60.png',
'titananip40.png',
'titanani.png',
'titananip33.png',
'titan_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/725-d6b5cf7f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/726-9a40ef60.png'
},
// ========================================
// ELF FACTION
// ========================================
ancienent: {
displayName: 'Ancienent',
variants: [
'ancienentanip60.png',
'ancienentanip40.png',
'ancienentani.png',
'ancienentanip33.png',
'ancienent_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/761-78d4f307.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/762-7adbdae5.png'
},
arcaneelf: {
displayName: 'Arcaneelf',
variants: [
'arcaneelfanip60.png',
'arcaneelfanip40.png',
'arcaneelfani.png',
'arcaneelfanip33.png',
'arcaneelf_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/745-8931a195.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/746-1f00d341.png'
},
crystaldragon: {
displayName: 'Crystaldragon',
variants: [
'crystaldragonanip60.png',
'crystaldragonanip40.png',
'crystaldragonani.png',
'crystaldragonanip33.png',
'crystaldragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/769-94859023.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/770-3cbf2236.png'
},
dancer: {
displayName: 'Dancer',
variants: [
'danceranip60.png',
'danceranip40.png',
'dancerani.png',
'danceranip33.png',
'dancer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/735-293a34ba.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/736-3c2c7907.png'
},
ddhigh: {
displayName: 'Ddhigh',
variants: [
'ddhighanip60.png',
'ddhighanip40.png',
'ddhighani.png',
'ddhighanip33.png',
'ddhigh_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/751-4f5084dd.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/752-7e42157d.png'
},
dd_: {
displayName: 'Dd_',
variants: [
'dd_anip60.png',
'dd_anip40.png',
'dd_ani.png',
'dd_anip33.png',
'dd__anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/747-be4a0038.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/748-6b239ed0.png'
},
ddeld: {
displayName: 'Ddeld',
variants: [
'ddeldanip60.png',
'ddeldanip40.png',
'ddeldani.png',
'ddeldanip33.png',
'ddeld_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/749-a6d91197.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/750-bc3aae1e.png'
},
dryad_: {
displayName: 'Dryad',
variants: [
'dryad_anip60.png',
'dryad_anip40.png',
'dryadani.png',
'dryadanip33.png',
'dryad_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/733-cad7630d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/734-ef925d74.png'
},
elf: {
displayName: 'Elf',
variants: [
'elfanip60.png',
'elfanip40.png',
'elfani.png',
'elfanip33.png',
'elf_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/741-75762868.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/742-ea5cf345.png'
},
emeralddragon: {
displayName: 'Emeralddragon',
variants: [
'emeralddragonanip60.png',
'emeralddragonanip40.png',
'emeralddragonani.png',
'emeralddragonanip33.png',
'emeralddragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/767-3508e344.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/768-8d08764c.png'
},
greendragon: {
displayName: 'Greendragon',
variants: [
'greendragonanip60.png',
'greendragonanip40.png',
'greendragonani.png',
'greendragonanip33.png',
'greendragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/765-b99e1fda.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/766-eb835f12.png'
},
hunterelf: {
displayName: 'Hunterelf',
variants: [
'hunterelfanip60.png',
'hunterelfanip40.png',
'hunterelfani.png',
'hunterelfanip33.png',
'hunterelf_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/743-aa21a9b4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/744-2aaf8fc1.png'
},
pp: {
displayName: 'Pp',
variants: [
'ppanip60.png',
'ppanip40.png',
'ppani.png',
'ppanip33.png',
'pp_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/729-e18079f2.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/730-bf04cafd.png'
},
pristineunicorn: {
displayName: 'Pristineunicorn',
variants: [
'pristineunicornanip60.png',
'pristineunicornanip40.png',
'pristineunicornani.png',
'pristineunicornanip33.png',
'pristineunicorn_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/757-78c2843d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/758-d07488f2.png'
},
savageent: {
displayName: 'Savageent',
variants: [
'savageentanip60.png',
'savageentanip40.png',
'savageentani.png',
'savageentanip33.png',
'savageent_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/763-d76fec81.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/764-bdfe2bca.png'
},
silverunicorn: {
displayName: 'Silverunicorn',
variants: [
'silverunicornanip60.png',
'silverunicornanip40.png',
'silverunicornani.png',
'silverunicornanip33.png',
'silverunicorn_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/755-5d0451e6.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/756-fe76a3db.png'
},
sprite: {
displayName: 'Sprite',
variants: [
'spriteanip60.png',
'spriteanip40.png',
'spriteani.png',
'spriteanip33.png',
'sprite_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/731-04bd3f9b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/732-ece0330b.png'
},
ent: {
displayName: 'Ent',
variants: [
'entanip60.png',
'entanip40.png',
'entani.png',
'entanip33.png',
'ent_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/759-f60823ac.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/760-5b5672b6.png'
},
unicorn: {
displayName: 'Unicorn',
variants: [
'unicornanip60.png',
'unicornanip40.png',
'unicornani.png',
'unicornanip33.png',
'unicorn_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/753-1acb13c1.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/754-e5771475.png'
},
bladedancer: {
displayName: 'Bladedancer',
variants: [
'bladedanceranip60.png',
'bladedanceranip40.png',
'bladedancerani.png',
'bladedanceranip33.png',
'bladedancer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/737-ddc53e0e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/738-1dfccff2.png'
},
winddancer: {
displayName: 'Winddancer',
variants: [
'winddanceranip60.png',
'winddanceranip40.png',
'winddancerani.png',
'winddanceranip33.png',
'winddancer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/739-87ea6e17.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/740-6d5cdb26.png'
},
// ========================================
// BARBARIAN FACTION
// ========================================
abehemoth: {
displayName: 'Abehemoth',
variants: [
'abehemothanip60.png',
'abehemothanip40.png',
'abehemothani.png',
'abehemothanip33.png',
'abehemoth_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/821-b267a530.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/822-a3134714.png'
},
behemoth: {
displayName: 'Behemoth',
variants: [
'behemothanip60.png',
'behemothanip40.png',
'behemothani.png',
'behemothanip33.png',
'behemoth_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/819-886e6ff0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/820-7ff87d26.png'
},
boarrider: {
displayName: 'Boarrider',
variants: [
'boarrideranip60.png',
'boarrideranip40.png',
'boarriderani.png',
'boarrideranip33.png',
'boarrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/783-91e8e084.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/784-6c93f657.png'
},
bbehemoth: {
displayName: 'Bbehemoth',
variants: [
'bbehemothanip60.png',
'bbehemothanip40.png',
'bbehemothani.png',
'bbehemothanip33.png',
'bbehemoth_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/825-3f61963a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/826-a3ff011f.png'
},
cyclop: {
displayName: 'Cyclop',
variants: [
'cyclopanip60.png',
'cyclopanip40.png',
'cyclopani.png',
'cyclopanip33.png',
'cyclop_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/811-e2d6c932.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/812-8872a384.png'
},
cyclopking: {
displayName: 'Cyclopking',
variants: [
'cyclopkinganip60.png',
'cyclopkinganip40.png',
'cyclopkingani.png',
'cyclopkinganip33.png',
'cyclopking_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/813-2555af32.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/814-b3d67a11.png'
},
cyclopod: {
displayName: 'Cyclopod',
variants: [
'cyclopod_anip60.png',
'cyclopod_anip40.png',
'cyclopodani.png',
'cyclopodanip33.png',
'cyclopod_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/815-605b2d54.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/816-56b12307.png'
},
darkbird: {
displayName: 'Darkbird',
variants: [
'darkbirdanip60.png',
'darkbirdanip40.png',
'darkbirdani.png',
'darkbirdanip33.png',
'darkbird_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/809-ebc068eb.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/810-dd66f37a.png'
},
dbehemoth: {
displayName: 'Dbehemoth',
variants: [
'dbehemothanip60.png',
'dbehemothanip40.png',
'dbehemothani.png',
'dbehemothanip33.png',
'dbehemoth_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/823-00570b79.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/824-0f02ffb3.png'
},
firebird: {
displayName: 'Firebird',
variants: [
'firebird_anip60.png',
'firebird_anip40.png',
'firebirdani.png',
'firebirdanip33.png',
'firebird_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/807-fbc83c71.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/808-072b2e02.png'
},
goblin: {
displayName: 'Goblin',
variants: [
'goblinanip60.png',
'goblinanip40.png',
'goblinani.png',
'goblinanip33.png',
'goblin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/771-51300fe4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/772-60700eb6.png'
},
goblinarcher: {
displayName: 'Goblinarcher',
variants: [
'goblinarcheranip60.png',
'goblinarcheranip40.png',
'goblinarcherani.png',
'goblinarcheranip33.png',
'goblinarcher_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/775-5b832008.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/776-3ca1867b.png'
},
goblinmag: {
displayName: 'Goblinmag',
variants: [
'goblinmaganip60.png',
'goblinmaganip40.png',
'goblinmagani.png',
'goblinmaganip33.png',
'goblinmag_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/777-100b032d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/778-5b63af8c.png'
},
hobgoblin: {
displayName: 'Hobgoblin',
variants: [
'hobgoblinanip60.png',
'hobgoblinanip40.png',
'hobgoblinani.png',
'hobgoblinanip33.png',
'hobgoblin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/773-f274acd9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/774-eb723ca0.png'
},
hyenarider: {
displayName: 'Hyenarider',
variants: [
'hyenarideranip60.png',
'hyenarideranip40.png',
'hyenariderani.png',
'hyenarideranip33.png',
'hyenarider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/785-f7d6ecc6.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/786-13046839.png'
},
ogre: {
displayName: 'Ogre',
variants: [
'ogreanip60.png',
'ogreanip40.png',
'ogreani.png',
'ogreanip33.png',
'ogre_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/795-7883ad65.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/796-a6e85428.png'
},
ogrebrutal: {
displayName: 'Ogrebrutal',
variants: [
'ogrebrutalanip60.png',
'ogrebrutalanip40.png',
'ogrebrutalani.png',
'ogrebrutalanip33.png',
'ogrebrutal_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/799-6ddae67e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/800-39c59dc3.png'
},
ogremagi: {
displayName: 'Ogremagi',
variants: [
'ogremagianip60.png',
'ogremagianip40.png',
'ogremagiani.png',
'ogremagianip33.png',
'ogremagi_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/797-15bb8934.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/798-95a96620.png'
},
ogreshaman: {
displayName: 'Ogreshaman',
variants: [
'ogreshamananip60.png',
'ogreshamananip40.png',
'ogreshamanani.png',
'ogreshamananip33.png',
'ogreshaman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/801-7974dbb5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/802-b1e32a90.png'
},
orc: {
displayName: 'Orc',
variants: [
'orcanip60.png',
'orcanip40.png',
'orcani.png',
'orcanip33.png',
'orc_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/787-251e1beb.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/788-ade12fe1.png'
},
orcchief: {
displayName: 'Orcchief',
variants: [
'orcchiefanip60.png',
'orcchiefanip40.png',
'orcchiefani.png',
'orcchiefanip33.png',
'orcchief_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/789-35544bd0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/790-858796ea.png'
},
orcrubak: {
displayName: 'Orcrubak',
variants: [
'orcrubakanip60.png',
'orcrubakanip40.png',
'orcrubakani.png',
'orcrubakanip33.png',
'orcrubak_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/791-b8128fe3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/792-cd724ac5.png'
},
orcshaman: {
displayName: 'Orcshaman',
variants: [
'orcshamananip60.png',
'orcshamananip40.png',
'orcshamanani.png',
'orcshamananip33.png',
'orcshaman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/793-c7eb23a9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/794-0ed01ad4.png'
},
roc: {
displayName: 'Roc',
variants: [
'rocanip60.png',
'rocanip40.png',
'rocani.png',
'rocanip33.png',
'roc_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/803-7c4c8571.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/804-f0b70a5b.png'
},
cyclopshaman: {
displayName: 'Cyclopshaman',
variants: [
'cyclopshamananip60.png',
'cyclopshamananip40.png',
'cyclopshamanani.png',
'cyclopshamananip33.png',
'cyclopshaman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/817-23634c03.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/818-b61d0cbe.png'
},
thunderbird: {
displayName: 'Thunderbird',
variants: [
'thunderbirdanip60.png',
'thunderbirdanip40.png',
'thunderbirdani.png',
'thunderbirdanip33.png',
'thunderbird_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/805-ede48ff0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/806-973ea442.png'
},
hobwolfrider: {
displayName: 'Hobwolfrider',
variants: [
'hobwolfrideranip60.png',
'hobwolfrideranip40.png',
'hobwolfriderani.png',
'hobwolfrideranip33.png',
'hobwolfrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/781-9dd512f5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/782-2d33fa21.png'
},
wolfrider: {
displayName: 'Wolfrider',
variants: [
'wolfrideranip60.png',
'wolfrideranip40.png',
'wolfriderani.png',
'wolfrideranip33.png',
'wolfrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/779-0f90f12a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/780-c23df826.png'
},
// ========================================
// DARK ELF FACTION
// ========================================
assasin: {
displayName: 'Assasin',
variants: [
'assasinanip60.png',
'assasinanip40.png',
'assasinani.png',
'assasinanip33.png',
'assasin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/829-5c53be90.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/830-f7e94c6e.png'
},
blackdragon: {
displayName: 'Blackdragon',
variants: [
'blackdragonanip60.png',
'blackdragonanip40.png',
'blackdragonani.png',
'blackdragonanip33.png',
'blackdragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/865-3488a055.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/866-7a7efc24.png'
},
bloodsister: {
displayName: 'Bloodsister',
variants: [
'bloodsisteranip60.png',
'bloodsisteranip40.png',
'bloodsisterani.png',
'bloodsisteranip33.png',
'bloodsister_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/837-85f5a5c4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/838-302b3d5e.png'
},
briskrider: {
displayName: 'Briskrider',
variants: [
'briskrideranip60.png',
'briskrideranip40.png',
'briskriderani.png',
'briskrideranip33.png',
'briskrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/849-94a391e4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/850-87e852fb.png'
},
deephydra: {
displayName: 'Deephydra',
variants: [
'deephydraanip60.png',
'deephydraanip40.png',
'deephydraani.png',
'deephydraanip33.png',
'deephydra_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/853-e8e95647.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/854-4210688d.png'
},
foulhydra: {
displayName: 'Foulhydra',
variants: [
'foulhydraanip60.png',
'foulhydraanip40.png',
'foulhydraani.png',
'foulhydraanip33.png',
'foulhydra_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/855-710819d7.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/856-c7449bc9.png'
},
fury: {
displayName: 'Fury',
variants: [
'furyanip60.png',
'furyanip40.png',
'furyani.png',
'furyanip33.png',
'fury_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/835-f8e7565e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/836-947ab84a.png'
},
grimrider: {
displayName: 'Grimrider',
variants: [
'grimrideranip60.png',
'grimrideranip40.png',
'grimriderani.png',
'grimrideranip33.png',
'grimrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/847-2fd3337a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/848-97243a8a.png'
},
hydra: {
displayName: 'Hydra',
variants: [
'hydraanip60.png',
'hydraanip40.png',
'hydraani.png',
'hydraanip33.png',
'hydra_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/851-322c6416.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/852-33fb9120.png'
},
lizardrider: {
displayName: 'Lizardrider',
variants: [
'lizardrideranip60.png',
'lizardrideranip40.png',
'lizardriderani.png',
'lizardrideranip33.png',
'lizardrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/845-45f57b70.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/846-a1b763ef.png'
},
maiden: {
displayName: 'Maiden',
variants: [
'maidenanip60.png',
'maidenanip40.png',
'maidenani.png',
'maidenanip33.png',
'maiden_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/833-a03d4bac.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/834-7fa5d0b0.png'
},
matriarch: {
displayName: 'Matriarch',
variants: [
'matriarchanip60.png',
'matriarchanip40.png',
'matriarchani.png',
'matriarchanip33.png',
'matriarch_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/859-100bff85.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/860-59ff5150.png'
},
minotaur: {
displayName: 'Minotaur',
variants: [
'minotauranip60.png',
'minotauranip40.png',
'minotaurani.png',
'minotauranip33.png',
'minotaur_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/839-3fa24007.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/840-7dfb1cb1.png'
},
minotaurguard_: {
displayName: 'Minotaurguard_',
variants: [
'minotaurguard_anip60.png',
'minotaurguard_anip40.png',
'minotaurguard_ani.png',
'minotaurguard_anip33.png',
'minotaurguard__anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/841-dfe4708b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/842-844b0755.png'
},
mistress: {
displayName: 'Mistress',
variants: [
'mistressanip60.png',
'mistressanip40.png',
'mistressani.png',
'mistressanip33.png',
'mistress_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/861-197c270e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/862-663295f8.png'
},
reddragon: {
displayName: 'Reddragon',
variants: [
'reddragonanip60.png',
'reddragonanip40.png',
'reddragonani.png',
'reddragonanip33.png',
'reddragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/867-51d59c91.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/868-dd3bd853.png'
},
scout: {
displayName: 'Scout',
variants: [
'scoutanip60.png',
'scoutanip40.png',
'scoutani.png',
'scoutanip33.png',
'scout_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/827-3c231ec8.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/828-9488f41e.png'
},
shadowdragon: {
displayName: 'Shadowdragon',
variants: [
'shadowdragonanip60.png',
'shadowdragonanip40.png',
'shadowdragonani.png',
'shadowdragonanip33.png',
'shadowdragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/863-50da9a84.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/864-ade5d3f7.png'
},
stalker: {
displayName: 'Stalker',
variants: [
'stalkeranip60.png',
'stalkeranip40.png',
'stalkerani.png',
'stalkeranip33.png',
'stalker_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/831-062b3b6b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/832-e2d77c23.png'
},
taskmaster: {
displayName: 'Taskmaster',
variants: [
'taskmasteranip60.png',
'taskmasteranip40.png',
'taskmasterani.png',
'taskmasteranip33.png',
'taskmaster_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/843-73796ef3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/844-df543c78.png'
},
witch: {
displayName: 'Witch',
variants: [
'witchanip60.png',
'witchanip40.png',
'witchani.png',
'witchanip33.png',
'witch_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/857-4fb6091b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/858-123635e0.png'
},
// ========================================
// DEMON FACTION
// ========================================
archdemon: {
displayName: 'Archdemon',
variants: [
'archdemonanip60.png',
'archdemonanip40.png',
'archdemonani.png',
'archdemonanip33.png',
'archdemon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/909-739bfdd4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/910-0a1dce0a.png'
},
archdevil: {
displayName: 'Archdevil',
variants: [
'archdevilanip60.png',
'archdevilanip40.png',
'archdevilani.png',
'archdevilanip33.png',
'archdevil_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/907-efec7e39.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/908-1f25ce43.png'
},
cerberus: {
displayName: 'Cerberus',
variants: [
'cerberusanip60.png',
'cerberusanip40.png',
'cerberusani.png',
'cerberusanip33.png',
'cerberus_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/883-6e313eb0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/884-ac6ee6ad.png'
},
demondog: {
displayName: 'Demondog',
variants: [
'demondoganip60.png',
'demondoganip40.png',
'demondogani.png',
'demondoganip33.png',
'demondog_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/881-7d6e4f9c.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/882-145c2250.png'
},
devil: {
displayName: 'Devil',
variants: [
'devilanip60.png',
'devilanip40.png',
'devilani.png',
'devilanip33.png',
'devil_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/905-6f0d1552.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/906-865b986b.png'
},
familiar: {
displayName: 'Familiar',
variants: [
'familiaranip60.png',
'familiaranip40.png',
'familiarani.png',
'familiaranip33.png',
'familiar_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/871-e1e8959a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/872-c55de761.png'
},
fdemon: {
displayName: 'Fdemon',
variants: [
'fdemonanip60.png',
'fdemonanip40.png',
'fdemonani.png',
'fdemonanip33.png',
'fdemon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/877-0636c52d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/878-f9a3b9d8.png'
},
firehound: {
displayName: 'Firehound',
variants: [
'firehoundanip60.png',
'firehoundanip40.png',
'firehoundani.png',
'firehoundanip33.png',
'firehound_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/885-d88a1d97.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/886-6bcce93f.png'
},
hdemon: {
displayName: 'Hdemon',
variants: [
'hdemonanip60.png',
'hdemonanip40.png',
'hdemonani.png',
'hdemonanip33.png',
'hdemon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/875-463f0439.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/876-8648d285.png'
},
hellstallion: {
displayName: 'Hellstallion',
variants: [
'hellstallionanip60.png',
'hellstallionanip40.png',
'hellstallionani.png',
'hellstallionanip33.png',
'hellstallion_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/897-323387e0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/898-b6693292.png'
},
imp: {
displayName: 'Imp',
variants: [
'impanip60.png',
'impanip40.png',
'impani.png',
'impanip33.png',
'imp_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/869-039472ad.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/870-4cee0362.png'
},
jdemon: {
displayName: 'Jdemon',
variants: [
'jdemonanip60.png',
'jdemonanip40.png',
'jdemonani.png',
'jdemonanip33.png',
'jdemon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/879-15df8ebd.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/880-9a8ed6b0.png'
},
nightmare: {
displayName: 'Nightmare',
variants: [
'nightmareanip60.png',
'nightmareanip40.png',
'nightmareani.png',
'nightmareanip33.png',
'nightmare_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/893-103cbb60.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/894-2f2302af.png'
},
pitfiend_: {
displayName: 'Pitfiend_',
variants: [
'pitfiend_anip60.png',
'pitfiend_anip40.png',
'pitfiend_ani.png',
'pitfiend_anip33.png',
'pitfiend__anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/899-06f47795.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/900-eeb2ff94.png'
},
pitlord_: {
displayName: 'Pitlord_',
variants: [
'pitlord_anip60.png',
'pitlord_anip40.png',
'pitlord_ani.png',
'pitlord_anip33.png',
'pitlord__anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/901-55ae80cb.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/902-a3e60bd0.png'
},
pitspawn: {
displayName: 'Pitspawn',
variants: [
'pitspawnanip60.png',
'pitspawnanip40.png',
'pitspawnani.png',
'pitspawnanip33.png',
'pitspawn_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/903-109de70c.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/904-c29335d8.png'
},
seducer: {
displayName: 'Seducer',
variants: [
'seduceranip60.png',
'seduceranip40.png',
'seducerani.png',
'seduceranip33.png',
'seducer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/891-9a67c151.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/892-8b2cbe3d.png'
},
stallion: {
displayName: 'Stallion',
variants: [
'stallionanip60.png',
'stallionanip40.png',
'stallionani.png',
'stallionanip33.png',
'stallion_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/895-21c78aab.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/896-ecb7021f.png'
},
succub: {
displayName: 'Succub',
variants: [
'succubanip60.png',
'succubanip40.png',
'succubani.png',
'succubanip33.png',
'succub_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/887-52e9f4c3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/888-52afdf13.png'
},
succubusm: {
displayName: 'Succubusm',
variants: [
'succubusmanip60.png',
'succubusmanip40.png',
'succubusmani.png',
'succubusmanip33.png',
'succubusm_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/889-4fb630ed.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/890-c38c5672.png'
},
vermin: {
displayName: 'Vermin',
variants: [
'verminanip60.png',
'verminanip40.png',
'verminani.png',
'verminanip33.png',
'vermin_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/873-987f1ff0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/874-bca0f2e5.png'
},
// ========================================
// DWARF FACTION
// ========================================
battlerager: {
displayName: 'Battlerager',
variants: [
'battlerageranip60.png',
'battlerageranip40.png',
'battleragerani.png',
'battlerageranip33.png',
'battlerager_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/933-f55b1e50.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/934-21b10703.png'
},
bearrider: {
displayName: 'Bearrider',
variants: [
'bearrideranip60.png',
'bearrideranip40.png',
'bearriderani.png',
'bearrideranip33.png',
'bearrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/923-6b9c598b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/924-734b5475.png'
},
berserker: {
displayName: 'Berserker',
variants: [
'berserkeranip60.png',
'berserkeranip40.png',
'berserkerani.png',
'berserkeranip33.png',
'berserker_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/931-1aa3ccfb.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/932-eaba2471.png'
},
blackbearrider: {
displayName: 'Blackbearrider',
variants: [
'blackbearrideranip60.png',
'blackbearrideranip40.png',
'blackbearriderani.png',
'blackbearrideranip33.png',
'blackbearrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/925-3a203bf9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/926-dbe4ab26.png'
},
brawler: {
displayName: 'Brawler',
variants: [
'brawleranip60.png',
'brawleranip40.png',
'brawlerani.png',
'brawleranip33.png',
'brawler_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/929-93ca6d30.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/930-8c68a701.png'
},
defender: {
displayName: 'Defender',
variants: [
'defenderanip60.png',
'defenderanip40.png',
'defenderani.png',
'defenderanip33.png',
'defender_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/911-bbbe2a17.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/912-51d9a034.png'
},
firedragon: {
displayName: 'Firedragon',
variants: [
'firedragonanip60.png',
'firedragonanip40.png',
'firedragonani.png',
'firedragonanip33.png',
'firedragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/947-457ed821.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/948-3a45b6c5.png'
},
flamelord: {
displayName: 'Flamelord',
variants: [
'flamelordanip60.png',
'flamelordanip40.png',
'flamelordani.png',
'flamelordanip33.png',
'flamelord_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/945-e99c61d5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/946-76e1a40f.png'
},
harpooner: {
displayName: 'Harpooner',
variants: [
'harpooneranip60.png',
'harpooneranip40.png',
'harpoonerani.png',
'harpooneranip33.png',
'harpooner_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/921-7cee6e27.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/922-f0a78b48.png'
},
lavadragon: {
displayName: 'Lavadragon',
variants: [
'lavadragonanip60.png',
'lavadragonanip40.png',
'lavadragonani.png',
'lavadragonanip33.png',
'lavadragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/951-85199672.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/952-b99ecb7a.png'
},
magmadragon: {
displayName: 'Magmadragon',
variants: [
'magmadragonanip60.png',
'magmadragonanip40.png',
'magmadragonani.png',
'magmadragonanip33.png',
'magmadragon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/949-3f8fed7a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/950-90e107ee.png'
},
mountaingr: {
displayName: 'Mountaingr',
variants: [
'mountaingranip60.png',
'mountaingranip40.png',
'mountaingrani.png',
'mountaingranip33.png',
'mountaingr_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/915-65a26110.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/916-543d58a9.png'
},
runekeeper: {
displayName: 'Runekeeper',
variants: [
'runekeeperanip60.png',
'runekeeperanip40.png',
'runekeeperani.png',
'runekeeperanip33.png',
'runekeeper_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/939-64ce4739.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/940-3f0ef397.png'
},
runepatriarch: {
displayName: 'Runepatriarch',
variants: [
'runepatriarchanip60.png',
'runepatriarchanip40.png',
'runepatriarchani.png',
'runepatriarchanip33.png',
'runepatriarch_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/937-3fd1a40b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/938-2f87934b.png'
},
runepriest: {
displayName: 'Runepriest',
variants: [
'runepriestanip60.png',
'runepriestanip40.png',
'runepriestani.png',
'runepriestanip33.png',
'runepriest_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/935-c19387cd.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/936-c1337c3d.png'
},
shieldguard: {
displayName: 'Shieldguard',
variants: [
'shieldguardanip60.png',
'shieldguardanip40.png',
'shieldguardani.png',
'shieldguardanip33.png',
'shieldguard_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/913-aaa24ffe.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/914-68100d1f.png'
},
skirmesher: {
displayName: 'Skirmesher',
variants: [
'skirmesheranip60.png',
'skirmesheranip40.png',
'skirmesherani.png',
'skirmesheranip33.png',
'skirmesher_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/919-d21a362c.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/920-25d2bd91.png'
},
spearwielder: {
displayName: 'Spearwielder',
variants: [
'spearwielderanip60.png',
'spearwielderanip40.png',
'spearwielderani.png',
'spearwielderanip33.png',
'spearwielder_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/917-fe947dd4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/918-7dfe6050.png'
},
thane: {
displayName: 'Thane',
variants: [
'thaneanip60.png',
'thaneanip40.png',
'thaneani.png',
'thaneanip33.png',
'thane_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/941-1f18b2c6.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/942-f90b7bf3.png'
},
thunderlord: {
displayName: 'Thunderlord',
variants: [
'thunderlordanip60.png',
'thunderlordanip40.png',
'thunderlordani.png',
'thunderlordanip33.png',
'thunderlord_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/943-9132d83d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/944-77882540.png'
},
whitebearrider: {
displayName: 'Whitebearrider',
variants: [
'whitebearrideranip60.png',
'whitebearrideranip40.png',
'whitebearriderani.png',
'whitebearrideranip33.png',
'whitebearrider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/927-40d6966d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/928-96822979.png'
},
// ========================================
// TRIBAL FACTION
// ========================================
bloodeyecyc: {
displayName: 'Bloodeyecyc',
variants: [
'bloodeyecycanip60.png',
'bloodeyecycanip40.png',
'bloodeyecycani.png',
'bloodeyecycanip33.png',
'bloodeyecyc_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/993-ba1c7619.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/994-80d22f21.png'
},
chieftain: {
displayName: 'Chieftain',
variants: [
'chieftainanip60.png',
'chieftainanip40.png',
'chieftainani.png',
'chieftainanip33.png',
'chieftain_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/981-b394bbd9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/982-202e7e74.png'
},
cyclopus: {
displayName: 'Cyclopus',
variants: [
'cyclopusanip60.png',
'cyclopusanip40.png',
'cyclopusani.png',
'cyclopusanip33.png',
'cyclopus_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/989-a0881809.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/990-d73f092c.png'
},
eadaughter: {
displayName: 'Eadaughter',
variants: [
'eadaughteranip60.png',
'eadaughteranip40.png',
'eadaughterani.png',
'eadaughteranip33.png',
'eadaughter_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/975-67421326.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/976-f1cc4888.png'
},
executioner: {
displayName: 'Executioner',
variants: [
'executioneranip60.png',
'executioneranip40.png',
'executionerani.png',
'executioneranip33.png',
'executioner_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/979-cb9617f7.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/980-f863f104.png'
},
fcentaur: {
displayName: 'Fcentaur',
variants: [
'fcentauranip60.png',
'fcentauranip40.png',
'fcentaurani.png',
'fcentauranip33.png',
'fcentaur_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/959-de68b7ca.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/960-2ad2338a.png'
},
foulwyvern: {
displayName: 'Foulwyvern',
variants: [
'foulwyvernanip60.png',
'foulwyvernanip40.png',
'foulwyvernani.png',
'foulwyvernanip33.png',
'foulwyvern_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/985-f382d1c0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/986-7cc54ed2.png'
},
goblinus: {
displayName: 'Goblinus',
variants: [
'goblinusanip60.png',
'goblinusanip40.png',
'goblinusani.png',
'goblinusanip33.png',
'goblinus_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/953-a486b4e4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/954-cc24897a.png'
},
mauler: {
displayName: 'Mauler',
variants: [
'mauleranip60.png',
'mauleranip40.png',
'maulerani.png',
'mauleranip33.png',
'mauler_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/967-9963b95e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/968-da16c4f8.png'
},
mcentaur: {
displayName: 'Mcentaur',
variants: [
'mcentauranip60.png',
'mcentauranip40.png',
'mcentaurani.png',
'mcentauranip33.png',
'mcentaur_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/963-39c8566f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/964-72e694a6.png'
},
ncentaur: {
displayName: 'Ncentaur',
variants: [
'ncentauranip60.png',
'ncentauranip40.png',
'ncentaurani.png',
'ncentauranip33.png',
'ncentaur_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/961-1755543b.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/962-3bd3a671.png'
},
paokai: {
displayName: 'Paokai',
variants: [
'paokaianip60.png',
'paokaianip40.png',
'paokaiani.png',
'paokaianip33.png',
'paokai_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/987-e3278e5a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/988-ad89a7b3.png'
},
sdaughter: {
displayName: 'Sdaughter',
variants: [
'sdaughteranip60.png',
'sdaughteranip40.png',
'sdaughterani.png',
'sdaughteranip33.png',
'sdaughter_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/973-255ad13f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/974-c42e4719.png'
},
shamaness: {
displayName: 'Shamaness',
variants: [
'shamanessanip60.png',
'shamanessanip40.png',
'shamanessani.png',
'shamanessanip33.png',
'shamaness_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/971-549a3da4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/972-094e19fc.png'
},
slayer: {
displayName: 'Slayer',
variants: [
'slayeranip60.png',
'slayeranip40.png',
'slayerani.png',
'slayeranip33.png',
'slayer_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/977-980ee63d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/978-fadcc3b4.png'
},
trapper: {
displayName: 'Trapper',
variants: [
'trapperanip60.png',
'trapperanip40.png',
'trapperani.png',
'trapperanip33.png',
'trapper_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/955-3f392dbf.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/956-d3d67582.png'
},
untamedcyc: {
displayName: 'Untamedcyc',
variants: [
'untamedcycanip60.png',
'untamedcycanip40.png',
'untamedcycani.png',
'untamedcycanip33.png',
'untamedcyc_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/991-4fe89677.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/992-94785a83.png'
},
warmong: {
displayName: 'Warmong',
variants: [
'warmonganip60.png',
'warmonganip40.png',
'warmongani.png',
'warmonganip33.png',
'warmong_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/969-b330889d.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/970-a6263a53.png'
},
warrior: {
displayName: 'Warrior',
variants: [
'warrioranip60.png',
'warrioranip40.png',
'warriorani.png',
'warrioranip33.png',
'warrior_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/965-f2e0c664.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/966-19def9bb.png'
},
witchdoctor: {
displayName: 'Witchdoctor',
variants: [
'witchdoctoranip60.png',
'witchdoctoranip40.png',
'witchdoctorani.png',
'witchdoctoranip33.png',
'witchdoctor_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/957-67707dcc.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/958-9c89cd26.png'
},
wyvern: {
displayName: 'Wyvern',
variants: [
'wyvernanip60.png',
'wyvernanip40.png',
'wyvernani.png',
'wyvernanip33.png',
'wyvern_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/983-d2df7390.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/984-f18fdc88.png'
},
// ========================================
// PHARAOH FACTION
// ========================================
anubis: {
displayName: 'Anubis',
variants: [
'anubisanip60.png',
'anubisanip40.png',
'anubisani.png',
'anubisanip33.png',
'anubis_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/037-358838d7.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/038-190be13b.png'
},
anubisalt: {
displayName: 'Anubisalt',
variants: [
'anubisaltanip60.png',
'anubisaltanip40.png',
'anubisaltani.png',
'anubisaltanip33.png',
'anubisalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/041-31d66b72.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/042-0fbf913a.png'
},
anubisup: {
displayName: 'Anubisup',
variants: [
'anubisupanip60.png',
'anubisupanip40.png',
'anubisupani.png',
'anubisupanip33.png',
'anubisup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/039-c3e54287.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/040-eed25ab5.png'
},
dromad: {
displayName: 'Dromad',
variants: [
'dromadanip60.png',
'dromadanip40.png',
'dromadani.png',
'dromadanip33.png',
'dromad_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/019-1fb0efb9.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/020-f4fdca1d.png'
},
dromadalt: {
displayName: 'Dromadalt',
variants: [
'dromadaltanip60.png',
'dromadaltanip40.png',
'dromadaltani.png',
'dromadaltanip33.png',
'dromadalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/023-de30a51a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/024-55d329ae.png'
},
dromadup: {
displayName: 'Dromadup',
variants: [
'dromadupanip60.png',
'dromadupanip40.png',
'dromadupani.png',
'dromadupanip33.png',
'dromadup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/021-98e1f1f0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/022-e73a4130.png'
},
duneraider: {
displayName: 'Duneraider',
variants: [
'duneraideranip60.png',
'duneraideranip40.png',
'duneraiderani.png',
'duneraideranip33.png',
'duneraider_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/007-360add73.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/008-c2d163fd.png'
},
duneraideralt: {
displayName: 'Duneraideralt',
variants: [
'duneraideraltanip60.png',
'duneraideraltanip40.png',
'duneraideraltani.png',
'duneraideraltanip33.png',
'duneraideralt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/011-a8f5ef88.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/012-5f7ea26f.png'
},
duneraiderup: {
displayName: 'Duneraiderup',
variants: [
'duneraiderupanip60.png',
'duneraiderupanip40.png',
'duneraiderupani.png',
'duneraiderupanip33.png',
'duneraiderup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/009-e26cda18.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/010-0172a227.png'
},
scarab: {
displayName: 'Scarab',
variants: [
'scarabanip60.png',
'scarabanip40.png',
'scarabani.png',
'scarabanip33.png',
'scarab_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/995-3900b287.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/996-8589a712.png'
},
scarabalt: {
displayName: 'Scarabalt',
variants: [
'scarabaltanip60.png',
'scarabaltanip40.png',
'scarabaltani.png',
'scarabaltanip33.png',
'scarabalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/999-7232e612.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/000-79704a7b.png'
},
scarabup: {
displayName: 'Scarabup',
variants: [
'scarabupanip60.png',
'scarabupanip40.png',
'scarabupani.png',
'scarabupanip33.png',
'scarabup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/997-a60d8d2a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001811/998-ef8b99b6.png'
},
scorp: {
displayName: 'Scorp',
variants: [
'scorpanip60.png',
'scorpanip40.png',
'scorpani.png',
'scorpanip33.png',
'scorp_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/001-b50b1957.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/002-9fec2809.png'
},
scorpalt: {
displayName: 'Scorpalt',
variants: [
'scorpaltanip60.png',
'scorpaltanip40.png',
'scorpaltani.png',
'scorpaltanip33.png',
'scorpalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/005-d20ab53f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/006-985fa6a2.png'
},
scorpup: {
displayName: 'Scorpup',
variants: [
'scorpupanip60.png',
'scorpupanip40.png',
'scorpupani.png',
'scorpupanip33.png',
'scorpup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/003-a934315a.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/004-592b5b1e.png'
},
shakal: {
displayName: 'Shakal',
variants: [
'shakalanip60.png',
'shakalanip40.png',
'shakalani.png',
'shakalanip33.png',
'shakal_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/013-92aa8cc5.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/014-72fa7496.png'
},
shakalalt: {
displayName: 'Shakalalt',
variants: [
'shakalaltanip60.png',
'shakalaltanip40.png',
'shakalaltani.png',
'shakalaltanip33.png',
'shakalalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/017-6956ba5c.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/018-d97a057c.png'
},
shakalup: {
displayName: 'Shakalup',
variants: [
'shakalupanip60.png',
'shakalupanip40.png',
'shakalupani.png',
'shakalupanip33.png',
'shakalup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/015-9ae6caa3.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/016-688fad1d.png'
},
slon: {
displayName: 'Slon',
variants: [
'slonanip60.png',
'slonanip40.png',
'slonani.png',
'slonanip33.png',
'slon_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/031-c43ab523.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/032-882cfbf4.png'
},
slonalt: {
displayName: 'Slonalt',
variants: [
'slonaltanip60.png',
'slonaltanip40.png',
'slonaltani.png',
'slonaltanip33.png',
'slonalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/035-f8625e7e.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/036-20a3f75f.png'
},
slonup: {
displayName: 'Slonup',
variants: [
'slonupanip60.png',
'slonupanip40.png',
'slonupani.png',
'slonupanip33.png',
'slonup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/033-c9fa2181.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/034-9c610cce.png'
},
zhrica: {
displayName: 'Zhrica',
variants: [
'zhricaanip60.png',
'zhricaanip40.png',
'zhricaani.png',
'zhricaanip33.png',
'zhrica_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/025-338c5fd0.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/026-b17d3e43.png'
},
zhricaalt: {
displayName: 'Zhricaalt',
variants: [
'zhricaaltanip60.png',
'zhricaaltanip40.png',
'zhricaaltani.png',
'zhricaaltanip33.png',
'zhricaalt_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/029-8b47c73f.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/030-eadee705.png'
},
zhricaup: {
displayName: 'Zhricaup',
variants: [
'zhricaupanip60.png',
'zhricaupanip40.png',
'zhricaupani.png',
'zhricaupanip33.png',
'zhricaup_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/027-1f751965.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/028-f2d6f659.png'
},
// ========================================
// NEUTRAL FACTION
// ========================================
skmarksman: {
displayName: 'Skmarksman',
variants: [
'skmarksmananip60.png',
'skmarksmananip40.png',
'skmarksmanani.png',
'skmarksmananip33.png',
'skmarksman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/138-150f28c4.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/139-8346adb8.png'
},
thiefmage: {
displayName: 'Thiefmage',
variants: [
'thiefmageanip60.png',
'thiefmageanip40.png',
'thiefmageani.png',
'thiefmageanip33.png',
'thiefmage_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/140-78c28aea.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/141-cf1196fa.png'
},
mercarcher: {
displayName: 'Mercarcher',
variants: [
'mercarcheranip60.png',
'mercarcheranip40.png',
'mercarcherani.png',
'mercarcheranip33.png',
'mercarcher_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/142-d5f2a5cb.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/143-13342b53.png'
},
mercfootman: {
displayName: 'Mercfootman',
variants: [
'mercfootmananip60.png',
'mercfootmananip40.png',
'mercfootmanani.png',
'mercfootmananip33.png',
'mercfootman_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/144-0cc28b86.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/145-2397597e.png'
},
mercwizard: {
displayName: 'Mercwizard',
variants: [
'mercwizardanip60.png',
'mercwizardanip40.png',
'mercwizardani.png',
'mercwizardanip33.png',
'mercwizard_anip33.png'
],
standardUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/146-8f7605a6.png',
battleUrl: 'https://dcdn.heroeswm.ru/photo-catalog/0001812/147-c1f52aac.png'
},
};
// EXPLICIT EXCLUSIONS for 3D models only (same as working version)
const EXCLUDED_PATHS = [
'/i/png40/', // 3D model textures
'/i/creatures/', // General creature models (not portraits)
'/i/units/', // Unit models
];
let replacementCount = 0;
let scanCount = 0;
// ====================================
// CREATURE TOGGLE MANAGEMENT
// ====================================
// Storage key for creature enable/disable states
const STORAGE_KEY = 'heroesWM_creature_controls';
// Get creature enable state from localStorage
function isCreatureEnabled(creatureName) {
try {
const stored = localStorage.getItem(STORAGE_KEY);
const controls = stored ? JSON.parse(stored) : {};
// Default to enabled if not set
return controls[creatureName] !== false;
} catch (e) {
console.warn('Failed to read creature controls from storage:', e);
return true; // Default to enabled
}
}
// Set creature enable state in localStorage
function setCreatureEnabled(creatureName, enabled) {
try {
const stored = localStorage.getItem(STORAGE_KEY);
const controls = stored ? JSON.parse(stored) : {};
controls[creatureName] = enabled;
localStorage.setItem(STORAGE_KEY, JSON.stringify(controls));
console.log(`[Controls] ${creatureName} ${enabled ? 'enabled' : 'disabled'}`);
} catch (e) {
console.error('Failed to save creature controls to storage:', e);
}
}
// ========================================
// CUSTOM IMAGE MANAGEMENT
// ========================================
// Save custom image for a creature
function saveCustomImage(creatureName, imageUrl) {
const customImages = JSON.parse(localStorage.getItem('hwm_custom_creature_images') || '{}');
customImages[creatureName] = imageUrl;
localStorage.setItem('hwm_custom_creature_images', JSON.stringify(customImages));
}
// Get custom image for a creature
function getCustomImage(creatureName) {
const customImages = JSON.parse(localStorage.getItem('hwm_custom_creature_images') || '{}');
return customImages[creatureName] || null;
}
// Remove custom image for a creature
function removeCustomImage(creatureName) {
const customImages = JSON.parse(localStorage.getItem('hwm_custom_creature_images') || '{}');
delete customImages[creatureName];
localStorage.setItem('hwm_custom_creature_images', JSON.stringify(customImages));
}
// Convert file to data URL
function fileToDataURL(file, callback) {
const reader = new FileReader();
reader.onload = function(e) {
callback(e.target.result);
};
reader.readAsDataURL(file);
}
// Get all creature states
function getAllCreatureStates() {
try {
const stored = localStorage.getItem(STORAGE_KEY);
const controls = stored ? JSON.parse(stored) : {};
const states = {};
// Initialize all creatures with their current state or default to enabled
Object.keys(CREATURE_REPLACEMENTS).forEach(name => {
states[name] = controls[name] !== false;
});
return states;
} catch (e) {
console.warn('Failed to read all creature states:', e);
const defaultStates = {};
Object.keys(CREATURE_REPLACEMENTS).forEach(name => {
defaultStates[name] = true;
});
return defaultStates;
}
}
// ====================================
// CONTROL INTERFACE (HOME PAGE ONLY)
// ====================================
function isHomePage() {
return window.location.pathname.includes('/home.php') ||
window.location.pathname === '/home' ||
window.location.pathname === '/';
}
// FACTION MAPPING - extracted from creature organization in the script
const FACTION_CREATURES = {
'Рыцарь | Knight': [
'paesant', 'conscript', 'brute', 'archer', 'marksman', 'crossbowman', 'footman',
'swordman', 'vindicator', 'griffon', 'impergriffin', 'battlegriffon', 'priest',
'inquisitor', 'zealot', 'knight', 'paladin', 'champion', 'angel', 'archangel', 'seraph2'
],
'Некромант | Necromancer': [
'sceleton', 'sceletonarcher', 'sceletonwar', 'zombie', 'plaguezombie', 'rotzombie', 'ghost',
'spectre', 'poltergeist', 'vampire', 'vampirelord', 'vampireprince', 'lich',
'archlich', 'masterlich', 'wight', 'wraith', 'banshee', 'bonedragon', 'spectraldragon', 'ghostdragon'
],
'Маг | Wizard': [
'gremlin', 'mastergremlin', 'saboteurgremlin', 'gargoly', 'obsgargoly', 'elgargoly', 'golem',
'steelgolem', 'magneticgolem', 'mage', 'archmage', 'battlemage', 'djinn',
'djinn_sultan', 'djinn_vizier', 'rakshas', 'rakshasa_raja', 'rakshasa_kshatra', 'colossus', 'titan', 'stormtitan'
],
'Эльф | Elf': [
'pp', 'sprite', 'dryad_', 'dancer', 'bladedancer', 'winddancer', 'elf',
'hunterelf', 'arcaneelf', 'dd_', 'ddeld', 'ddhigh', 'unicorn',
'silverunicorn', 'pristineunicorn', 'ent', 'ancienent', 'savageent', 'greendragon', 'emeralddragon', 'crystaldragon'
],
'Варвар | Barbarian': [
'goblin', 'hobgoblin', 'goblinarcher', 'goblinmag', 'wolfrider', 'hobwolfrider', 'boarrider',
'hyenarider', 'orc', 'orcchief', 'orcrubak', 'orcshaman', 'ogre',
'ogremagi', 'ogrebrutal', 'ogreshaman', 'roc', 'thunderbird', 'firebird', 'darkbird', 'cyclop',
'cyclopking', 'cyclopod', 'cyclopshaman', 'behemoth', 'abehemoth', 'dbehemoth', 'bbehemoth'
],
'Тёмный эльф | Dark elf': [
'scout', 'assasin', 'stalker', 'maiden', 'fury', 'bloodsister', 'minotaur',
'minotaurguard_', 'taskmaster', 'lizardrider', 'grimrider', 'briskrider', 'hydra',
'deephydra', 'foulhydra', 'witch', 'matriarch', 'mistress', 'shadowdragon', 'blackdragon', 'reddragon'
],
'Демон | Demon': [
'imp', 'familiar', 'vermin', 'hdemon', 'fdemon', 'jdemon', 'demondog',
'cerberus', 'firehound', 'succub', 'succubusm', 'seducer', 'nightmare',
'stallion', 'hellstallion', 'pitfiend_', 'pitlord_', 'pitspawn', 'devil', 'archdevil', 'archdemon'
],
'Гном | Dwarf': [
'defender', 'shieldguard', 'mountaingr', 'spearwielder', 'skirmesher', 'harpooner', 'bearrider',
'blackbearrider', 'whitebearrider', 'brawler', 'berserker', 'battlerager', 'runepriest',
'runepatriarch', 'runekeeper', 'thane', 'thunderlord', 'flamelord', 'firedragon', 'magmadragon', 'lavadragon'
],
'Степной варвар | Tribal': [
'goblinus', 'trapper', 'witchdoctor', 'fcentaur', 'ncentaur', 'mcentaur', 'warrior',
'mauler', 'warmong', 'shamaness', 'sdaughter', 'eadaughter', 'slayer',
'executioner', 'chieftain', 'wyvern', 'foulwyvern', 'paokai', 'cyclopus', 'untamedcyc', 'bloodeyecyc'
],
'Фараон | Pharaoh': [
'scarab', 'scarabup', 'scarabalt', 'scorp', 'scorpup', 'scorpalt', 'duneraider',
'duneraiderup', 'duneraideralt', 'shakal', 'shakalup', 'shakalalt', 'dromad',
'dromadup', 'dromadalt', 'zhrica', 'zhricaup', 'zhricaalt', 'slon', 'slonup', 'slonalt', 'anubis', 'anubisup', 'anubisalt'
],
'Нейтралы | Neutral': [
'mercarcher', 'mercwizard', 'mercfootman', 'skmarksman', 'thiefmage'
]
};
// FACTION CUSTOM IMAGES CONFIGURATION
// To add custom images for a faction, add image URLs to the array for that faction
const FACTION_CUSTOM_IMAGES = {
'Рыцарь | Knight': [
'https://dcdn.heroeswm.ru/i/f/r1.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r101.png?v=1.1'
],
'Некромант | Necromancer': [
'https://dcdn.heroeswm.ru/i/f/r2.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r102.png?v=1.1'
],
'Маг | Wizard': [
'https://dcdn.heroeswm.ru/i/f/r3.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r103.png?v=1.1'
],
'Эльф | Elf': [
'https://dcdn.heroeswm.ru/i/f/r4.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r104.png?v=1.1'
],
'Варвар | Barbarian': [
'https://dcdn.heroeswm.ru/i/f/r5.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r105.png?v=1.1'
],
'Тёмный эльф | Dark elf': [
'https://dcdn.heroeswm.ru/i/f/r6.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r106.png?v=1.1'
],
'Демон | Demon': [
'https://dcdn.heroeswm.ru/i/f/r7.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r107.png?v=1.1'
],
'Гном | Dwarf': [
'https://dcdn.heroeswm.ru/i/f/r8.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r108.png?v=1.1'
],
'Степной варвар | Tribal': [
'https://dcdn.heroeswm.ru/i/f/r9.png?v=1.1', 'https://dcdn.heroeswm.ru/i/f/r109.png?v=1.1'
],
'Фараон | Pharaoh': [
'https://dcdn.heroeswm.ru/i/f/r10.png?v=1.1'
],
'Нейтралы | Neutral': [
'https://dcdn.heroeswm.ru/i/f/r_neut.png'
]
};
function createControlInterface() {
if (!isHomePage()) return;
// Create settings button with HeroesWM image
const settingsButton = document.createElement('div');
settingsButton.id = 'creature-controls-gear';
settingsButton.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
width: 40px;
height: 40px;
background: none;
background-image: url('https://dcdn3.heroeswm.ru/i/combat/btn_settings.png?v=8');
background-size: contain;
background-repeat: no-repeat;
background-position: center;
cursor: pointer;
z-index: 10000;
border: none;
border-radius: 0;
box-shadow: none;
outline: none;
transition: opacity 0.3s ease, transform 0.3s ease;
user-select: none;
`;
// Hover effects
settingsButton.addEventListener('mouseenter', function() {
this.style.transform = 'scale(1.1)';
this.style.opacity = '0.8';
});
settingsButton.addEventListener('mouseleave', function() {
this.style.transform = 'scale(1)';
this.style.opacity = '1';
});
// Create popup modal (without dark background)
const modal = document.createElement('div');
modal.id = 'creature-controls-modal';
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10001;
display: none;
align-items: center;
justify-content: center;
pointer-events: none;
`;
// Create popup content
const popup = document.createElement('div');
popup.style.cssText = `
background: #EAE7DF;
border: 2px solid #5D413A;
border-radius: 12px;
padding: 0;
max-width: 1000px;
width: 90%;
max-height: 80vh;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0,0,0,0.25);
color: #333333;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
pointer-events: auto;
position: relative;
`;
// Create popup header (sticky)
const header = document.createElement('div');
header.style.cssText = `
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #DEDAD0;
background: linear-gradient(to bottom, #E7C065, #D4AD52);
padding: 15px 25px;
border-radius: 12px 12px 0 0;
position: sticky;
top: 0;
z-index: 10;
`;
// Create left container for thumbnail and title
const headerLeftContainer = document.createElement('div');
headerLeftContainer.style.cssText = `
display: flex;
align-items: center;
gap: 10px;
`;
// Create thumbnail image (only if URL is provided and not empty)
if (CUSTOM_THUMBNAIL_URL && CUSTOM_THUMBNAIL_URL.trim() !== '') {
const thumbnail = document.createElement('img');
thumbnail.src = CUSTOM_THUMBNAIL_URL;
thumbnail.style.cssText = `
width: 36px;
height: 22px;
border-radius: 4px;
object-fit: cover;
border: none;
box-shadow: none;
`;
// Handle image loading errors
thumbnail.addEventListener('error', () => {
thumbnail.style.display = 'none';
});
headerLeftContainer.appendChild(thumbnail);
}
const title = document.createElement('h3');
title.textContent = 'HWM CP (Creature Portrait) Framework';
title.style.cssText = `
margin: 0;
color: #333333;
font-size: 18px;
font-weight: 600;
`;
headerLeftContainer.appendChild(title);
const closeBtn = document.createElement('button');
closeBtn.innerHTML = '✕';
closeBtn.style.cssText = `
background: #D73527;
border: none;
color: white;
border-radius: 50%;
width: 25px;
height: 25px;
cursor: pointer;
font-size: 14px;
font-weight: bold;
transition: background 0.2s ease;
`;
closeBtn.addEventListener('mouseenter', () => {
closeBtn.style.background = '#B52D20';
});
closeBtn.addEventListener('mouseleave', () => {
closeBtn.style.background = '#D73527';
});
header.appendChild(headerLeftContainer);
header.appendChild(closeBtn);
// Create scrollable content container
const scrollableContent = document.createElement('div');
scrollableContent.style.cssText = `
max-height: calc(80vh - 80px);
overflow-y: auto;
padding: 25px;
`;
// Create faction controls container
const controlsContainer = document.createElement('div');
controlsContainer.style.cssText = `
display: flex;
flex-direction: column;
gap: 8px;
`;
// Add description
const description = document.createElement('p');
description.innerHTML = '© Penguin';
description.style.cssText = `
margin: 0 0 15px 0;
color: #555555;
font-size: 10px;
line-height: 1.4;
`;
// Description will be moved to footer - not added to controls container
// Get current states
const currentStates = getAllCreatureStates();
// Array to track all faction states for accordion behavior
const allFactions = [];
// Create controls for each faction
Object.entries(FACTION_CREATURES).forEach(([factionName, creatures]) => {
// Skip empty factions
const validCreatures = creatures.filter(name => CREATURE_REPLACEMENTS[name]);
if (validCreatures.length === 0) return;
// Create faction header (collapsible)
const factionHeader = document.createElement('div');
factionHeader.style.cssText = `
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 15px;
background: linear-gradient(to bottom, #D4AD52, #B8860B);
border-radius: 6px;
cursor: pointer;
color: white;
font-weight: 600;
font-size: 14px;
border: 1px solid #9A7009;
transition: all 0.2s ease;
user-select: none;
`;
// Create faction title container with custom images
const factionTitleContainer = document.createElement('div');
factionTitleContainer.style.cssText = `
display: flex;
align-items: center;
gap: 5px;
`;
// Add custom images for this faction if any exist
const customImages = FACTION_CUSTOM_IMAGES[factionName];
if (customImages && customImages.length > 0) {
customImages.forEach(imageUrl => {
const img = document.createElement('img');
img.src = imageUrl;
img.style.cssText = `
width: 30px;
height: 30px;
object-fit: cover;
`;
factionTitleContainer.appendChild(img);
});
}
const factionTitle = document.createElement('span');
factionTitle.textContent = factionName;
factionTitle.style.marginLeft = '10px';
factionTitleContainer.appendChild(factionTitle);
const factionArrow = document.createElement('span');
factionArrow.textContent = '▼';
factionArrow.style.cssText = `
transition: transform 0.3s ease;
font-size: 12px;
`;
factionHeader.appendChild(factionTitleContainer);
factionHeader.appendChild(factionArrow);
// Create faction controls (enable/disable all for this faction)
const factionControls = document.createElement('div');
factionControls.style.cssText = `
display: none;
gap: 5px;
padding: 8px 15px;
background: #F0EFED;
border-radius: 4px;
margin-left: 15px;
margin-bottom: 4px;
overflow: hidden;
transition: all 0.3s ease;
`;
const enableFactionBtn = document.createElement('button');
enableFactionBtn.textContent = 'Enable All';
enableFactionBtn.style.cssText = `
background: #B8860B;
color: white;
border: none;
padding: 4px 8px;
border-radius: 4px;
cursor: pointer;
font-size: 10px;
font-weight: 600;
transition: background 0.2s ease;
`;
const disableFactionBtn = document.createElement('button');
disableFactionBtn.textContent = 'Disable All';
disableFactionBtn.style.cssText = `
background: #A0A0A0;
color: white;
border: none;
padding: 4px 8px;
border-radius: 4px;
cursor: pointer;
font-size: 10px;
font-weight: 600;
transition: background 0.2s ease;
`;
// Handle faction buttons
enableFactionBtn.addEventListener('click', (e) => {
e.stopPropagation();
validCreatures.forEach(name => {
setCreatureEnabled(name, true);
// Find and update the checkbox for this creature
const checkbox = factionContent.querySelector(`input[data-creature="${name}"]`);
if (checkbox) {
checkbox.checked = true;
// Trigger the change event to update status
checkbox.dispatchEvent(new Event('change'));
}
});
setTimeout(replaceCreaturePortraits, 100);
});
disableFactionBtn.addEventListener('click', (e) => {
e.stopPropagation();
validCreatures.forEach(name => {
setCreatureEnabled(name, false);
// Find and update the checkbox for this creature
const checkbox = factionContent.querySelector(`input[data-creature="${name}"]`);
if (checkbox) {
checkbox.checked = false;
// Trigger the change event to update status
checkbox.dispatchEvent(new Event('change'));
}
});
setTimeout(replaceCreaturePortraits, 100);
});
enableFactionBtn.addEventListener('mouseenter', () => {
enableFactionBtn.style.background = '#9A7009';
});
enableFactionBtn.addEventListener('mouseleave', () => {
enableFactionBtn.style.background = '#B8860B';
});
disableFactionBtn.addEventListener('mouseenter', () => {
disableFactionBtn.style.background = '#808080';
});
disableFactionBtn.addEventListener('mouseleave', () => {
disableFactionBtn.style.background = '#A0A0A0';
});
factionControls.appendChild(enableFactionBtn);
factionControls.appendChild(disableFactionBtn);
// Create faction content (creature list)
const factionContent = document.createElement('div');
// Special 4-column layout for Barbarian faction
const use4ColGrid = factionName === 'Варвар | Barbarian';
if (use4ColGrid) {
factionContent.style.cssText = `
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;
padding-left: 15px;
margin-bottom: 8px;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
`;
} else {
// Default 3-column grid layout for all other factions
factionContent.style.cssText = `
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
padding-left: 15px;
margin-bottom: 8px;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
`;
}
// Add creatures for this faction
validCreatures.forEach(creatureName => {
const config = CREATURE_REPLACEMENTS[creatureName];
const controlRow = document.createElement('div');
controlRow.style.cssText = `
display: flex;
flex-direction: column;
align-items: center;
padding: 8px 6px;
background: #F5F4F2;
border-radius: 4px;
border: 1px solid transparent;
transition: all 0.2s ease;
min-height: 120px;
text-align: center;
`;
controlRow.addEventListener('mouseenter', () => {
controlRow.style.background = '#E8E7E4';
controlRow.style.borderColor = '#DEDAD0';
});
controlRow.addEventListener('mouseleave', () => {
controlRow.style.background = '#F5F4F2';
controlRow.style.borderColor = 'transparent';
});
const label = document.createElement('label');
label.style.cssText = `
display: flex;
flex-direction: column;
align-items: center;
cursor: pointer;
font-size: 11px;
font-weight: 500;
color: #333333;
width: 100%;
gap: 4px;
`;
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = currentStates[creatureName];
checkbox.setAttribute('data-creature', creatureName);
checkbox.style.cssText = `
margin-right: 8px;
transform: scale(1.1);
cursor: pointer;
`;
// Create creature portrait preview container with frame overlay
const imageContainer = document.createElement('div');
const creatureImage = document.createElement('img');
const frameOverlay = document.createElement('img');
if (config.standardUrl) {
// Check for custom image first, fall back to default
const customImage = getCustomImage(creatureName);
creatureImage.src = customImage || config.standardUrl;
frameOverlay.src = 'https://dcdn.heroeswm.ru/photo-catalog/0001812/117-2452ae38.png';
// Container for grid layout
imageContainer.style.cssText = `
position: relative;
width: 144px;
height: 120px;
margin: 0;
`;
// Creature image for grid layout
creatureImage.style.cssText = `
width: 144px;
height: 120px;
object-fit: cover;
border: 1px solid #D4AD52;
border-radius: 2px;
background: #f5f5f5;
display: block;
`;
// Frame overlay for grid layout
frameOverlay.style.cssText = `
position: absolute;
top: 0;
left: 0;
width: 146px;
height: 122px;
object-fit: cover;
pointer-events: none;
z-index: 2;
`;
// Handle image loading errors
creatureImage.onerror = function() {
imageContainer.style.display = 'none';
};
frameOverlay.onerror = function() {
this.style.display = 'none';
};
// Assemble the container
imageContainer.appendChild(creatureImage);
imageContainer.appendChild(frameOverlay);
} else {
imageContainer.style.display = 'none';
}
const creatureTitle = document.createElement('span');
creatureTitle.textContent = config.displayName || creatureName;
const status = document.createElement('span');
status.style.cssText = `
font-size: 9px;
padding: 2px 8px;
border-radius: 6px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 4px;
`;
function updateStatus() {
if (checkbox.checked) {
status.textContent = 'ON';
status.style.background = '#B8860B';
status.style.color = 'white';
} else {
status.textContent = 'OFF';
status.style.background = '#A0A0A0';
status.style.color = 'white';
}
}
updateStatus();
// Handle checkbox change
checkbox.addEventListener('change', function() {
setCreatureEnabled(creatureName, this.checked);
updateStatus();
// Force immediate re-scan to apply changes
setTimeout(() => {
replaceCreaturePortraits();
console.log(`[Faction Controls] Applied ${creatureName} toggle: ${this.checked ? 'enabled' : 'disabled'}`);
}, 100);
});
// Create custom image controls
const customImageControls = document.createElement('div');
customImageControls.style.cssText = `
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 6px;
width: 100%;
`;
// URL input field
const urlInput = document.createElement('input');
urlInput.type = 'text';
urlInput.placeholder = 'Custom image URL...';
urlInput.style.cssText = `
padding: 3px 6px;
border: 1px solid #ccc;
border-radius: 3px;
font-size: 10px;
width: 100%;
box-sizing: border-box;
`;
// Set current custom URL if exists
const currentCustomImage = getCustomImage(creatureName);
if (currentCustomImage && !currentCustomImage.startsWith('data:')) {
urlInput.value = currentCustomImage;
}
// File upload input
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = 'image/*';
fileInput.style.cssText = `
font-size: 9px;
padding: 2px;
border: 1px solid #ccc;
border-radius: 3px;
background: #fff;
`;
// Control buttons container
const buttonContainer = document.createElement('div');
buttonContainer.style.cssText = `
display: flex;
gap: 3px;
`;
// Apply URL button
const applyUrlBtn = document.createElement('button');
applyUrlBtn.textContent = 'Apply URL';
applyUrlBtn.style.cssText = `
padding: 3px 6px;
font-size: 9px;
background: #B8860B;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
flex: 1;
`;
// Reset button
const resetBtn = document.createElement('button');
resetBtn.textContent = 'Reset';
resetBtn.style.cssText = `
padding: 3px 6px;
font-size: 9px;
background: #A0A0A0;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
flex: 1;
`;
// Event handlers
applyUrlBtn.addEventListener('click', (e) => {
e.stopPropagation();
const url = urlInput.value.trim();
if (url) {
saveCustomImage(creatureName, url);
creatureImage.src = url;
// Force immediate re-scan to apply changes
setTimeout(() => {
replaceCreaturePortraits();
}, 100);
}
});
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
fileToDataURL(file, (dataUrl) => {
saveCustomImage(creatureName, dataUrl);
creatureImage.src = dataUrl;
urlInput.value = ''; // Clear URL input when file is uploaded
// Force immediate re-scan to apply changes
setTimeout(() => {
replaceCreaturePortraits();
}, 100);
});
}
});
resetBtn.addEventListener('click', (e) => {
e.stopPropagation();
removeCustomImage(creatureName);
creatureImage.src = config.standardUrl;
urlInput.value = '';
fileInput.value = '';
// Force immediate re-scan to apply changes
setTimeout(() => {
replaceCreaturePortraits();
}, 100);
});
// Assemble custom image controls
customImageControls.appendChild(urlInput);
customImageControls.appendChild(fileInput);
buttonContainer.appendChild(applyUrlBtn);
buttonContainer.appendChild(resetBtn);
customImageControls.appendChild(buttonContainer);
// Grid layout: vertical arrangement (checkbox at top, image in center, title below, custom controls, status at bottom)
label.appendChild(checkbox);
label.appendChild(imageContainer);
label.appendChild(creatureTitle);
controlRow.appendChild(label);
controlRow.appendChild(customImageControls);
controlRow.appendChild(status);
factionContent.appendChild(controlRow);
});
// Handle faction collapse/expand (collapsed by default) with accordion behavior
let collapsed = true;
factionArrow.style.transform = 'rotate(-90deg)';
// Store faction data for accordion behavior
const factionData = {
name: factionName,
collapsed: collapsed,
content: factionContent,
controls: factionControls,
arrow: factionArrow
};
allFactions.push(factionData);
factionHeader.addEventListener('click', () => {
// Sync local variable with stored state (in case it was changed by accordion behavior)
collapsed = factionData.collapsed;
// If opening this faction, close all others first (accordion behavior)
if (collapsed) {
allFactions.forEach(faction => {
if (faction.name !== factionName && !faction.collapsed) {
// Close other open factions
faction.collapsed = true;
faction.content.style.maxHeight = '0px';
faction.content.style.paddingLeft = '0px';
faction.content.style.marginBottom = '0px';
faction.controls.style.display = 'none';
faction.arrow.style.transform = 'rotate(-90deg)';
}
});
}
// Toggle current faction
collapsed = !collapsed;
factionData.collapsed = collapsed;
if (collapsed) {
factionContent.style.maxHeight = '0px';
factionContent.style.paddingLeft = '0px';
factionContent.style.marginBottom = '0px';
factionControls.style.display = 'none';
factionArrow.style.transform = 'rotate(-90deg)';
} else {
factionContent.style.maxHeight = 'none';
factionContent.style.paddingLeft = '15px';
factionContent.style.marginBottom = '8px';
factionControls.style.display = 'flex';
factionArrow.style.transform = 'rotate(0deg)';
}
});
// Hover effects for faction header
factionHeader.addEventListener('mouseenter', () => {
factionHeader.style.background = 'linear-gradient(to bottom, #C19A42, #9A7009)';
});
factionHeader.addEventListener('mouseleave', () => {
factionHeader.style.background = 'linear-gradient(to bottom, #D4AD52, #B8860B)';
});
controlsContainer.appendChild(factionHeader);
controlsContainer.appendChild(factionControls);
controlsContainer.appendChild(factionContent);
});
// Add global controls
const globalControls = document.createElement('div');
globalControls.style.cssText = `
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid #DEDAD0;
display: flex;
gap: 10px;
justify-content: center;
`;
const enableAllBtn = document.createElement('button');
enableAllBtn.textContent = 'Enable All';
enableAllBtn.style.cssText = `
background: #B8860B;
color: white;
border: none;
padding: 8px 16px;
border-radius: 6px;
cursor: pointer;
font-size: 12px;
font-weight: 600;
transition: background 0.2s ease;
`;
const disableAllBtn = document.createElement('button');
disableAllBtn.textContent = 'Disable All';
disableAllBtn.style.cssText = `
background: #A0A0A0;
color: white;
border: none;
padding: 8px 16px;
border-radius: 6px;
cursor: pointer;
font-size: 12px;
font-weight: 600;
transition: background 0.2s ease;
`;
enableAllBtn.addEventListener('click', () => {
Object.keys(CREATURE_REPLACEMENTS).forEach(name => {
setCreatureEnabled(name, true);
// Find and update all checkboxes
const checkbox = scrollableContent.querySelector(`input[data-creature="${name}"]`);
if (checkbox) {
checkbox.checked = true;
// Trigger the change event to update status
checkbox.dispatchEvent(new Event('change'));
}
});
setTimeout(replaceCreaturePortraits, 100);
});
disableAllBtn.addEventListener('click', () => {
Object.keys(CREATURE_REPLACEMENTS).forEach(name => {
setCreatureEnabled(name, false);
// Find and update all checkboxes
const checkbox = scrollableContent.querySelector(`input[data-creature="${name}"]`);
if (checkbox) {
checkbox.checked = false;
// Trigger the change event to update status
checkbox.dispatchEvent(new Event('change'));
}
});
setTimeout(replaceCreaturePortraits, 100);
});
enableAllBtn.addEventListener('mouseenter', () => {
enableAllBtn.style.background = '#9A7009';
});
enableAllBtn.addEventListener('mouseleave', () => {
enableAllBtn.style.background = '#B8860B';
});
disableAllBtn.addEventListener('mouseenter', () => {
disableAllBtn.style.background = '#808080';
});
disableAllBtn.addEventListener('mouseleave', () => {
disableAllBtn.style.background = '#A0A0A0';
});
globalControls.appendChild(enableAllBtn);
globalControls.appendChild(disableAllBtn);
// Create footer for bottom-right description
const footer = document.createElement('div');
footer.style.cssText = `
display: flex;
justify-content: flex-end;
padding: 0px 15px;
`;
// Update description styling for footer placement
description.style.cssText = `
margin: 0;
color: #555555;
font-size: 10px;
line-height: 1.4;
`;
footer.appendChild(description);
// Assemble popup
function createPopupContent() {
popup.innerHTML = '';
scrollableContent.innerHTML = '';
scrollableContent.appendChild(controlsContainer);
scrollableContent.appendChild(globalControls);
scrollableContent.appendChild(footer);
popup.appendChild(header);
popup.appendChild(scrollableContent);
}
createPopupContent();
modal.appendChild(popup);
// Event handlers
settingsButton.addEventListener('click', (e) => {
e.stopPropagation();
// Toggle modal visibility
if (modal.style.display === 'flex') {
modal.style.display = 'none'; // Close if open
} else {
modal.style.display = 'flex'; // Open if closed
}
});
closeBtn.addEventListener('click', () => {
modal.style.display = 'none';
});
modal.addEventListener('click', (e) => {
if (e.target === modal) {
modal.style.display = 'none';
}
});
// Close when clicking outside popup content
document.addEventListener('click', (e) => {
if (modal.style.display === 'flex' && !popup.contains(e.target) && e.target !== settingsButton) {
modal.style.display = 'none';
}
});
// Escape key to close
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.style.display === 'flex') {
modal.style.display = 'none';
}
});
// Add to page
document.body.appendChild(settingsButton);
document.body.appendChild(modal);
console.log('[Controls] Interface created on home page');
}
// NEW: Page detection functions
function isLeaderArmyPage() {
return window.location.href.includes('leader_army.php');
}
function isBattlePage() {
return window.location.href.includes('/war.php') || window.location.href.includes('/war?');
}
// NEW: Initiative scale detection
function isInitiativeScaleImage(img) {
if (!isBattlePage()) return false;
// Method 1: Check parent elements for initiative-related classes/IDs
const parent = img.closest('[id*="init"], [class*="init"], [id*="scale"], [class*="scale"]');
if (parent) return true;
// Method 2: Check image dimensions - initiative scale typically uses larger images
const isLargerImage = img.clientWidth >= 50 || img.clientHeight >= 50;
if (isLargerImage) return true;
// Method 3: Check image positioning - initiative scale is often positioned differently
const rect = img.getBoundingClientRect();
const computedStyle = window.getComputedStyle(img);
// Images with specific positioning or z-index often indicate initiative scale
if (parseInt(computedStyle.zIndex) > 50) return true;
if (computedStyle.position === 'absolute' || computedStyle.position === 'fixed') return true;
// Method 4: Check image variants - certain variants are more common on initiative scale
const src = img.src || '';
if (src.includes('p60') && isBattlePage()) return true; // p60 variants often used in battles
return false;
}
function isExcludedPath(src) {
return EXCLUDED_PATHS.some(path => src.includes(path));
}
function isValidPortraitTarget(img) {
const src = img.src || '';
// HARD EXCLUSIONS - never replace these
if (isExcludedPath(src)) {
return false;
}
// HARD EXCLUSIONS - very large images are likely 3D models
if (img.naturalWidth > 200 || img.naturalHeight > 200) {
return false;
}
// MORE PERMISSIVE LOGIC (same as working grimrider version)
// Always include /portraits/ directory
if (src.includes('/portraits/')) {
return true;
}
// Include small to medium images
if (img.clientWidth <= 120 && img.clientHeight <= 120) {
return true;
}
// Include images in popups/overlays (high z-index)
const computedStyle = window.getComputedStyle(img);
if (parseInt(computedStyle.zIndex) > 100) {
return true;
}
// Include images in any position on screen
return true; // Default to replacing (unless explicitly excluded)
}
function findMatchingCreature(imgSrc) {
// Extract the filename from the portraits URL
const portraitMatch = imgSrc.match(/\/i\/portraits\/([^\/\?]+)/);
if (!portraitMatch) {
return null; // Not a portraits URL
}
const urlFilename = portraitMatch[1]; // e.g., "marksmananip60.png" or "skeletonmarksman.png"
// Check each creature's variants for EXACT filename match
// This prevents "skeletonmarksman.png" from matching "marksman" variants
for (const [creatureName, config] of Object.entries(CREATURE_REPLACEMENTS)) {
const matchedVariant = config.variants.find(variant => variant === urlFilename);
if (matchedVariant) {
return {
name: creatureName,
config: config,
matchedVariant: matchedVariant
};
}
}
return null;
}
// NEW: Get appropriate URL based on context
function getReplacementUrl(creatureMatch, img) {
const config = creatureMatch.config;
// Check for custom image first (always prioritized)
const customImage = getCustomImage(creatureMatch.name);
if (customImage) {
return customImage;
}
// Use battleUrl for initiative scale, standardUrl for everything else
if (isInitiativeScaleImage(img) && config.battleUrl) {
return config.battleUrl;
} else if (config.standardUrl) {
return config.standardUrl;
} else {
// Fallback to old replacementUrl property for backwards compatibility
return config.replacementUrl || config.standardUrl;
}
}
function getOriginalDimensions(img) {
// Multiple methods to capture original dimensions before replacement
const dimensions = {
width: null,
height: null
};
// Method 1: Current rendered dimensions (most reliable for visible elements)
if (img.clientWidth && img.clientHeight) {
dimensions.width = img.clientWidth;
dimensions.height = img.clientHeight;
}
// Method 2: CSS computed dimensions
else {
const computedStyle = window.getComputedStyle(img);
const cssWidth = parseInt(computedStyle.width);
const cssHeight = parseInt(computedStyle.height);
if (cssWidth && cssHeight) {
dimensions.width = cssWidth;
dimensions.height = cssHeight;
}
}
// Method 3: HTML attributes
if (!dimensions.width && img.width) {
dimensions.width = img.width;
}
if (!dimensions.height && img.height) {
dimensions.height = img.height;
}
// Method 4: Natural dimensions (loaded image size)
if (!dimensions.width && img.naturalWidth) {
dimensions.width = img.naturalWidth;
}
if (!dimensions.height && img.naturalHeight) {
dimensions.height = img.naturalHeight;
}
// Method 5: Fallback based on variant type
if (!dimensions.width || !dimensions.height) {
const variant = findMatchingCreature(img.src)?.matchedVariant || '';
if (variant.includes('p60')) {
dimensions.width = dimensions.width || 60;
dimensions.height = dimensions.height || 60;
} else if (variant.includes('p40')) {
dimensions.width = dimensions.width || 40;
dimensions.height = dimensions.height || 40;
} else if (variant.includes('p33')) {
dimensions.width = dimensions.width || 33;
dimensions.height = dimensions.height || 33;
} else {
// General fallback
dimensions.width = dimensions.width || 60;
dimensions.height = dimensions.height || 60;
}
}
return dimensions;
}
// NEW: Enhanced instant replacement function with dual resolution support and toggle controls
function instantReplaceImage(img) {
if (img.dataset.replaced === 'true') {
return false; // Already replaced
}
const creatureMatch = findMatchingCreature(img.src);
if (!creatureMatch) {
return false; // Not a target creature
}
// CHECK IF CREATURE IS ENABLED
if (!isCreatureEnabled(creatureMatch.name)) {
return false; // Creature is disabled by user
}
const isExcluded = isExcludedPath(img.src);
const isValidTarget = isValidPortraitTarget(img);
if (!isValidTarget || isExcluded) {
return false; // Not valid target
}
// Store original data for potential restoration
img.setAttribute('data-original-src', img.src);
// NEW: Get context-appropriate replacement URL
const replacementUrl = getReplacementUrl(creatureMatch, img);
const isInitiativeScale = isInitiativeScaleImage(img);
const resolutionMode = isInitiativeScale ? 'Battle' : 'Standard';
// Apply replacement immediately
img.src = replacementUrl;
if (isLeaderArmyPage()) {
// PURE SOURCE REPLACEMENT ONLY
console.log(`[${creatureMatch.name.toUpperCase()}] ⚡ INSTANT REPLACED (Pure Source - ${resolutionMode})`);
img.dataset.replaced = 'true';
img.dataset.creatureType = creatureMatch.name;
img.dataset.resolutionMode = resolutionMode;
} else {
// FULL AUTO-RESIZE for all other pages
const originalDimensions = getOriginalDimensions(img);
img.setAttribute('data-original-width', originalDimensions.width);
img.setAttribute('data-original-height', originalDimensions.height);
img.style.width = `${originalDimensions.width}px`;
img.style.height = `${originalDimensions.height}px`;
img.style.objectFit = 'cover';
img.style.objectPosition = 'center';
// Ensure dimensions are maintained even if CSS tries to override
img.style.minWidth = `${originalDimensions.width}px`;
img.style.minHeight = `${originalDimensions.height}px`;
img.style.maxWidth = `${originalDimensions.width}px`;
img.style.maxHeight = `${originalDimensions.height}px`;
console.log(`[${creatureMatch.name.toUpperCase()}] ⚡ INSTANT REPLACED & RESIZED (${resolutionMode}): ${originalDimensions.width}x${originalDimensions.height}px${isBattlePage() ? ' [BATTLE POPUP FIX]' : ''}`);
img.dataset.replaced = 'true';
img.dataset.creatureType = creatureMatch.name;
img.dataset.resolutionMode = resolutionMode;
}
replacementCount++;
return true;
}
function replaceCreaturePortraits() {
scanCount++;
let newReplacements = 0;
let foundImages = [];
// Get ALL images (same approach as working version)
const allImages = document.querySelectorAll('img');
allImages.forEach((img, index) => {
if (instantReplaceImage(img)) {
newReplacements++;
}
// Still collect info for debugging
const creatureMatch = findMatchingCreature(img.src);
if (creatureMatch) {
const rect = img.getBoundingClientRect();
const isInitiativeScale = isInitiativeScaleImage(img);
const info = {
index: index,
creature: creatureMatch.name,
variant: creatureMatch.matchedVariant,
src: img.src,
dimensions: `${img.clientWidth}x${img.clientHeight}`,
alreadyReplaced: img.dataset.replaced === 'true',
resolutionMode: img.dataset.resolutionMode || (isInitiativeScale ? 'Battle' : 'Standard'),
pageMode: isLeaderArmyPage() ? 'InstantReplace' : 'AutoResize',
isInitiativeScale: isInitiativeScale,
enabled: isCreatureEnabled(creatureMatch.name)
};
foundImages.push(info);
}
});
if (newReplacements > 0) {
const pageMode = isLeaderArmyPage() ? ' [Instant Replace Mode]' : ' [Auto-Resize Mode]';
const battleInfo = isBattlePage() ? ' [Battle Page - Dual Resolution]' : '';
console.log(`[Multi-Creature] Scan #${scanCount}: Made ${newReplacements} new replacements (${replacementCount} total)${pageMode}${battleInfo}`);
}
return foundImages;
}
// ====================================
// PAGE-SPECIFIC SCANNING STRATEGY (SAME AS BEFORE)
// ====================================
if (isLeaderArmyPage()) {
// INSTANT REPLACEMENT MODE for leader_army.php
console.log('[Multi-Creature] Initializing INSTANT REPLACEMENT mode for leader_army.php');
// Initial scans for page load
setTimeout(replaceCreaturePortraits, 500);
setTimeout(replaceCreaturePortraits, 1000);
setTimeout(replaceCreaturePortraits, 2000);
// MutationObserver with IMMEDIATE synchronous replacement
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // Element node
if (node.tagName === 'IMG') {
instantReplaceImage(node);
} else if (node.querySelectorAll) {
const newImages = node.querySelectorAll('img');
newImages.forEach(instantReplaceImage);
}
}
});
}
if (mutation.type === 'attributes' && mutation.target.tagName === 'IMG' && mutation.attributeName === 'src') {
instantReplaceImage(mutation.target);
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['src']
});
} else {
// STANDARD MODE for all other pages with ENHANCED popup handling
console.log(`[Multi-Creature] Initializing ENHANCED STANDARD mode with instant popup replacement${isBattlePage() ? ' + Dual Resolution for battles' : ''}`);
// Primary scanner - very frequent (same as working)
const mainInterval = setInterval(replaceCreaturePortraits, 200); // Every 200ms
// Secondary scanner - for popups and delayed content (same as working)
const secondaryInterval = setInterval(replaceCreaturePortraits, 1000);
// Enhanced MutationObserver with INSTANT replacement for battle popups
const observer = new MutationObserver((mutations) => {
let hasNewImages = false;
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // Element node
if (node.tagName === 'IMG') {
// INSTANT replacement for new IMG elements
instantReplaceImage(node);
hasNewImages = true;
} else if (node.querySelectorAll) {
// INSTANT replacement for new images within added elements
const newImages = node.querySelectorAll('img');
newImages.forEach(instantReplaceImage);
if (newImages.length > 0) hasNewImages = true;
}
}
});
}
if (mutation.type === 'attributes' && mutation.target.tagName === 'IMG' && mutation.attributeName === 'src') {
// INSTANT replacement when src attribute changes (popups!)
instantReplaceImage(mutation.target);
hasNewImages = true;
}
});
// Fallback delayed scan for anything missed
if (hasNewImages) {
setTimeout(replaceCreaturePortraits, 500); // Delayed check for edge cases
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['src'] // Focus on src changes for popup portraits
});
// Initial runs for standard pages
setTimeout(replaceCreaturePortraits, 500);
setTimeout(replaceCreaturePortraits, 1000);
setTimeout(replaceCreaturePortraits, 2000);
}
// Initialize control interface when page loads
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', createControlInterface);
} else {
setTimeout(createControlInterface, 1000);
}
// ====================================
// ENHANCED DEBUG FUNCTIONS WITH DUAL RESOLUTION INFO
// ====================================
window.multiCreatureStatus = function() {
console.log('=== MULTI-CREATURE STATUS ===');
console.log(`Page Mode: ${isLeaderArmyPage() ? 'Instant Replacement (MutationObserver Only)' : 'Standard (Full Scanning)'}`);
console.log(`Battle Mode: ${isBattlePage() ? 'YES (Dual Resolution Active)' : 'NO'}`);
console.log(`Total scans performed: ${scanCount}`);
console.log(`Total replacements made: ${replacementCount}`);
console.log(`Configured creatures:`, Object.keys(CREATURE_REPLACEMENTS));
// Show creature states
const states = getAllCreatureStates();
console.log('Creature States:');
Object.entries(states).forEach(([name, enabled]) => {
console.log(` - ${name}: ${enabled ? 'ENABLED' : 'DISABLED'}`);
});
const currentImages = replaceCreaturePortraits();
if (currentImages.length > 0) {
console.log(`Found ${currentImages.length} creature images:`);
console.table(currentImages);
// Group by resolution mode
const byResolution = {};
currentImages.forEach(img => {
const mode = img.resolutionMode || 'Standard';
if (!byResolution[mode]) byResolution[mode] = [];
byResolution[mode].push(img);
});
console.log('📊 Summary by resolution:');
Object.entries(byResolution).forEach(([mode, images]) => {
console.log(` - ${mode}: ${images.length} images`);
});
const totalUnreplaced = currentImages.filter(img => !img.alreadyReplaced);
if (totalUnreplaced.length > 0) {
console.log(`⚠️ UNREPLACED PORTRAITS:`, totalUnreplaced);
} else {
console.log(`✅ All portraits successfully replaced!`);
}
} else {
console.log('❌ No creature images found');
}
return currentImages;
};
// NEW: Helper function to add creatures with dual resolution support
window.addCreatureDualRes = function(name, variants, standardUrl, battleUrl = null) {
CREATURE_REPLACEMENTS[name] = {
displayName: name.charAt(0).toUpperCase() + name.slice(1),
variants: variants,
standardUrl: standardUrl,
battleUrl: battleUrl || standardUrl // Use standard as fallback if no battle URL provided
};
console.log(`✅ Added creature with dual resolution: ${name}`);
console.log(` Variants: ${variants.join(', ')}`);
console.log(` Standard URL: ${standardUrl}`);
console.log(` Battle URL: ${battleUrl || standardUrl}`);
// Force immediate scan for new creature
setTimeout(replaceCreaturePortraits, 100);
};
// Legacy function for backwards compatibility
window.addCreature = function(name, variants, replacementUrl) {
CREATURE_REPLACEMENTS[name] = {
displayName: name.charAt(0).toUpperCase() + name.slice(1),
variants: variants,
standardUrl: replacementUrl,
battleUrl: replacementUrl // Same URL for both contexts
};
console.log(`✅ Added creature: ${name}`);
console.log(` Variants: ${variants.join(', ')}`);
console.log(` URL: ${replacementUrl}`);
setTimeout(replaceCreaturePortraits, 100);
};
window.forceMultiCreatureScan = function() {
console.log('[Manual] Forcing multi-creature scan...');
setTimeout(replaceCreaturePortraits, 100);
setTimeout(replaceCreaturePortraits, 500);
setTimeout(replaceCreaturePortraits, 1000);
setTimeout(() => window.multiCreatureStatus(), 1500);
};
// Function to restore original icons (for debugging)
window.restoreOriginalCreatureIcons = function() {
document.querySelectorAll('[data-original-src]').forEach(img => {
img.src = img.getAttribute('data-original-src');
img.style.width = '';
img.style.height = '';
img.style.objectFit = '';
img.style.objectPosition = '';
img.style.minWidth = '';
img.style.minHeight = '';
img.style.maxWidth = '';
img.style.maxHeight = '';
img.removeAttribute('data-replaced');
img.removeAttribute('data-creature-type');
img.removeAttribute('data-resolution-mode');
img.removeAttribute('data-original-src');
img.removeAttribute('data-original-width');
img.removeAttribute('data-original-height');
});
console.log('Original creature icons restored');
replacementCount = 0;
};
// NEW: Control interface functions
window.openCreatureControls = function() {
const modal = document.getElementById('creature-controls-modal');
if (modal) {
modal.style.display = 'flex';
} else {
console.log('Controls interface not available (only on home page)');
}
};
window.toggleCreature = function(creatureName, enabled = null) {
if (!CREATURE_REPLACEMENTS[creatureName]) {
console.error(`Unknown creature: ${creatureName}`);
return;
}
const newState = enabled !== null ? enabled : !isCreatureEnabled(creatureName);
setCreatureEnabled(creatureName, newState);
// Force re-scan
setTimeout(replaceCreaturePortraits, 100);
console.log(`[Controls] ${creatureName} ${newState ? 'enabled' : 'disabled'}`);
return newState;
};
console.log('[Multi-Creature] Ultra Reliable replacer loaded with auto-resize + Dual Resolution + Controls');
console.log('🎯 Configured creatures:', Object.keys(CREATURE_REPLACEMENTS));
console.log(`📍 Page Mode: ${isLeaderArmyPage() ? 'Instant Replacement (MutationObserver Only)' : 'Standard (Full Scanning)'}`);
console.log(`⚔️ Battle Mode: ${isBattlePage() ? 'YES (Dual Resolution Active)' : 'NO'}`);
console.log(`🏠 Controls Available: ${isHomePage() ? 'YES (Settings Button)' : 'NO (Home page only)'}`);
})();