1 /***************************************************************************
2  *   Copyright (C) 2009 by Andrey Afletdinov <fheroes2@gmail.com>          *
3  *                                                                         *
4  *   Part of the Free Heroes2 Engine:                                      *
5  *   http://sourceforge.net/projects/fheroes2                              *
6  *                                                                         *
7  *   This program is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU General Public License as published by  *
9  *   the Free Software Foundation; either version 2 of the License, or     *
10  *   (at your option) any later version.                                   *
11  *                                                                         *
12  *   This program is distributed in the hope that it will be useful,       *
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
15  *   GNU General Public License for more details.                          *
16  *                                                                         *
17  *   You should have received a copy of the GNU General Public License     *
18  *   along with this program; if not, write to the                         *
19  *   Free Software Foundation, Inc.,                                       *
20  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
21  ***************************************************************************/
22 
23 #include "heroes.h"
24 #include "icn.h"
25 #include "race.h"
26 #include "settings.h"
27 
28 namespace ICN
29 {
30     struct icnmap_t
31     {
32         int type;
33         const char * string;
34     };
35 
36     // Make sure that each item ID has exactly the same location ID!
37     const icnmap_t icnmap[LAST_VALID_FILE_ICN]
38         = { { UNKNOWN, "UNKNOWN" },       { ADVBORDE, "ADVBORDE.ICN" }, { ADVBORD, "ADVBORD.ICN" },   { ADVBTNS, "ADVBTNS.ICN" },   { ADVEBTNS, "ADVEBTNS.ICN" },
39             { ADVMCO, "ADVMCO.ICN" },     { AELEM, "AELEM.ICN" },       { APANBKGE, "APANBKGE.ICN" }, { APANBKG, "APANBKG.ICN" },   { APANELE, "APANELE.ICN" },
40             { APANEL, "APANEL.ICN" },     { ARCHER2, "ARCHER2.ICN" },   { ARCHER, "ARCHER.ICN" },     { ARCH_MSL, "ARCH_MSL.ICN" }, { ART32, "ART32.ICN" },
41             { ARTFX, "ARTFX.ICN" },       { ARTIFACT, "ARTIFACT.ICN" }, { BARB32, "BARB32.ICN" },     { B_BFLG32, "B-BFLG32.ICN" }, { BERZERK, "BERZERK.ICN" },
42             { B_FLAG32, "B-FLAG32.ICN" }, { BIGBAR, "BIGBAR.ICN" },     { BLDGXTRA, "BLDGXTRA.ICN" }, { BLESS, "BLESS.ICN" },       { BLIND, "BLIND.ICN" },
43             { BLUEFIRE, "BLUEFIRE.ICN" }, { BOAR, "BOAR.ICN" },         { BOAT32, "BOAT32.ICN" },     { BOATSHAD, "BOATSHAD.ICN" }, { BOATWIND, "BOATWIND.ICN" },
44             { BOOK, "BOOK.ICN" },         { BORDEDIT, "BORDEDIT.ICN" }, { BOULDER, "BOULDER.ICN" },   { BRCREST, "BRCREST.ICN" },   { BROTHERS, "BROTHERS.ICN" },
45             { BTNBAUD, "BTNBAUD.ICN" },   { BTNCMPGN, "BTNCMPGN.ICN" }, { BTNCOM, "BTNCOM.ICN" },     { BTNDCCFG, "BTNDCCFG.ICN" }, { BTNDC, "BTNDC.ICN" },
46             { BTNEMAIN, "BTNEMAIN.ICN" }, { BTNENEW, "BTNENEW.ICN" },   { BTNESIZE, "BTNESIZE.ICN" }, { BTNHOTST, "BTNHOTST.ICN" }, { BTNMCFG, "BTNMCFG.ICN" },
47             { BTNMODEM, "BTNMODEM.ICN" }, { BTNMP, "BTNMP.ICN" },       { BTNNET2, "BTNNET2.ICN" },   { BTNNET, "BTNNET.ICN" },     { BTNNEWGM, "BTNNEWGM.ICN" },
48             { BTNSHNGL, "BTNSHNGL.ICN" }, { BUILDING, "BUILDING.ICN" }, { BUYBUILD, "BUYBUILD.ICN" }, { BUYBUILE, "BUYBUILE.ICN" }, { CAMPBKGE, "CAMPBKGE.ICN" },
49             { CAMPBKGG, "CAMPBKGG.ICN" }, { CAMPXTRE, "CAMPXTRE.ICN" }, { CAMPXTRG, "CAMPXTRG.ICN" }, { CAPTCOVR, "CAPTCOVR.ICN" }, { CASLBAR, "CASLBAR.ICN" },
50             { CASLWIND, "CASLWIND.ICN" }, { CASLXTRA, "CASLXTRA.ICN" }, { CASTBKGB, "CASTBKGB.ICN" }, { CASTBKGK, "CASTBKGK.ICN" }, { CASTBKGN, "CASTBKGN.ICN" },
51             { CASTBKGS, "CASTBKGS.ICN" }, { CASTBKGW, "CASTBKGW.ICN" }, { CASTBKGZ, "CASTBKGZ.ICN" }, { CASTLEB, "CASTLEB.ICN" },   { CASTLEK, "CASTLEK.ICN" },
52             { CASTLEN, "CASTLEN.ICN" },   { CASTLES, "CASTLES.ICN" },   { CASTLEW, "CASTLEW.ICN" },   { CASTLEZ, "CASTLEZ.ICN" },   { CATAPULT, "CATAPULT.ICN" },
53             { CAVALRYB, "CAVALRYB.ICN" }, { CAVALRYR, "CAVALRYR.ICN" }, { CBKGBEAC, "CBKGBEAC.ICN" }, { CBKGCRCK, "CBKGCRCK.ICN" }, { CBKGDIMT, "CBKGDIMT.ICN" },
54             { CBKGDITR, "CBKGDITR.ICN" }, { CBKGDSRT, "CBKGDSRT.ICN" }, { CBKGGRAV, "CBKGGRAV.ICN" }, { CBKGGRMT, "CBKGGRMT.ICN" }, { CBKGGRTR, "CBKGGRTR.ICN" },
55             { CBKGLAVA, "CBKGLAVA.ICN" }, { CBKGSNMT, "CBKGSNMT.ICN" }, { CBKGSNTR, "CBKGSNTR.ICN" }, { CBKGSWMP, "CBKGSWMP.ICN" }, { CBKGWATR, "CBKGWATR.ICN" },
56             { CELLWIN, "CELLWIN.ICN" },   { CENTAUR, "CENTAUR.ICN" },   { CFLGSMAL, "CFLGSMAL.ICN" }, { CLOP32, "CLOP32.ICN" },     { CLOUDLUK, "CLOUDLUK.ICN" },
57             { CMBTCAPB, "CMBTCAPB.ICN" }, { CMBTCAPK, "CMBTCAPK.ICN" }, { CMBTCAPN, "CMBTCAPN.ICN" }, { CMBTCAPS, "CMBTCAPS.ICN" }, { CMBTCAPW, "CMBTCAPW.ICN" },
58             { CMBTCAPZ, "CMBTCAPZ.ICN" }, { CMBTFLE1, "CMBTFLE1.ICN" }, { CMBTFLE2, "CMBTFLE2.ICN" }, { CMBTFLE3, "CMBTFLE3.ICN" }, { CMBTHROB, "CMBTHROB.ICN" },
59             { CMBTHROK, "CMBTHROK.ICN" }, { CMBTHRON, "CMBTHRON.ICN" }, { CMBTHROS, "CMBTHROS.ICN" }, { CMBTHROW, "CMBTHROW.ICN" }, { CMBTHROZ, "CMBTHROZ.ICN" },
60             { CMBTLOS1, "CMBTLOS1.ICN" }, { CMBTLOS2, "CMBTLOS2.ICN" }, { CMBTLOS3, "CMBTLOS3.ICN" }, { CMBTMISC, "CMBTMISC.ICN" }, { CMBTSURR, "CMBTSURR.ICN" },
61             { CMSECO, "CMSECO.ICN" },     { COBJ0000, "COBJ0000.ICN" }, { COBJ0001, "COBJ0001.ICN" }, { COBJ0002, "COBJ0002.ICN" }, { COBJ0003, "COBJ0003.ICN" },
62             { COBJ0004, "COBJ0004.ICN" }, { COBJ0005, "COBJ0005.ICN" }, { COBJ0006, "COBJ0006.ICN" }, { COBJ0007, "COBJ0007.ICN" }, { COBJ0008, "COBJ0008.ICN" },
63             { COBJ0009, "COBJ0009.ICN" }, { COBJ0010, "COBJ0010.ICN" }, { COBJ0011, "COBJ0011.ICN" }, { COBJ0012, "COBJ0012.ICN" }, { COBJ0013, "COBJ0013.ICN" },
64             { COBJ0014, "COBJ0014.ICN" }, { COBJ0015, "COBJ0015.ICN" }, { COBJ0016, "COBJ0016.ICN" }, { COBJ0017, "COBJ0017.ICN" }, { COBJ0018, "COBJ0018.ICN" },
65             { COBJ0019, "COBJ0019.ICN" }, { COBJ0020, "COBJ0020.ICN" }, { COBJ0021, "COBJ0021.ICN" }, { COBJ0022, "COBJ0022.ICN" }, { COBJ0023, "COBJ0023.ICN" },
66             { COBJ0024, "COBJ0024.ICN" }, { COBJ0025, "COBJ0025.ICN" }, { COBJ0026, "COBJ0026.ICN" }, { COBJ0027, "COBJ0027.ICN" }, { COBJ0028, "COBJ0028.ICN" },
67             { COBJ0029, "COBJ0029.ICN" }, { COBJ0030, "COBJ0030.ICN" }, { COBJ0031, "COBJ0031.ICN" }, { COLDRAY, "COLDRAY.ICN" },   { COLDRING, "COLDRING.ICN" },
68             { CONGRATS, "CONGRATS.ICN" }, { COVR0001, "COVR0001.ICN" }, { COVR0002, "COVR0002.ICN" }, { COVR0003, "COVR0003.ICN" }, { COVR0004, "COVR0004.ICN" },
69             { COVR0005, "COVR0005.ICN" }, { COVR0006, "COVR0006.ICN" }, { COVR0007, "COVR0007.ICN" }, { COVR0008, "COVR0008.ICN" }, { COVR0009, "COVR0009.ICN" },
70             { COVR0010, "COVR0010.ICN" }, { COVR0011, "COVR0011.ICN" }, { COVR0012, "COVR0012.ICN" }, { COVR0013, "COVR0013.ICN" }, { COVR0014, "COVR0014.ICN" },
71             { COVR0015, "COVR0015.ICN" }, { COVR0016, "COVR0016.ICN" }, { COVR0017, "COVR0017.ICN" }, { COVR0018, "COVR0018.ICN" }, { COVR0019, "COVR0019.ICN" },
72             { COVR0020, "COVR0020.ICN" }, { COVR0021, "COVR0021.ICN" }, { COVR0022, "COVR0022.ICN" }, { COVR0023, "COVR0023.ICN" }, { COVR0024, "COVR0024.ICN" },
73             { CPANBKGE, "CPANBKGE.ICN" }, { CPANBKG, "CPANBKG.ICN" },   { CPANELE, "CPANELE.ICN" },   { CPANEL, "CPANEL.ICN" },     { CREST, "CREST.ICN" },
74             { CSPANBKE, "CSPANBKE.ICN" }, { CSPANBKG, "CSPANBKG.ICN" }, { CSPANBTE, "CSPANBTE.ICN" }, { CSPANBTN, "CSPANBTN.ICN" }, { CSPANEL, "CSPANEL.ICN" },
75             { CSTLBARB, "CSTLBARB.ICN" }, { CSTLCAPB, "CSTLCAPB.ICN" }, { CSTLCAPK, "CSTLCAPK.ICN" }, { CSTLCAPN, "CSTLCAPN.ICN" }, { CSTLCAPS, "CSTLCAPS.ICN" },
76             { CSTLCAPW, "CSTLCAPW.ICN" }, { CSTLCAPZ, "CSTLCAPZ.ICN" }, { CSTLKNGT, "CSTLKNGT.ICN" }, { CSTLNECR, "CSTLNECR.ICN" }, { CSTLSORC, "CSTLSORC.ICN" },
77             { CSTLWRLK, "CSTLWRLK.ICN" }, { CSTLWZRD, "CSTLWZRD.ICN" }, { CTRACK00, "CTRACK00.ICN" }, { CTRACK01, "CTRACK01.ICN" }, { CTRACK02, "CTRACK02.ICN" },
78             { CTRACK03, "CTRACK03.ICN" }, { CTRACK04, "CTRACK04.ICN" }, { CTRACK05, "CTRACK05.ICN" }, { CTRACK06, "CTRACK06.ICN" }, { CURSE, "CURSE.ICN" },
79             { CYCLOPS, "CYCLOPS.ICN" },   { DISRRAY, "DISRRAY.ICN" },   { DRAGBLAK, "DRAGBLAK.ICN" }, { DRAGBONE, "DRAGBONE.ICN" }, { DRAGGREE, "DRAGGREE.ICN" },
80             { DRAGRED, "DRAGRED.ICN" },   { DRAGSLAY, "DRAGSLAY.ICN" }, { DROPLISL, "DROPLISL.ICN" }, { DROPLIST, "DROPLIST.ICN" }, { DRUID2, "DRUID2.ICN" },
81             { DRUID, "DRUID.ICN" },       { DRUIDMSL, "DRUIDMSL.ICN" }, { DUMMY, "DUMMY.ICN" },       { DWARF2, "DWARF2.ICN" },     { DWARF, "DWARF.ICN" },
82             { ECPANEL, "ECPANEL.ICN" },   { EDITBTNS, "EDITBTNS.ICN" }, { EDITOR, "EDITOR.ICN" },     { EDITPANL, "EDITPANL.ICN" }, { EELEM, "EELEM.ICN" },
83             { ELECTRIC, "ELECTRIC.ICN" }, { ELF2, "ELF2.ICN" },         { ELF, "ELF.ICN" },           { ELF__MSL, "ELF__MSL.ICN" }, { ESCROLL, "ESCROLL.ICN" },
84             { ESPANBKG, "ESPANBKG.ICN" }, { ESPANBTN, "ESPANBTN.ICN" }, { ESPANEL, "ESPANEL.ICN" },   { EVIW_ALL, "EVIW_ALL.ICN" }, { EVIWDDOR, "EVIWDDOR.ICN" },
85             { EVIWHROS, "EVIWHROS.ICN" }, { EVIWMINE, "EVIWMINE.ICN" }, { EVIWPUZL, "EVIWPUZL.ICN" }, { EVIWRSRC, "EVIWRSRC.ICN" }, { EVIWRTFX, "EVIWRTFX.ICN" },
86             { EVIWTWNS, "EVIWTWNS.ICN" }, { EVIWWRLD, "EVIWWRLD.ICN" }, { EXPMRL, "EXPMRL.ICN" },     { EXTRAOVR, "EXTRAOVR.ICN" }, { FELEM, "FELEM.ICN" },
87             { FIREBAL2, "FIREBAL2.ICN" }, { FIREBALL, "FIREBALL.ICN" }, { FLAG32, "FLAG32.ICN" },     { FONT, "FONT.ICN" },         { FRNG0001, "FRNG0001.ICN" },
88             { FRNG0002, "FRNG0002.ICN" }, { FRNG0003, "FRNG0003.ICN" }, { FRNG0004, "FRNG0004.ICN" }, { FRNG0005, "FRNG0005.ICN" }, { FRNG0006, "FRNG0006.ICN" },
89             { FRNG0007, "FRNG0007.ICN" }, { FRNG0008, "FRNG0008.ICN" }, { FRNG0009, "FRNG0009.ICN" }, { FRNG0010, "FRNG0010.ICN" }, { FRNG0011, "FRNG0011.ICN" },
90             { FRNG0012, "FRNG0012.ICN" }, { FRNG0013, "FRNG0013.ICN" }, { FROTH, "FROTH.ICN" },       { GARGOYLE, "GARGOYLE.ICN" }, { G_BFLG32, "G-BFLG32.ICN" },
91             { GENIE, "GENIE.ICN" },       { G_FLAG32, "G-FLAG32.ICN" }, { GHOST, "GHOST.ICN" },       { GOBLIN, "GOBLIN.ICN" },     { GOLEM2, "GOLEM2.ICN" },
92             { GOLEM, "GOLEM.ICN" },       { GRIFFIN, "GRIFFIN.ICN" },   { GROUND12, "GROUND12.ICN" }, { GROUND4, "GROUND4.ICN" },   { GROUND6, "GROUND6.ICN" },
93             { HALFLING, "HALFLING.ICN" }, { HALFLMSL, "HALFLMSL.ICN" }, { HASTE, "HASTE.ICN" },       { HEROBKG, "HEROBKG.ICN" },   { HEROES, "HEROES.ICN" },
94             { HEROEXTE, "HEROEXTE.ICN" }, { HEROEXTG, "HEROEXTG.ICN" }, { HEROFL00, "HEROFL00.ICN" }, { HEROFL01, "HEROFL01.ICN" }, { HEROFL02, "HEROFL02.ICN" },
95             { HEROFL03, "HEROFL03.ICN" }, { HEROFL04, "HEROFL04.ICN" }, { HEROFL05, "HEROFL05.ICN" }, { HEROFL06, "HEROFL06.ICN" }, { HEROLOGE, "HEROLOGE.ICN" },
96             { HEROLOGO, "HEROLOGO.ICN" }, { HISCORE, "HISCORE.ICN" },   { HOURGLAS, "HOURGLAS.ICN" }, { HSBKG, "HSBKG.ICN" },       { HSBTNS, "HSBTNS.ICN" },
97             { HSICONS, "HSICONS.ICN" },   { HYDRA, "HYDRA.ICN" },       { HYPNOTIZ, "HYPNOTIZ.ICN" }, { ICECLOUD, "ICECLOUD.ICN" }, { KEEP, "KEEP.ICN" },
98             { KNGT32, "KNGT32.ICN" },     { LETTER12, "LETTER12.ICN" }, { LETTER4, "LETTER4.ICN" },   { LETTER6, "LETTER6.ICN" },   { LGNDXTRA, "LGNDXTRA.ICN" },
99             { LGNDXTRE, "LGNDXTRE.ICN" }, { LICH2, "LICH2.ICN" },       { LICHCLOD, "LICHCLOD.ICN" }, { LICH, "LICH.ICN" },         { LICH_MSL, "LICH_MSL.ICN" },
100             { LISTBOX, "LISTBOX.ICN" },   { LISTBOXS, "LISTBOXS.ICN" }, { LOCATORE, "LOCATORE.ICN" }, { LOCATORS, "LOCATORS.ICN" }, { MAGE1, "MAGE1.ICN" },
101             { MAGE2, "MAGE2.ICN" },       { MAGEGLDB, "MAGEGLDB.ICN" }, { MAGEGLDK, "MAGEGLDK.ICN" }, { MAGEGLDN, "MAGEGLDN.ICN" }, { MAGEGLDS, "MAGEGLDS.ICN" },
102             { MAGEGLDW, "MAGEGLDW.ICN" }, { MAGEGLDZ, "MAGEGLDZ.ICN" }, { MAGIC01, "MAGIC01.ICN" },   { MAGIC02, "MAGIC02.ICN" },   { MAGIC03, "MAGIC03.ICN" },
103             { MAGIC04, "MAGIC04.ICN" },   { MAGIC06, "MAGIC06.ICN" },   { MAGIC07, "MAGIC07.ICN" },   { MAGIC08, "MAGIC08.ICN" },   { MANA, "MANA.ICN" },
104             { MEDUSA, "MEDUSA.ICN" },     { METEOR, "METEOR.ICN" },     { MINICAPT, "MINICAPT.ICN" }, { MINIHERO, "MINIHERO.ICN" }, { MINILKMR, "MINILKMR.ICN" },
105             { MINIMON, "MINIMON.ICN" },   { MINIPORT, "MINIPORT.ICN" }, { MINISS, "MINISS.ICN" },     { MINITOWN, "MINITOWN.ICN" }, { MINOTAU2, "MINOTAU2.ICN" },
106             { MINOTAUR, "MINOTAUR.ICN" }, { MISC12, "MISC12.ICN" },     { MISC4, "MISC4.ICN" },       { MISC6, "MISC6.ICN" },       { MOATPART, "MOATPART.ICN" },
107             { MOATWHOL, "MOATWHOL.ICN" }, { MOBILITY, "MOBILITY.ICN" }, { MONH0000, "MONH0000.ICN" }, { MONH0001, "MONH0001.ICN" }, { MONH0002, "MONH0002.ICN" },
108             { MONH0003, "MONH0003.ICN" }, { MONH0004, "MONH0004.ICN" }, { MONH0005, "MONH0005.ICN" }, { MONH0006, "MONH0006.ICN" }, { MONH0007, "MONH0007.ICN" },
109             { MONH0008, "MONH0008.ICN" }, { MONH0009, "MONH0009.ICN" }, { MONH0010, "MONH0010.ICN" }, { MONH0011, "MONH0011.ICN" }, { MONH0012, "MONH0012.ICN" },
110             { MONH0013, "MONH0013.ICN" }, { MONH0014, "MONH0014.ICN" }, { MONH0015, "MONH0015.ICN" }, { MONH0016, "MONH0016.ICN" }, { MONH0017, "MONH0017.ICN" },
111             { MONH0018, "MONH0018.ICN" }, { MONH0019, "MONH0019.ICN" }, { MONH0020, "MONH0020.ICN" }, { MONH0021, "MONH0021.ICN" }, { MONH0022, "MONH0022.ICN" },
112             { MONH0023, "MONH0023.ICN" }, { MONH0024, "MONH0024.ICN" }, { MONH0025, "MONH0025.ICN" }, { MONH0026, "MONH0026.ICN" }, { MONH0027, "MONH0027.ICN" },
113             { MONH0028, "MONH0028.ICN" }, { MONH0029, "MONH0029.ICN" }, { MONH0030, "MONH0030.ICN" }, { MONH0031, "MONH0031.ICN" }, { MONH0032, "MONH0032.ICN" },
114             { MONH0033, "MONH0033.ICN" }, { MONH0034, "MONH0034.ICN" }, { MONH0035, "MONH0035.ICN" }, { MONH0036, "MONH0036.ICN" }, { MONH0037, "MONH0037.ICN" },
115             { MONH0038, "MONH0038.ICN" }, { MONH0039, "MONH0039.ICN" }, { MONH0040, "MONH0040.ICN" }, { MONH0041, "MONH0041.ICN" }, { MONH0042, "MONH0042.ICN" },
116             { MONH0043, "MONH0043.ICN" }, { MONH0044, "MONH0044.ICN" }, { MONH0045, "MONH0045.ICN" }, { MONH0046, "MONH0046.ICN" }, { MONH0047, "MONH0047.ICN" },
117             { MONH0048, "MONH0048.ICN" }, { MONH0049, "MONH0049.ICN" }, { MONH0050, "MONH0050.ICN" }, { MONH0051, "MONH0051.ICN" }, { MONH0052, "MONH0052.ICN" },
118             { MONH0053, "MONH0053.ICN" }, { MONH0054, "MONH0054.ICN" }, { MONH0055, "MONH0055.ICN" }, { MONH0056, "MONH0056.ICN" }, { MONH0057, "MONH0057.ICN" },
119             { MONH0058, "MONH0058.ICN" }, { MONH0059, "MONH0059.ICN" }, { MONH0060, "MONH0060.ICN" }, { MONH0061, "MONH0061.ICN" }, { MONH0062, "MONH0062.ICN" },
120             { MONH0063, "MONH0063.ICN" }, { MONH0064, "MONH0064.ICN" }, { MONH0065, "MONH0065.ICN" }, { MONS32, "MONS32.ICN" },     { MORALEB, "MORALEB.ICN" },
121             { MORALEG, "MORALEG.ICN" },   { MTNCRCK, "MTNCRCK.ICN" },   { MTNDIRT, "MTNDIRT.ICN" },   { MTNDSRT, "MTNDSRT.ICN" },   { MTNGRAS, "MTNGRAS.ICN" },
122             { MTNLAVA, "MTNLAVA.ICN" },   { MTNMULT, "MTNMULT.ICN" },   { MTNSNOW, "MTNSNOW.ICN" },   { MTNSWMP, "MTNSWMP.ICN" },   { MUMMY2, "MUMMY2.ICN" },
123             { MUMMYW, "MUMMYW.ICN" },     { NECR32, "NECR32.ICN" },     { NETBOX, "NETBOX.ICN" },     { NGEXTRA, "NGEXTRA.ICN" },   { NGHSBKG, "NGHSBKG.ICN" },
124             { NGMPBKG, "NGMPBKG.ICN" },   { NGSPBKG, "NGSPBKG.ICN" },   { NOMAD, "NOMAD.ICN" },       { O_BFLG32, "O-BFLG32.ICN" }, { OBJNARTI, "OBJNARTI.ICN" },
125             { OBJNCRCK, "OBJNCRCK.ICN" }, { OBJNDIRT, "OBJNDIRT.ICN" }, { OBJNDSRT, "OBJNDSRT.ICN" }, { OBJNGRA2, "OBJNGRA2.ICN" }, { OBJNGRAS, "OBJNGRAS.ICN" },
126             { OBJNHAUN, "OBJNHAUN.ICN" }, { OBJNLAV2, "OBJNLAV2.ICN" }, { OBJNLAV3, "OBJNLAV3.ICN" }, { OBJNLAVA, "OBJNLAVA.ICN" }, { OBJNMUL2, "OBJNMUL2.ICN" },
127             { OBJNMULT, "OBJNMULT.ICN" }, { OBJNRSRC, "OBJNRSRC.ICN" }, { OBJNSNOW, "OBJNSNOW.ICN" }, { OBJNSWMP, "OBJNSWMP.ICN" }, { OBJNTOWN, "OBJNTOWN.ICN" },
128             { OBJNTWBA, "OBJNTWBA.ICN" }, { OBJNTWRD, "OBJNTWRD.ICN" }, { OBJNTWSH, "OBJNTWSH.ICN" }, { OBJNWAT2, "OBJNWAT2.ICN" }, { OBJNWATR, "OBJNWATR.ICN" },
129             { OBJNXTRA, "OBJNXTRA.ICN" }, { OBJPALET, "OBJPALET.ICN" }, { O_FLAG32, "O-FLAG32.ICN" }, { OGRE2, "OGRE2.ICN" },       { OGRE, "OGRE.ICN" },
130             { ORC2, "ORC2.ICN" },         { ORC, "ORC.ICN" },           { ORC__MSL, "ORC__MSL.ICN" }, { OVERBACK, "OVERBACK.ICN" }, { OVERLAY, "OVERLAY.ICN" },
131             { OVERVIEW, "OVERVIEW.ICN" }, { PALADIN2, "PALADIN2.ICN" }, { PALADIN, "PALADIN.ICN" },   { PARALYZE, "PARALYZE.ICN" }, { P_BFLG32, "P-BFLG32.ICN" },
132             { PEASANT, "PEASANT.ICN" },   { P_FLAG32, "P-FLAG32.ICN" }, { PHOENIX, "PHOENIX.ICN" },   { PHYSICAL, "PHYSICAL.ICN" }, { PIKEMAN2, "PIKEMAN2.ICN" },
133             { PIKEMAN, "PIKEMAN.ICN" },   { PORT0000, "PORT0000.ICN" }, { PORT0001, "PORT0001.ICN" }, { PORT0002, "PORT0002.ICN" }, { PORT0003, "PORT0003.ICN" },
134             { PORT0004, "PORT0004.ICN" }, { PORT0005, "PORT0005.ICN" }, { PORT0006, "PORT0006.ICN" }, { PORT0007, "PORT0007.ICN" }, { PORT0008, "PORT0008.ICN" },
135             { PORT0009, "PORT0009.ICN" }, { PORT0010, "PORT0010.ICN" }, { PORT0011, "PORT0011.ICN" }, { PORT0012, "PORT0012.ICN" }, { PORT0013, "PORT0013.ICN" },
136             { PORT0014, "PORT0014.ICN" }, { PORT0015, "PORT0015.ICN" }, { PORT0016, "PORT0016.ICN" }, { PORT0017, "PORT0017.ICN" }, { PORT0018, "PORT0018.ICN" },
137             { PORT0019, "PORT0019.ICN" }, { PORT0020, "PORT0020.ICN" }, { PORT0021, "PORT0021.ICN" }, { PORT0022, "PORT0022.ICN" }, { PORT0023, "PORT0023.ICN" },
138             { PORT0024, "PORT0024.ICN" }, { PORT0025, "PORT0025.ICN" }, { PORT0026, "PORT0026.ICN" }, { PORT0027, "PORT0027.ICN" }, { PORT0028, "PORT0028.ICN" },
139             { PORT0029, "PORT0029.ICN" }, { PORT0030, "PORT0030.ICN" }, { PORT0031, "PORT0031.ICN" }, { PORT0032, "PORT0032.ICN" }, { PORT0033, "PORT0033.ICN" },
140             { PORT0034, "PORT0034.ICN" }, { PORT0035, "PORT0035.ICN" }, { PORT0036, "PORT0036.ICN" }, { PORT0037, "PORT0037.ICN" }, { PORT0038, "PORT0038.ICN" },
141             { PORT0039, "PORT0039.ICN" }, { PORT0040, "PORT0040.ICN" }, { PORT0041, "PORT0041.ICN" }, { PORT0042, "PORT0042.ICN" }, { PORT0043, "PORT0043.ICN" },
142             { PORT0044, "PORT0044.ICN" }, { PORT0045, "PORT0045.ICN" }, { PORT0046, "PORT0046.ICN" }, { PORT0047, "PORT0047.ICN" }, { PORT0048, "PORT0048.ICN" },
143             { PORT0049, "PORT0049.ICN" }, { PORT0050, "PORT0050.ICN" }, { PORT0051, "PORT0051.ICN" }, { PORT0052, "PORT0052.ICN" }, { PORT0053, "PORT0053.ICN" },
144             { PORT0054, "PORT0054.ICN" }, { PORT0055, "PORT0055.ICN" }, { PORT0056, "PORT0056.ICN" }, { PORT0057, "PORT0057.ICN" }, { PORT0058, "PORT0058.ICN" },
145             { PORT0059, "PORT0059.ICN" }, { PORT0060, "PORT0060.ICN" }, { PORT0061, "PORT0061.ICN" }, { PORT0062, "PORT0062.ICN" }, { PORT0063, "PORT0063.ICN" },
146             { PORT0064, "PORT0064.ICN" }, { PORT0065, "PORT0065.ICN" }, { PORT0066, "PORT0066.ICN" }, { PORT0067, "PORT0067.ICN" }, { PORT0068, "PORT0068.ICN" },
147             { PORT0069, "PORT0069.ICN" }, { PORT0070, "PORT0070.ICN" }, { PORT0090, "PORT0090.ICN" }, { PORT0091, "PORT0091.ICN" }, { PORT0092, "PORT0092.ICN" },
148             { PORT0093, "PORT0093.ICN" }, { PORT0094, "PORT0094.ICN" }, { PORT0095, "PORT0095.ICN" }, { PORTCFLG, "PORTCFLG.ICN" }, { PORTMEDI, "PORTMEDI.ICN" },
149             { PORTXTRA, "PORTXTRA.ICN" }, { PRIMSKIL, "PRIMSKIL.ICN" }, { PUZZLE, "PUZZLE.ICN" },     { QWIKHERO, "QWIKHERO.ICN" }, { QWIKINFO, "QWIKINFO.ICN" },
150             { QWIKTOWN, "QWIKTOWN.ICN" }, { RADAR, "RADAR.ICN" },       { R_BFLG32, "R-BFLG32.ICN" }, { RECR2BKG, "RECR2BKG.ICN" }, { RECRBKG, "RECRBKG.ICN" },
151             { RECRUIT, "RECRUIT.ICN" },   { REDBACK, "REDBACK.ICN" },   { REDDEATH, "REDDEATH.ICN" }, { REDFIRE, "REDFIRE.ICN" },   { REQBKG, "REQBKG.ICN" },
152             { REQSBKG, "REQSBKG.ICN" },   { REQUEST, "REQUEST.ICN" },   { REQUESTS, "REQUESTS.ICN" }, { RESOURCE, "RESOURCE.ICN" }, { RESSMALL, "RESSMALL.ICN" },
153             { R_FLAG32, "R-FLAG32.ICN" }, { ROAD, "ROAD.ICN" },         { ROC, "ROC.ICN" },           { ROGUE, "ROGUE.ICN" },       { ROUTE, "ROUTE.ICN" },
154             { SCENIBKG, "SCENIBKG.ICN" }, { SCROLL2, "SCROLL2.ICN" },   { SCROLLCN, "SCROLLCN.ICN" }, { SCROLLE, "SCROLLE.ICN" },   { SCROLL, "SCROLL.ICN" },
155             { SECSKILL, "SECSKILL.ICN" }, { SHADOW32, "SHADOW32.ICN" }, { SHIELD, "SHIELD.ICN" },     { SHNGANIM, "SHNGANIM.ICN" }, { SKELETON, "SKELETON.ICN" },
156             { SMALCLOD, "SMALCLOD.ICN" }, { SMALFONT, "SMALFONT.ICN" }, { SMALLBAR, "SMALLBAR.ICN" }, { SORC32, "SORC32.ICN" },     { SPANBKGE, "SPANBKGE.ICN" },
157             { SPANBKG, "SPANBKG.ICN" },   { SPANBTNE, "SPANBTNE.ICN" }, { SPANBTN, "SPANBTN.ICN" },   { SPANEL, "SPANEL.ICN" },     { SPARKS, "SPARKS.ICN" },
158             { SPELCO, "SPELCO.ICN" },     { SPELLINF, "SPELLINF.ICN" }, { SPELLINL, "SPELLINL.ICN" }, { SPELLS, "SPELLS.ICN" },     { SPRITE, "SPRITE.ICN" },
159             { STELSKIN, "STELSKIN.ICN" }, { STONBACK, "STONBACK.ICN" }, { STONBAKE, "STONBAKE.ICN" }, { STONEBAK, "STONEBAK.ICN" }, { STONEBK2, "STONEBK2.ICN" },
160             { STONSKIN, "STONSKIN.ICN" }, { STORM, "STORM.ICN" },       { STREAM, "STREAM.ICN" },     { STRIP, "STRIP.ICN" },       { SUNMOONE, "SUNMOONE.ICN" },
161             { SUNMOON, "SUNMOON.ICN" },   { SURDRBKE, "SURDRBKE.ICN" }, { SURDRBKG, "SURDRBKG.ICN" }, { SURRENDE, "SURRENDE.ICN" }, { SURRENDR, "SURRENDR.ICN" },
162             { SWAPBTN, "SWAPBTN.ICN" },   { SWAPWIN, "SWAPWIN.ICN" },   { SWORDSM2, "SWORDSM2.ICN" }, { SWORDSMN, "SWORDSMN.ICN" }, { SYSTEME, "SYSTEME.ICN" },
163             { SYSTEM, "SYSTEM.ICN" },     { TAVWIN, "TAVWIN.ICN" },     { TENT, "TENT.ICN" },         { TERRAINS, "TERRAINS.ICN" }, { TEXTBACK, "TEXTBACK.ICN" },
164             { TEXTBAK2, "TEXTBAK2.ICN" }, { TEXTBAR, "TEXTBAR.ICN" },   { TITANBLA, "TITANBLA.ICN" }, { TITANBLU, "TITANBLU.ICN" }, { TITANMSL, "TITANMSL.ICN" },
165             { TOWNBKG0, "TOWNBKG0.ICN" }, { TOWNBKG1, "TOWNBKG1.ICN" }, { TOWNBKG2, "TOWNBKG2.ICN" }, { TOWNBKG3, "TOWNBKG3.ICN" }, { TOWNBKG4, "TOWNBKG4.ICN" },
166             { TOWNBKG5, "TOWNBKG5.ICN" }, { TOWNFIX, "TOWNFIX.ICN" },   { TOWNNAME, "TOWNNAME.ICN" }, { TOWNWIND, "TOWNWIND.ICN" }, { TRADPOSE, "TRADPOSE.ICN" },
167             { TRADPOST, "TRADPOST.ICN" }, { TREASURY, "TREASURY.ICN" }, { TREDECI, "TREDECI.ICN" },   { TREEVIL, "TREEVIL.ICN" },   { TREFALL, "TREFALL.ICN" },
168             { TREFIR, "TREFIR.ICN" },     { TREJNGL, "TREJNGL.ICN" },   { TRESNOW, "TRESNOW.ICN" },   { TROLL2, "TROLL2.ICN" },     { TROLL, "TROLL.ICN" },
169             { TROLLMSL, "TROLLMSL.ICN" }, { TWNBBOAT, "TWNBBOAT.ICN" }, { TWNBCAPT, "TWNBCAPT.ICN" }, { TWNBCSTL, "TWNBCSTL.ICN" }, { TWNBDOCK, "TWNBDOCK.ICN" },
170             { TWNBDW_0, "TWNBDW_0.ICN" }, { TWNBDW_1, "TWNBDW_1.ICN" }, { TWNBDW_2, "TWNBDW_2.ICN" }, { TWNBDW_3, "TWNBDW_3.ICN" }, { TWNBDW_4, "TWNBDW_4.ICN" },
171             { TWNBDW_5, "TWNBDW_5.ICN" }, { TWNBEXT0, "TWNBEXT0.ICN" }, { TWNBEXT1, "TWNBEXT1.ICN" }, { TWNBEXT2, "TWNBEXT2.ICN" }, { TWNBEXT3, "TWNBEXT3.ICN" },
172             { TWNBLTUR, "TWNBLTUR.ICN" }, { TWNBMAGE, "TWNBMAGE.ICN" }, { TWNBMARK, "TWNBMARK.ICN" }, { TWNBMOAT, "TWNBMOAT.ICN" }, { TWNBRTUR, "TWNBRTUR.ICN" },
173             { TWNBSPEC, "TWNBSPEC.ICN" }, { TWNBSTAT, "TWNBSTAT.ICN" }, { TWNBTENT, "TWNBTENT.ICN" }, { TWNBTHIE, "TWNBTHIE.ICN" }, { TWNBTVRN, "TWNBTVRN.ICN" },
174             { TWNBUP_1, "TWNBUP_1.ICN" }, { TWNBUP_3, "TWNBUP_3.ICN" }, { TWNBUP_4, "TWNBUP_4.ICN" }, { TWNBWEL2, "TWNBWEL2.ICN" }, { TWNBWELL, "TWNBWELL.ICN" },
175             { TWNKBOAT, "TWNKBOAT.ICN" }, { TWNKCAPT, "TWNKCAPT.ICN" }, { TWNKCSTL, "TWNKCSTL.ICN" }, { TWNKDOCK, "TWNKDOCK.ICN" }, { TWNKDW_0, "TWNKDW_0.ICN" },
176             { TWNKDW_1, "TWNKDW_1.ICN" }, { TWNKDW_2, "TWNKDW_2.ICN" }, { TWNKDW_3, "TWNKDW_3.ICN" }, { TWNKDW_4, "TWNKDW_4.ICN" }, { TWNKDW_5, "TWNKDW_5.ICN" },
177             { TWNKEXT0, "TWNKEXT0.ICN" }, { TWNKEXT1, "TWNKEXT1.ICN" }, { TWNKEXT2, "TWNKEXT2.ICN" }, { TWNKLTUR, "TWNKLTUR.ICN" }, { TWNKMAGE, "TWNKMAGE.ICN" },
178             { TWNKMARK, "TWNKMARK.ICN" }, { TWNKMOAT, "TWNKMOAT.ICN" }, { TWNKRTUR, "TWNKRTUR.ICN" }, { TWNKSPEC, "TWNKSPEC.ICN" }, { TWNKSTAT, "TWNKSTAT.ICN" },
179             { TWNKTENT, "TWNKTENT.ICN" }, { TWNKTHIE, "TWNKTHIE.ICN" }, { TWNKTVRN, "TWNKTVRN.ICN" }, { TWNKUP_1, "TWNKUP_1.ICN" }, { TWNKUP_2, "TWNKUP_2.ICN" },
180             { TWNKUP_3, "TWNKUP_3.ICN" }, { TWNKUP_4, "TWNKUP_4.ICN" }, { TWNKUP_5, "TWNKUP_5.ICN" }, { TWNKWEL2, "TWNKWEL2.ICN" }, { TWNKWELL, "TWNKWELL.ICN" },
181             { TWNNBOAT, "TWNNBOAT.ICN" }, { TWNNCAPT, "TWNNCAPT.ICN" }, { TWNNCSTL, "TWNNCSTL.ICN" }, { TWNNDOCK, "TWNNDOCK.ICN" }, { TWNNDW_0, "TWNNDW_0.ICN" },
182             { TWNNDW_1, "TWNNDW_1.ICN" }, { TWNNDW_2, "TWNNDW_2.ICN" }, { TWNNDW_3, "TWNNDW_3.ICN" }, { TWNNDW_4, "TWNNDW_4.ICN" }, { TWNNDW_5, "TWNNDW_5.ICN" },
183             { TWNNEXT0, "TWNNEXT0.ICN" }, { TWNNLTUR, "TWNNLTUR.ICN" }, { TWNNMAGE, "TWNNMAGE.ICN" }, { TWNNMARK, "TWNNMARK.ICN" }, { TWNNMOAT, "TWNNMOAT.ICN" },
184             { TWNNRTUR, "TWNNRTUR.ICN" }, { TWNNSPEC, "TWNNSPEC.ICN" }, { TWNNSTAT, "TWNNSTAT.ICN" }, { TWNNTENT, "TWNNTENT.ICN" }, { TWNNTHIE, "TWNNTHIE.ICN" },
185             { TWNNTVRN, "TWNNTVRN.ICN" }, { TWNNUP_1, "TWNNUP_1.ICN" }, { TWNNUP_2, "TWNNUP_2.ICN" }, { TWNNUP_3, "TWNNUP_3.ICN" }, { TWNNUP_4, "TWNNUP_4.ICN" },
186             { TWNNWEL2, "TWNNWEL2.ICN" }, { TWNNWELL, "TWNNWELL.ICN" }, { TWNSBOAT, "TWNSBOAT.ICN" }, { TWNSCAPT, "TWNSCAPT.ICN" }, { TWNSCSTL, "TWNSCSTL.ICN" },
187             { TWNSDOCK, "TWNSDOCK.ICN" }, { TWNSDW_0, "TWNSDW_0.ICN" }, { TWNSDW_1, "TWNSDW_1.ICN" }, { TWNSDW_2, "TWNSDW_2.ICN" }, { TWNSDW_3, "TWNSDW_3.ICN" },
188             { TWNSDW_4, "TWNSDW_4.ICN" }, { TWNSDW_5, "TWNSDW_5.ICN" }, { TWNSEXT0, "TWNSEXT0.ICN" }, { TWNSEXT1, "TWNSEXT1.ICN" }, { TWNSLTUR, "TWNSLTUR.ICN" },
189             { TWNSMAGE, "TWNSMAGE.ICN" }, { TWNSMARK, "TWNSMARK.ICN" }, { TWNSMOAT, "TWNSMOAT.ICN" }, { TWNSRTUR, "TWNSRTUR.ICN" }, { TWNSSPEC, "TWNSSPEC.ICN" },
190             { TWNSSTAT, "TWNSSTAT.ICN" }, { TWNSTENT, "TWNSTENT.ICN" }, { TWNSTHIE, "TWNSTHIE.ICN" }, { TWNSTVRN, "TWNSTVRN.ICN" }, { TWNSUP_1, "TWNSUP_1.ICN" },
191             { TWNSUP_2, "TWNSUP_2.ICN" }, { TWNSUP_3, "TWNSUP_3.ICN" }, { TWNSWEL2, "TWNSWEL2.ICN" }, { TWNSWELL, "TWNSWELL.ICN" }, { TWNWBOAT, "TWNWBOAT.ICN" },
192             { TWNWCAPT, "TWNWCAPT.ICN" }, { TWNWCSTL, "TWNWCSTL.ICN" }, { TWNWDOCK, "TWNWDOCK.ICN" }, { TWNWDW_0, "TWNWDW_0.ICN" }, { TWNWDW_1, "TWNWDW_1.ICN" },
193             { TWNWDW_2, "TWNWDW_2.ICN" }, { TWNWDW_3, "TWNWDW_3.ICN" }, { TWNWDW_4, "TWNWDW_4.ICN" }, { TWNWDW_5, "TWNWDW_5.ICN" }, { TWNWEXT0, "TWNWEXT0.ICN" },
194             { TWNWLTUR, "TWNWLTUR.ICN" }, { TWNWMAGE, "TWNWMAGE.ICN" }, { TWNWMARK, "TWNWMARK.ICN" }, { TWNWMOAT, "TWNWMOAT.ICN" }, { TWNWRTUR, "TWNWRTUR.ICN" },
195             { TWNWSPEC, "TWNWSPEC.ICN" }, { TWNWSTAT, "TWNWSTAT.ICN" }, { TWNWTENT, "TWNWTENT.ICN" }, { TWNWTHIE, "TWNWTHIE.ICN" }, { TWNWTVRN, "TWNWTVRN.ICN" },
196             { TWNWUP_3, "TWNWUP_3.ICN" }, { TWNWUP5B, "TWNWUP5B.ICN" }, { TWNWUP_5, "TWNWUP_5.ICN" }, { TWNWWEL2, "TWNWWEL2.ICN" }, { TWNWWELL, "TWNWWELL.ICN" },
197             { TWNZBOAT, "TWNZBOAT.ICN" }, { TWNZCAPT, "TWNZCAPT.ICN" }, { TWNZCSTL, "TWNZCSTL.ICN" }, { TWNZDOCK, "TWNZDOCK.ICN" }, { TWNZDW_0, "TWNZDW_0.ICN" },
198             { TWNZDW_1, "TWNZDW_1.ICN" }, { TWNZDW_2, "TWNZDW_2.ICN" }, { TWNZDW_3, "TWNZDW_3.ICN" }, { TWNZDW_4, "TWNZDW_4.ICN" }, { TWNZDW_5, "TWNZDW_5.ICN" },
199             { TWNZEXT0, "TWNZEXT0.ICN" }, { TWNZLTUR, "TWNZLTUR.ICN" }, { TWNZMAGE, "TWNZMAGE.ICN" }, { TWNZMARK, "TWNZMARK.ICN" }, { TWNZMOAT, "TWNZMOAT.ICN" },
200             { TWNZRTUR, "TWNZRTUR.ICN" }, { TWNZSPEC, "TWNZSPEC.ICN" }, { TWNZSTAT, "TWNZSTAT.ICN" }, { TWNZTENT, "TWNZTENT.ICN" }, { TWNZTHIE, "TWNZTHIE.ICN" },
201             { TWNZTVRN, "TWNZTVRN.ICN" }, { TWNZUP_2, "TWNZUP_2.ICN" }, { TWNZUP_4, "TWNZUP_4.ICN" }, { TWNZUP_5, "TWNZUP_5.ICN" }, { TWNZWEL2, "TWNZWEL2.ICN" },
202             { TWNZWELL, "TWNZWELL.ICN" }, { UNICORN, "UNICORN.ICN" },   { VAMPIRE2, "VAMPIRE2.ICN" }, { VAMPIRE, "VAMPIRE.ICN" },   { VGENBKGE, "VGENBKGE.ICN" },
203             { VGENBKG, "VGENBKG.ICN" },   { VIEW_ALL, "VIEW_ALL.ICN" }, { VIEWARME, "VIEWARME.ICN" }, { VIEWARMY, "VIEWARMY.ICN" }, { VIEWARSM, "VIEWARSM.ICN" },
204             { VIEWDDOR, "VIEWDDOR.ICN" }, { VIEWGEN, "VIEWGEN.ICN" },   { VIEWHROS, "VIEWHROS.ICN" }, { VIEWMINE, "VIEWMINE.ICN" }, { VIEWPUZL, "VIEWPUZL.ICN" },
205             { VIEWRSRC, "VIEWRSRC.ICN" }, { VIEWRTFX, "VIEWRTFX.ICN" }, { VIEWTWNS, "VIEWTWNS.ICN" }, { VIEWWRLD, "VIEWWRLD.ICN" }, { VWFLAG12, "VWFLAG12.ICN" },
206             { VWFLAG4, "VWFLAG4.ICN" },   { VWFLAG6, "VWFLAG6.ICN" },   { WELEM, "WELEM.ICN" },       { WELLBKG, "WELLBKG.ICN" },   { WELLXTRA, "WELLXTRA.ICN" },
207             { WINCMBBE, "WINCMBBE.ICN" }, { WINCMBTB, "WINCMBTB.ICN" }, { WINCMBT, "WINCMBT.ICN" },   { WINLOSEB, "WINLOSEB.ICN" }, { WINLOSEE, "WINLOSEE.ICN" },
208             { WINLOSE, "WINLOSE.ICN" },   { WOLF, "WOLF.ICN" },         { WRLK32, "WRLK32.ICN" },     { WZRD32, "WZRD32.ICN" },     { X_IVY, "X_IVY.ICN" },
209             { X_LOADCM, "X_LOADCM.ICN" }, { X_CMPBKG, "X_CMPBKG.ICN" }, { X_CMPBTN, "X_CMPBTN.ICN" }, { X_CMPEXT, "X_CMPEXT.ICN" }, { X_TRACK1, "X_TRACK1.ICN" },
210             { X_TRACK2, "X_TRACK2.ICN" }, { X_TRACK3, "X_TRACK3.ICN" }, { X_TRACK4, "X_TRACK4.ICN" }, { X_LOC1, "X_LOC1.ICN" },     { X_LOC2, "X_LOC2.ICN" },
211             { X_LOC3, "X_LOC3.ICN" },     { XPRIMARY, "XPRIMARY.ICN" }, { Y_BFLG32, "Y-BFLG32.ICN" }, { Y_FLAG32, "Y-FLAG32.ICN" }, { YINYANG, "YINYANG.ICN" },
212             { ZOMBIE2, "ZOMBIE2.ICN" },   { ZOMBIE, "ZOMBIE.ICN" } };
213 }
214 
GetString(int icn)215 const char * ICN::GetString( int icn )
216 {
217     return UNKNOWN <= icn && icn < LAST_VALID_FILE_ICN ? icnmap[icn].string : "CUSTOM";
218 }
219 
AnimationFrame(int icn,u32 start,u32 ticket,bool quantity)220 u32 ICN::AnimationFrame( int icn, u32 start, u32 ticket, bool quantity )
221 {
222     switch ( icn ) {
223     case TWNBBOAT:
224     case TWNKBOAT:
225     case TWNNBOAT:
226     case TWNSBOAT:
227     case TWNWBOAT:
228     case TWNZBOAT:
229         return 1 + ticket % 9;
230     case CMBTCAPB:
231     case CMBTCAPK:
232     case CMBTCAPN:
233     case CMBTCAPS:
234     case CMBTCAPW:
235     case CMBTCAPZ:
236         return 1 + ticket % 10;
237     case CMBTHROB:
238         return 1 + ticket % 18;
239     case CMBTHROK:
240         return 1 + ticket % 19;
241     case CMBTHRON:
242         return 1 + ticket % 19;
243     case CMBTHROS:
244         return 1 + ticket % 16;
245     case CMBTHROW:
246         return 1 + ticket % 16;
247     case CMBTHROZ:
248         return 1 + ticket % 18;
249     case HEROFL00:
250     case HEROFL01:
251     case HEROFL02:
252     case HEROFL03:
253     case HEROFL04:
254     case HEROFL05:
255     case HEROFL06:
256         return ticket % 5;
257     case TWNBDOCK:
258     case TWNKDOCK:
259     case TWNNDOCK:
260     case TWNSDOCK:
261     case TWNWDOCK:
262     case TWNZDOCK:
263     case TWNBEXT0:
264     case TWNKEXT0:
265     case TWNNEXT0:
266     case TWNSEXT0:
267     case TWNWEXT0:
268     case TWNZEXT0:
269     case TWNBCAPT:
270     case TWNBDW_3:
271     case TWNBDW_4:
272     case TWNBDW_5:
273     case TWNBEXT1:
274     case TWNBMOAT:
275     case TWNBUP_3:
276     case TWNBUP_4:
277     case TWNKCSTL:
278     case TWNKDW_0:
279     case TWNKLTUR:
280     case TWNKRTUR:
281     case TWNKTHIE:
282     case TWNKTVRN:
283     case TWNNCSTL:
284     case TWNNDW_2:
285     case TWNNUP_2:
286     case TWNSCAPT:
287     case TWNSCSTL:
288     case TWNSDW_0:
289     case TWNSDW_1:
290     case TWNSEXT1:
291     case TWNSTHIE:
292     case TWNSTVRN:
293     case TWNSUP_1:
294     case TWNSWEL2:
295     case TWNWCAPT:
296     case TWNWCSTL:
297     case TWNWMOAT:
298     case TWNZCSTL:
299     case TWNZDW_0:
300     case TWNZDW_2:
301     case TWNZTHIE:
302     case TWNZUP_2:
303         return 1 + ticket % 5;
304     case TWNBCSTL:
305     case TWNKDW_2:
306     case TWNKUP_2:
307     case TWNNDW_5:
308     case TWNNWEL2:
309     case TWNWDW_0:
310     case TWNWWEL2:
311     case TWNZTVRN:
312         return 1 + ticket % 6;
313     case TWNKDW_4:
314     case TWNKUP_4:
315         return 1 + ticket % 7;
316     case TAVWIN:
317         return 2 + ticket % 20;
318     case CMBTLOS1:
319         return 1 + ticket % 30;
320     case CMBTLOS2:
321         return 1 + ticket % 29;
322     case CMBTLOS3:
323         return 1 + ticket % 22;
324     case CMBTFLE1:
325         return 1 + ticket % 43;
326     case CMBTFLE2:
327         return 1 + ticket % 26;
328     case CMBTFLE3:
329         return 1 + ticket % 25;
330     case CMBTSURR:
331         return 1 + ticket % 20;
332     case WINCMBT:
333         return 1 + ticket % 20;
334     case MINIMON:
335         return start + 1 + ticket % 6;
336     case TWNNMAGE:
337         return start + 1 + ticket % 5;
338     case TWNBMAGE:
339         return 4 == start ? start + 1 + ticket % 8 : 0;
340     case SHNGANIM:
341         return 1 + ticket % 39;
342     case BTNSHNGL:
343         return start + ticket % 4;
344     case OBJNHAUN:
345         return ticket % 15;
346     case OBJNWATR:
347         switch ( start ) {
348         // buttle
349         case 0x00:
350             return start + ( ticket % 11 ) + 1;
351         // shadow
352         case 0x0C:
353         // chest
354         case 0x13:
355         // shadow
356         case 0x26:
357         // flotsam
358         case 0x2D:
359         // unkn
360         case 0x37:
361         // boat
362         case 0x3E:
363         // waves
364         case 0x45:
365         // seaweed
366         case 0x4C:
367         case 0x53:
368         case 0x5A:
369         case 0x61:
370         case 0x68:
371         // sailor-man
372         case 0x6F:
373         // shadow
374         case 0xBC:
375         // buoy
376         case 0xC3:
377         // broken ship (right)
378         case 0xE2:
379         case 0xE9:
380         case 0xF1:
381         case 0xF8:
382             return start + ( ticket % 6 ) + 1;
383         // seagull on stones
384         case 0x76:
385         case 0x86:
386         case 0x96:
387         case 0xA6:
388             return start + ( ticket % 15 ) + 1;
389         // whirlpool
390         case 0xCA:
391         case 0xCE:
392         case 0xD2:
393         case 0xD6:
394         case 0xDA:
395         case 0xDE:
396             return start + ( ticket % 3 ) + 1;
397         default:
398             return 0;
399         }
400     case OBJNWAT2:
401         switch ( start ) {
402         // sail broken ship (left)
403         case 0x03:
404         case 0x0C:
405             return start + ( ticket % 6 ) + 1;
406         default:
407             return 0;
408         }
409     case OBJNCRCK:
410         switch ( start ) {
411         // pool of oil
412         case 0x50:
413         case 0x5B:
414         case 0x66:
415         case 0x71:
416         case 0x7C:
417         case 0x89:
418         case 0x94:
419         case 0x9F:
420         case 0xAA:
421         // smoke from chimney
422         case 0xBE:
423         // shadow smoke
424         case 0xCA:
425             return start + ( ticket % 10 ) + 1;
426         default:
427             return 0;
428         }
429     case OBJNDIRT:
430         switch ( start ) {
431         // mill
432         case 0x99:
433         case 0x9D:
434         case 0xA1:
435         case 0xA5:
436         case 0xA9:
437         case 0xAD:
438         case 0xB1:
439         case 0xB5:
440         case 0xB9:
441         case 0xBD:
442             return start + ( ticket % 3 ) + 1;
443         default:
444             return 0;
445         }
446     case OBJNDSRT:
447         switch ( start ) {
448         // campfire
449         case 0x36:
450         case 0x3D:
451             return start + ( ticket % 6 ) + 1;
452         default:
453             return 0;
454         }
455     case OBJNGRA2:
456         switch ( start ) {
457         // mill
458         case 0x17:
459         case 0x1B:
460         case 0x1F:
461         case 0x23:
462         case 0x27:
463         case 0x2B:
464         case 0x2F:
465         case 0x33:
466         case 0x37:
467         case 0x3B:
468             return start + ( ticket % 3 ) + 1;
469         // smoke from chimney
470         case 0x3F:
471         case 0x46:
472         case 0x4D:
473         // archerhouse
474         case 0x54:
475         // smoke from chimney
476         case 0x5D:
477         case 0x64:
478         // shadow smoke
479         case 0x6B:
480         // peasanthunt
481         case 0x72:
482             return start + ( ticket % 6 ) + 1;
483         default:
484             return 0;
485         }
486     case OBJNLAV2:
487         switch ( start ) {
488         // middle volcano
489         case 0x00:
490         // shadow
491         case 0x07:
492         case 0x0E:
493         // lava
494         case 0x15:
495             return start + ( ticket % 6 ) + 1;
496         // small volcano
497         // shadow
498         case 0x21:
499         case 0x2C:
500         // lava
501         case 0x37:
502         case 0x43:
503             return start + ( ticket % 10 ) + 1;
504         default:
505             return 0;
506         }
507     case OBJNLAV3:
508         // big volcano
509         switch ( start ) {
510         // smoke
511         case 0x00:
512         case 0x0F:
513         case 0x1E:
514         case 0x2D:
515         case 0x3C:
516         case 0x4B:
517         case 0x5A:
518         case 0x69:
519         case 0x87:
520         case 0x96:
521         case 0xA5:
522         // shadow
523         case 0x78:
524         case 0xB4:
525         case 0xC3:
526         case 0xD2:
527         case 0xE1:
528             return start + ( ticket % 14 ) + 1;
529         default:
530             return 0;
531         }
532     case OBJNLAVA:
533         switch ( start ) {
534         // shadow of lava
535         case 0x4E:
536         case 0x58:
537         case 0x62:
538             return start + ( ticket % 9 ) + 1;
539         default:
540             return 0;
541         }
542     case OBJNMUL2:
543         switch ( start ) {
544         // lighthouse
545         case 0x3D:
546             return start + ( ticket % 9 ) + 1;
547         // alchemytower
548         case 0x1B:
549         // watermill
550         case 0x53:
551         case 0x5A:
552         case 0x62:
553         case 0x69:
554         // fire in wagoncamp
555         case 0x81:
556         // smoke smithy (2 chimney)
557         case 0xA6:
558         // smoke smithy (1 chimney)
559         case 0xAD:
560         // shadow smoke
561         case 0xB4:
562             return start + ( ticket % 6 ) + 1;
563         // magic garden
564         case 0xBE:
565             return quantity ? start + ( ticket % 6 ) + 1 : start + 7;
566         default:
567             return 0;
568         }
569     case OBJNMULT:
570         switch ( start ) {
571         // smoke
572         case 0x05:
573         // shadow
574         case 0x0F:
575         case 0x19:
576             return start + ( ticket % 9 ) + 1;
577         // smoke
578         case 0x24:
579         // shadow
580         case 0x2D:
581             return start + ( ticket % 8 ) + 1;
582         // smoke
583         case 0x5A:
584         // shadow
585         case 0x61:
586         case 0x68:
587         case 0x7C:
588         // campfire
589         case 0x83:
590             return start + ( ticket % 6 ) + 1;
591         default:
592             return 0;
593         }
594     case OBJNSNOW:
595         switch ( start ) {
596         // firecamp
597         case 0x04:
598         // alchemytower
599         case 0x97:
600         // watermill
601         case 0xA2:
602         case 0xA9:
603         case 0xB1:
604         case 0xB8:
605             return start + ( ticket % 6 ) + 1;
606         // mill
607         case 0x60:
608         case 0x64:
609         case 0x68:
610         case 0x6C:
611         case 0x70:
612         case 0x74:
613         case 0x78:
614         case 0x7C:
615         case 0x80:
616         case 0x84:
617             return start + ( ticket % 3 ) + 1;
618         default:
619             return 0;
620         }
621     case OBJNSWMP:
622         switch ( start ) {
623         // shadow
624         case 0x00:
625         case 0x0E:
626         case 0x2B:
627         // smoke
628         case 0x07:
629         case 0x22:
630         case 0x33:
631         // light in window
632         case 0x16:
633         case 0x3A:
634         case 0x43:
635         case 0x4A:
636             return start + ( ticket % 6 ) + 1;
637         default:
638             return 0;
639         }
640     // extra objects for loyalty version
641     case X_LOC1:
642         if ( Settings::Get().isPriceOfLoyaltySupported() )
643             switch ( start ) {
644             // alchemist tower
645             case 0x04:
646             case 0x0D:
647             case 0x16:
648             // arena
649             case 0x1F:
650             case 0x28:
651             case 0x32:
652             case 0x3B:
653             // earth altar
654             case 0x55:
655             case 0x5E:
656             case 0x67:
657                 return start + ( ticket % 8 ) + 1;
658             default:
659                 return 0;
660             }
661         break;
662     // extra objects for loyalty version
663     case X_LOC2:
664         if ( Settings::Get().isPriceOfLoyaltySupported() )
665             switch ( start ) {
666             // mermaid
667             case 0x0A:
668             case 0x13:
669             case 0x1C:
670             case 0x25:
671             // sirens
672             case 0x2F:
673             case 0x38:
674             case 0x41:
675             case 0x4A:
676             case 0x53:
677             case 0x5C:
678             case 0x66:
679                 return start + ( ticket % 8 ) + 1;
680             default:
681                 return 0;
682             }
683         break;
684 
685     // extra objects for loyalty version
686     case X_LOC3:
687         if ( Settings::Get().isPriceOfLoyaltySupported() )
688             switch ( start ) {
689             // hut magi
690             case 0x00:
691             case 0x0A:
692             case 0x14:
693             // eye magi
694             case 0x20:
695             case 0x29:
696             case 0x32:
697                 return start + ( ticket % 8 ) + 1;
698             // barrier
699             case 0x3C:
700             case 0x42:
701             case 0x48:
702             case 0x4E:
703             case 0x54:
704             case 0x5A:
705             case 0x60:
706             case 0x66:
707                 return start + ( ticket % 4 ) + 1;
708             default:
709                 return 0;
710             }
711         break;
712 
713     default:
714         break;
715     }
716     return 0;
717 }
718 
PORTxxxx(int heroId)719 int ICN::PORTxxxx( int heroId )
720 {
721     switch ( heroId ) {
722     case Heroes::LORDKILBURN:
723         return ICN::PORT0000;
724     case Heroes::SIRGALLANTH:
725         return ICN::PORT0001;
726     case Heroes::ECTOR:
727         return ICN::PORT0002;
728     case Heroes::GVENNETH:
729         return ICN::PORT0003;
730     case Heroes::TYRO:
731         return ICN::PORT0004;
732     case Heroes::AMBROSE:
733         return ICN::PORT0005;
734     case Heroes::RUBY:
735         return ICN::PORT0006;
736     case Heroes::MAXIMUS:
737         return ICN::PORT0007;
738     case Heroes::DIMITRY:
739         return ICN::PORT0008;
740     case Heroes::THUNDAX:
741         return ICN::PORT0009;
742     case Heroes::FINEOUS:
743         return ICN::PORT0010;
744     case Heroes::JOJOSH:
745         return ICN::PORT0011;
746     case Heroes::CRAGHACK:
747         return ICN::PORT0012;
748     case Heroes::JEZEBEL:
749         return ICN::PORT0013;
750     case Heroes::JACLYN:
751         return ICN::PORT0014;
752     case Heroes::ERGON:
753         return ICN::PORT0015;
754     case Heroes::TSABU:
755         return ICN::PORT0016;
756     case Heroes::ATLAS:
757         return ICN::PORT0017;
758     case Heroes::ASTRA:
759         return ICN::PORT0018;
760     case Heroes::NATASHA:
761         return ICN::PORT0019;
762     case Heroes::TROYAN:
763         return ICN::PORT0020;
764     case Heroes::VATAWNA:
765         return ICN::PORT0021;
766     case Heroes::REBECCA:
767         return ICN::PORT0022;
768     case Heroes::GEM:
769         return ICN::PORT0023;
770     case Heroes::ARIEL:
771         return ICN::PORT0024;
772     case Heroes::CARLAWN:
773         return ICN::PORT0025;
774     case Heroes::LUNA:
775         return ICN::PORT0026;
776     case Heroes::ARIE:
777         return ICN::PORT0027;
778     case Heroes::ALAMAR:
779         return ICN::PORT0028;
780     case Heroes::VESPER:
781         return ICN::PORT0029;
782     case Heroes::CRODO:
783         return ICN::PORT0030;
784     case Heroes::BAROK:
785         return ICN::PORT0031;
786     case Heroes::KASTORE:
787         return ICN::PORT0032;
788     case Heroes::AGAR:
789         return ICN::PORT0033;
790     case Heroes::FALAGAR:
791         return ICN::PORT0034;
792     case Heroes::WRATHMONT:
793         return ICN::PORT0035;
794     case Heroes::MYRA:
795         return ICN::PORT0036;
796     case Heroes::FLINT:
797         return ICN::PORT0037;
798     case Heroes::DAWN:
799         return ICN::PORT0038;
800     case Heroes::HALON:
801         return ICN::PORT0039;
802     case Heroes::MYRINI:
803         return ICN::PORT0040;
804     case Heroes::WILFREY:
805         return ICN::PORT0041;
806     case Heroes::SARAKIN:
807         return ICN::PORT0042;
808     case Heroes::KALINDRA:
809         return ICN::PORT0043;
810     case Heroes::MANDIGAL:
811         return ICN::PORT0044;
812     case Heroes::ZOM:
813         return ICN::PORT0045;
814     case Heroes::DARLANA:
815         return ICN::PORT0046;
816     case Heroes::ZAM:
817         return ICN::PORT0047;
818     case Heroes::RANLOO:
819         return ICN::PORT0048;
820     case Heroes::CHARITY:
821         return ICN::PORT0049;
822     case Heroes::RIALDO:
823         return ICN::PORT0050;
824     case Heroes::ROXANA:
825         return ICN::PORT0051;
826     case Heroes::SANDRO:
827         return ICN::PORT0052;
828     case Heroes::CELIA:
829         return ICN::PORT0053;
830     case Heroes::ROLAND:
831         return ICN::PORT0054;
832     case Heroes::CORLAGON:
833         return ICN::PORT0055;
834     case Heroes::ELIZA:
835         return ICN::PORT0056;
836     case Heroes::ARCHIBALD:
837         return ICN::PORT0057;
838     case Heroes::HALTON:
839         return ICN::PORT0058;
840     case Heroes::BAX:
841         return ICN::PORT0059;
842 
843     case Heroes::SOLMYR:
844         return ICN::PORT0060;
845     case Heroes::DAINWIN:
846         return ICN::PORT0061;
847     case Heroes::MOG:
848         return ICN::PORT0062;
849     case Heroes::UNCLEIVAN:
850         return ICN::PORT0063;
851     case Heroes::JOSEPH:
852         return ICN::PORT0064;
853     case Heroes::GALLAVANT:
854         return ICN::PORT0065;
855     case Heroes::ELDERIAN:
856         return ICN::PORT0066;
857     case Heroes::CEALLACH:
858         return ICN::PORT0067;
859     case Heroes::DRAKONIA:
860         return ICN::PORT0068;
861     case Heroes::MARTINE:
862         return ICN::PORT0069;
863     case Heroes::JARKONAS:
864         return ICN::PORT0070;
865 
866     case Heroes::DEBUG_HERO:
867         return ICN::PORT0059;
868 
869     default:
870         break;
871     }
872 
873     return ICN::UNKNOWN;
874 }
875 
HighlyObjectSprite(int icn,u32 index)876 bool ICN::HighlyObjectSprite( int icn, u32 index )
877 {
878     switch ( icn ) {
879     case OBJNDIRT:
880         // wind mill
881         if ( 154 <= index && index <= 160 )
882             return true;
883         break;
884 
885     case OBJNGRA2:
886         // wind mill
887         if ( 24 <= index && index <= 30 )
888             return true;
889         break;
890 
891     case OBJNLAV2:
892     case OBJNLAV3:
893         // fog lava
894         return true;
895 
896     case OBJNMUL2:
897         // dragon city
898         if ( 35 == index || 37 == index || 38 == index || 40 == index || 41 == index )
899             return true;
900         // ligth
901         if ( 59 == index )
902             return true;
903         // water mill
904         if ( 82 == index )
905             return true;
906         break;
907 
908     case OBJNMULT:
909         // fort
910         if ( 36 <= index && index <= 44 )
911             return true;
912         // tree
913         if ( 117 == index || 118 == index )
914             return true;
915         break;
916 
917     case OBJNSNOW:
918         // wind mill
919         if ( 97 <= index && index <= 103 )
920             return true;
921         // water mill
922         if ( 161 == index )
923             return true;
924         break;
925 
926     case OBJNSWMP:
927         //
928         if ( 35 <= index && index <= 42 )
929             return true;
930         break;
931 
932     case OBJNTOWN:
933         if ( 1 <= index && index <= 5 )
934             return true;
935         if ( 32 <= index && index <= 37 )
936             return true;
937         if ( 64 <= index && index <= 69 )
938             return true;
939         if ( 96 <= index && index <= 101 )
940             return true;
941         if ( 128 <= index && index <= 133 )
942             return true;
943         if ( 160 <= index && index <= 165 )
944             return true;
945         break;
946 
947     default:
948         break;
949     }
950     return false;
951 }
952 
Get4Captain(int race)953 int ICN::Get4Captain( int race )
954 {
955     switch ( race ) {
956     case Race::BARB:
957         return CSTLCAPB;
958     case Race::KNGT:
959         return CSTLCAPK;
960     case Race::NECR:
961         return CSTLCAPN;
962     case Race::SORC:
963         return CSTLCAPS;
964     case Race::WRLK:
965         return CSTLCAPW;
966     case Race::WZRD:
967         return CSTLCAPZ;
968     default:
969         break;
970     }
971 
972     return UNKNOWN;
973 }
974 
Get4Building(int race)975 int ICN::Get4Building( int race )
976 {
977     switch ( race ) {
978     case Race::BARB:
979         return CSTLBARB;
980     case Race::KNGT:
981         return CSTLKNGT;
982     case Race::NECR:
983         return CSTLNECR;
984     case Race::SORC:
985         return CSTLSORC;
986     case Race::WRLK:
987         return CSTLWRLK;
988     case Race::WZRD:
989         return CSTLWZRD;
990     default:
991         break;
992     }
993 
994     return UNKNOWN;
995 }
996 
Get4Castle(int race)997 int ICN::Get4Castle( int race )
998 {
999     switch ( race ) {
1000     case Race::BARB:
1001         return CASTLEB;
1002     case Race::KNGT:
1003         return CASTLEK;
1004     case Race::NECR:
1005         return CASTLEN;
1006     case Race::SORC:
1007         return CASTLES;
1008     case Race::WRLK:
1009         return CASTLEW;
1010     case Race::WZRD:
1011         return CASTLEZ;
1012     default:
1013         break;
1014     }
1015 
1016     return UNKNOWN;
1017 }
1018 
GetFlagIcnId(int color)1019 int ICN::GetFlagIcnId( int color )
1020 {
1021     switch ( color ) {
1022     case Color::BLUE:
1023         return ICN::HEROFL00;
1024     case Color::GREEN:
1025         return ICN::HEROFL01;
1026     case Color::RED:
1027         return ICN::HEROFL02;
1028     case Color::YELLOW:
1029         return ICN::HEROFL03;
1030     case Color::ORANGE:
1031         return ICN::HEROFL04;
1032     case Color::PURPLE:
1033         return ICN::HEROFL05;
1034     default:
1035         return ICN::HEROFL06;
1036     }
1037 }
1038