// 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); .bodytype = BODYTYPE_1; .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; }