#include "Misc/Shared.hpp"
#include "Register.hpp"

// ------------------------------------------------------------------------------------------------
#include <cstring>
#include <algorithm>

// ------------------------------------------------------------------------------------------------
namespace SqMod {

// ------------------------------------------------------------------------------------------------
const SQChar * GetKeyCodeName(SQInt32 keycode)
{
    switch (keycode)
    {
        case SQMOD_KEYCODE_ABNT_C1:             return _SC("Abnt C1");
        case SQMOD_KEYCODE_ABNT_C2:             return _SC("Abnt C2");
        case SQMOD_KEYCODE_ADD:                 return _SC("Numpad +");
        case SQMOD_KEYCODE_ATTN:                return _SC("Attn");
        case SQMOD_KEYCODE_BACK:                return _SC("Backspace");
        case SQMOD_KEYCODE_CANCEL:              return _SC("Break");
        case SQMOD_KEYCODE_CLEAR:               return _SC("Clear");
        case SQMOD_KEYCODE_CRSEL:               return _SC("Cr Sel");
        case SQMOD_KEYCODE_DECIMAL:             return _SC("Numpad .");
        case SQMOD_KEYCODE_DIVIDE:              return _SC("Numpad /");
        case SQMOD_KEYCODE_EREOF:               return _SC("Er Eof");
        case SQMOD_KEYCODE_ESCAPE:              return _SC("Esc");
        case SQMOD_KEYCODE_EXECUTE:             return _SC("Execute");
        case SQMOD_KEYCODE_EXSEL:               return _SC("Ex Sel");
        case SQMOD_KEYCODE_ICO_CLEAR:           return _SC("IcoClr");
        case SQMOD_KEYCODE_ICO_HELP:            return _SC("IcoHlp");
        case SQMOD_KEYCODE_KEY_0:               return _SC("0");
        case SQMOD_KEYCODE_KEY_1:               return _SC("1");
        case SQMOD_KEYCODE_KEY_2:               return _SC("2");
        case SQMOD_KEYCODE_KEY_3:               return _SC("3");
        case SQMOD_KEYCODE_KEY_4:               return _SC("4");
        case SQMOD_KEYCODE_KEY_5:               return _SC("5");
        case SQMOD_KEYCODE_KEY_6:               return _SC("6");
        case SQMOD_KEYCODE_KEY_7:               return _SC("7");
        case SQMOD_KEYCODE_KEY_8:               return _SC("8");
        case SQMOD_KEYCODE_KEY_9:               return _SC("9");
        case SQMOD_KEYCODE_KEY_A:               return _SC("A");
        case SQMOD_KEYCODE_KEY_B:               return _SC("B");
        case SQMOD_KEYCODE_KEY_C:               return _SC("C");
        case SQMOD_KEYCODE_KEY_D:               return _SC("D");
        case SQMOD_KEYCODE_KEY_E:               return _SC("E");
        case SQMOD_KEYCODE_KEY_F:               return _SC("F");
        case SQMOD_KEYCODE_KEY_G:               return _SC("G");
        case SQMOD_KEYCODE_KEY_H:               return _SC("H");
        case SQMOD_KEYCODE_KEY_I:               return _SC("I");
        case SQMOD_KEYCODE_KEY_J:               return _SC("J");
        case SQMOD_KEYCODE_KEY_K:               return _SC("K");
        case SQMOD_KEYCODE_KEY_L:               return _SC("L");
        case SQMOD_KEYCODE_KEY_M:               return _SC("M");
        case SQMOD_KEYCODE_KEY_N:               return _SC("N");
        case SQMOD_KEYCODE_KEY_O:               return _SC("O");
        case SQMOD_KEYCODE_KEY_P:               return _SC("P");
        case SQMOD_KEYCODE_KEY_Q:               return _SC("Q");
        case SQMOD_KEYCODE_KEY_R:               return _SC("R");
        case SQMOD_KEYCODE_KEY_S:               return _SC("S");
        case SQMOD_KEYCODE_KEY_T:               return _SC("T");
        case SQMOD_KEYCODE_KEY_U:               return _SC("U");
        case SQMOD_KEYCODE_KEY_V:               return _SC("V");
        case SQMOD_KEYCODE_KEY_W:               return _SC("W");
        case SQMOD_KEYCODE_KEY_X:               return _SC("X");
        case SQMOD_KEYCODE_KEY_Y:               return _SC("Y");
        case SQMOD_KEYCODE_KEY_Z:               return _SC("Z");
        case SQMOD_KEYCODE_MULTIPLY:            return _SC("Numpad *");
        case SQMOD_KEYCODE_NONAME:              return _SC("NoName");
        case SQMOD_KEYCODE_NUMPAD0:             return _SC("Numpad 0");
        case SQMOD_KEYCODE_NUMPAD1:             return _SC("Numpad 1");
        case SQMOD_KEYCODE_NUMPAD2:             return _SC("Numpad 2");
        case SQMOD_KEYCODE_NUMPAD3:             return _SC("Numpad 3");
        case SQMOD_KEYCODE_NUMPAD4:             return _SC("Numpad 4");
        case SQMOD_KEYCODE_NUMPAD5:             return _SC("Numpad 5");
        case SQMOD_KEYCODE_NUMPAD6:             return _SC("Numpad 6");
        case SQMOD_KEYCODE_NUMPAD7:             return _SC("Numpad 7");
        case SQMOD_KEYCODE_NUMPAD8:             return _SC("Numpad 8");
        case SQMOD_KEYCODE_NUMPAD9:             return _SC("Numpad 9");
        case SQMOD_KEYCODE_OEM_1:               return _SC("OEM_1 (: ;)");
        case SQMOD_KEYCODE_OEM_102:             return _SC("OEM_102 (> <)");
        case SQMOD_KEYCODE_OEM_2:               return _SC("OEM_2 (? /)");
        case SQMOD_KEYCODE_OEM_3:               return _SC("OEM_3 (~ `)");
        case SQMOD_KEYCODE_OEM_4:               return _SC("OEM_4 ({ [)");
        case SQMOD_KEYCODE_OEM_5:               return _SC("OEM_5 (| \\)");
        case SQMOD_KEYCODE_OEM_6:               return _SC("OEM_6 (} ])");
        case SQMOD_KEYCODE_OEM_7:               return _SC("OEM_7 (\" ')");
        case SQMOD_KEYCODE_OEM_8:               return _SC("OEM_8 (ยง !)");
        case SQMOD_KEYCODE_OEM_ATTN:            return _SC("Oem Attn");
        case SQMOD_KEYCODE_OEM_AUTO:            return _SC("Auto");
        case SQMOD_KEYCODE_OEM_AX:              return _SC("Ax");
        case SQMOD_KEYCODE_OEM_BACKTAB:         return _SC("Back Tab");
        case SQMOD_KEYCODE_OEM_CLEAR:           return _SC("OemClr");
        case SQMOD_KEYCODE_OEM_COMMA:           return _SC("OEM_COMMA (< ,)");
        case SQMOD_KEYCODE_OEM_COPY:            return _SC("Copy");
        case SQMOD_KEYCODE_OEM_CUSEL:           return _SC("Cu Sel");
        case SQMOD_KEYCODE_OEM_ENLW:            return _SC("Enlw");
        case SQMOD_KEYCODE_OEM_FINISH:          return _SC("Finish");
        case SQMOD_KEYCODE_OEM_FJ_LOYA:         return _SC("Loya");
        case SQMOD_KEYCODE_OEM_FJ_MASSHOU:      return _SC("Mashu");
        case SQMOD_KEYCODE_OEM_FJ_ROYA:         return _SC("Roya");
        case SQMOD_KEYCODE_OEM_FJ_TOUROKU:      return _SC("Touroku");
        case SQMOD_KEYCODE_OEM_JUMP:            return _SC("Jump");
        case SQMOD_KEYCODE_OEM_MINUS:           return _SC("OEM_MINUS (_ -)");
        case SQMOD_KEYCODE_OEM_PA1:             return _SC("OemPa1");
        case SQMOD_KEYCODE_OEM_PA2:             return _SC("OemPa2");
        case SQMOD_KEYCODE_OEM_PA3:             return _SC("OemPa3");
        case SQMOD_KEYCODE_OEM_PERIOD:          return _SC("OEM_PERIOD (> .)");
        case SQMOD_KEYCODE_OEM_PLUS:            return _SC("OEM_PLUS (+ =)");
        case SQMOD_KEYCODE_OEM_RESET:           return _SC("Reset");
        case SQMOD_KEYCODE_OEM_WSCTRL:          return _SC("WsCtrl");
        case SQMOD_KEYCODE_PA1:                 return _SC("Pa1");
        case SQMOD_KEYCODE_PACKET:              return _SC("Packet");
        case SQMOD_KEYCODE_PLAY:                return _SC("Play");
        case SQMOD_KEYCODE_PROCESSKEY:          return _SC("Process");
        case SQMOD_KEYCODE_RETURN:              return _SC("Enter");
        case SQMOD_KEYCODE_SELECT:              return _SC("Select");
        case SQMOD_KEYCODE_SEPARATOR:           return _SC("Separator");
        case SQMOD_KEYCODE_SPACE:               return _SC("Space");
        case SQMOD_KEYCODE_SUBTRACT:            return _SC("Num -");
        case SQMOD_KEYCODE_TAB:                 return _SC("Tab");
        case SQMOD_KEYCODE_ZOOM:                return _SC("Zoom");
        case SQMOD_KEYCODE_ACCEPT:              return _SC("Accept");
        case SQMOD_KEYCODE_APPS:                return _SC("Context Menu");
        case SQMOD_KEYCODE_BROWSER_BACK:        return _SC("Browser Back");
        case SQMOD_KEYCODE_BROWSER_FAVORITES:   return _SC("Browser Favorites");
        case SQMOD_KEYCODE_BROWSER_FORWARD:     return _SC("Browser Forward");
        case SQMOD_KEYCODE_BROWSER_HOME:        return _SC("Browser Home");
        case SQMOD_KEYCODE_BROWSER_REFRESH:     return _SC("Browser Refresh");
        case SQMOD_KEYCODE_BROWSER_SEARCH:      return _SC("Browser Search");
        case SQMOD_KEYCODE_BROWSER_STOP:        return _SC("Browser Stop");
        case SQMOD_KEYCODE_CAPITAL:             return _SC("Caps Lock");
        case SQMOD_KEYCODE_CONVERT:             return _SC("Convert");
        case SQMOD_KEYCODE_DELETE:              return _SC("Delete");
        case SQMOD_KEYCODE_DOWN:                return _SC("Arrow Down");
        case SQMOD_KEYCODE_END:                 return _SC("End");
        case SQMOD_KEYCODE_F1:                  return _SC("F1");
        case SQMOD_KEYCODE_F10:                 return _SC("F10");
        case SQMOD_KEYCODE_F11:                 return _SC("F11");
        case SQMOD_KEYCODE_F12:                 return _SC("F12");
        case SQMOD_KEYCODE_F13:                 return _SC("F13");
        case SQMOD_KEYCODE_F14:                 return _SC("F14");
        case SQMOD_KEYCODE_F15:                 return _SC("F15");
        case SQMOD_KEYCODE_F16:                 return _SC("F16");
        case SQMOD_KEYCODE_F17:                 return _SC("F17");
        case SQMOD_KEYCODE_F18:                 return _SC("F18");
        case SQMOD_KEYCODE_F19:                 return _SC("F19");
        case SQMOD_KEYCODE_F2:                  return _SC("F2");
        case SQMOD_KEYCODE_F20:                 return _SC("F20");
        case SQMOD_KEYCODE_F21:                 return _SC("F21");
        case SQMOD_KEYCODE_F22:                 return _SC("F22");
        case SQMOD_KEYCODE_F23:                 return _SC("F23");
        case SQMOD_KEYCODE_F24:                 return _SC("F24");
        case SQMOD_KEYCODE_F3:                  return _SC("F3");
        case SQMOD_KEYCODE_F4:                  return _SC("F4");
        case SQMOD_KEYCODE_F5:                  return _SC("F5");
        case SQMOD_KEYCODE_F6:                  return _SC("F6");
        case SQMOD_KEYCODE_F7:                  return _SC("F7");
        case SQMOD_KEYCODE_F8:                  return _SC("F8");
        case SQMOD_KEYCODE_F9:                  return _SC("F9");
        case SQMOD_KEYCODE_FINAL:               return _SC("Final");
        case SQMOD_KEYCODE_HELP:                return _SC("Help");
        case SQMOD_KEYCODE_HOME:                return _SC("Home");
        case SQMOD_KEYCODE_ICO_00:              return _SC("Ico00 *");
        case SQMOD_KEYCODE_INSERT:              return _SC("Insert");
        case SQMOD_KEYCODE_JUNJA:               return _SC("Junja");
        case SQMOD_KEYCODE_KANA:                return _SC("Kana");
        case SQMOD_KEYCODE_KANJI:               return _SC("Kanji");
        case SQMOD_KEYCODE_LAUNCH_APP1:         return _SC("App1");
        case SQMOD_KEYCODE_LAUNCH_APP2:         return _SC("App2");
        case SQMOD_KEYCODE_LAUNCH_MAIL:         return _SC("Mail");
        case SQMOD_KEYCODE_LAUNCH_MEDIA_SELECT: return _SC("Media");
        case SQMOD_KEYCODE_LBUTTON:             return _SC("Left Button **");
        case SQMOD_KEYCODE_LCONTROL:            return _SC("Left Ctrl");
        case SQMOD_KEYCODE_LEFT:                return _SC("Arrow Left");
        case SQMOD_KEYCODE_LMENU:               return _SC("Left Alt");
        case SQMOD_KEYCODE_LSHIFT:              return _SC("Left Shift");
        case SQMOD_KEYCODE_LWIN:                return _SC("Left Win");
        case SQMOD_KEYCODE_MBUTTON:             return _SC("Middle Button **");
        case SQMOD_KEYCODE_MEDIA_NEXT_TRACK:    return _SC("Next Track");
        case SQMOD_KEYCODE_MEDIA_PLAY_PAUSE:    return _SC("Play / Pause");
        case SQMOD_KEYCODE_MEDIA_PREV_TRACK:    return _SC("Previous Track");
        case SQMOD_KEYCODE_MEDIA_STOP:          return _SC("Stop");
        case SQMOD_KEYCODE_MODECHANGE:          return _SC("Mode Change");
        case SQMOD_KEYCODE_NEXT:                return _SC("Page Down");
        case SQMOD_KEYCODE_NONCONVERT:          return _SC("Non Convert");
        case SQMOD_KEYCODE_NUMLOCK:             return _SC("Num Lock");
        case SQMOD_KEYCODE_OEM_FJ_JISHO:        return _SC("Jisho");
        case SQMOD_KEYCODE_PAUSE:               return _SC("Pause");
        case SQMOD_KEYCODE_PRINT:               return _SC("Print");
        case SQMOD_KEYCODE_PRIOR:               return _SC("Page Up");
        case SQMOD_KEYCODE_RBUTTON:             return _SC("Right Button **");
        case SQMOD_KEYCODE_RCONTROL:            return _SC("Right Ctrl");
        case SQMOD_KEYCODE_RIGHT:               return _SC("Arrow Right");
        case SQMOD_KEYCODE_RMENU:               return _SC("Right Alt");
        case SQMOD_KEYCODE_RSHIFT:              return _SC("Right Shift");
        case SQMOD_KEYCODE_RWIN:                return _SC("Right Win");
        case SQMOD_KEYCODE_SCROLL:              return _SC("Scrol Lock");
        case SQMOD_KEYCODE_SLEEP:               return _SC("Sleep");
        case SQMOD_KEYCODE_SNAPSHOT:            return _SC("Print Screen");
        case SQMOD_KEYCODE_UP:                  return _SC("Arrow Up");
        case SQMOD_KEYCODE_VOLUME_DOWN:         return _SC("Volume Down");
        case SQMOD_KEYCODE_VOLUME_MUTE:         return _SC("Volume Mute");
        case SQMOD_KEYCODE_VOLUME_UP:           return _SC("Volume Up");
        case SQMOD_KEYCODE_XBUTTON1:            return _SC("X Button 1 **");
        case SQMOD_KEYCODE_XBUTTON2:            return _SC("X Button 2 **");
        case SQMOD_KEYCODE_NONE:                return _SC("no mapping");
        default:                                return _SC("");
    }
}


// ------------------------------------------------------------------------------------------------
const SQChar * GetModelName(SQInt32 id)
{
    switch (id)
    {
        case 258: return _SC("Mobile CellPhone");
        case 259: return _SC("Brass Knuckles");
        case 260: return _SC("Screwdriver");
        case 261: return _SC("Golf Club");
        case 262: return _SC("Nigtht Stick");
        case 263: return _SC("Knife");
        case 264: return _SC("Baseball");
        case 265: return _SC("Hammer");
        case 266: return _SC("Meath Cleaver");
        case 267: return _SC("Machete");
        case 268: return _SC("Katana");
        case 269: return _SC("Chainsaw");
        case 270: return _SC("Grenades");
        case 271: return _SC("Tear Gas");
        case 272: return _SC("Molotovs");
        case 273: return _SC("Rocket");
        case 274: return _SC("Colt 45");
        case 275: return _SC("Python");
        case 276: return _SC("Ruger");
        case 277: return _SC("Chrome Shotgun");
        case 278: return _SC("Spaz Shotgun");
        case 279: return _SC("Stubby Shotgun");
        case 280: return _SC("M4");
        case 281: return _SC("Tec9");
        case 282: return _SC("Uzi");
        case 283: return _SC("Silenced Ingram");
        case 284: return _SC("MP5");
        case 285: return _SC("Sniper Rifle");
        case 286: return _SC("Laser Sniper Rifle");
        case 287: return _SC("Rocket Launcher");
        case 288: return _SC("Flamethrower");
        case 289: return _SC("M60");
        case 290: return _SC("Minigun");
        case 291: return _SC("Detonator + Grenades");
        case 292: return _SC("Camera");
        case 293: return _SC("Fists");
        case 294: return _SC("Helicannon");
        case 300: return _SC("bar_gatebar01");
        case 301: return _SC("bar_gatebox01");
        case 302: return _SC("barrier_turn");
        case 303: return _SC("Electricgate");
        case 304: return _SC("fence_small");
        case 305: return _SC("subwaygate");
        case 306: return _SC("tunnel_entrance");
        case 307: return _SC("sub_roadbarrier");
        case 308: return _SC("tall_fence");
        case 309: return _SC("Columbian_gate");
        case 310: return _SC("phils_compnd_gate");
        case 311: return _SC("towerdoor1");
        case 312: return _SC("sub_roadright");
        case 313: return _SC("sub_roadleft");
        case 314: return _SC("airport_gate");
        case 315: return _SC("helix_barrier");
        case 316: return _SC("bar_barrier12");
        case 317: return _SC("bar_barrier16");
        case 318: return _SC("bar_barriergate1");
        case 319: return _SC("bar_barrier10b");
        case 320: return _SC("lhouse_barrier1");
        case 321: return _SC("lhouse_barrier2");
        case 322: return _SC("lhouse_barrier3");
        case 323: return _SC("Gdyn_barrier17");
        case 324: return _SC("bar_barrier10");
        case 330: return _SC("tiny_rock");
        case 331: return _SC("washing_machane");
        case 332: return _SC("junk_tyre");
        case 333: return _SC("cooker1");
        case 334: return _SC("vending_machane");
        case 335: return _SC("briefcase");
        case 336: return _SC("fire_hydrant");
        case 337: return _SC("Money");
        case 338: return _SC("mine");
        case 339: return _SC("bollard");
        case 340: return _SC("bollard_light");
        case 341: return _SC("phonebooth1");
        case 342: return _SC("barrel2");
        case 343: return _SC("barrel1");
        case 344: return _SC("palette");
        case 345: return _SC("cardboardbox2");
        case 346: return _SC("cardboardbox4");
        case 347: return _SC("barrel3");
        case 348: return _SC("lampost_coast");
        case 349: return _SC("wooden_box");
        case 350: return _SC("barrel4");
        case 351: return _SC("lamppost3");
        case 352: return _SC("bin1");
        case 353: return _SC("dump1");
        case 354: return _SC("roadworkbarrier1");
        case 355: return _SC("bussign1");
        case 356: return _SC("cardboard_box");
        case 357: return _SC("Streetlamp2");
        case 358: return _SC("Streetlamp1");
        case 359: return _SC("noparkingsign1");
        case 360: return _SC("phone_sign");
        case 361: return _SC("waste_bin");
        case 362: return _SC("rcyclbank01");
        case 363: return _SC("strtbarrier01");
        case 364: return _SC("traffic_cone");
        case 365: return _SC("info");
        case 366: return _SC("health");
        case 367: return _SC("adrenaline");
        case 368: return _SC("bodyarmour");
        case 369: return _SC("bouy");
        case 370: return _SC("petrolpump");
        case 371: return _SC("newramp");
        case 372: return _SC("line");
        case 373: return _SC("rockpatch1");
        case 374: return _SC("rockpatch03");
        case 375: return _SC("bribe");
        case 376: return _SC("bonus");
        case 377: return _SC("faketarget");
        case 378: return _SC("smashbarpost");
        case 379: return _SC("smashbar");
        case 380: return _SC("barrelexpos");
        case 381: return _SC("glassfx_composh");
        case 382: return _SC("camerapickup");
        case 383: return _SC("killfrenzy");
        case 384: return _SC("telgrphpole02");
        case 385: return _SC("lounger");
        case 386: return _SC("Stonebench1");
        case 387: return _SC("miami_phone");
        case 388: return _SC("miami_hydrant");
        case 389: return _SC("bustop");
        case 390: return _SC("Mpostbox1");
        case 391: return _SC("BillBd1");
        case 392: return _SC("BillBd3");
        case 393: return _SC("LODlBd2");
        case 394: return _SC("MTraffic2");
        case 395: return _SC("Miamibin");
        case 396: return _SC("MTraffic4");
        case 397: return _SC("MTraffic3");
        case 398: return _SC("BlackBag1");
        case 399: return _SC("BlackBag2");
        case 400: return _SC("LODlBd3");
        case 401: return _SC("BillBd2");
        case 402: return _SC("LODlBd1");
        case 403: return _SC("parkingmeter");
        case 404: return _SC("parkingmeterg");
        case 405: return _SC("gunbox");
        case 406: return _SC("property_locked");
        case 407: return _SC("property_foresale");
        case 408: return _SC("bigdollar");
        case 409: return _SC("clothesp");
        case 410: return _SC("package1");
        case 411: return _SC("pickup_save");
        case 412: return _SC("postbox1");
        case 413: return _SC("newsstand1");
        case 414: return _SC("parkbench1");
        case 415: return _SC("papermachn01");
        case 416: return _SC("parktable1");
        case 417: return _SC("lamppost2");
        case 418: return _SC("garden_bench");
        case 419: return _SC("Barrier");
        case 420: return _SC("newstandnew1");
        case 421: return _SC("newstandnew4");
        case 422: return _SC("newstandnew3");
        case 423: return _SC("newstandnew5");
        case 424: return _SC("newstandnew2");
        case 425: return _SC("lamppost1");
        case 426: return _SC("doublestreetlght1");
        case 427: return _SC("trafficlight1");
        case 428: return _SC("MTraffic1");
        case 429: return _SC("lamp_post");
        case 430: return _SC("sea_light");
        case 431: return _SC("craig_package");
        case 432: return _SC("music_headsets");
        case 440: return _SC("veg_tree3");
        case 441: return _SC("veg_treea1");
        case 442: return _SC("veg_treeb1");
        case 443: return _SC("veg_treea3");
        case 444: return _SC("veg_palwee03");
        case 445: return _SC("veg_palm04");
        case 446: return _SC("veg_palm02");
        case 447: return _SC("veg_palm03");
        case 448: return _SC("veg_palwee01");
        case 449: return _SC("veg_palwee02");
        case 450: return _SC("veg_palmkb1");
        case 451: return _SC("veg_palmkb2");
        case 452: return _SC("veg_palmkb3");
        case 453: return _SC("veg_palmkb4");
        case 454: return _SC("veg_palmkb5");
        case 455: return _SC("veg_palmkb8");
        case 456: return _SC("veg_palmkb9");
        case 457: return _SC("veg_palmkb7");
        case 458: return _SC("veg_palmkb10");
        case 459: return _SC("veg_palmkbb11");
        case 460: return _SC("veg_fern_balcny_kb1");
        case 461: return _SC("veg_fern_balcny_kb2");
        case 462: return _SC("kb_pot_1");
        case 463: return _SC("kb_planterbush2");
        case 464: return _SC("kb_planterbox");
        case 465: return _SC("kb_planter+bush");
        case 466: return _SC("veg_ivy_balcny_kb3");
        case 467: return _SC("new_bushtest");
        case 468: return _SC("kb_planter+bush2");
        case 469: return _SC("veg_palmkb13");
        case 470: return _SC("kb_canopy_test");
        case 471: return _SC("kb_chr_tbl_test");
        case 472: return _SC("pot_02");
        case 473: return _SC("pot_01");
        case 474: return _SC("veg_palmbig14");
        case 475: return _SC("veg_palmkb14");
        case 476: return _SC("pot_03");
        case 477: return _SC("new_bushsm");
        case 478: return _SC("veg_palm01");
        case 500: return _SC("lf_mediastage");
        case 501: return _SC("trashcan");
        case 502: return _SC("drug_white");
        case 503: return _SC("drug_orange");
        case 504: return _SC("drug_yellow");
        case 505: return _SC("drug_green");
        case 506: return _SC("drug_blue");
        case 507: return _SC("drug_red");
        case 508: return _SC("keycard");
        case 509: return _SC("lf_banner");
        case 510: return _SC("pizzabox");
        case 511: return _SC("tar_gun2");
        case 512: return _SC("tar_gun1");
        case 513: return _SC("tar_civ2");
        case 514: return _SC("tar_civ1");
        case 515: return _SC("tar_frame");
        case 516: return _SC("tar_top");
        case 517: return _SC("tar_upright");
        case 518: return _SC("tar_upleft");
        case 519: return _SC("tar_downleft");
        case 520: return _SC("tar_downright");
        case 521: return _SC("plc_stinger");
        case 522: return _SC("chairsntable");
        case 523: return _SC("satdishbig");
        case 524: return _SC("satdishsml");
        case 525: return _SC("cntrlrsac1");
        case 526: return _SC("beachball");
        case 527: return _SC("fish1single");
        case 528: return _SC("fish2single");
        case 529: return _SC("fish3s");
        case 530: return _SC("jellyfish");
        case 531: return _SC("jellyfish01");
        case 532: return _SC("fish3single");
        case 533: return _SC("fish1s");
        case 534: return _SC("fish2s");
        case 535: return _SC("dolphin");
        case 536: return _SC("shark");
        case 537: return _SC("turtle");
        case 538: return _SC("sandcastle1");
        case 539: return _SC("sandcastle2");
        case 540: return _SC("submarine");
        case 541: return _SC("nt_firehose_01");
        case 542: return _SC("nt_alarm1_01");
        case 543: return _SC("nt_alarm2_01");
        case 544: return _SC("nt_securecam1_01");
        case 545: return _SC("nt_aircon1_01");
        case 546: return _SC("nt_aircon1_02");
        case 547: return _SC("nt_vent1_01");
        case 548: return _SC("nt_vent2_01");
        case 549: return _SC("nt_vent3_01");
        case 550: return _SC("nt_securecam2_01");
        case 551: return _SC("nt_aircon3_01");
        case 552: return _SC("nt_cablebox1_01");
        case 553: return _SC("nt_cablebox2_01");
        case 554: return _SC("nt_cablebox3_01");
        case 555: return _SC("nt_alarm3_01");
        case 556: return _SC("nt_cablebox4_01");
        case 557: return _SC("nt_cablebox5_01");
        case 558: return _SC("nt_cablebox6_01");
        case 559: return _SC("waterjump2");
        case 560: return _SC("waterjump1");
        case 561: return _SC("landjump");
        case 562: return _SC("landjump2");
        case 563: return _SC("nt_aircon1dbl");
        case 564: return _SC("rcbomb");
        case 565: return _SC("od_pat_hutb");
        case 566: return _SC("od_pat_hut");
        case 567: return _SC("od_vbnet");
        case 568: return _SC("beachtowel04");
        case 569: return _SC("beachtowel03");
        case 570: return _SC("beachtowel02");
        case 571: return _SC("beachtowel01");
        case 572: return _SC("lotion");
        case 573: return _SC("lounge_wood_up");
        case 574: return _SC("lounge_towel_up");
        case 575: return _SC("lounge_wood_dn");
        case 576: return _SC("groyne01");
        case 577: return _SC("wglasssmash");
        case 578: return _SC("petrolcan");
        case 579: return _SC("copwindows");
        case 580: return _SC("fence_haiti");
        case 581: return _SC("fence_haitis");
        case 582: return _SC("dynamite");
        case 583: return _SC("waterjumpx2");
        case 584: return _SC("Esculator_step");
        case 587: return _SC("htl_fan_static_dy");
        case 588: return _SC("ramp");
        case 589: return _SC("htl_fan_rotate_dy");
        case 590: return _SC("nt_roadblockCI");
        case 591: return _SC("swivel_chair_B");
        case 592: return _SC("propwinebotl2");
        case 593: return _SC("propashtray1");
        case 594: return _SC("propbeerglass1");
        case 595: return _SC("propwineglass1");
        case 596: return _SC("propvodkabotl1");
        case 597: return _SC("propwinebotl1");
        case 598: return _SC("propcollecttable");
        case 599: return _SC("swivelchair_A");
        case 600: return _SC("Gasgrenade");
        case 601: return _SC("roadsign");
        case 602: return _SC("lodxrefhse1");
        case 603: return _SC("wshxrefhse1");
        case 604: return _SC("wash_gaspump");
        case 605: return _SC("lodxrefhirise1");
        case 606: return _SC("wshxrefhirise1");
        case 607: return _SC("wshxrefhse2");
        case 608: return _SC("lodxrefhse2");
        case 609: return _SC("xod_beacon_dy");
        case 611: return _SC("xod_starlite_dy");
        case 613: return _SC("xod_leslie_nt");
        case 614: return _SC("xod_leslie_dy");
        case 615: return _SC("xod_majestic_dy");
        case 617: return _SC("xod_macalpin_dy");
        case 620: return _SC("xod_tides_dy");
        case 633: return _SC("jw_coffin");
        case 634: return _SC("chairsntableml");
        case 635: return _SC("LODjumbo_01");
        case 636: return _SC("ap_learjet1_01");
        case 637: return _SC("ap_radar1_01");
        case 638: return _SC("ap_jumbo_01");
        default: return _SC("");
    }
}

bool IsModelWeapon(SQInt32 id)
{
    switch (id)
    {
        case 258:
        case 259:
        case 260:
        case 261:
        case 262:
        case 263:
        case 264:
        case 265:
        case 266:
        case 267:
        case 268:
        case 269:
        case 270:
        case 271:
        case 272:
        case 273:
        case 274:
        case 275:
        case 276:
        case 277:
        case 278:
        case 279:
        case 280:
        case 281:
        case 282:
        case 283:
        case 284:
        case 285:
        case 286:
        case 287:
        case 288:
        case 289:
        case 290:
        case 291:
        case 292:
        case 293:
        case 294: return true;
        default: return false;
    }
}

bool IsModelActuallyWeapon(SQInt32 id)
{
    switch (id)
    {
        case 259:
        case 260:
        case 261:
        case 262:
        case 263:
        case 264:
        case 265:
        case 266:
        case 267:
        case 268:
        case 269:
        case 270:
        case 271:
        case 272:
        case 274:
        case 275:
        case 276:
        case 277:
        case 278:
        case 279:
        case 280:
        case 281:
        case 282:
        case 283:
        case 284:
        case 285:
        case 286:
        case 287:
        case 288:
        case 289:
        case 290:
        case 291: return true;
        default: return false;
    }
}

bool IsModelValid(SQInt32 id)
{
    return (strcmp(GetModelName(id), _SC("")) != 0) ? true : false;
}

// ------------------------------------------------------------------------------------------------
const SQChar * GetSkinName(SQInt32 id)
{
    switch(id)
    {
        case SQMOD_SKIN_TOMMY_VERCETTI:         return _SC("Tommy Vercetti");
        case SQMOD_SKIN_COP:                    return _SC("Cop");
        case SQMOD_SKIN_SWAT:                   return _SC("SWAT");
        case SQMOD_SKIN_FBI:                    return _SC("FBI");
        case SQMOD_SKIN_ARMY:                   return _SC("Army");
        case SQMOD_SKIN_PARAMEDIC:              return _SC("Paramedic");
        case SQMOD_SKIN_FIREMAN:                return _SC("Firefighter");
        case SQMOD_SKIN_GOLF_GUY_A:             return _SC("Golf Guy #1");
        case SQMOD_SKIN_BUM_LADY_A:             return _SC("Bum Lady #1");
        case SQMOD_SKIN_BUM_LADY_B:             return _SC("Bum Lady #2");
        case SQMOD_SKIN_PUNK_A:                 return _SC("Punk #1");
        case SQMOD_SKIN_LAWYER:                 return _SC("Lawyer");
        case SQMOD_SKIN_SPANISH_LADY_A:         return _SC("Spanish Lady #1");
        case SQMOD_SKIN_SPANISH_LADY_B:         return _SC("Spanish Lady #2");
        case SQMOD_SKIN_COOL_GUY_A:             return _SC("Cool Guy #1");
        case SQMOD_SKIN_ARABIC_GUY:             return _SC("Arabic Guy");
        case SQMOD_SKIN_BEACH_LADY_A:           return _SC("Beach Lady #1");
        case SQMOD_SKIN_BEACH_LADY_B:           return _SC("Beach Lady #2");
        case SQMOD_SKIN_BEACH_GUY_A:            return _SC("Beach Guy #1");
        case SQMOD_SKIN_BEACH_GUY_B:            return _SC("Beach Guy #2");
        case SQMOD_SKIN_OFFICE_LADY_A:          return _SC("Office Lady #1");
        case SQMOD_SKIN_WAITRESS_A:             return _SC("Waitress #1");
        case SQMOD_SKIN_FOOD_LADY:              return _SC("Food Lady");
        case SQMOD_SKIN_PROSTITUTE_A:           return _SC("Prostitute #1");
        case SQMOD_SKIN_BUM_LADY_C:             return _SC("Bum Lady #3");
        case SQMOD_SKIN_BUM_GUY_A:              return _SC("Bum Guy #1");
        case SQMOD_SKIN_GARBAGEMAN_A:           return _SC("Garbageman #1");
        case SQMOD_SKIN_TAXI_DRIVER_A:          return _SC("Taxi Driver #1");
        case SQMOD_SKIN_HATIAN_A:               return _SC("Haitian #1");
        case SQMOD_SKIN_CRIMINAL_A:             return _SC("Criminal #1");
        case SQMOD_SKIN_HOOD_LADY:              return _SC("Hood Lady");
        case SQMOD_SKIN_GRANNY_A:               return _SC("Granny #1");
        case SQMOD_SKIN_BUSINESS_MAN_A:         return _SC("Businessman #1");
        case SQMOD_SKIN_CHURCH_GUY:             return _SC("Church Guy");
        case SQMOD_SKIN_CLUB_LADY:              return _SC("Club Lady");
        case SQMOD_SKIN_CHURCH_LADY:            return _SC("Church Lady");
        case SQMOD_SKIN_PIMP:                   return _SC("Pimp");
        case SQMOD_SKIN_BEACH_LADY_C:           return _SC("Beach Lady #3");
        case SQMOD_SKIN_BEACH_GUY_C:            return _SC("Beach Guy #3");
        case SQMOD_SKIN_BEACH_LADY_D:           return _SC("Beach Lady #4");
        case SQMOD_SKIN_BEACH_GUY_D:            return _SC("Beach Guy #4");
        case SQMOD_SKIN_BUSINESS_MAN_B:         return _SC("Businessman #2");
        case SQMOD_SKIN_PROSTITUTE_B:           return _SC("Prostitute #2");
        case SQMOD_SKIN_BUM_LADY_D:             return _SC("Bum Lady #4");
        case SQMOD_SKIN_BUM_GUY_B:              return _SC("Bum Guy #2");
        case SQMOD_SKIN_HATIAN_B:               return _SC("Haitian #2");
        case SQMOD_SKIN_CONSTRUCTION_WORKER_A:  return _SC("Construction Worker #1");
        case SQMOD_SKIN_PUNK_B:                 return _SC("Punk #2");
        case SQMOD_SKIN_PROSTITUTE_C:           return _SC("Prostitute #3");
        case SQMOD_SKIN_GRANNY_B:               return _SC("Granny #2");
        case SQMOD_SKIN_PUNK_C:                 return _SC("Punk #3");
        case SQMOD_SKIN_BUSINESS_MAN_C:         return _SC("Businessman #3");
        case SQMOD_SKIN_SPANISH_LADY_C:         return _SC("Spanish Lady #3");
        case SQMOD_SKIN_SPANISH_LADY_D:         return _SC("Spanish Lady #4");
        case SQMOD_SKIN_COOL_GUY_B:             return _SC("Cool Guy #2");
        case SQMOD_SKIN_BUSINESS_MAN_D:         return _SC("Businessman #4");
        case SQMOD_SKIN_BEACH_LADY_E:           return _SC("Beach Lady #5");
        case SQMOD_SKIN_BEACH_GUY_E:            return _SC("Beach Guy #5");
        case SQMOD_SKIN_BEACH_LADY_F:           return _SC("Beach Lady #6");
        case SQMOD_SKIN_BEACH_GUY_F:            return _SC("Beach Guy #6");
        case SQMOD_SKIN_CONSTRUCTION_WORKER_B:  return _SC("Construction Worker #2");
        case SQMOD_SKIN_GOLF_GUY_B:             return _SC("Golf Guy #2");
        case SQMOD_SKIN_GOLF_LADY:              return _SC("Golf Lady");
        case SQMOD_SKIN_GOLF_GUY_C:             return _SC("Golf Guy #3");
        case SQMOD_SKIN_BEACH_LADY_G:           return _SC("Beach Lady #7");
        case SQMOD_SKIN_BEACH_GUY_G:            return _SC("Beach Guy #7");
        case SQMOD_SKIN_OFFICE_LADY_B:          return _SC("Office Lady #2");
        case SQMOD_SKIN_BUSINESS_MAN_E:         return _SC("Businessman #5");
        case SQMOD_SKIN_BUSINESS_MAN_F:         return _SC("Businessman #6");
        case SQMOD_SKIN_PROSTITUTE_D:           return _SC("Prostitute #2");
        case SQMOD_SKIN_BUM_LADY_E:             return _SC("Bum Lady #4");
        case SQMOD_SKIN_BUM_GUY_C:              return _SC("Bum Guy #3");
        case SQMOD_SKIN_SPANISH_GUY:            return _SC("Spanish Guy");
        case SQMOD_SKIN_TAXI_DRIVER_B:          return _SC("Taxi Driver #2");
        case SQMOD_SKIN_GYM_LADY:               return _SC("Gym Lady");
        case SQMOD_SKIN_GYM_GUY:                return _SC("Gym Guy");
        case SQMOD_SKIN_SKATE_LADY:             return _SC("Skate Lady");
        case SQMOD_SKIN_SKATE_GUY:              return _SC("Skate Guy");
        case SQMOD_SKIN_SHOPPER_A:              return _SC("Shopper #1");
        case SQMOD_SKIN_SHOPPER_B:              return _SC("Shopper #2");
        case SQMOD_SKIN_TOURIST_A:              return _SC("Tourist #1");
        case SQMOD_SKIN_TOURIST_B:              return _SC("Tourist #2");
        case SQMOD_SKIN_CUBAN_A:                return _SC("Cuban #1");
        case SQMOD_SKIN_CUBAN_B:                return _SC("Cuban #2");
        case SQMOD_SKIN_HATIAN_C:               return _SC("Haitian #3");
        case SQMOD_SKIN_HATIAN_D:               return _SC("Haitian #4");
        case SQMOD_SKIN_SHARK_A:                return _SC("Shark #1");
        case SQMOD_SKIN_SHARK_B:                return _SC("Shark #2");
        case SQMOD_SKIN_DIAZ_GUY_A:             return _SC("Diaz Guy #1");
        case SQMOD_SKIN_DIAZ_GUY_B:             return _SC("Diaz Guy #2");
        case SQMOD_SKIN_DBP_SECURITY_A:         return _SC("DBP Security #1");
        case SQMOD_SKIN_DBP_SECURITY_B:         return _SC("DBP Security #2");
        case SQMOD_SKIN_BIKER_A:                return _SC("Biker #1");
        case SQMOD_SKIN_BIKER_B:                return _SC("Biker #2");
        case SQMOD_SKIN_VERCETTI_GUY_A:         return _SC("Vercetti Guy #1");
        case SQMOD_SKIN_VERCETTI_GUY_B:         return _SC("Vercetti Guy #2");
        case SQMOD_SKIN_UNDERCOVER_COP_A:       return _SC("Undercover Cop #1");
        case SQMOD_SKIN_UNDERCOVER_COP_B:       return _SC("Undercover Cop #2");
        case SQMOD_SKIN_UNDERCOVER_COP_C:       return _SC("Undercover Cop #3");
        case SQMOD_SKIN_UNDERCOVER_COP_D:       return _SC("Undercover Cop #4");
        case SQMOD_SKIN_UNDERCOVER_COP_E:       return _SC("Undercover Cop #5");
        case SQMOD_SKIN_UNDERCOVER_COP_F:       return _SC("Undercover Cop #6");
        case SQMOD_SKIN_RICH_GUY:               return _SC("Rich Guy");
        case SQMOD_SKIN_COOL_GUY_C:             return _SC("Cool Guy #3");
        case SQMOD_SKIN_PROSTITUTE_E:           return _SC("Prostitute #3");
        case SQMOD_SKIN_PROSTITUTE_F:           return _SC("Prostitute #4");
        case SQMOD_SKIN_LOVE_FIST_A:            return _SC("Love Fist #1");
        case SQMOD_SKIN_KEN_ROSENBURG:          return _SC("Ken Rosenburg");
        case SQMOD_SKIN_CANDY_SUXX:             return _SC("Candy Suxx");
        case SQMOD_SKIN_HILARY:                 return _SC("Hilary");
        case SQMOD_SKIN_LOVE_FIST_B:            return _SC("Love Fist #2");
        case SQMOD_SKIN_PHIL:                   return _SC("Phil");
        case SQMOD_SKIN_ROCKSTAR_GUY:           return _SC("Rockstar Guy");
        case SQMOD_SKIN_SONNY:                  return _SC("Sonny");
        case SQMOD_SKIN_LANCE_A:                return _SC("Lance");
        case SQMOD_SKIN_MERCADES_A:             return _SC("Mercedes");
        case SQMOD_SKIN_LOVE_FIST_C:            return _SC("Love Fist #3");
        case SQMOD_SKIN_ALEX_SRUB:              return _SC("Alex Shrub");
        case SQMOD_SKIN_LANCE_COP:              return _SC("Lance (Cop)");
        case SQMOD_SKIN_LANCE_B:                return _SC("Lance");
        case SQMOD_SKIN_CORTEZ:                 return _SC("Cortez");
        case SQMOD_SKIN_LOVE_FIST_D:            return _SC("Love Fist #4");
        case SQMOD_SKIN_COLUMBIAN_GUY_A:        return _SC("Columbian Guy #1");
        case SQMOD_SKIN_HILARY_ROBBER:          return _SC("Hilary (Robber)");
        case SQMOD_SKIN_MERCADES_B:             return _SC("Mercedes");
        case SQMOD_SKIN_CAM:                    return _SC("Cam");
        case SQMOD_SKIN_CAM_ROBBER:             return _SC("Cam (Robber)");
        case SQMOD_SKIN_PHIL_ONE_ARM:           return _SC("Phil (One Arm)");
        case SQMOD_SKIN_PHIL_ROBBER:            return _SC("Phil (Robber)");
        case SQMOD_SKIN_COOL_GUY_D:             return _SC("Cool Guy #4");
        case SQMOD_SKIN_PIZZAMAN:               return _SC("Pizza Man");
        case SQMOD_SKIN_TAXI_DRIVER_C:          return _SC("Taxi Driver #1");
        case SQMOD_SKIN_TAXI_DRIVER_D:          return _SC("Taxi Driver #2");
        case SQMOD_SKIN_SAILOR_A:               return _SC("Sailor #1");
        case SQMOD_SKIN_SAILOR_B:               return _SC("Sailor #2");
        case SQMOD_SKIN_SAILOR_C:               return _SC("Sailor #3");
        case SQMOD_SKIN_CHEF:                   return _SC("Chef");
        case SQMOD_SKIN_CRIMINAL_B:             return _SC("Criminal #2");
        case SQMOD_SKIN_FRENCH_GUY:             return _SC("French Guy");
        case SQMOD_SKIN_GARBAGEMAN_B:           return _SC("Garbageman #2");
        case SQMOD_SKIN_HATIAN_E:               return _SC("Haitian #5");
        case SQMOD_SKIN_WAITRESS_B:             return _SC("Waitress #2");
        case SQMOD_SKIN_SONNY_GUY_A:            return _SC("Sonny Guy #1");
        case SQMOD_SKIN_SONNY_GUY_B:            return _SC("Sonny Guy #2");
        case SQMOD_SKIN_SONNY_GUY_C:            return _SC("Sonny Guy #3");
        case SQMOD_SKIN_COLUMBIAN_GUY_B:        return _SC("Columbian Guy #2");
        case SQMOD_SKIN_THUG_A:                 return _SC("Haitian #6");
        case SQMOD_SKIN_BEACH_GUY_H:            return _SC("Beach Guy #8");
        case SQMOD_SKIN_GARBAGEMAN_C:           return _SC("Garbageman #3");
        case SQMOD_SKIN_GARBAGEMAN_D:           return _SC("Garbageman #4");
        case SQMOD_SKIN_GARBAGEMAN_E:           return _SC("Garbageman #5");
        case SQMOD_SKIN_TRANNY:                 return _SC("Tranny");
        case SQMOD_SKIN_THUG_B:                 return _SC("Thug #5");
        case SQMOD_SKIN_SPANDEX_GUY_A:          return _SC("SpandEx Guy #1");
        case SQMOD_SKIN_SPANDEX_GUY_B:          return _SC("SpandEx Guy #2");
        case SQMOD_SKIN_STRIPPER_A:             return _SC("Stripper #1");
        case SQMOD_SKIN_STRIPPER_B:             return _SC("Stripper #2");
        case SQMOD_SKIN_STRIPPER_C:             return _SC("Stripper #3");
        case SQMOD_SKIN_STORE_CLERK:            return _SC("Store Clerk");
        default:                                return _SC("");
    }
}

// ------------------------------------------------------------------------------------------------
SQInt32 GetSkinID(const SQChar * name)
{
    // Clone the string into an editable version
    String str(name);
    // Strip non alphanumeric characters from the name
    str.erase(std::remove_if(str.begin(), str.end(), std::not1(std::ptr_fun(::isalnum))), str.end());
    // Convert the string to lowercase
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    // See if we still have a valid name after the cleanup
    if(str.empty()) return SQMOD_UNKNOWN;
    // Grab the actual length of the string
    unsigned len = str.length();
    // Get the most significant characters used to identify a skin
    SQChar a = str[0], b = 0, c = 0, d = str[len-1];
    // Look for deeper specifiers
    if (str.length() >= 3)
    {
        b = str[1];
        c = str[2];
    }
    else if (str.length() >= 2)
    {
        b = str[1];
    }
    // Search for a pattern in the name
    switch (a)
    {
        // [A]lex Srub, [A]rabic guy, [A]rmy
        case 'a':
            switch (b)
            {
                // [Al]ex [S]rub
                case 'l':
                case 's': return SQMOD_SKIN_ALEX_SRUB;
                // [A]rabic [g]uy
                case 'g': return SQMOD_SKIN_ARABIC_GUY;
                // [Ara]bic guy, [Arm]y
                case 'r':
                    if (c == 'a') return SQMOD_SKIN_ARABIC_GUY;
                    else if (c == 'm') return SQMOD_SKIN_ARMY;
            }
        // [B]each guy (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)/(#8|H)
        // [B]each lady (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)
        // [B]iker (#1|A)/(#2|B)
        // [B]um guy (#1|A)/(#2|B)/(#3|C)
        // [B]um lady (#1|A)/(#2|B)/(#2|C)/(#3|D)/(#4|E)
        // [B]usiness man (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)
        case 'b':
            // [Be]ach [g]uy (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)/(#8|H)
            if (b == 'e' && (c == 'g' || (len > 4 && str[5] == 'g')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_BEACH_GUY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_BEACH_GUY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_BEACH_GUY_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_BEACH_GUY_D;
                    case '5':
                    case 'e': return SQMOD_SKIN_BEACH_GUY_E;
                    case '6':
                    case 'f': return SQMOD_SKIN_BEACH_GUY_F;
                    case '7':
                    case 'g': return SQMOD_SKIN_BEACH_GUY_G;
                    case '8':
                    case 'h': return SQMOD_SKIN_BEACH_GUY_H;
                }
            }
            // [Be]ach [l]ady (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)
            else if (b == 'e' && (c == 'l' || (len > 4 && str[5] == 'l')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_BEACH_LADY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_BEACH_LADY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_BEACH_LADY_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_BEACH_LADY_D;
                    case '5':
                    case 'e': return SQMOD_SKIN_BEACH_LADY_E;
                    case '6':
                    case 'f': return SQMOD_SKIN_BEACH_LADY_F;
                    case '7':
                    case 'g': return SQMOD_SKIN_BEACH_LADY_G;
                }
            }
            // [Bi]ker (#1|A)/(#2|B)
            else if (b == 'i' && (d == '1' || d == 'a')) return SQMOD_SKIN_BIKER_A;
            else if (b == 'i' && (d == '2' || d == 'b')) return SQMOD_SKIN_BIKER_B;
            // [Bum] [g]uy (#1|A)/(#2|B)/(#3|C)
            // [Bum] [l]ady (#1|A)/(#2|B)/(#2|C)/(#3|D)/(#4|E)
            else if (b == 'u' && (c && (c == 'm' || c == 'g' || c == 'l')))
            {
                // [Bum] [g]uy (#1|A)/(#2|B)/(#3|C)
                if (c == 'g' || (len > 2 && str[3] == 'g'))
                {
                    if (d == '1' || d == 'a') return SQMOD_SKIN_BUM_GUY_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_BUM_GUY_B;
                    else if (d == '3' || d == 'c') return SQMOD_SKIN_BUM_GUY_C;
                }
                // [Bum] [l]ady (#1|A)/(#2|B)/(#2|C)/(#3|D)/(#4|E)
                else if (c == 'l' || (len > 2 && str[3] == 'l'))
                {
                    if (d == '1' || d == 'a') return SQMOD_SKIN_BUM_LADY_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_BUM_LADY_B;
                    else if (d == '2' || d == 'c') return SQMOD_SKIN_BUM_LADY_C;
                    else if (d == '3' || d == 'd') return SQMOD_SKIN_BUM_LADY_D;
                    else if (d == '4' || d == 'e') return SQMOD_SKIN_BUM_LADY_E;
                }
            }
            // [Bus]iness [m]an (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)
            else if (b == 'u' && (c == 's' || (len > 8 && str[9] == 'm')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_BUSINESS_MAN_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_BUSINESS_MAN_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_BUSINESS_MAN_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_BUSINESS_MAN_D;
                    case '5':
                    case 'e': return SQMOD_SKIN_BUSINESS_MAN_E;
                    case '6':
                    case 'f': return SQMOD_SKIN_BUSINESS_MAN_F;
                }
            }
        // [C]am, [C]am (Robber), [C]andy Suxx, [C]hef
        // [C]hurch guy, [C]hurch lady, [C]lub lady
        // [C]olumbian guy (#1|A)/(#2|B),
        // [C]onstruction worker (#1|A)/(#2|B)
        // [C]ool guy (#1|A)/(#2|B)/(#3|C)/(#4|D)
        // [C]op, [C]ortez
        // [C]riminal (#1|A)/(#2|B)
        // [C]uban (#1|A)/(#2|B)
        case 'c':
            // [Ca]m, [Ca]m (Robber), [Ca]ndy Suxx
            if (b == 'a')
            {
                // [Cam] ([R]obbe[r])
                if (c && (c == 'm' || c == 'r') && d == 'r') return SQMOD_SKIN_CAM_ROBBER;
                // [Cam]
                else if (c == 'm') return SQMOD_SKIN_CAM;
                // [Can]dy [S]ux[x]
                else if (c && (c == 'n' || c == 's' || d == 'x')) return SQMOD_SKIN_CANDY_SUXX;
            }
            // [Ch]ef, [Ch]urch guy, [Ch]urch lady
            else if (b == 'h')
            {
                // [Che][f]
                if (c && (c == 'e' || d == 'f')) return SQMOD_SKIN_CHEF;
                // [Chu]rch [g]uy
                else if (c && ((c == 'u' && len > 5 && str[6] == 'g') || (c == 'g')))
                    return SQMOD_SKIN_CHURCH_GUY;
                // [Chu]rch [l]ady
                else if (c && ((c == 'u' && len > 5 && str[6] == 'l') || (c == 'l')))
                    return SQMOD_SKIN_CHURCH_LADY;
            }
            // [Cl]ub [l]ady
            else if (b == 'l') return SQMOD_SKIN_CLUB_LADY;
            // [Co]lumbian guy (#1|A)/(#2|B)
            // [Co]nstruction worker (#1|A)/(#2|B)
            // [Co]ol guy (#1|A)/(#2|B)/(#3|C)/(#4|D)
            // [Co]p, [Co]rtez
            else if (b == 'o')
            {
                // [Col]umbian [g]uy (#1|A)/(#2|B)
                if (c && ((c == 'l' && len > 8 && str[9] == 'g') || (c == 'g')))
                {
                    if (d == '1' || d == 'a') return SQMOD_SKIN_COLUMBIAN_GUY_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_COLUMBIAN_GUY_B;
                }
                // [Con]struction [w]orker (#1|A)/(#2|B)
                else if (c && (c == 'n' || (len > 11 && str[12] == 'g')))
                {
                    if (d == '1' || d == 'a') return SQMOD_SKIN_CONSTRUCTION_WORKER_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_CONSTRUCTION_WORKER_B;
                }
                // [Coo]l guy (#1|A)/(#2|B)/(#3|C)/(#4|D)
                else if (c == 'o')
                {
                    switch (d)
                    {
                        case '1':
                        case 'a': return SQMOD_SKIN_COOL_GUY_A;
                        case '2':
                        case 'b': return SQMOD_SKIN_COOL_GUY_B;
                        case '3':
                        case 'c': return SQMOD_SKIN_COOL_GUY_C;
                        case '4':
                        case 'd': return SQMOD_SKIN_COOL_GUY_D;
                    }
                }
                // [Cop]
                else if (c == 'p') return SQMOD_SKIN_COP;
                // [Cor]te[z]
                else if (c && (c == 'r' || c == 'z' || d == 'z')) return SQMOD_SKIN_CORTEZ;
            }
            // [Cr]iminal (#1|A)/(#2|B)
            else if (b == 'r' && (d == '1' || d == 'a')) return SQMOD_SKIN_CRIMINAL_A;
            else if (b == 'r' && (d == '2' || d == 'b')) return SQMOD_SKIN_CRIMINAL_B;
            // [Cu]ban (#1|A)/(#2|B)
            else if (b == 'u' && (d == '1' || d == 'a')) return SQMOD_SKIN_CUBAN_A;
            else if (b == 'u' && (d == '2' || d == 'b')) return SQMOD_SKIN_CUBAN_B;
        // [D]BP security (#1|A)/(#2|B)
        // [D]iaz guy (#1|A)/(#2|B)
        case 'd':
            switch (b)
            {
                // [DB]P [s]ecurity (#1|A)/(#2|B)
                case 'b':
                case 's':
                    if (d == '1' || d == 'a') return SQMOD_SKIN_DBP_SECURITY_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_DBP_SECURITY_B;
                // [Di]a[z] [g]uy (#1|A)/(#2|B)
                case 'i':
                case 'z':
                case 'g':
                    if (d == '1' || d == 'a') return SQMOD_SKIN_DIAZ_GUY_A;
                    else if (d == '2' || d == 'b') return SQMOD_SKIN_DIAZ_GUY_B;
            }
        // [F]BI, [F]ireman, [F]ood lady, [F]rench guy
        case 'f':
            switch (b)
            {
                // [FB]I
                case 'b': return SQMOD_SKIN_FBI;
                // [Fi]re[m]an
                case 'i':
                case 'm': return SQMOD_SKIN_FIREMAN;
                // [Fo]od [l]ady
                case 'o':
                case 'l': return SQMOD_SKIN_FOOD_LADY;
                // [Fr]ench [g]uy
                case 'r':
                case 'g': return SQMOD_SKIN_FRENCH_GUY;
            }
        // [G]arbageman (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)
        // [G]olf guy (#1|A)/(#2|B)/(#3|C)
        // [G]olf lady
        // [G]ranny (#1|A)/(#2|B)
        // [G]ym guy, [G]ym lady
        case 'g':
            // [Ga]rbage[m]an (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)
            if (b && (b == 'a' || b == 'm'))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_GARBAGEMAN_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_GARBAGEMAN_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_GARBAGEMAN_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_GARBAGEMAN_D;
                    case '5':
                    case 'e': return SQMOD_SKIN_GARBAGEMAN_E;
                }
            }
            // [Go]lf [g]uy (#1|A)/(#2|B)/(#3|C)
            else if (b == 'o' && ((c == 'g') || (len > 3 && str[4] == 'g')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_GOLF_GUY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_GOLF_GUY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_GOLF_GUY_C;
                }
            }
            // [Go]lf [l]ady
            else if (b == 'o' && ((c == 'l') || (len > 3 && str[4] == 'l')))
                return SQMOD_SKIN_GOLF_LADY;
            // [Gr]anny (#1|A)/(#2|B)
            else if (b == 'r')
            {
                if (d == '1' || d == 'a') return SQMOD_SKIN_GRANNY_A;
                else if (d == '2' || d == 'b') return SQMOD_SKIN_GRANNY_B;
            }
            // [Gy]m [g]uy
            else if (b && (b == 'g' || (b == 'y' && len > 2 && str[3] == 'g')))
                return SQMOD_SKIN_GYM_GUY;
            // [Gy]m [l]ady
            else if (b && (b == 'l' || (b == 'y' && len > 2 && str[3] == 'l')))
                return SQMOD_SKIN_GYM_LADY;
        // [H]atian (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)
        // [H]ilary, [H]ilary (Robber), [H]ood lady
        case 'h':
            // [H]atian (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)
            if (b == 'a')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_HATIAN_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_HATIAN_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_HATIAN_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_HATIAN_D;
                    case '5':
                    case 'e': return SQMOD_SKIN_HATIAN_E;
                }
            }
            // [Hi]lary ([R]obbe[r])
            else if (b && (b == 'i' || b == 'r') && d == 'r') return SQMOD_SKIN_HILARY_ROBBER;
            // [Hi]lary
            else if (b == 'i') return SQMOD_SKIN_HILARY;
            // [Ho]od [l]ady
            if (b && (b == 'o' || b == 'l')) return SQMOD_SKIN_HOOD_LADY;
        // [K]en Rosenburg
        case 'k':
            return SQMOD_SKIN_KEN_ROSENBURG;
        // [L]ance (#1|A)/(#1|B)
        // [L]ance (Cop)
        // [L]awyer
        // [L]ove Fist (#1|A)/(#2|B)/(#3|C)/(#3|D)
        case 'l':
            //[Lan]ce ([C]o[p])
            if ((b == 'a') && (c == 'n') && ((len > 4 && str[5] == 'c') || d == 'p'))
                return SQMOD_SKIN_LANCE_COP;
            else if (b && (b == 'c' ||  (b == 'a' && (c == 'n'))))
                return SQMOD_SKIN_LANCE_COP;
            // [La]nce (#1|A)/(#1|B)
            else if (b == 'a' && c == 'n')
            {
                if (d == '1' || d == 'a') return SQMOD_SKIN_LANCE_A;
                else if (d == '2' || d == 'b') return SQMOD_SKIN_LANCE_B;
            }
            // [Law]yer
            else if (b && (b == 'w' || (b == 'a' && c == 'w'))) return SQMOD_SKIN_LAWYER;
            // [Lo]ve [F]ist (#1|A)/(#2|B)/(#3|C)/(#3|D)
            else if (b && (b == 'o' || b == 'f'))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_LOVE_FIST_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_LOVE_FIST_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_LOVE_FIST_C;
                    case 'd': return SQMOD_SKIN_LOVE_FIST_D;
                }
            }
        // [M]ercades
        case 'm':
            if (d == 'b') return SQMOD_SKIN_MERCADES_B;
            else return SQMOD_SKIN_MERCADES_A;
        // [O]ffice lady (#1|A)/(#2|B)
        case 'o':
            if (d == '1' || d == 'a') return SQMOD_SKIN_OFFICE_LADY_A;
            else if (d == '2' || d == 'b') return SQMOD_SKIN_OFFICE_LADY_B;
        // [P]aramedic, [P]hil,  [P]hil (One arm), [P]hil (Robber)
        // [P]imp, [P]izzaman
        // [P]rostitute (#1|A)/(#2|B)/(#2|C)/(#2|D)/(#3|D)/(#4|D)
        // [P]unk (#1|A)/(#2|B)/(#3|C)
        case 'p':
            // [Pa]ramedic
            if (b == 'a') return SQMOD_SKIN_PARAMEDIC;
            // [Ph]il (One arm), [Ph]il (Robber)
            else if (b == 'h')
            {
                // [Ph]il ([O]ne ar[m])
                if (b == 'o' || (c == 'o') || (len > 3 && str[4] == 'o') || d == 'm')
                    return SQMOD_SKIN_PHIL_ONE_ARM;
                // [Ph]il ([R]obbe[r])
                else if (c && (c == 'r' || d == 'r' || (len > 3 && str[4] == 'r')))
                    return SQMOD_SKIN_PHIL_ROBBER;
                // [Phi]l
                else if (c == 'i') return SQMOD_SKIN_PHIL;
            }
            // [Pim][p]
            else if (b == 'i' && ((c == 'm') || d == 'p')) return SQMOD_SKIN_PIMP;
            // [Piz]zama[n]
            else if (b == 'i' && ((c == 'z') || d == 'n')) return SQMOD_SKIN_PIZZAMAN;
            // [Pr]ostitute (#1|A)/(#2|B)/(#2|C)/(#2|D)/(#3|D)/(#4|D)
            else if (b == 'r')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_PROSTITUTE_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_PROSTITUTE_B;
                    case 'c': return SQMOD_SKIN_PROSTITUTE_C;
                    case 'd': return SQMOD_SKIN_PROSTITUTE_D;
                    case '3':
                    case 'e': return SQMOD_SKIN_PROSTITUTE_E;
                    case '4':
                    case 'f': return SQMOD_SKIN_PROSTITUTE_F;
                }
            }
            // [Pu]nk (#1|A)/(#2|B)/(#3|C)
            else if (b == 'u')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_PUNK_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_PUNK_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_PUNK_C;
                }
            }
        // [R]ich guy, [R]ockstar guy
        case 'r':
            // [Ri]ch guy
            if (b == 'i') return SQMOD_SKIN_RICH_GUY;
            // [Ro]ckstar guy
            else if (b == 'o') return SQMOD_SKIN_ROCKSTAR_GUY;
        // [S]ailor (#1|A)/(#2|B)/(#3|C)
        // [S]hark (#1|A)/(#2|B)
        // [S]hopper (#1|A)/(#2|B)
        // [S]kate guy, [S]kate lady, [S]onny
        // [S]onny guy (#1|A)/(#2|B)/(#3|C)
        // [S]pandEx (#1|A)/(#2|B)
        // [S]panish guy
        // [S]panish lady (#1|A)/(#2|B)/(#3|C)/(#4|D)
        // [S]tore clerk
        // [S]tripper (#1|A)/(#2|B)/(#3|C)
        // [S]wat
        case 's':
            // [Sa]ilor (#1|A)/(#2|B)/(#3|C)
            if (b == 'a')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SAILOR_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SAILOR_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_SAILOR_C;
                }
            }
            // [S]hark (#1|A)/(#2|B)
            else if (b == 'h' && c == 'a')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SHARK_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SHARK_B;
                }
            }
            // [S]hopper (#1|A)/(#2|B)
            else if (b == 'h' && c == 'o')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SHOPPER_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SHOPPER_B;
                }
            }
            // [Sk]ate [g]uy
            else if (b == 'k' && ((c == 'g') || (len > 4 && str[5] == 'g')))
                return SQMOD_SKIN_SKATE_GUY;
            // [Sk]ate [l]ady
            else if (b == 'k' && ((c == 'l') || (len > 4 && str[5] == 'l')))
                return SQMOD_SKIN_SKATE_LADY;
            // [So]nny
            // [So]nny guy (#1|A)/(#2|B)/(#3|C)
            else if (b == 'o')
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SONNY_GUY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SONNY_GUY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_SONNY_GUY_C;
                }
            }
            else if (b == 'g')
            {
                                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SONNY_GUY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SONNY_GUY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_SONNY_GUY_C;
                }
            }
            // [Sp]andE[x] (#1|A)/(#2|B)
            else if (b == 'p' && ((c == 'x') || (len > 5 && str[6] == 'x')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SPANDEX_GUY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SPANDEX_GUY_B;
                }
            }
            // [Sp]anish [g]uy
            else if (b == 'p' && ((c == 'g') || (len > 6 && str[7] == 'g')))
                return SQMOD_SKIN_SPANISH_GUY;
            // [Sp]anish [l]ady (#1|A)/(#2|B)/(#3|C)/(#4|D)
            else if (b == 'p' && ((c == 'l') || (len > 6 && str[7] == 'l')))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_SPANISH_LADY_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_SPANISH_LADY_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_SPANISH_LADY_C;
                    case '4':
                    case 'd': return SQMOD_SKIN_SPANISH_LADY_D;
                }
            }
            // [Sto]re clerk
            else if ((b == 't') && (c == 'o')) return SQMOD_SKIN_STORE_CLERK;
            // [Str]ipper (#1|A)/(#2|B)/(#3|C)
            else if ((b == 't') && (c == 'r'))
            {
                switch (d)
                {
                    case '1':
                    case 'a': return SQMOD_SKIN_STRIPPER_A;
                    case '2':
                    case 'b': return SQMOD_SKIN_STRIPPER_B;
                    case '3':
                    case 'c': return SQMOD_SKIN_STRIPPER_C;
                }
            }
            // [Sw]at
            else if (b == 'w') return SQMOD_SKIN_SWAT;
        // [T]axi driver (#1|A)/(#1|B)/(#2|C)/(#2|D)
        // [T]hug (#1|A)/(#2|B)
        // [T]ommy Vercetti
        // [T]ourist (#1|A)/(#2|B)
        // [T]ranny
        case 't':
            switch (b)
            {
                // [Ta]xi driver (#1|A)/(#1|B)/(#2|C)/(#2|D)
                case 'a':
                    switch (d)
                    {
                        case '1':
                        case 'a': return SQMOD_SKIN_TAXI_DRIVER_A;
                        case '2':
                        case 'b': return SQMOD_SKIN_TAXI_DRIVER_B;
                        case 'c': return SQMOD_SKIN_TAXI_DRIVER_C;
                        case 'd': return SQMOD_SKIN_TAXI_DRIVER_D;
                    }
                // [Th]ug (#1|A)/(#2|B)
                case 'h':
                    switch (d)
                    {
                        case '1':
                        case 'a': return SQMOD_SKIN_THUG_A;
                        case '5':
                        case 'b': return SQMOD_SKIN_THUG_B;
                    }
                // [To]mmy [V]ercetti
                // [To]urist (#1|A)/(#2|B)
                case 'v': return SQMOD_SKIN_TOMMY_VERCETTI;
                case 'o':
                    if (c == 'm') return SQMOD_SKIN_TOMMY_VERCETTI;
                    else if (c == 'u' && (d == '1' || d == 'a')) return SQMOD_SKIN_TOURIST_A;
                    else if (c == 'u' && (d == '2' || d == 'b')) return SQMOD_SKIN_TOURIST_B;
                case 'r': return SQMOD_SKIN_TRANNY;
            }
        // [U]ndercover cop (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)
        case 'u':
            switch (d)
            {
                case '1':
                case 'a': return SQMOD_SKIN_UNDERCOVER_COP_A;
                case '2':
                case 'b': return SQMOD_SKIN_UNDERCOVER_COP_B;
                case '3':
                case 'c': return SQMOD_SKIN_UNDERCOVER_COP_C;
                case '4':
                case 'd': return SQMOD_SKIN_UNDERCOVER_COP_D;
                case '5':
                case 'e': return SQMOD_SKIN_UNDERCOVER_COP_E;
                case '6':
                case 'f': return SQMOD_SKIN_UNDERCOVER_COP_F;
            }
        // [V]ercetti guy (#1|A)/(#2|B)
        case 'v':
            switch (d)
            {
                case '1':
                case 'a': return SQMOD_SKIN_VERCETTI_GUY_A;
                case '2':
                case 'b': return SQMOD_SKIN_VERCETTI_GUY_B;
            }
        // [W]aitress (#1|A)/(#2|B)
        case 'w':
            switch (d)
            {
                case '1':
                case 'a': return SQMOD_SKIN_WAITRESS_A;
                case '2':
                case 'b': return SQMOD_SKIN_WAITRESS_B;
            }
        // Default to unknown
        default: return SQMOD_UNKNOWN;
    }
}

// ------------------------------------------------------------------------------------------------
bool IsSkinValid(SQInt32 id)
{
    return (strcmp(GetSkinName(id), _SC("")) != 0) ? true : false;
}

// ------------------------------------------------------------------------------------------------
const SQChar * GetAutomobileName(SQInt32 id)
{
    switch(id)
    {
        case SQMOD_VEHICLE_LANDSTALKER:         return _SC("Landstalker");
        case SQMOD_VEHICLE_IDAHO:               return _SC("Idaho");
        case SQMOD_VEHICLE_STINGER:             return _SC("Stinger");
        case SQMOD_VEHICLE_LINERUNNER:          return _SC("Linerunner");
        case SQMOD_VEHICLE_PERENNIAL:           return _SC("Perennial");
        case SQMOD_VEHICLE_SENTINEL:            return _SC("Sentinel");
        case SQMOD_VEHICLE_RIO:                 return _SC("Rio");
        case SQMOD_VEHICLE_FIRETRUCK:           return _SC("Firetruck");
        case SQMOD_VEHICLE_TRASHMASTER:         return _SC("Trashmaster");
        case SQMOD_VEHICLE_STRETCH:             return _SC("Stretch");
        case SQMOD_VEHICLE_MANANA:              return _SC("Manana");
        case SQMOD_VEHICLE_INFERNUS:            return _SC("Infernus");
        case SQMOD_VEHICLE_VOODOO:              return _SC("Voodoo");
        case SQMOD_VEHICLE_PONY:                return _SC("Pony");
        case SQMOD_VEHICLE_MULE:                return _SC("Mule");
        case SQMOD_VEHICLE_CHEETAH:             return _SC("Cheetah");
        case SQMOD_VEHICLE_AMBULANCE:           return _SC("Ambulance");
        case SQMOD_VEHICLE_FBIWASHINGTON:       return _SC("FBI Washington");
        case SQMOD_VEHICLE_MOONBEAM:            return _SC("Moonbeam");
        case SQMOD_VEHICLE_ESPERANTO:           return _SC("Esperanto");
        case SQMOD_VEHICLE_TAXI:                return _SC("Taxi");
        case SQMOD_VEHICLE_WASHINGTON:          return _SC("Washington");
        case SQMOD_VEHICLE_BOBCAT:              return _SC("Bobcat");
        case SQMOD_VEHICLE_MRWHOOPEE:           return _SC("Mr. Whoopee");
        case SQMOD_VEHICLE_BFINJECTION:         return _SC("BF Injection");
        case SQMOD_VEHICLE_HUNTER:              return _SC("Hunter");
        case SQMOD_VEHICLE_POLICE:              return _SC("Police");
        case SQMOD_VEHICLE_ENFORCER:            return _SC("Enforcer");
        case SQMOD_VEHICLE_SECURICAR:           return _SC("Securicar");
        case SQMOD_VEHICLE_BANSHEE:             return _SC("Banshee");
        case SQMOD_VEHICLE_PREDATOR:            return _SC("Predator");
        case SQMOD_VEHICLE_BUS:                 return _SC("Bus");
        case SQMOD_VEHICLE_RHINO:               return _SC("Rhino");
        case SQMOD_VEHICLE_BARRACKSOL:          return _SC("Barracks OL");
        case SQMOD_VEHICLE_CUBANHERMES:         return _SC("Cuban Hermes");
        case SQMOD_VEHICLE_HELICOPTER:          return _SC("Helicopter");
        case SQMOD_VEHICLE_ANGEL:               return _SC("Angel");
        case SQMOD_VEHICLE_COACH:               return _SC("Coach");
        case SQMOD_VEHICLE_CABBIE:              return _SC("Cabbie");
        case SQMOD_VEHICLE_STALLION:            return _SC("Stallion");
        case SQMOD_VEHICLE_RUMPO:               return _SC("Rumpo");
        case SQMOD_VEHICLE_RCBANDIT:            return _SC("RC Bandit");
        case SQMOD_VEHICLE_HEARSE:              return _SC("Romero's Hearse");
        case SQMOD_VEHICLE_PACKER:              return _SC("Packer");
        case SQMOD_VEHICLE_SENTINELXS:          return _SC("Sentinel XS");
        case SQMOD_VEHICLE_ADMIRAL:             return _SC("Admiral");
        case SQMOD_VEHICLE_SQUALO:              return _SC("Squalo");
        case SQMOD_VEHICLE_SEASPARROW:          return _SC("Sea Sparrow");
        case SQMOD_VEHICLE_PIZZABOY:            return _SC("Pizza Boy");
        case SQMOD_VEHICLE_GANGBURRITO:         return _SC("Gang Burrito");
        case SQMOD_VEHICLE_AIRTRAIN:            return _SC("Airtrain");
        case SQMOD_VEHICLE_DEADDODO:            return _SC("Deaddodo");
        case SQMOD_VEHICLE_SPEEDER:             return _SC("Speeder");
        case SQMOD_VEHICLE_REEFER:              return _SC("Reefer");
        case SQMOD_VEHICLE_TROPIC:              return _SC("Tropic");
        case SQMOD_VEHICLE_FLATBED:             return _SC("Flatbed");
        case SQMOD_VEHICLE_YANKEE:              return _SC("Yankee");
        case SQMOD_VEHICLE_CADDY:               return _SC("Caddy");
        case SQMOD_VEHICLE_ZEBRACAB:            return _SC("Zebra Cab");
        case SQMOD_VEHICLE_TOPFUN:              return _SC("Top Fun");
        case SQMOD_VEHICLE_SKIMMER:             return _SC("Skimmer");
        case SQMOD_VEHICLE_PCJ600:              return _SC("PCJ-600");
        case SQMOD_VEHICLE_FAGGIO:              return _SC("Faggio");
        case SQMOD_VEHICLE_FREEWAY:             return _SC("Freeway");
        case SQMOD_VEHICLE_RCBARON:             return _SC("RC Baron");
        case SQMOD_VEHICLE_RCRAIDER:            return _SC("RC Raider");
        case SQMOD_VEHICLE_GLENDALE:            return _SC("Glendale");
        case SQMOD_VEHICLE_OCEANIC:             return _SC("Oceanic");
        case SQMOD_VEHICLE_SANCHEZ:             return _SC("Sanchez");
        case SQMOD_VEHICLE_SPARROW:             return _SC("Sparrow");
        case SQMOD_VEHICLE_PATRIOT:             return _SC("Patriot");
        case SQMOD_VEHICLE_LOVEFIST:            return _SC("Love Fist");
        case SQMOD_VEHICLE_COASTGUARD:          return _SC("Coast Guard");
        case SQMOD_VEHICLE_DINGHY:              return _SC("Dinghy");
        case SQMOD_VEHICLE_HERMES:              return _SC("Hermes");
        case SQMOD_VEHICLE_SABRE:               return _SC("Sabre");
        case SQMOD_VEHICLE_SABRETURBO:          return _SC("Sabre Turbo");
        case SQMOD_VEHICLE_PHOENIX:             return _SC("Phoenix");
        case SQMOD_VEHICLE_WALTON:              return _SC("Walton");
        case SQMOD_VEHICLE_REGINA:              return _SC("Regina");
        case SQMOD_VEHICLE_COMET:               return _SC("Comet");
        case SQMOD_VEHICLE_DELUXO:              return _SC("Deluxo");
        case SQMOD_VEHICLE_BURRITO:             return _SC("Burrito");
        case SQMOD_VEHICLE_SPANDEXPRESS:        return _SC("Spand Express");
        case SQMOD_VEHICLE_MARQUIS:             return _SC("Marquis");
        case SQMOD_VEHICLE_BAGGAGEHANDLER:      return _SC("Baggage Handler");
        case SQMOD_VEHICLE_KAUFMANCAB:          return _SC("Kaufman Cab");
        case SQMOD_VEHICLE_MAVERICK:            return _SC("Maverick");
        case SQMOD_VEHICLE_VCNMAVERICK:         return _SC("VCN Maverick");
        case SQMOD_VEHICLE_RANCHER:             return _SC("Rancher");
        case SQMOD_VEHICLE_FBIRANCHER:          return _SC("FBI Rancher");
        case SQMOD_VEHICLE_VIRGO:               return _SC("Virgo");
        case SQMOD_VEHICLE_GREENWOOD:           return _SC("Greenwood");
        case SQMOD_VEHICLE_CUBANJETMAX:         return _SC("Cuban Jetmax");
        case SQMOD_VEHICLE_HOTRINGRACER1:       return _SC("Hotring Racer #1");
        case SQMOD_VEHICLE_SANDKING:            return _SC("Sandking");
        case SQMOD_VEHICLE_BLISTACOMPACT:       return _SC("Blista Compact");
        case SQMOD_VEHICLE_POLICEMAVERICK:      return _SC("Police Maverick");
        case SQMOD_VEHICLE_BOXVILLE:            return _SC("Boxville");
        case SQMOD_VEHICLE_BENSON:              return _SC("Benson");
        case SQMOD_VEHICLE_MESAGRANDE:          return _SC("Mesa Grande");
        case SQMOD_VEHICLE_RCGOBLIN:            return _SC("RC Goblin");
        case SQMOD_VEHICLE_HOTRINGRACER2:       return _SC("Hotring Racer #2");
        case SQMOD_VEHICLE_HOTRINGRACER3:       return _SC("Hotring Racer #3");
        case SQMOD_VEHICLE_BLOODRINGBANGER1:    return _SC("Bloodring Banger #1");
        case SQMOD_VEHICLE_BLOODRINGBANGER2:    return _SC("Bloodring Banger #2");
        case SQMOD_VEHICLE_POLICECHEETAH:       return _SC("Vice Squad Cheetah");
        default:                                return _SC("");
    }
}

SQInt32 GetAutomobileID(const SQChar * name)
{
    // Clone the string into an editable version
    String str(name);
    // Strip non alphanumeric characters from the name
    str.erase(std::remove_if(str.begin(), str.end(), std::not1(std::ptr_fun(::isalnum))), str.end());
    // Convert the string to lowercase
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    // See if we still have a valid name after the cleanup
    if(str.empty()) return SQMOD_UNKNOWN;
    // Grab the actual length of the string
    unsigned len = str.length();
    // Get the most significant characters used to identify a vehicle
    SQChar a = str[0], b = 0, c = 0, d = str[len-1];
    // Look for deeper specifiers
    if(str.length() >= 3)
    {
        c = str[2];
        b = str[1];
    }
    else if(str.length() >= 2)
    {
        b = str[1];
    }
    // Search for a pattern in the name
    switch (a)
    {
        // [A]dmiral
        // [A]irtrain
        // [A]mbulance
        // [A]ngel
        case 'a':
            switch (b)
            {
                // [Ad]miral
                case 'd': return SQMOD_VEHICLE_ADMIRAL;
                // [Ai]rtrain
                case 'i': return SQMOD_VEHICLE_AIRTRAIN;
                // [Am]bulance
                case 'm': return SQMOD_VEHICLE_AMBULANCE;
                // [An]gel
                case 'n': return SQMOD_VEHICLE_ANGEL;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }

        // [B]aggage Handler
        // [B]anshee
        // [B]arracks OL
        // [B]enson
        // [B]F Injection
        // [B]lista Compact
        // [B]loodring Banger #1
        // [B]loodring Banger #2
        // [B]obcat
        // [B]oxville
        // [B]urrito
        // [B]us
        case 'b':
            switch (b)
            {
                // [Ba]ggage Handler
                // [Ba]nshee
                // [Ba]rracks OL
                case 'a':
                    // [Bag]gage Handler
                    if (c == 'g') return SQMOD_VEHICLE_BAGGAGEHANDLER;
                    // [Ban]shee
                    else if (c == 'n') return SQMOD_VEHICLE_BANSHEE;
                    // [Bar]racks OL
                    else if (c == 'r') return SQMOD_VEHICLE_BARRACKS;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Be]nson
                case 'e': return SQMOD_VEHICLE_BENSON;
                // [BF] [I]njection
                case 'f':
                case 'i': return SQMOD_VEHICLE_BFINJECTION;
                // [Bl]ista Compact
                // [Bl]oodring Banger #1
                // [Bl]oodring Banger #2
                case 'l':
                    // [Bli]sta [C]ompact
                    if (b == 'c' || c == 'i') return SQMOD_VEHICLE_BLISTACOMPACT;
                    // [Blo]odring [B]anger (#1|A)
                    else if ((b == 'b' || c == 'o') && (d == '1' || d == 'a')) return SQMOD_VEHICLE_BLOODRINGBANGER1;
                    // [Blo]odring [B]anger (#2|B)
                    else if ((b == 'b' || c == 'o') && (d == '2' || d == 'b')) return SQMOD_VEHICLE_BLOODRINGBANGER2;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Bo]bcat
                // [Bo]xville
                case 'o':
                    // [Bob]cat
                    if (c == 'b') return SQMOD_VEHICLE_BOBCAT;
                    // [Box]ville
                    else if (c == 'x') return SQMOD_VEHICLE_BOXVILLE;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Bu]rrito
                // [Bu]s
                case 'u':
                    // [Bur]rito
                    if (c == 'r') return SQMOD_VEHICLE_BURRITO;
                    // [Bus]
                    else if (c == 's') return SQMOD_VEHICLE_BUS;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [C]abbie
        // [C]addy
        // [C]heetah
        // [C]oach
        // [C]oast Guard
        // [C]omet
        // [C]uban Hermes
        // [C]uban Jetmax
        case 'c':
            switch (b)
            {
                // [Ca]bbie
                // [Ca]ddy
                case 'a':
                    // [Cab]bie
                    if (c == 'b') return SQMOD_VEHICLE_CABBIE;
                    // [Cad]dy
                    else if (c == 'd') return SQMOD_VEHICLE_CADDY;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Ch]eetah
                case 'h': return SQMOD_VEHICLE_CHEETAH;
                // [Co]ach
                // [Co]ast Guard
                // [Co]met
                case 'o':
                    // [Coa]c[h]
                    if (c == 'a' && d == 'h') return SQMOD_VEHICLE_COACH;
                    // [Coa]s[t] Guar[d]
                    else if (c == 'a' && (d == 't' || d == 'd')) return SQMOD_VEHICLE_COASTGUARD;
                    // [Co]met
                    else if (c == 'm') return SQMOD_VEHICLE_COMET;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Cu]ban Hermes
                // [Cu]ban Jetmax
                case 'u':
                    // [Cub]an [H]erme[s]
                    if ((len > 4 && str[5] == 'h') || (d == 's' || d == 'h')) return SQMOD_VEHICLE_CUBANHERMES;
                    // [Cub]an [J]etma[x]
                    if ((len > 4 && str[5] == 'j') || (d == 'x' || d == 'j')) return SQMOD_VEHICLE_CUBANJETMAX;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [D]eaddodo
        // [D]eluxo
        // [D]inghy
        case 'd':
            switch (b)
            {
                // [De]addodo
                // [De]luxo
                case 'e':
                    // [Dea]ddodo
                    if (c == 'a') return SQMOD_VEHICLE_DEADDODO;
                    // [Del]uxo
                    else if (c == 'l') return SQMOD_VEHICLE_DELUXO;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Di]nghy
                case 'i': return SQMOD_VEHICLE_DINGHY;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [E]speranto
        // [E]nforcer
        case 'e':
            // [Es]peranto
            if (b && b == 's') return SQMOD_VEHICLE_ESPERANTO;
            // [En]forcer
            else if (b && b == 'n') return SQMOD_VEHICLE_ENFORCER;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [F]aggio
        // [F]BI Rancher
        // [F]BI Washington
        // [F]iretruck
        // [F]latbed
        // [F]reeway
        case 'f':
            switch (b)
            {
                // [Fa]ggio
                case 'a': return SQMOD_VEHICLE_FAGGIO;
                // [FB]I Rancher
                // [FB]I Washington
                case 'b':
                    // [FB]I [R]anche[r]
                    if ((len > 2 && str[3] == 'r') || d == 'r') return SQMOD_VEHICLE_FBIRANCHER;
                    // [FB]I [W]ashingto[n]
                    else if ((len > 2 && str[3] == 'w') || (d == 'n' || d == 'w')) return SQMOD_VEHICLE_FBIWASHINGTON;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Fi]retruck
                case 'i': return SQMOD_VEHICLE_FIRETRUCK;
                // [Fl]atbed
                case 'l': return SQMOD_VEHICLE_FLATBED;
                // [Fr]eeway
                case 'r': return SQMOD_VEHICLE_FREEWAY;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [G]ang Burrito
        // [G]lendale
        // [G]reenwood
        case 'g':
            switch (b)
            {
                // [Ga]ng Burrito
                case 'a': return SQMOD_VEHICLE_GANGBURRITO;
                // [Gl]endale
                case 'l': return SQMOD_VEHICLE_GLENDALE;
                // [Gr]eenwood
                case 'r': return SQMOD_VEHICLE_GREENWOOD;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [H]elicopter
        // [H]ermes
        // [H]otring Racer (#1|A)(#2|B)(#3|C)
        // [H]unter
        case 'h':
            switch (b)
            {
                // [He]licopter
                // [He]rmes
                case 'e':
                    // [Hel]icopter
                    if (c == 'l') return SQMOD_VEHICLE_HELICOPTER;
                    // [Her]mes
                    else if (c == 'r') return SQMOD_VEHICLE_HERMES;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Ho]tring Racer (#1|A)(#2|B)(#3|C)
                case 'o':
                    switch (d)
                    {
                        case '1':
                        case 'a': return SQMOD_VEHICLE_HOTRINGRACER1;
                        case '2':
                        case 'b': return SQMOD_VEHICLE_HOTRINGRACER2;
                        case '3':
                        case 'c': return SQMOD_VEHICLE_HOTRINGRACER3;
                        // Default to unknwon
                        default: return SQMOD_UNKNOWN;
                    }
                // [Hu]nter
                case 'u': return SQMOD_VEHICLE_HUNTER;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [I]daho
        // [I]nfernus
        case 'i':
            // [Id]aho
            if (b && b == 'd') return SQMOD_VEHICLE_IDAHO;
            // [In]fernus
            else if (b && b == 'n') return SQMOD_VEHICLE_INFERNUS;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [K]aufman Cab
        case 'k': return SQMOD_VEHICLE_KAUFMANCAB;
        // [L]andstalker
        // [L]inerunner
        // [L]ove Fist
        case 'l':
            switch (b)
            {
                // [La]ndstalker
                case 'a': return SQMOD_VEHICLE_LANDSTALKER;
                // [Li]nerunner
                case 'i': return SQMOD_VEHICLE_LINERUNNER;
                // [Lo]ve Fist
                case 'o': return SQMOD_VEHICLE_LOVEFIST;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;

            }
        // [M]anana
        // [M]arquis
        // [M]averick
        // [M]esa Grande
        // [M]oonbeam
        // [M]r. Whoopee
        // [M]ule
        case 'm':
            switch (b)
            {
                // [Ma]nana
                // [Ma]rquis
                // [Ma]verick
                case 'a':
                    // [Man]ana
                    if (c == 'n') return SQMOD_VEHICLE_MANANA;
                    // [Mar]quis
                    else if (c == 'r') return SQMOD_VEHICLE_MARQUIS;
                    // [Mav]erick
                    else if (c == 'v') return SQMOD_VEHICLE_MAVERICK;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Me]sa Grande
                case 'e': return SQMOD_VEHICLE_MESAGRANDE;
                // [Mo]onbeam
                case 'o': return SQMOD_VEHICLE_MOONBEAM;
                // [Mr]. Whoopee
                case 'r': return SQMOD_VEHICLE_MRWHOOPEE;
                // [Mu]le
                case 'u': return SQMOD_VEHICLE_MULE;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [O]ceanic
        case 'o': return SQMOD_VEHICLE_OCEANIC;
        // [P]acker
        // [P]atriot
        // [P]CJ-600
        // [P]erennial
        // [P]hoenix
        // [P]izza Boy
        // [P]olice
        // [P]olice Maverick
        // [P]ony
        // [P]redator
        case 'p':
            switch (b)
            {
                // [Pa]cker
                // [Pa]triot
                case 'a':
                    // [Pac]ker
                    if (c == 'c') return SQMOD_VEHICLE_PACKER;
                    // [Pat]riot
                    else if (c == 't') return SQMOD_VEHICLE_PATRIOT;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [PC]J-600
                case 'c': return SQMOD_VEHICLE_PCJ600;
                // [Pe]rennial
                case 'e': return SQMOD_VEHICLE_PERENNIAL;
                // [Ph]oenix
                case 'h': return SQMOD_VEHICLE_PHOENIX;
                // [Pi]zza Boy
                case 'i':
                // [Po]lice
                // [Po]lice Maverick
                // [Po]ny
                case 'o':
                    // [Po]lice
                    if (d == 'e') return SQMOD_VEHICLE_POLICE;
                    // [Po]lice Maverick
                    else if ((len > 5 && str[6] == 'm') || (d == 'k' || d == 'm')) return SQMOD_VEHICLE_POLICEMAVERICK;
                    // [Po]ny
                    else if (c == 'n') return SQMOD_VEHICLE_PONY;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Pr]edator
                case 'r': return SQMOD_VEHICLE_PREDATOR;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [R]ancher
        // [R]C Bandit
        // [R]C Baron
        // [R]C Goblin
        // [R]C Raider
        // [R]eefer
        // [R]egina
        // [R]hino
        // [R]io
        // [R]omero's Hearse
        // [R]umpo
        case 'r':
            switch (b)
            {
                // [Ra]ncher
                case 'a': return SQMOD_VEHICLE_RANCHER;
                // [RC] Bandit
                // [RC] Baron
                // [RC] Goblin
                // [RC] Raider
                case 'c':
                    // [RC] [B]andi[t]
                    if (c == 'b' && d == 't') return SQMOD_VEHICLE_RCBANDIT;
                    // [RC] [B]aro[n]
                    else if (c == 'b' && d == 'n') return SQMOD_VEHICLE_RCBARON;
                    // [RC] [G]oblin
                    else if (c == 'g') return SQMOD_VEHICLE_RCGOBLIN;
                    // [RC] [R]aide[r]
                    else if (c == 'r' || d == 'r') return SQMOD_VEHICLE_RCRAIDER;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Re]efer
                // [Re]gina
                case 'e':
                    // [Ree]fer
                    if (c == 'e' || d == 'r') return SQMOD_VEHICLE_REEFER;
                    // [Reg]ina
                    else if (c == 'g' || d == 'a') return SQMOD_VEHICLE_REGINA;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Rh]ino
                case 'h': return SQMOD_VEHICLE_RHINO;
                // [Ri]o
                case 'i': return SQMOD_VEHICLE_RIO;
                // [Ro]mero's Hearse
                case 'o': return SQMOD_VEHICLE_HEARSE;
                // [Ru]mpo
                case 'u': return SQMOD_VEHICLE_RUMPO;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [S]abre
        // [S]abre Turbo
        // [S]anchez
        // [S]andking
        // [S]ea Sparrow
        // [S]ecuricar
        // [S]entinel
        // [S]entinel XS
        // [S]kimmer
        // [S]pand Express
        // [S]parrow
        // [S]peeder
        // [S]qualo
        // [S]tallion
        // [S]tinger
        // [S]tretch
        case 's':
            switch (b)
            {
                // [Sa]bre
                // [Sa]bre Turbo
                // [Sa]nchez
                // [Sa]ndking
                case 'a':
                    // [Sab]r[e]
                    if (c == 'b' && d == 'e') return SQMOD_VEHICLE_SABRE;
                    // [Sab]re [T]urb[o]
                    else if ((c == 'b' && d == 'o') || (len > 4 && str[5 ]== 't')) return SQMOD_VEHICLE_SABRETURBO;
                    // [Sa]n[c]he[z]
                    else if (d == 'c' || d == 'z') return SQMOD_VEHICLE_SANCHEZ;
                    // [Sa]n[d]kin[g]
                    else if (d == 'd' || d == 'g') return SQMOD_VEHICLE_SANDKING;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Se]a Sparrow
                // [Se]curicar
                // [Se]ntinel
                // [Se]ntinel XS
                case 'e':
                    // [Sea] Sparro[w]
                    if (c == 'e' || d == 'w') return SQMOD_VEHICLE_SEASPARROW;
                    // [Sec]urica[r]
                    else if (c == 'c' || d == 'r') return SQMOD_VEHICLE_SECURICAR;
                    // [Sen]tine[l]
                    else if (c == 'n' && d == 'l') return SQMOD_VEHICLE_SENTINEL;
                    // [Sen]tinel X[S]
                    else if (c == 'n' && d == 's') return SQMOD_VEHICLE_SENTINELXS;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Sk]immer
                case 'k': return SQMOD_VEHICLE_SKIMMER;
                // [Sp]and Express
                // [Sp]arrow
                // [Sp]eeder
                case 'p':
                    // [Spa]nd [E]xpres[s]
                    if (c == 'a' || ((len > 4 && str[5] == 'e') || d == 's')) return SQMOD_VEHICLE_SPANDEXPRESS;
                    // [Spa]rro[w]
                    else if (d == 'w' && (c == 'a' && d == 'w')) return SQMOD_VEHICLE_SPARROW;
                    // [Spe]ede[r]
                    else if (c == 'e' || d == 'r') return SQMOD_VEHICLE_SPEEDER;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Sq]ualo
                case 'q': return SQMOD_VEHICLE_SQUALO;
                // [St]allion
                // [St]inger
                // [St]retch
                case 't':
                    // [Sta]llion
                    if (c == 'a') return SQMOD_VEHICLE_STALLION;
                    // [Sti]nger
                    if (c == 'i') return SQMOD_VEHICLE_STINGER;
                    // [Str]etch
                    if (c == 'r') return SQMOD_VEHICLE_STRETCH;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [T]axi
        // [T]op Fun
        // [T]rashmaster
        // [T]ropic
        case 't':
            switch (b)
            {
                // [Ta]xi
                case 'a': return SQMOD_VEHICLE_TAXI;
                // [To]p Fun
                case 'o': return SQMOD_VEHICLE_TOPFUN;
                // [Tr]ashmaster
                // [Tr]opic
                case 'r':
                    // [Tr]ashmaster
                    if (c == 'a') return SQMOD_VEHICLE_TRASHMASTER;
                    // [Tr]opic
                    if (c == 'o') return SQMOD_VEHICLE_TROPIC;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [V]CN Maverick
        // [V]ice Squad Cheetah
        // [V]irgo
        // [V]oodoo
        case 'v':
            switch (b)
            {
                // [VC]N Maverick
                case 'c': return SQMOD_VEHICLE_VCNMAVERICK;
                // [Vi]ce Squad Cheetah
                // [Vi]rgo
                case 'i':
                    // [Vic]e Squad Cheetah
                    if (c == 'a') return SQMOD_VEHICLE_VICECHEE;
                    // [Vir]go
                    if (c == 'o') return SQMOD_VEHICLE_VIRGO;
                    // Default to unknwon
                    else return SQMOD_UNKNOWN;
                // [Vo]odoo
                case 'o': return SQMOD_VEHICLE_VOODOO;
                // Default to unknwon
                default: return SQMOD_UNKNOWN;
            }
        // [W]alton
        // [W]ashington
        case 'w':
            // [Wa]lton
            if (b == 'a' && c == 'l') return SQMOD_VEHICLE_WALTON;
            // [Wa]shington
            else if (b == 'a' && c == 's') return SQMOD_VEHICLE_WASHINGTON;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [Y]ankee
        case 'y': return SQMOD_VEHICLE_YANKEE;
        // [Z]ebra Cab
        case 'z': return SQMOD_VEHICLE_ZEBRACAB;
        // Default to unknwon
        default: return SQMOD_UNKNOWN;
    }
}

bool IsAutomobileValid(SQInt32 id)
{
    return (strcmp(GetAutomobileName(id), _SC("")) != 0) ? true : false;
}

// ------------------------------------------------------------------------------------------------
const SQChar * GetWeaponName(SQInt32 id)
{
    switch (id)
    {
        case SQMOD_WEAPON_UNARMED:          return _SC("Unarmed");
        case SQMOD_WEAPON_BRASSKNUCKLES:    return _SC("Brass Knuckles");
        case SQMOD_WEAPON_SCREWDRIVER:      return _SC("Screwdriver");
        case SQMOD_WEAPON_GOLFCLUB:         return _SC("Golf Club");
        case SQMOD_WEAPON_NIGHTSTICK:       return _SC("Nightstick");
        case SQMOD_WEAPON_KNIFE:            return _SC("Knife");
        case SQMOD_WEAPON_BASEBALLBAT:      return _SC("Baseball Bat");
        case SQMOD_WEAPON_HAMMER:           return _SC("Hammer");
        case SQMOD_WEAPON_MEATCLEAVER:      return _SC("Meat Cleaver");
        case SQMOD_WEAPON_MACHETE:          return _SC("Machete");
        case SQMOD_WEAPON_KATANA:           return _SC("Katana");
        case SQMOD_WEAPON_CHAINSAW:         return _SC("Chainsaw");
        case SQMOD_WEAPON_GRENADE:          return _SC("Grenade");
        case SQMOD_WEAPON_REMOTE:           return _SC("Remote Detonation Grenade");
        case SQMOD_WEAPON_TEARGAS:          return _SC("Tear Gas");
        case SQMOD_WEAPON_MOLOTOV:          return _SC("Molotov Cocktails");
        case SQMOD_WEAPON_ROCKET:           return _SC("Rocket");
        case SQMOD_WEAPON_COLT45:           return _SC("Colt .45");
        case SQMOD_WEAPON_PYTHON:           return _SC("Python");
        case SQMOD_WEAPON_SHOTGUN:          return _SC("Pump-Action Shotgun");
        case SQMOD_WEAPON_SPAS12:           return _SC("SPAS-12 Shotgun");
        case SQMOD_WEAPON_STUBBY:           return _SC("Stubby Shotgun");
        case SQMOD_WEAPON_TEC9:             return _SC("TEC-9");
        case SQMOD_WEAPON_UZI:              return _SC("Uzi");
        case SQMOD_WEAPON_INGRAM:           return _SC("Silenced Ingram");
        case SQMOD_WEAPON_MP5:              return _SC("MP5");
        case SQMOD_WEAPON_M4:               return _SC("M4");
        case SQMOD_WEAPON_RUGER:            return _SC("Ruger");
        case SQMOD_WEAPON_SNIPER:           return _SC("Sniper Rifle");
        case SQMOD_WEAPON_LASERSCOPE:       return _SC("Laserscope Sniper Rifle");
        case SQMOD_WEAPON_ROCKETLAUNCHER:   return _SC("Rocket Launcher");
        case SQMOD_WEAPON_FLAMETHROWER:     return _SC("Flamethrower");
        case SQMOD_WEAPON_M60:              return _SC("M60");
        case SQMOD_WEAPON_MINIGUN:          return _SC("Minigun");
        case SQMOD_WEAPON_BOMB:             return _SC("Bomb");
        case SQMOD_WEAPON_HELICANNON:       return _SC("Helicannon");
        case SQMOD_WEAPON_CAMERA:           return _SC("Camera");
        case SQMOD_WEAPON_VEHICLE:          return _SC("Vehicle");
        case SQMOD_WEAPON_EXPLOSION1:       return _SC("Explosion");
        case SQMOD_WEAPON_DRIVEBY:          return _SC("Driveby");
        case SQMOD_WEAPON_DROWNED:          return _SC("Drowned");
        case SQMOD_WEAPON_FALL:             return _SC("Fall");
        case SQMOD_WEAPON_EXPLOSION2:       return _SC("Explosion");
        case SQMOD_WEAPON_SUICIDE:          return _SC("Suicide");
        default:                            return _SC("");
    }
}

// ------------------------------------------------------------------------------------------------
SQInt32 GetWeaponID(const SQChar * name)
{
    // Clone the string into an editable version
    String str(name);
    // Strip non alphanumeric characters from the name
    str.erase(std::remove_if(str.begin(), str.end(), std::not1(std::ptr_fun(::isalnum))), str.end());
    // Convert the string to lowercase
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    // See if we still have a valid name after the cleanup
    if(str.length() < 1) return SQMOD_UNKNOWN;
    // Grab the actual length of the string
    unsigned len = str.length();
    // Get the most significant characters used to identify a weapon
    SQChar a = str[0], b = 0, c = 0, d = str[len-1];
    // Look for deeper specifiers
    if(str.length() >= 3)
    {
        c = str[2];
        b = str[1];
    }
    else if(str.length() >= 2)
    {
        b = str[1];
    }
    // Search for a pattern in the name
    switch(a)
    {
        // [B]aseball Bat
        // [B]omb
        // [B]rass Knuckles
        case 'b':
            // [Ba]seball Bat
            if (b == 'a') return SQMOD_WEAPON_BASEBALLBAT;
            // [Bo]mb
            else if (b == 'o') return SQMOD_WEAPON_BOMB;
            // [Br]ass Knuckles
            else if (b == 'r') return SQMOD_WEAPON_BRASSKNUCKLES;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [C]amera
        // [C]hainsaw
        // [C]olt .45
        case 'c':
            // [Ca]mera
            if (b == 'a') return SQMOD_WEAPON_CAMERA;
            // [Ch]ainsaw
            else if (b == 'h') return SQMOD_WEAPON_CHAINSAW;
            // [Co]lt .45
            else if (b == 'o') return SQMOD_WEAPON_COLT45;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [D]riveby
        // [D]rowned
        case 'd':
            // [Dr]iveby
            if (b == 'r' && (c == 'i' || d == 'y')) return SQMOD_WEAPON_DRIVEBY;
            // [Dr]owned
            else if (b == 'r' && (c == 'o' || d == 'd')) return SQMOD_WEAPON_DROWNED;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [E]xplosion
        case 'e': return SQMOD_WEAPON_EXPLOSION2;
        // [F]all
        // [F]lamethrower
        case 'f':
            // [Fa]ll
            if (b == 'a') return SQMOD_WEAPON_FALL;
            // [Fl]amethrower
            else if (b == 'l') return SQMOD_WEAPON_FLAMETHROWER;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [G]olf Club
        // [G]renade
        case 'g':
            // [Go]lf Club
            if (b == 'o') return SQMOD_WEAPON_GOLFCLUB;
            // [Gr]enade
            else if (b == 'r') return SQMOD_WEAPON_GRENADE;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [H]ammer
        // [H]elicannon
        case 'h':
            // [Ha]mmer
            if (b == 'a') return SQMOD_WEAPON_HAMMER;
            // [He]licannon
            else if (b == 'e') return SQMOD_WEAPON_HELICANNON;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [K]atana
        // [K]nife
        case 'k':
            // [Ka]tana
            if (b == 'a') return SQMOD_WEAPON_KATANA;
            // [Kn]ife
            else if (b == 'n') return SQMOD_WEAPON_KNIFE;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [L]aserscope Sniper Rifle
        case 'l': return SQMOD_WEAPON_LASERSCOPE;
        // [M]4
        // [M]60
        // [M]achete
        // [M]eat Cleaver
        // [M]inigun
        // [M]olotov Cocktails
        // [M]P5
        case 'm':
            // [M4]
            if (b == '4') return SQMOD_WEAPON_M4;
            // [M6]0
            else if (b == '6') return SQMOD_WEAPON_M60;
            // [Ma]chete
            else if (b == 'a') return SQMOD_WEAPON_MACHETE;
            // [Me]at Cleaver
            else if (b == 'e') return SQMOD_WEAPON_MEATCLEAVER;
            // [Mi]nigun
            else if (b == 'i') return SQMOD_WEAPON_MINIGUN;
            // [Mo]lotov Cocktails
            else if (b == 'o') return SQMOD_WEAPON_MOLOTOV;
            // [MP]5
            else if (b == 'p') return SQMOD_WEAPON_MP5;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [N]ightstick
        case 'n': return SQMOD_WEAPON_NIGHTSTICK;
        // [P]ump-Action Shotgun
        // [P]ython
        case 'p':
            // [Pu]mp-Action Shotgun
            if (b == 'u') return SQMOD_WEAPON_SHOTGUN;
            // [Py]thon
            else if (b == 'y') return SQMOD_WEAPON_PYTHON;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [R]emote Detonation Grenade
        // [R]ocket
        // [R]ocket Launcher
        // [R]uger
        case 'r':
            // [Re]mote Detonation Grenade
            if (b == 'e') return SQMOD_WEAPON_REMOTE;
            // [Ro]cke[t]
            else if (b == 'o' && d == 't') return SQMOD_WEAPON_ROCKET;
            // [Ro]cket [L]aunche[r]
            else if (b == 'o' && (d == 'r' || d == 'l' || (len > 5 && str[6] == 'l'))) return SQMOD_WEAPON_ROCKETLAUNCHER;
            // [Ru]ger
            else if (b == 'u') return SQMOD_WEAPON_RUGER;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [S]crewdriver
        // [S]ilenced Ingram
        // [S]niper Rifle
        // [S]PAS-12 Shotgun
        // [S]tubby Shotgun
        // [S]uicide
        case 's':
            // [Sc]rewdriver
            if (b == 'c') return SQMOD_WEAPON_SCREWDRIVER;
            // [Si]lenced Ingram
            else if (b == 'i') return SQMOD_WEAPON_INGRAM;
            // [Sn]iper Rifle
            else if (b == 'n') return SQMOD_WEAPON_SNIPER;
            // [SP]AS-12 Shotgun
            else if (b == 'p') return SQMOD_WEAPON_SPAS12;
            // [St]ubby Shotgun
            else if (b == 't') return SQMOD_WEAPON_STUBBY;
            // [Su]icide
            else if (b == 'u') return SQMOD_WEAPON_SUICIDE;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [T]ear Gas
        // [T]EC-9
        case 't':
            // [Tea]r Ga[s]
            if (b == 'e' && (c == 'a' || d == 's')) return SQMOD_WEAPON_TEARGAS;
            // [TEC]-[9]
            else if (b == 'e' && (c == 'c' || d == '9')) return SQMOD_WEAPON_TEC9;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [U]narmed
        // [U]zi
        case 'u':
            // [Un]armed
            if (b == 'n') return SQMOD_WEAPON_UNARMED;
            // [Uz]i
            else if (b == 'z') return SQMOD_WEAPON_UZI;
            // Default to unknwon
            else return SQMOD_UNKNOWN;
        // [V]ehicle
        case 'v': return SQMOD_WEAPON_VEHICLE;
        // Default to unknwon
        default: return SQMOD_UNKNOWN;
    }
}

// ------------------------------------------------------------------------------------------------
bool IsWeaponValid(SQInt32 id)
{
    return (strcmp(GetWeaponName(id), _SC("")) != 0) ? true : false;
}

// ------------------------------------------------------------------------------------------------
bool IsWeaponNatural(SQInt32 id)
{
    switch (id)
    {
        case SQMOD_WEAPON_VEHICLE:
        case SQMOD_WEAPON_DRIVEBY:
        case SQMOD_WEAPON_DROWNED:
        case SQMOD_WEAPON_FALL:
        case SQMOD_WEAPON_EXPLOSION2:
        case SQMOD_WEAPON_SUICIDE: return true;
        default: return false;
    }
}

// ------------------------------------------------------------------------------------------------
SQInt32 WeaponToModel(SQInt32 id)
{
    switch (id)
    {
        case SQMOD_WEAPON_UNARMED:          return 293;
        case SQMOD_WEAPON_BRASSKNUCKLES:    return 259;
        case SQMOD_WEAPON_SCREWDRIVER:      return 260;
        case SQMOD_WEAPON_GOLFCLUB:         return 261;
        case SQMOD_WEAPON_NIGHTSTICK:       return 262;
        case SQMOD_WEAPON_KNIFE:            return 263;
        case SQMOD_WEAPON_BASEBALLBAT:      return 264;
        case SQMOD_WEAPON_HAMMER:           return 265;
        case SQMOD_WEAPON_MEATCLEAVER:      return 266;
        case SQMOD_WEAPON_MACHETE:          return 267;
        case SQMOD_WEAPON_KATANA:           return 268;
        case SQMOD_WEAPON_CHAINSAW:         return 269;
        case SQMOD_WEAPON_GRENADE:          return 270;
        case SQMOD_WEAPON_REMOTE:           return 291;
        case SQMOD_WEAPON_TEARGAS:          return 271;
        case SQMOD_WEAPON_MOLOTOV:          return 272;
        case SQMOD_WEAPON_ROCKET:           return 273;
        case SQMOD_WEAPON_COLT45:           return 274;
        case SQMOD_WEAPON_PYTHON:           return 275;
        case SQMOD_WEAPON_SHOTGUN:          return 277;
        case SQMOD_WEAPON_SPAS12:           return 278;
        case SQMOD_WEAPON_STUBBY:           return 279;
        case SQMOD_WEAPON_TEC9:             return 281;
        case SQMOD_WEAPON_UZI:              return 282;
        case SQMOD_WEAPON_INGRAM:           return 283;
        case SQMOD_WEAPON_MP5:              return 284;
        case SQMOD_WEAPON_M4:               return 280;
        case SQMOD_WEAPON_RUGER:            return 276;
        case SQMOD_WEAPON_SNIPER:           return 285;
        case SQMOD_WEAPON_LASERSCOPE:       return 286;
        case SQMOD_WEAPON_ROCKETLAUNCHER:   return 287;
        case SQMOD_WEAPON_FLAMETHROWER:     return 288;
        case SQMOD_WEAPON_M60:              return 289;
        case SQMOD_WEAPON_MINIGUN:          return 290;
        case SQMOD_WEAPON_BOMB:             return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_HELICANNON:       return 294;
        case SQMOD_WEAPON_CAMERA:           return 292;
        case SQMOD_WEAPON_VEHICLE:          return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_EXPLOSION1:       return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_DRIVEBY:          return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_DROWNED:          return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_FALL:             return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_EXPLOSION2:       return SQMOD_UNKNOWN;
        case SQMOD_WEAPON_SUICIDE:          return SQMOD_UNKNOWN;
        default:                            return SQMOD_UNKNOWN;
    }
}

bool Register_Misc(HSQUIRRELVM vm)
{
    // Output debugging information
    LogDbg("Beginning registration of <Miscellaneous> API");
    // Attempt to register the specified API
    Sqrat::RootTable(vm)
    .Func(_SC("GetKeyCodeName"), &GetKeyCodeName)
    .Func(_SC("GetModelName"), &GetModelName)
    .Func(_SC("IsModelWeapon"), &IsModelWeapon)
    .Func(_SC("IsModelActuallyWeapon"), &IsModelActuallyWeapon)
    .Func(_SC("IsModelValid"), &IsModelValid)
    .Func(_SC("GetSkinName"), &GetSkinName)
    .Func(_SC("GetSkinID"), &GetSkinID)
    .Func(_SC("IsSkinValid"), &IsSkinValid)
    .Func(_SC("GetAutomobileName"), &GetAutomobileName)
    .Func(_SC("GetAutomobileID"), &GetAutomobileID)
    .Func(_SC("IsAutomobileValid"), &IsAutomobileValid)
    .Func(_SC("GetWeaponName"), &GetWeaponName)
    .Func(_SC("GetWeaponID"), &GetWeaponID)
    .Func(_SC("IsWeaponValid"), &IsWeaponValid)
    .Func(_SC("IsWeaponNatural"), &IsWeaponNatural)
    .Func(_SC("WeaponToModel"), &WeaponToModel);

    /* END REGISTRATION STATEMENT */ ;

    // Output debugging information
    LogDbg("Registration of <Miscellaneous> API was successful");
    // Registration succeeded
    return true;
}

} // Namespace:: SqMod