summaryrefslogtreecommitdiff
path: root/npc/items/recipes.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/items/recipes.txt')
-rw-r--r--npc/items/recipes.txt352
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;
+}