summaryrefslogblamecommitdiff
path: root/npc/craft/tweak.txt
blob: 07699bf2cb56e5c9839ba43f8a2cef5970f51a17 (plain) (tree)
1
2
3
4
5
6
7
8







                                                          














                                                               
           











                                                                                                                             


                                                                   
                                                     











                                                                         
                     


           
                                                   

                                                 
                           
                         
 


                                         
 
                                        
                                              

                                                                               
                                                           
                                                
 
                              
                                           
                                                      
                     
     



                            

                            

                     
                          



                                





                                                                                                                          




                                                         
 
                                         
                                                                            
                                                                        

                                                                                 






                                                                                                      
                                 
                                 
                                   
 



                                                                     
                   



                                                            











                                                                      



                         
                          
 
// TMW2 Script
// Author:
//  Jesusalva
// Description:
//  Smith System (Player, Guild, NPC)
// Notes:
//  It's like smithing, but it only change an item options

// How many times more can you tweak?
// You regenerate 1 action per hour, capped at 6 actions total.
function	script	SmithTweakPointsLeft	{
    .@points = gettimeparam(GETTIME_HOUR) - SMITH_TWEAKS;
    if (.@points > 6) {
        .@points = 6;
        SMITH_TWEAKS = gettimeparam(GETTIME_HOUR) - 6;
    }
    return .@points;
}

function	script	SmithTweakPointsDecrement	{
    .@item_id = getarg(0, -1);
    if (.@item_id != Lightbringer)
        SMITH_TWEAKS += 1;
    return;
}

function	script	SmithTweakPointsExplain	{
    .@points = SmithTweakPointsLeft();
    mesc l("Note: You can only perform this operation @@/6 times.", .@points);
    mesc l("You recover a tweaking point every hour.");
    if (!.@points)
        mesc l("You currently have no Tweaking AP, so you will need to wait %02d minute(s).", 60-gettime(GETTIME_MINUTE)), 1;
    return .@points;
}


// Usage: SmithTweakReset ()
// Asks if player wants to remove an item options. And remove them.
function	script	SmithTweakReset	{
    mesc b(l("You are REMOVING an item option.")), 1;
    mesc l("Note: This action cannot be undone."), 1;
    mes l("Drag and drop here the item you want to remove the options.");

    .@id=requestitemindex();
    mes "";

    // Ask player to confirm
    mesc l("Are you sure?"), 1;
    mesc l("Note: This action cannot be undone."), 1;
    if (!csys_Confirm(.@id))
        return;

    csys_Check(.@id);
    return;
}

// Usage: SmithTweakSystem ({price=600, retries=1})
// Returns true on success, false on failure
function	script	SmithTweakSystem	{
    .@price=getarg(0, 600);
    .@retry=getarg(1, 1);

	// Adjust price (if relevant)
    if (.@retry == 1)
    	.@price=POL_AdjustPrice(.@price);

    mes l("Which item will you tweak?");
    .@points_left = SmithTweakPointsExplain();
    mesc l("EXPERTS ONLY - If you are not a talented crafter, avoid this."), 1;
    mesc l("The item must have a previous bonus, which WILL BE LOST!"), 1;
    mesc l("Note: You may fail to write skills to it."), 1;
    mesc l("Operation Cost: @@ GP", .@price), 3;

    // Do you have money or AP
    if (Zeny < .@price || !.@points_left) {
        mesc l("You lack money or Action Points."), 1;
        return false;
    }

    .@id=requestitemindex();
    mes "";

    // Ask player to confirm
    if (!csys_Confirm(.@id))
        return false;

    // Collect the item ID
    delinventorylist();
    getinventorylist();
    .@x=@inventorylist_id[.@id];

    // No duplicates
    if (countitem(.@x) > 1) {
        mesc l("You are carrying duplicates of the same item. Sorry, but I have no idea which one you want to tweak."), 1;
        return false;
    }

    // Skip equipped items
    if (isequipped(.@x)) {
        mesc l("You should unequip this item first."), 1;
        return false;
    }

    // If the item have no bonuses - fail
    setarray .@AlwaysTweaks, 65535, BlacksmithAxe, Dustynator, Lightbringer,
                             DemureAxe, Tyranny, Runestaff, AegisShield,
                             SaviorShield, SaviorArmor, SaviorBoots, SaviorPants,
                             Skypiercer;

    // Tweaked items
    if (getitemoptionidbyindex(.@id, 0) <= 0 && !is_master() && array_find(.@AlwaysTweaks, .@x) < 0) {
        mesc l("This item have no bonuses, and cannot be tweaked."), 1;
        return false;
    }

    // Take the money and AP away
	POL_PlayerMoney(.@price);
    SmithTweakPointsDecrement(.@x);

    // Apply the bonuses. This will only loop if `continue;` is cast.
    // `continue` will only be cast if .@retry is set
    do
    {
        .@retry-=1;
        // Check if you fail
        if (!csys_Check(.@id)) {
            mesc l("YOU FAIL! It is a simple item now."), 1;
            if (.@retry) {
                mesc l("...Automatically retrying...");
                continue;
            }
            return false;
        }

        csys_Apply(.@id);
        mesc l("SUCCESS! Congratulations, the item was improved!"), 3;
        if (.@retry) {
            next;
            mesc l("Do you want to re-roll?"), 1;
            if (askyesno() == ASK_YES) {
                continue;
            }
        }
        return true;
    } while (.@retry > 0);
}