#include "cs_blcak_inc_def" struct Receipt { int item_basetype; int metal; int ingots; }; const int INGOT_INVALID = 0; const int INGOT_ADAMANTITE = 1; const int INGOT_AGAPITE = 2; const int INGOT_BRONZE = 4; const int INGOT_COBALT = 8; const int INGOT_COPPER = 16; const int INGOT_DULL = 32; const int INGOT_GOLD = 64; const int INGOT_IRON = 128; const int INGOT_MITHRIL = 256; const int INGOT_PLATINUM = 512; const int INGOT_SHADOW_IRON = 1024; const int INGOT_SILVER = 2048; const int INGOT_VALORITE = 4096; const int INGOT_VERITE = 8192; // Print debug message void Debug(string message); // ... int GetIngotCost(int base_type, int armor_type = 0); // ... int IsMold(string resRef); // ... int IsIngot(string resRef); // ... string GetItemName(int base_type); // ... string GetMetalName(int ingot_type); // ... int GetMoldItemBaseType(string resRef); // ... struct Receipt FindValidReceipt(object container); //.. int GetIsReceiptValid(struct Receipt receipt); void Debug(string message) { AssignCommand(GetModule(), SpeakString(message, TALKVOLUME_SHOUT)); } int GetIngotCost(int base_type, int armor_type = 0) { switch (base_type) { case BASE_ITEM_BASTARDSWORD: return 30; case BASE_ITEM_BATTLEAXE: return 60; case BASE_ITEM_CLUB: return 10; case BASE_ITEM_DAGGER: return 10; case BASE_ITEM_DIREMACE: return 60; case BASE_ITEM_DOUBLEAXE: return 100; case BASE_ITEM_DWARVENWARAXE: return 30; case BASE_ITEM_FALCHION: return 70; case BASE_ITEM_FLAIL: return 30; case BASE_ITEM_GREATAXE: return 90; case BASE_ITEM_GREATCLUB: return 24; case BASE_ITEM_GREATSWORD: return 90; case BASE_ITEM_HALBERD: return 90; case BASE_ITEM_HANDAXE: return 20; case BASE_ITEM_HEAVYFLAIL: return 80; case BASE_ITEM_KAMA: return 16; case BASE_ITEM_KATANA: return 70; case BASE_ITEM_KUKRI: return 12; case BASE_ITEM_LIGHTFLAIL: return 20; case BASE_ITEM_LIGHTHAMMER: return 20; case BASE_ITEM_LIGHTMACE: return 20; case BASE_ITEM_LONGSWORD: return 24; case BASE_ITEM_MACE: return 30; case BASE_ITEM_MORNINGSTAR: return 24; case BASE_ITEM_RAPIER: return 24; case BASE_ITEM_SCIMITAR: return 40; case BASE_ITEM_SHORTSWORD: return 16; case BASE_ITEM_SCYTHE: return 50; case BASE_ITEM_SHURIKEN: return 2; case BASE_ITEM_SICKLE: return 10; case BASE_ITEM_SPEAR: return 20; case BASE_ITEM_THROWINGAXE: return 6; case BASE_ITEM_TWOBLADEDSWORD: return 80; case BASE_ITEM_WARHAMMER: return 50; case BASE_ITEM_WARMACE: return 60; case BASE_ITEM_LARGESHIELD: return 0; case BASE_ITEM_SMALLSHIELD: return 0; case BASE_ITEM_TOWERSHIELD: return 0; case BASE_ITEM_HELMET: case BASE_ITEM_ARMOR: { switch (armor_type) { case 0: break; } return 0; } break; } return 0; } int IsMold(string resRef) { if (GetStringLength(resRef) < 13) return 0; return GetStringLeft(resRef, 13) == "n2_crft_mold_"; } // I HATE ABIGALS STUPID TAG NAMING CONVENTIONS! int IsIngot(string resRef) { if (GetStringLength(resRef) < 24) return INGOT_INVALID; if (resRef == "uoacraft_resource_adamantite_hi" || resRef == "uoacraft_resource_adamantite_med" || resRef == "uoacraft_resource_adamantite_low") return INGOT_ADAMANTITE; if (resRef == "uoacraft_resource_agapite_hi" || resRef == "uoacraft_resource_agapite_med" || resRef == "uoacraft_resource_agapite_low") return INGOT_AGAPITE; if (resRef == "uoacraft_resource_bronze_hi" || resRef == "uoacraft_resource_bronze_med" || resRef == "uoacraft_resource_bronze_low") return INGOT_BRONZE; if (resRef == "uoacraft_resource_cobalt_hi" || resRef == "uoacraft_resource_cobalt_med" || resRef == "uoacraft_resource_cobalt_low") return INGOT_COBALT; if (resRef == "uoacraft_resource_copper_hi" || resRef == "uoacraft_resource_copper_med" || resRef == "uoacraft_resource_copper_low") return INGOT_COPPER; if (resRef == "uoacraft_resource_dull_hi" || resRef == "uoacraft_resource_dull_med" || resRef == "uoacraft_resource_dull_low") return INGOT_DULL; if (resRef == "uoacraft_resource_gold_hi" || resRef == "uoacraft_resource_gold_med" || resRef == "uoacraft_resource_gold_low") return INGOT_GOLD; if (resRef == "uoacraft_resource_iron_hi" || resRef == "uoacraft_resource_iron_med" || resRef == "uoacraft_resource_iron_low") return INGOT_IRON; if (resRef == "uoacraft_resource_mithril_hi" || resRef == "uoacraft_resource_mithril_med" || resRef == "uoacraft_resource_mithril_low") return INGOT_MITHRIL; if (resRef == "uoacraft_resource_platinum_hi" || resRef == "uoacraft_resource_platinum_med" || resRef == "uoacraft_resource_platinum_low") return INGOT_PLATINUM; if (resRef == "uoacraft_resource_shadow_hi" || resRef == "uoacraft_resource_shadow_med" || resRef == "uoacraft_resource_shadow_low") return INGOT_SHADOW_IRON; if (resRef == "uoacraft_resource_silver_hi" || resRef == "uoacraft_resource_silver_med" || resRef == "uoacraft_resource_silver_low") return INGOT_SILVER; if (resRef == "uoacraft_resource_valorite_hi" || resRef == "uoacraft_resource_valorite_med" || resRef == "uoacraft_resource_valorite_low") return INGOT_VALORITE; if (resRef == "uoacraft_resource_verite_hi" || resRef == "uoacraft_resource_verite_med" || resRef == "uoacraft_resource_verite_low") return INGOT_VERITE; return INGOT_INVALID; } string GetItemName(int base_type) { switch (base_type) { case BASE_ITEM_BASTARDSWORD: return "bastard sword"; case BASE_ITEM_BATTLEAXE: return "battle axe"; case BASE_ITEM_CLUB: return "club"; case BASE_ITEM_DAGGER: return "dagger"; case BASE_ITEM_DIREMACE: return "dire mace"; case BASE_ITEM_DOUBLEAXE: return "doubleaxe"; case BASE_ITEM_DWARVENWARAXE: return "dwarven waraxe"; case BASE_ITEM_FALCHION: return "falchion"; case BASE_ITEM_FLAIL: return "flail"; case BASE_ITEM_GREATAXE: return "greataxe"; case BASE_ITEM_GREATCLUB: return "greatclub"; case BASE_ITEM_GREATSWORD: return "greatsword"; case BASE_ITEM_HALBERD: return "halberd"; case BASE_ITEM_HANDAXE: return "handaxe"; case BASE_ITEM_HEAVYFLAIL: return "heavy flail"; case BASE_ITEM_KAMA: return "kama"; case BASE_ITEM_KATANA: return "katana"; case BASE_ITEM_KUKRI: return "kukri"; case BASE_ITEM_LIGHTFLAIL: return "light flail"; case BASE_ITEM_LIGHTHAMMER: return "light warhammer"; case BASE_ITEM_LIGHTMACE: return "light mace"; case BASE_ITEM_LONGSWORD: return "longsword"; case BASE_ITEM_MACE: return "mace"; case BASE_ITEM_MORNINGSTAR: return "morningstar"; case BASE_ITEM_RAPIER: return "rapier"; case BASE_ITEM_SCIMITAR: return "scimitar"; case BASE_ITEM_SHORTSWORD: return "short sword"; case BASE_ITEM_SCYTHE: return "scythe"; case BASE_ITEM_SHURIKEN: return "shuriken"; case BASE_ITEM_SICKLE: return "sickle"; case BASE_ITEM_SPEAR: return "spear"; case BASE_ITEM_THROWINGAXE: return "throwing axe"; case BASE_ITEM_TWOBLADEDSWORD: return "two-bladed sword"; case BASE_ITEM_WARHAMMER: return "warhammer"; case BASE_ITEM_WARMACE: return "warmace"; case BASE_ITEM_LARGESHIELD: return "large shield"; case BASE_ITEM_SMALLSHIELD: return "small shield"; case BASE_ITEM_TOWERSHIELD: return "tower shield"; case BASE_ITEM_HELMET: return "helmet"; } return ""; } string GetMetalName(int ingot_type) { switch (ingot_type) { case INGOT_INVALID: return "[invalid ingot]"; case INGOT_ADAMANTITE: return "adamantite"; case INGOT_AGAPITE: return "agapite"; case INGOT_BRONZE: return "bronze"; case INGOT_COBALT: return "cobalt"; case INGOT_COPPER: return "copper"; case INGOT_DULL: return "dull"; case INGOT_GOLD: return "gold"; case INGOT_IRON: return "iron"; case INGOT_MITHRIL: return "mithril"; case INGOT_PLATINUM: return "platinum"; case INGOT_SHADOW_IRON: return "shadow iron"; case INGOT_SILVER: return "silver"; case INGOT_VALORITE: return "valorite"; case INGOT_VERITE: return "verite"; } return "[invalid ingot]"; } int GetMoldItemBaseType(string resRef) { resRef = GetStringRight(resRef, GetStringLength(resRef) - 13); Debug("GetMoldItemBaseType: " + resRef); // //////////////// UNORDERED PROBABLY MOST FREQUENT MOLDS if (resRef == "swdg") // Dagger return BASE_ITEM_DAGGER; if (resRef == "swls") return BASE_ITEM_LONGSWORD; if (resRef == "swss") return BASE_ITEM_SHORTSWORD; // //////////////// ORDERED LIST ///////////////////////// if (resRef == "hvbm") // Banded mail return 0; if (resRef == "swbs") // Bastard sword return BASE_ITEM_BASTARDSWORD; if (resRef == "axbt") // Battle axe return BASE_ITEM_BATTLEAXE; if (resRef == "mdbp") // Breastplate return 0; if (resRef == "ltcs") // Chain shirt return 0; if (resRef == "mdcm") // Chainmail return 0; if (resRef == "blcl") // Club return BASE_ITEM_CLUB; if (resRef == "axdv") // Dwarven Battle Axe return BASE_ITEM_DWARVENWARAXE; if (resRef == "swfl") return BASE_ITEM_FALCHION; if (resRef == "blfl") // Flail return BASE_ITEM_FLAIL; if (resRef == "hvfp") // Full Plate return 0; if (resRef == "axgr") return BASE_ITEM_GREATAXE; if (resRef == "swgs") return BASE_ITEM_GREATSWORD; if (resRef == "plhb") return BASE_ITEM_HALBERD; if (resRef == "hvhp") //Half Plate return 0; if (resRef == "axhn") return BASE_ITEM_HANDAXE; if (resRef == "shhv") // heavy shield return 0; // BASE_ITEM_HEAVY_SHIELD; if (resRef == "mdhd") // Hide armour return 0; if (resRef == "spka") return BASE_ITEM_KAMA; if (resRef == "swka") return BASE_ITEM_KATANA; if (resRef == "spku") return BASE_ITEM_KUKRI; if (resRef == "ltlt") // Leather armour return 0; if (resRef == "blhl") return BASE_ITEM_LIGHTHAMMER; if (resRef == "shlt") // Light shield return 0; //BASE_ITEM_LIGHT_SHIELD; if (resRef == "blml") return BASE_ITEM_MACE; if (resRef == "blms") return BASE_ITEM_MORNINGSTAR; if (resRef == "ltpd") // Padded armour return 0; if (resRef == "swrp") return BASE_ITEM_RAPIER; if (resRef == "mdsm") // Scale mail return 0; if (resRef == "swsc") return BASE_ITEM_SCIMITAR; if (resRef == "plsc") return BASE_ITEM_SCYTHE; if (resRef == "spsc") return BASE_ITEM_SICKLE; if (resRef == "plss") return BASE_ITEM_SPEAR; if (resRef == "ltsl") // Studded leather armour return 0; if (resRef == "shtw") return 0; //BASE_ITEM_TOWERSHIELD; if (resRef == "blhw") return BASE_ITEM_WARHAMMER; if (resRef == "bldm") return BASE_ITEM_WARMACE; return 0; } struct Receipt FindValidReceipt(object container) { struct Receipt res; res.item_basetype = 0; res.metal = INGOT_INVALID; res.ingots = 0; if (!GetIsObjectValid(container)) return res; object item = GetFirstItemInInventory(container); while (GetIsObjectValid(item)) { if (res.item_basetype == 0) { if (IsMold(GetResRef(item))) { string resRef = GetResRef(item); int base = GetMoldItemBaseType(resRef); Debug("Mold found: " + resRef + "; Result: " + IntToString(base)); if (base > 0) { res.item_basetype = base; item = GetFirstItemInInventory(container); continue; } } } else { int ingot = IsIngot(GetResRef(item)); if (ingot != INGOT_INVALID) { if (res.metal == INGOT_INVALID) { res.metal = ingot; res.ingots = GetIngotCost(res.item_basetype); break; //res.ingots = 1; } /* else { if (res.metal == ingot) res.ingots += 1; } */ } } item = GetNextItemInInventory(container); } if (res.item_basetype > 0 && res.metal == INGOT_INVALID) res.item_basetype = 0; return res; } int GetIsReceiptValid(struct Receipt receipt) { return receipt.item_basetype == 0 || receipt.metal == INGOT_INVALID; }