// 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);
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);
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);
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;
}