// TMW-2 script. // Author: // Jesusalva // Description: // Recipe Books in TMW2 - script #RecipeBook NPC_HIDDEN,{ function showRecipe; function readCooking; function readAlchemy; function readCrafting; OnUse: setnpcdialogtitle l("Recipe Book"); mesc l("You open the Recipe Book. Each recipe you get can be put here."); next; do { mesc l("Which recipes do you want to read?"); select l("Nothing."), l("Cooking Recipes."), l("Alchemy Recipes."), l("Crafting Recipes."); mes ""; switch (@menu) { case 2: readCooking(); break; case 3: readAlchemy(); break; case 4: readCrafting(); break; } } while (@menu != 1); closeclientdialog; close; // Expects: @scope$ // showRecipe( Craft, Bonus, {amount 1, item 1}, {amount 2, item 2}... ) function showRecipe { if (getargcount() < 3 || getargcount() % 2 != 0 || @scope$ == "") return Exception("Faulty recipe skill command invoked - error"); // getd("$RECIPES_ALCHEMY_"+getcharid(2)+"["+getarg(0)+"]") if (getd("RECIPES_"+@scope$+"["+getarg(0)+"]")) { if (getarg(1)) { mes l(".:: @@ Recipe ::.", getitemlink(getarg(1))); for (.@i=2;.@i < getargcount(); .@i++) { mesc l("@@/@@ @@", countitem(getarg(.@i+1)), getarg(.@i), getitemlink(getarg(.@i+1))); .@i++; } mes ""; } return 1; } //debugmes "Nope, nothing here"; return 0; } // =============================== Cooking Functions function readCooking { setnpcdialogtitle l("Cooking Recipes"); @scope$="COOKING"; mesc l("Eating is a necessity, but cooking is an art."); mesc l("(All items must be placed exactly in this order.)"); next; mesc l("List of known cooking recipes:"); mes ""; showRecipe(0, Iten, WarpedLog, 9999); next; @scope$=""; return; } // =============================== Cooking Functions function readAlchemy { setnpcdialogtitle l("Alchemy Recipes"); @scope$="ALCHEMY"; mesc l("Alchemy. The art of having quasi-magical effects without magic."); mesc l("(All items must be placed exactly in this order.)"); next; mesc l("List of known alchemy recipes:"); mes ""; // Healing mesc "----------"+l("Healing Recipes")+"----------", 2; showRecipe(CraftPiberriesInfusion, PiberriesInfusion, 5, Piberries, 1, Curshroom); next; // General Boosts mesc "----------"+l("General Recipes")+"----------", 2; showRecipe(CraftHastePotion, HastePotion, 15, Plushroom); showRecipe(CraftStrengthPotion, StrengthPotion, 15, Chagashroom); showRecipe(CraftResetPotion, StatusResetPotion, 90, ManaPiouFeathers, 10, Curshroom); showRecipe(CraftSpeedPotion, MoveSpeedPotion, 1, GemPowder, 5, FluoPowder); showRecipe(CraftPrecisionPotion, PrecisionPotion, 3, Piberries, 1, MountainSnakeEgg); showRecipe(CraftDodgePotion, DodgePotion, 3, Piberries, 1, SnakeEgg); next; // Stats Boosts mesc "----------"+l("Stat Boost Recipes")+"----------", 2; showRecipe(CraftLukPotionA, LukPotionA, 1, EmeraldPowder, 1, HerbalTea); showRecipe(CraftLukPotionB, LukPotionB, 1, Emerald, 2, HerbalTea); showRecipe(CraftLukPotionC, LukPotionC, 1, PolishedEmerald, 3, HerbalTea); showRecipe(CraftDexPotionA, DexPotionA, 1, AmethystPowder, 1, HerbalTea); showRecipe(CraftDexPotionB, DexPotionB, 1, Amethyst, 2, HerbalTea); showRecipe(CraftDexPotionC, DexPotionC, 1, PolishedAmethyst, 3, HerbalTea); showRecipe(CraftIntPotionA, IntPotionA, 1, SapphirePowder, 1, HerbalTea); showRecipe(CraftIntPotionB, IntPotionB, 1, Sapphire, 2, HerbalTea); showRecipe(CraftIntPotionC, IntPotionC, 1, PolishedSapphire, 3, HerbalTea); showRecipe(CraftVitPotionA, VitPotionA, 1, DiamondPowder, 1, HerbalTea); showRecipe(CraftVitPotionB, VitPotionB, 1, Diamond, 2, HerbalTea); showRecipe(CraftVitPotionC, VitPotionC, 1, PolishedDiamond, 3, HerbalTea); showRecipe(CraftAgiPotionA, AgiPotionA, 1, TopazPowder, 1, HerbalTea); showRecipe(CraftAgiPotionB, AgiPotionB, 1, Topaz, 2, HerbalTea); showRecipe(CraftAgiPotionC, AgiPotionC, 1, PolishedTopaz, 3, HerbalTea); next; @scope$=""; return; } // =============================== Crafting Functions function readCrafting { setnpcdialogtitle l("Crafting Recipes"); @scope$="EQUIPMENT"; mesc l("There is only one way towards the best equipment: Smith away!"); mesc l("(All items must be placed exactly in this order.)"); next; mesc l("List of known crafting recipes:"); mes ""; // Melee Weapons: Never use Titanium nor Lead. Iron-based, no silver mesc "----------"+l("One Hand Weapon Recipes")+"----------", 2; showRecipe(CraftWoodenSword, WoodenSword, 20, WoodenLog, 5, RawLog, 1, SharpKnife); showRecipe(CraftBugSlayer, BugSlayer, 8, IronIngot, 12, Coal, 1, EverburnPowder); showRecipe(CraftShortGladius, ShortGladius, 12, IronIngot, 16, Coal, 1, EverburnPowder); showRecipe(CraftBacksword, Backsword, 18, IronIngot, 3, TinIngot, 20, Coal, 1, EverburnPowder); showRecipe(CraftShortsword, ShortSword, 24, IronIngot, 5, TinIngot, 24, Coal, 1, EverburnPowder); next; // Two Hands Melee Weapons: Never use Titanium nor Lead. Silver-based. mesc "----------"+l("Two Hands Weapon Recipes")+"----------", 2; showRecipe(CraftMiereCleaver, MiereCleaver, 12, SilverIngot, 1, TinIngot, 8, Coal, 1, EverburnPowder); showRecipe(CraftBroadsword, Broadsword, 27, SilverIngot, 1, TinIngot, 20, Coal, 1, EverburnPowder); next; // Archery Weapons: Always use Wood, Root and Carp. mesc "----------"+l("Archery Weapon Recipes")+"----------", 2; showRecipe(CraftShortBow, ShortBow, 18, WoodenLog, 12, Root, 3, LeatherPatch, 1, CommonCarp); showRecipe(CraftForestBow, ForestBow, 24, WoodenLog, 16, Root, 5, LeatherPatch, 3, CommonCarp); showRecipe(CraftElficBow, ElficBow, 33, WoodenLog, 22, Root, 1, IronIngot, 4, CommonCarp); showRecipe(CraftChampionshipBow, ChampionshipBow, 48, WoodenLog, 32, Root, 1, GoldIngot, 5, CommonCarp); showRecipe(CraftBansheeBow, BansheeBow, 70, WoodenLog, 45, Root, 5, DarkCrystal, 5, CommonCarp); next; // Magical Weapons: Wood + powders mesc "----------"+l("Magical Weapon Recipes")+"----------", 2; showRecipe(CraftTrainingWand, TrainingWand, 20, WoodenLog, 30, ManaPiouFeathers, 5, FluoPowder, 1, GemPowder); showRecipe(CraftNoviceWand, NoviceWand, 40, WoodenLog, 60, ManaPiouFeathers, 8, FluoPowder, 2, GemPowder); showRecipe(CraftApprenticeWand, ApprenticeWand, 60, WoodenLog, 90, ManaPiouFeathers, 12, FluoPowder, 3, GemPowder); showRecipe(CraftLeaderWand, LeaderWand, 100, WoodenLog, 120, ManaPiouFeathers, 15, FluoPowder, 5, GemPowder); showRecipe(CraftLegendaryWand, LegendaryWand, 110, WoodenLog, 3, GoldenApple, 20, FluoPowder, 7, GemPowder); next; // Firestaff Weapons: Lead + Titanium mesc "----------"+l("Fire Staffs Recipes")+"----------", 2; showRecipe(CraftPynRevolver, PynRevolver, 4, LeadIngot, 5, TitaniumIngot, 11, Coal, 1, EverburnPowder); showRecipe(CraftPynRifle, PynRifle, 6, LeadIngot, 7, TitaniumIngot, 14, Coal, 1, EverburnPowder); showRecipe(CraftPynGatling, PynGatling, 7, LeadIngot, 7, TitaniumIngot, 14, Coal, 1, EverburnPowder); showRecipe(CraftPynShotgun, PynShotgun, 9, LeadIngot, 10, TitaniumIngot, 16, Coal, 1, EverburnPowder); next; // Shields: May use Leather. Titanium or Lead, but never both mesc "----------"+l("Shield Recipes")+"----------", 2; showRecipe(CraftWoodenShield, WoodenShield, 40, WoodenLog, 2, LeatherPatch, 1, SharpKnife); showRecipe(CraftBladeShield, BladeShield, 14, IronIngot, 2, TitaniumIngot, 5, Coal, 1, EverburnPowder); next; // Misc: Misc items mesc "----------"+l("Miscellaneous Recipes")+"----------", 2; showRecipe(CraftGoldenRing, GoldenRing, 5, GoldPieces, 1, TitaniumIngot, 8, Coal, 1, EverburnPowder); next; @scope$=""; return; } OnInit: .sex = G_OTHER; .distance = 1; end; } // Below this line are utils for Gacha. We use callfunc() on itemDB. // Types: CRAFT_COOKING, CRAFT_ALCHEMY, CRAFT_EQUIPMENT // Rarity: 1 - basic, 2 - intermediary, 4 - advanced, 8 - expert, 16 - master // Level equivalents: 1: (1~20) 2: (21~44), 3: (45~75), 4: (76~99), 5: 100+ function script MakeBlueprint { .@type=getarg(0, -1); .@rarity=getarg(1, 1); switch (.@type) { ///////////////////////////////////////////////////// ///// Alchemy Recipes ///////////////////////////////////////////////////// case CRAFT_ALCHEMY: if (.@rarity & CRAFT_BASIC) { array_push(.@recipes, CraftPiberriesInfusion); array_push(.@recipes, CraftHastePotion); array_push(.@recipes, CraftStrengthPotion); } if (.@rarity & CRAFT_INTERMEDIARY) { array_push(.@recipes, CraftLukPotionA); array_push(.@recipes, CraftDexPotionA); array_push(.@recipes, CraftIntPotionA); array_push(.@recipes, CraftAgiPotionA); array_push(.@recipes, CraftVitPotionA); array_push(.@recipes, CraftSpeedPotion); } if (.@rarity & CRAFT_ADVANCED) { array_push(.@recipes, CraftResetPotion); array_push(.@recipes, CraftPrecisionPotion); array_push(.@recipes, CraftDodgePotion); } if (.@rarity & CRAFT_EXPERT) { array_push(.@recipes, CraftLukPotionB); array_push(.@recipes, CraftDexPotionB); array_push(.@recipes, CraftIntPotionB); array_push(.@recipes, CraftAgiPotionB); array_push(.@recipes, CraftVitPotionB); } if (.@rarity & CRAFT_MASTER) { array_push(.@recipes, CraftLukPotionC); array_push(.@recipes, CraftDexPotionC); array_push(.@recipes, CraftIntPotionC); array_push(.@recipes, CraftAgiPotionC); array_push(.@recipes, CraftVitPotionC); } // Now you'll learn some recipe! .@rcp=any_of(.@recipes); if (RECIPES_ALCHEMY[.@rcp]) { dispbottom l("It was a recipe you already knew..."); getexp (BaseLevel+JobLevel)*rand2(1,.@rarity), JobLevel+rand2(1,.@rarity); } else { dispbottom l("Learned a new recipe!"); RECIPES_ALCHEMY[.@rcp]=true; } break; ///////////////////////////////////////////////////// ///// Equipment Recipes ///////////////////////////////////////////////////// // array_push(.@recipes, Craft); case CRAFT_EQUIPMENT: if (.@rarity & CRAFT_BASIC) { array_push(.@recipes, CraftWoodenSword); array_push(.@recipes, CraftWoodenShield); array_push(.@recipes, CraftTrainingWand); array_push(.@recipes, CraftShortBow); } if (.@rarity & CRAFT_INTERMEDIARY) { array_push(.@recipes, CraftBugSlayer); array_push(.@recipes, CraftShortGladius); array_push(.@recipes, CraftBladeShield); array_push(.@recipes, CraftNoviceWand); array_push(.@recipes, CraftForestBow); } if (.@rarity & CRAFT_ADVANCED) { array_push(.@recipes, CraftBacksword); array_push(.@recipes, CraftShortsword); array_push(.@recipes, CraftMiereCleaver); array_push(.@recipes, CraftPynRevolver); array_push(.@recipes, CraftApprenticeWand); array_push(.@recipes, CraftElficBow); } if (.@rarity & CRAFT_EXPERT) { array_push(.@recipes, CraftGoldenRing); array_push(.@recipes, CraftBroadsword); array_push(.@recipes, CraftPynRifle); array_push(.@recipes, CraftPynGatling); array_push(.@recipes, CraftLeaderWand); array_push(.@recipes, CraftChampionshipBow); } if (.@rarity & CRAFT_MASTER) { array_push(.@recipes, CraftPynShotgun); array_push(.@recipes, CraftLegendaryWand); array_push(.@recipes, CraftBansheeBow); } // Now you'll learn some recipe! .@rcp=any_of(.@recipes); if (RECIPES_EQUIPMENT[.@rcp]) { dispbottom l("It was a recipe you already knew..."); getexp (BaseLevel+JobLevel)*rand2(1,.@rarity), JobLevel+rand2(1,.@rarity); } else { dispbottom l("Learned a new recipe!"); RECIPES_EQUIPMENT[.@rcp]=true; } break; default: return Exception("Invalid blueprint type "+.@type+" - item was lost."); } return; } // Create a blueprint based on level. Extra chance for weaker Blueprint. // Level equivalents: 1: (1~20) 2: (21~44), 3: (45~75), 4: (76~99), 5: 100+ function script MakeRandomBlueprint { array_push(.@blueprints, AlchemyBlueprintA); array_push(.@blueprints, EquipmentBlueprintA); if (BaseLevel > 20) { array_push(.@blueprints, AlchemyBlueprintB); array_push(.@blueprints, EquipmentBlueprintB); } if (BaseLevel > 44) { array_push(.@blueprints, AlchemyBlueprintB); array_push(.@blueprints, EquipmentBlueprintB); array_push(.@blueprints, AlchemyBlueprintC); array_push(.@blueprints, EquipmentBlueprintC); } if (BaseLevel > 75) { array_push(.@blueprints, AlchemyBlueprintC); array_push(.@blueprints, EquipmentBlueprintC); array_push(.@blueprints, AlchemyBlueprintD); array_push(.@blueprints, EquipmentBlueprintD); } if (BaseLevel > 100) { array_push(.@blueprints, AlchemyBlueprintD); array_push(.@blueprints, EquipmentBlueprintD); array_push(.@blueprints, AlchemyBlueprintE); array_push(.@blueprints, EquipmentBlueprintE); } getitem any_of(.@blueprints), 1; return; }