summaryrefslogblamecommitdiff
path: root/npc/functions/refine.txt
blob: dee5c36e01cc1759904363f102780113a3688053 (plain) (tree)
1
2
3
4
5
6
7


                 

                               
               
                                                                                                                                 
















                                                                                                         
                                                                                                               
                                                                                                     
                                                                                                                                                         
                                                                                                           
                                                             
























                                                                                   
                                         
                     
                                                                           
                                                                                             
             


                       








                                                              
                             
                                                                






                                                               
                                         





                         
               
                                 
               

               
               

                                     
               

                
                

                                     


                                                                                                                                       

                                                                      




                               















                                                                                             
              





                                                                               
              






                                                                                                                                  




                                                                                                               

                                                                    

                          
                                                         


                                                                             

                                                      
             

                                                                









                                                                                                           










                                                                             







                                                                                                           
     
                                                                     


           
















                                                                                                                                                                         
                                                         

                    
                                                                                                                              
         
                                                                              








                                                                                                                      
                                                  


                      
                         









                                         
// TMW2 Script
// Author:
//      Jesusalva
//      Pyndragon (inspiration)
//      Scall (inspiration)
// Description:
//      Refine functions. Includes equipment repair. In future use getequippercentrefinery(.@it, REFINE_CHANCE_TYPE_ENRICHED) too

// (No arguments)
function	script	refineMaster	{
    mesn;
    mesq l("Ah, hello there, funny face! Do you want to refine items?");
    mesc l("There's always some chance that THE ITEM WILL BREAK, beware!");
    next;
    mesn;
    mesq l("First - item must be equipped.");
    mesq l("If you succeed, the defense and/or attack will raise. If you fail, refine level goes down.");
    //mesq l("And if the item breaks, that is definitive - no repair is possible. What to refine?");
    mesq l("And if the item breaks, that's your loss. What to refine?");
    next;

    // Dark magic from hercules used, take care
    menuint
        l("Nothing, thanks"), 0,
        rif(getequipisequiped(EQI_HEAD_MID), l("My chestplate, @@", getequipname(EQI_HEAD_MID))), EQI_HEAD_MID,
        rif(getequipisequiped(EQI_HAND_R), l("My weapon, @@", getequipname(EQI_HAND_R))), EQI_HAND_R,
        rif(getequipisequiped(EQI_HAND_L) && getequipid(EQI_HAND_L) != getequipid(EQI_HAND_R), l("My shield, @@", getequipname(EQI_HAND_L))), EQI_HAND_L,
        rif(getequipisequiped(EQI_HEAD_TOP), l("My helmet, @@", getequipname(EQI_HEAD_TOP))), EQI_HEAD_TOP,
        l("Item break? Too dangerous! I don't want it!!"), 0;


	if (@menuret == 0) {
        mesn;
        //mesq l("Wait a moment - you are naked! YOU WILL DIE IN THE FREEZE! o.o");
        mesq l("Well... we'll see around!");
		close;
	}
    .@it=@menuret;
    .@item=getequipid(.@it);

    /*
    mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
    .@item = requestitem();

    // Check if we received an item
    if (.@item < 1) {
        mesn;
        mesq l("Well, no risk, no gain.");
        close;
        return;
    }
    */

    // Not all items are refinable
	if (!getequipisenableref(.@it)) {
		mesn;
		mesq l("Well, sorry, but only some items can be refined.");
        mesq l("There may be some exceptions. Anyway, this item clearly cannot be refined.");
        next;
		return;
	}

    // Savior items have different rules
    .@savior = false;
    if (compare("savior", strtolower(getitemname(getarg(0)))))
        .@savior = true;

    // Legendary Weapons, this formula is hardcoded in C
    if (is_between(3600, 3610, getarg(0)))
        .@savior = true;

    // Max refining level: 10
	if (getequiprefinerycnt(.@it) >= (.@savior ? 12 : 10)) {
		mesn;
		mesq l("This item cannot be refined further.");
        return;
	}

    .@rlv=getequiprefinerycnt(.@it);
    .@price=(.@rlv+1)*1000;
	.@price=POL_AdjustPrice(.@price);
    .@amount=(.@rlv/2)+1;
    // required item
    switch (.@rlv) {
        case 0:
        case 1:
        case 2:
        case 3:
            .@rg=Wurtzite; break;
        case 4:
        case 5:
        case 6:
        case 7:
            .@amount=((.@rlv-4)/2)+1;
            .@rg=Graphene; break;
        case 8:
        case 9:
        case 10:
        default:
            .@amount=((.@rlv-8)/2)+1;
            .@rg=Arcanum; break;
    }
    mesn;
    mesq l("This @@ is a nice stuff. I can refine it for @@ GP and @@ @@.", getitemlink(.@item), .@price, .@amount, getitemlink(.@rg));
    .@fake = (.@savior ? rand2(-1,1) : rand2(-6, 6));
    mesc l("Success ratio is of aprox. @@ %", (100-(.@rlv*7))+.@fake);
    next;
    if (askyesno() != ASK_YES)
        close;

    // Anti-Crazyfefe™ System
    // No money
    if (Zeny < .@price) {
        mesn;
        mesq l("Where's the money? Go away.");
        close;
    }
    // No reagents
    if (countitem(.@rg) < .@amount) {
        mesn;
        mesq l("Where's the reagent? You don't expect me to find it, right? Go bring them!");
        close;
    }
    // Item removed
	if (getequipisequiped(.@it) == 0) {
        mesn;
        mesc l("All cheaters must die."), 1;
        die();
        close;
    }
    // Item changed
	if (getequiprefinerycnt(.@it) != .@rlv || getequipid(.@it) != .@item) {
        mesn;
        mesc l("All cheaters must die."), 1;
        die();
        close;
    }
    ///// This should cover most of Crazyfefe tricks ¬.¬ I hope ¬.¬
    mesn;
    mesq l("HA, HA, HA! The blacksmiths from the Land of Fire are the best from the world! There's no challenge too big for us!");
    mesq l("It's time to show this shiny @@ who is the boss! HAHAHAHAHAHAHAH!", getitemlink(.@item));
    next;
    // Cheater should be locked for eternity.
	if (getequiprefinerycnt(.@it) != .@rlv || getequipid(.@it) != .@item || getequipisequiped(.@it) == 0) {
        atcommand "@jail "+strcharinfo(0);
        close;
    }
    // If you cheat somewhere along the way, the script will explode
	POL_PlayerMoney(.@price);

    // Were we successful?
	if (getequippercentrefinery(.@it) > rand2(100)) {
	    successrefitem .@it;
        mesn;
        mesq l("HAHAHAHAH! Shiny as new, and stronger than ever! Have fun!");
        mesc l("Weapons: +8 attack, +8 magic attack");
        mesc l("Armors: +3~5 defense");
        next;
    // Item is weakened. (1% per refine level) (Savior Immunity)
    } else if (rand2(100) < .@rlv && !.@savior) {
		downrefitem .@it, 1;
        mesn;
        mesq l("A masterpiece!... Whaaaat, this stuff got ##Bweaker##b??");
        next;
        mesn;
        mesq l("Well, I did my best, but this had been so refined, that it was difficult to find my way.");
        next;
        mesn;
        mesq l("I'm sure I could refine this again, if you bring me the payment and the reagents again.");
        next;
    // Perhaps the item has broken? (~0.1% chance/refine level)
    } else if (rand2(10000) <= 10*(.@rlv+1)) {
		failedrefitem .@it;
        mesc l("*CRASH*");
        next;
        mesn;
        mesq l("Ops... I hammered this stuff too hard... It's junk now.");
        next;
        mesn;
        mesq l("Well, you were warned. Do you have any other stuff for me?");
        next;
    // Nothing happens
    } else {
        mesn;
        mesq l("Well, I did my best, but this had been so refined, that it was difficult to find my way.");
        next;
        mesn;
        mesq l("I'm sure I could refine this again, if you bring me the payment and the reagents again.");
        next;
    }
    delitem .@rg, .@amount; // We delete last, to prevent IDX changes
    return;
}


// (No arguments)
function	script	repairMaster	{
    mesn;
    mesq l("I am a really good blacksmith. In fact, there is no stuff I can't fix.");
    next;
    mesn;
	if (getbrokenid(1) == 0) {
		mesq l("I don't think you have any broken item, but if a friend of mine break your stuff, come talk to me!");
        close;
	} else {
        // Print the name of the first broken item
		mesq l("You seem to have @@ broken items and... Oh, I see you have a broken @@ here! I wanna repair it!", getbrokencount(), getitemname(getbrokenid(1)));
        .@save=getbrokenid(1);
        next;
    }
    .@price=getiteminfo(getbrokenid(1), ITEMINFO_SELLPRICE)+getiteminfo(getbrokenid(1), ITEMINFO_ELV)-(getbrokencount()*15);
    if (.@price < 100 || getbrokenid(1) == BronzeGladius)
        .@price=100;
    mesn;
    mesq l("I can fix this for you. Just pay me @@ GP and a @@. It'll take no time at all!", .@price, getitemlink(IronIngot));
    next;
    if (Zeny < .@price || countitem(IronIngot) < 1 || askyesno() != ASK_YES) {
        mes "";
        mesn;
        mesq l("Ahh, that's a pity... Well, just talk to me with enough money and I'll gladly fix that for you! %%0");
        close;
    }
    // Cheating? Well, let's try to be innovative this time
    if (.@save != getbrokenid(1)) {
        mesn;
        mesq l("Ah...! POLICE! POLICE! Quick, send this cheating thief to jail!!");
        atcommand "@jailfor 20mn "+strcharinfo(0);
        close;
    }
    Zeny=Zeny-.@price;
    delitem IronIngot, 1;
    repair(1);
    mesn;
    mesq l("Here, sparking new! Nice!!");
    if (getbrokencount() > 0) {
        next;
        return;
    } else {
        close;
    }
}