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