// 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 "";
// Weapons
mesc "----------"+l("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;
@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)*rand(1,.@rarity), JobLevel+rand(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, CraftTrainingWand);
}
if (.@rarity & CRAFT_INTERMEDIARY) {
array_push(.@recipes, CraftBugSlayer);
array_push(.@recipes, CraftShortGladius);
array_push(.@recipes, CraftNoviceWand);
}
if (.@rarity & CRAFT_ADVANCED) {
array_push(.@recipes, CraftBacksword);
array_push(.@recipes, CraftShortsword);
array_push(.@recipes, CraftPynRevolver);
array_push(.@recipes, CraftApprenticeWand);
}
if (.@rarity & CRAFT_EXPERT) {
array_push(.@recipes, CraftPynRifle);
array_push(.@recipes, CraftPynGatling);
array_push(.@recipes, CraftLeaderWand);
}
if (.@rarity & CRAFT_MASTER) {
array_push(.@recipes, CraftPynShotgun);
array_push(.@recipes, CraftLegendaryWand);
}
// 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)*rand(1,.@rarity), JobLevel+rand(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;
}