您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Classic & Custom Creature Portraits
// ==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)'}`); })();