diff options
Diffstat (limited to 'npc/items/recipes.txt')
-rw-r--r-- | npc/items/recipes.txt | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/npc/items/recipes.txt b/npc/items/recipes.txt new file mode 100644 index 00000000..42cdf51b --- /dev/null +++ b/npc/items/recipes.txt @@ -0,0 +1,352 @@ +// Evol script. +// Author: +// Jesusalva +// Micksha +// Description: +// Contains recipe books for Evol Online + +// showRecipe( recipe{, recipe...} ) +function script showRecipe { + freeloop(true); + for (.@a = 0; .@a < getargcount(); ++.@a) { + .@const$ = data_to_string(getarg(.@a)); + + if (startswith(.@const$, "Craft")) { + // infer the item constant from the craft constant + .@recipe = getarg(.@a); + + .@item = string_to_data(substr(.@const$, 5, getstrlen(.@const$) - 1)); + } else { + // infer the craft constant from the item constant + .@recipe = string_to_data(sprintf("Craft%s", .@const$)); + .@item = getarg(.@a); + } + + if (.@item <= 0) { + // target item not found + continue; + } + + if (!RECIPES[.@recipe] && !debug) { + // does not have the recipe + continue; + } + + for (.@inv = 0; .@inv < 9; ++.@inv) { + .@size = getcraftrecipe(.@recipe, .@inv, .@qty[0], .@item_id[0]); + + if (.@size < 0) { + if (.@size == -1) { + // recipe does not exist + break; + } + // inventory does not exist + break; + } + + mes(l(".:: %s Recipe ::.", getitemlink(.@item))); + + for (.@it = 0; .@it < .@size; ++.@it) { + .@recipe_item = .@item_id[.@it]; + .@recipe_qty = .@qty[.@it]; + + if (.@recipe_item <= 0) { + break; + } + + mesc(sprintf("%d/%d %s", countitem(.@recipe_item), .@recipe_qty, getitemlink(.@recipe_item))); + } + + mes(""); + .@count++; + } + } + freeloop(false); + + return .@count > 0; +} + +- script #RecipeBook NPC_HIDDEN,{ + function read_book; + function read_cooking; + function read_smithery; + function read_tailoring; + end; + +function read_book { + setnpcdialogtitle l(.book_name$); + mesc l("This book has several bookmarks. Which one will you open?"); + next; + menuint + l("Cooking"), CRAFT_COOKING, + l("Alchemy"), CRAFT_ALCHEMY, + l("Smithery"), CRAFT_SMITHERY, + l("Tailoring"), CRAFT_TAILORING, + l("Jewelery"), CRAFT_JEWELERY; + mes ""; + switch (@menuret) { + case CRAFT_COOKING: + read_cooking(); break; + case CRAFT_SMITHERY: + read_smithery(); break; + case CRAFT_TAILORING: + read_tailoring(); break; + default: + mesc l("Unfortunately, there is nothing on this bookmark."); + mesc l("Perhaps, in future, someone adds it to this world."); + break; + } + close2(); + return; +} + +/////////////////////////////////////////////////////////////////////////////// +function read_cooking { + + setnpcdialogtitle l("Cooking Recipes"); + + mesc l("Eating is a necessity, but cooking is an art."); + mesc l("(All items must be placed exactly in this order for cooking work.)"); + next; + mesc l("List of known cooking recipes:"); + mes ""; + mes ".:: " + l("Sandwiches") + " ::."; + mes ""; + + showRecipe(CarpSandwich, + PioulegSandwich, + MananaSandwich); + + mes ""; + mes ".:: " + l("Stew") + " ::."; + mes ""; + + showRecipe(SailorStew, + SquirrelStew, + MoubooStew); + + mes ""; + mes ".:: " + l("Plates") + " ::."; + mes ""; + + showRecipe(SeafoodPlate, + BarbecuePlate, + VeggiePlate); + + mes ""; + mes ".:: " + l("Desserts") + " ::."; + mes ""; + + showRecipe(Donut, + BlueberryCake, + CarrotCake); + return; +} + +/////////////////////////////////////////////////////////////////////////////// +function read_smithery { + + setnpcdialogtitle l("Smithery Recipes"); + + mesc l("You will trust your life to this, so you better do a good job!"); + mesc l("(All items must be placed exactly in this order.)"); + next; + mesc l("List of known smithery recipes:"); + + mes(); + mesf(".:: %s ::.", l("Chest Armor")); + mes(); + + showRecipe(LegionTrainingShirt, + LegionCopperArmor, + Chainmail, + Snakeplate, + LightPlatemail, + JustifierChest, + LegionIronArmor, + WarlordPlate, + TerraniteArmor, + AssassinChest, + BlackArmor, + GoldenWarlordPlate); + + next(); + mes(); + mesf(".:: %s ::.", l("Leg Armor")); + mes(); + + showRecipe(ChainmailSkirt, + TerranitePants, + AssassinPants); + + next(); + mes(); + mesf(".:: %s ::.", l("Gloves")); + mes(); + + showRecipe(CopperArmbands, + BromenalGloves, + IronArmbands); + + next(); + mes(); + mesf(".:: %s ::.", l("Boots")); + mes(); + + showRecipe(BromenalBoots, + WarlordBoots); + + return; +} + +function read_tailoring { + setnpcdialogtitle(l("Tailoring Recipes")); + + mesc(l("(All items must be placed exactly in this order.)")); + next(); + mesc(l("List of known tailoring recipes:")); + + mes(); + mesf(".:: %s ::.", l("Chest Armor")); + mes(); + + showRecipe(CreasedShirt, + ArtisTankTop, + VneckJumper, + SailorShirt, + FineDress, + SilkRobe, + ForestArmor, + ApprenticeRobe, + PeltJacket, + SorcererRobe, + WizardRobe, + EvocatorRobe); + + next(); + mes(); + mesf(".:: %s ::.", l("Leg Armor")); + mes(); + + showRecipe(CreasedShorts, + CottonSkirt, + PirateShorts, + SilkPants, + BrownTrousers, + BanditTrousers, + JeansChaps, + LeatherTrousers); + + next(); + mes(); + mesf(".:: %s ::.", l("Gloves")); + mes(); + + showRecipe(ShortGloves, + Armbands, + CottonGloves, + BanditGloves, + SilkGloves, + LeatherGloves, + AssassinGloves); + + next(); + mes(); + mesf(".:: %s ::.", l("Boots")); + mes(); + + showRecipe(LousyMoccasins, + Slippers, + CottonBoots, + BanditBoots, + ManaSlippers, + SquirrelBoots, + LeatherBoots, + RidingBoots, + AssassinBoots); + + return; +} + + +OnUse: + if (openbook()) + read_book(); + closeclientdialog(); + close; + +OnInit: + .book_name$ = getitemname(RecipeBook); + .distance = 1; + end; +} + +////////////////////////////////////////////////////// +// Below this line are utils for Gacha. We use callfunc() on itemDB. +// Types: see constants.db - everything is a bitwise here +// Rarity: 1 - basic, 2 - intermediary, 4 - advanced, 8 - expert, 16 - master +// Rarity: 1 - training, 2 - basic, 4 - advanced, 8 - expert, 16 - legendary +// Keep in mind! Expert and Master blueprints must be restricted! +// MakeBlueprint(type, rarity) +function script MakeBlueprint { + .@type=getarg(0, -1); + .@rarity=getarg(1, 1); + + if (.@type & CRAFT_COOKING) { + + // ---------------------------------- + if (.@rarity & CRAFT_BASIC) { + } + if (.@rarity & CRAFT_INTERMEDIARY) { + } + if (.@rarity & CRAFT_ADVANCED) { + } + if (.@rarity & CRAFT_EXPERT) { + } + if (.@rarity & CRAFT_MASTER) { + } + // ---------------------------------- + + } + else if (.@type & CRAFT_SMITHERY) + { + + // ---------------------------------- + if (.@rarity & CRAFT_BASIC) { + } + if (.@rarity & CRAFT_INTERMEDIARY) { + array_push(.@recipes, CraftInfantryHelmet); + } + if (.@rarity & CRAFT_ADVANCED) { + } + if (.@rarity & CRAFT_EXPERT) { + } + if (.@rarity & CRAFT_MASTER) { + } + // ---------------------------------- + + } + + // We don't have a .@recipes array D: + if (array_entries(.@recipes) <= 0) { + dispbottom l("This blueprint was blank."); + return; + } + + // Select a recipe randomly + .@rcp=any_of(.@recipes); + + // Double precision failsafe + if (RECIPES[.@rcp]) + .@rcp=any_of(.@recipes); + + // Learn the recipe or lose the item (and gain some EXP) + if (RECIPES_[.@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[.@rcp]=true; + } + return; +} |