summaryrefslogblamecommitdiff
path: root/npc/craft/cooking.txt
blob: a6ab0e382927c28c573c3aad7915e1730579f1c9 (plain) (tree)























                                                                              
               















                                                                              

                                                                                   
 




                                                                          



                                                                                                                                                   












































































                                                                                                                                                                                                                        
 










                                                                                    
























































































                                                                                      
// TMW2 Script
// Author:
//  Jesusalva, Micksha, Meway
// Description:
//  Cooking System (Player, Guild, NPC)

// Usage: CookingSystem ({scope})
// Scopes: CRAFT_NPC, CRAFT_PLAYER
// If an invalid scope is passed, .knowledge won't be set but will be required
// Returns true on success, false on failure
function	script	CookingSystem	{
    // Set .scope, .knowledge and .success
    .scope=getarg(0, CRAFT_PLAYER);
    if (.scope == CRAFT_PLAYER) {
        if (!getskilllv(TMW2_COOKING)) {
            mesc l("You don't know how to cook."), 1;
            return false;
        }
        copyarray(.knowledge,RECIPES_COOKING,getarraysize(RECIPES_COOKING));
    }
    .success=false;

    setskin "craft3";
    .@var$ = requestcraft(6); // ?????
    setskin "";
    .@craft = initcraft(.@var$);
    .@entry = findcraftentry(.@craft, CRAFT_COOKING); // ??????
    if (debug || $@GM_OVERRIDE) mes "found craft entry: " + .@entry;
    if (debug || $@GM_OVERRIDE) mes "knowledge value: " + .knowledge[.@entry];
    if (.@entry < 0) {
            .success=false;
    } else {
        if (.scope == CRAFT_NPC || .knowledge[.@entry]) {
            .@s=validatecraft(.@craft);
            // Could not validate (not enough resources)
            if (!.@s) {
                mesc l("Not crafting - insufficient materials!"), 1;
                return false;
            }
            usecraft(.@craft);
            .@it=getcraftcode(.@entry);
            .@bt=min(1500, getiteminfo(.@it, ITEMINFO_SELLPRICE)) * 10; // basetime
            .@tm=limit(3600, .@bt * getskilllv(TMW2_COOKING), 86400);

            // Create the item immediately (in case you crash, etc.)
            rentitem(.@it, .@tm); // From 1 hour to 1 day

            // Note: Seasoning it will destroy it and re-rent it once done
            if (countitem(.@it) != 1) {
                mesc l("Skipping seasoning: You have multiple %s.", getitemlink(.@it));
            } else {
                mesc l("Do you want to try to season it? If you succeed, it might become more powerful, but if you fail, it might become weaker.");
                select
                    l("No"),
                    l("Yes");
                mes "";
                if (@menu == 2) {
                    .@moves=5;.@goal=rand2(4,10);.@stat=0;.@view=false;.@smel=false;
                    while (.@moves) {
                        mesc l(".:: Seasoning ::.");
                        mesc l("You have %d moves left.%s%s", .@moves,
                        (.@view ? "" : l(" You can view the recipe once.")),
                        (.@smel ? "" : l(" You can smell the recipe once.")));
                        next;
                        select
                            l("Put a large amount of spice"),
                            l("Put a small amount of spice"),
                            rif(!.@view, l("View the dish")),
                            rif(!.@smel, l("Smell the dish")),
                            l("Finish the seasoning");
                        mes "";
                        switch (@menu) {
                        case 1:
                            .@stat+=3; .@moves -= 1; break;
                        case 2:
                            .@stat+=2; .@moves -= 1; break;
                        case 3:
                            if ((.@stat + 5) <= .@goal)
                                mesc l("You cannot see any spice in there.");
                            else if ((.@stat + 3) <= .@goal)
                                mesc l("The spice is vaguely visible... It needs more.");
                            else if (.@stat <= .@goal)
                                mesc l("The spice seems good... or at least, almost enough...");
                            else if (.@stat - 3 <= .@goal)
                                mesc l("The spice is clearly visible... This is not a good sign.");
                            else
                                mesc l("The dish is covered in spice. It is ruined.");
                            .@view=true;
                            next;
                            break;
                        case 4:
                            if ((.@stat + 5) <= .@goal)
                                mesc l("You cannot smell any spice in there.");
                            else if ((.@stat + 3) <= .@goal)
                                mesc l("The spice's smell is too faint... It needs more.");
                            else if (.@stat <= .@goal)
                                mesc l("The spice smells good... or at least, almost enough...");
                            else if (.@stat - 3 <= .@goal)
                                mesc l("The spice is smelling strong... This is not a good sign.");
                            else
                                mesc l("The spice smell is nauseating. The dish is ruined.");
                            .@smel=true;
                            next;
                            break;
                        case 5:
                            .@moves=0; break;
                        } // switch move
                    } // while game
                // Recreate the item, so its rent time is preserved
                delitem .@it, 1;
                rentitem(.@it, .@tm);
                delinventorylist(); // Needed, because we'll rely on rfind()
                getinventorylist();
                .@index=array_rfind(@inventorylist_id, .@it);
                .@opt1 = any(VAR_DEXAMOUNT, VAR_MAXSPAMOUNT, VAR_VITAMOUNT, CLASS_DAMAGE_BOSS_TARGET, VAR_ITEMDEFPOWER, VAR_PLUSASPD, IOPT_CRITDMG, RANGE_ATTACK_DAMAGE_USER, IOPT_SCPROVOKE_BLIND, SP_DRAIN, HP_DRAIN);
                // By how much you missed the goal?
                // Note: It is perfectly possible to avoid a negative bonus
                .@excess = abs(.@stat-.@goal);
                if (.@excess == 0)
                    .@pow = 30; // The default assigned power
                else if (.@excess == 1)
                    .@pow = 20;
                else if (.@excess == 2)
                    .@pow = 10;
                else if (.@excess == 3)
                    .@pow = -10;
                else if (.@excess == 4)
                    .@pow = -20;
                else
                    .@pow = -30;

                // Translate .@pow into a value and apply it
                .@val1=csys_BonusCalc(getskilllv(TMW2_COOKING), abs(.@pow), .@opt1);
                if (.@pow < 0)
                    .@val1=-(.@val1);
                // If you're lucky: Cancel the debuff
                if (.@val1 < 0 && .@opt1 == IOPT_SCPROVOKE_BLIND)
                    .@val1=0;
                // Apply the seasoning bonus
                setitemoptionbyindex(.@index, 0, .@opt1, .@val1);
                } // if seasoning
            } // if can season
            .success=true;
        } else {
            .success=false;
        }
    }
    deletecraft .@craft;
    setskin "";
    return .success;
}

/*
Alchemy can rely in cross-building
Where a weaker potion is base for a stronger one
Standard Duration = 2 minutes ~ 5 minutes

Reagents:
	Water
	...Eggs?
	...Milk?
	Nymph Poison
	Death Potion
	Manapple

Products:
	Tea (Chamomile, Spearmint, Oolong, Jasmine, Yerba Mate?)
	→ Argaes Water + «Herbal Reagent»
OK	Coffee (Shadow Herb + Tonori Water)
OK	Piberries Infusion (Piberries + Curshroom)
OK	Atropos Mixture (Lachesis Brew + Clotho Liquor)
OK	Death Potion (Dragonfruit + Nightshade Tea)
OK	Smoke Grenade (Cactus pot + Coal)
OK	Grenade (Cactus pot + Sulfur Powder)
OK	Scented Grenade (Cactus pot + Moss)
OK	Haste Potion (Plushshroom)
OK	Strength Potion (Chagashroom)
	Return Potion (Hurnscald Recipe => Ocean Croc Claw + Hard Spike? Grass Seeds?)
OK	Status Reset (Curshroom + Mana Piou Feather)
OK	Homun Stat Reset (Curshroom + Manapple)
OK	Move Speed (Gem Powder + Fluor Powder)
OK	Precision (Piberries + Mt. Snake Egg)
OK	Dodge Potion (Piberries + Snake Egg)
OK	Luck, Dex, Int, Vit, Agi (Gems + Tea)
OK	Sacred Life (Golden Apple + Elixir of Life)
OK	Sacred Mana (Golden Apple + Celestia Tea)
OK	Sacred Revival (Sacred Life + Sacred Mana)
OK	Broken Warp Crystal? (Wurtizite + Black Mamba Skin)
OK	Magic Apple? (Divine Apple + Manapple? Death Potion? Sacred Life/Revival?)
OK	Purification Potion (Nymph Poison + Sacred Life)
OK	Iced Bottle (Tonori W. + Argaes W.)
OK	Insurance Contract (» Insurance?) (Quill + Reed Bundle)
OK	Insurance (Quill + Death Potion)
	Mysterious Fruit? (Legendary)

For all Scrolls: Quill + ? (depends on scroll itself)
	» Summon Scrolls (Based on mob parts, 1× mob?)
		→ alignment_cansummon() + SummonMagic() or summon() directly
		→ Criteria between weak/strong version is alignment
		→ When aligned, scrolls always summon strongest ver
		→ Level must be equal or superior to strongest, tho
		» Maggot/Giant Maggot: Bug Leg (Lv 40)
		» CaveMaggot: Maggot Slime
		» Green Dragon/Nightmare: Dragon Scales (Lv 105)
		» Wolvern: Wolvern Pelt
		» Moggun/Yeti: Frozen Yeti Tear (Lv 60)
		» Terranite/T.Prot.: Terranite Ore (Lv 90)
	» Magnus Heal (Lifestone)
	» Area Provoke? → Scent grenade?
	» Guild Skills?
OK		» ScrollAngelLightA ( + )
OK		» ScrollBattlePlansA ( + )
OK		» ScrollDefenseBlessA ( + )
OK		» ScrollCriticalFortuneA ( + )
	→ TODO: Kyrie Eleison (Absolute Shield)
	→ With self-stun, makes you a temporary wall?
	→ Maybe a item of Quill + LoF Coin for guild skills? (LoF Quill)

		// Skills for Aegis Shield, all beyond maximum level
		// Slimes, Snakes, Fairies, Darth Duck, Mr. Prickel
		// PoisonS.Mushroom
		// TODO: Lizards, (Black)Scorpions, Moonshroom, Black Mamba, Centaur
		skill TMW2_HALHISS, 10;
		skill TMW2_KALSPIKE, 9;
		skill TMW2_LIMERIZER, 10;
		skill TMW2_FAIRYKINGDOM, 9;
		skill TMW2_DUCKY, 10;
		skill TMW2_FAIRYEMPIRE, 10;

*/