// TMW2 Script.
// Authors:
// Jesusalva
// Description:
// Util functions
// Returns Nard reputation for discounts
// Currently ranges from 0 to 15.
function script nard_reputation {
.@nr=0; // Base reputation
// Valon Quest (+1 rep)
if (getq(CandorQuest_Trainer) >= 14)
.@nr=.@nr+1;
// Zegas Quest (+1 rep)
if (getq(CandorQuest_Barrel) >= 4)
.@nr=.@nr+1;
// Hide And Seek Quest (+1 rep)
if (getq(CandorQuest_HAS) >= 4)
.@nr=.@nr+1;
// Sailors Quest (+1 rep)
if (getq(CandorQuest_Sailors) >= 3)
.@nr=.@nr+1;
// Sailors Quest, part 2 (+1 rep)
if (getq(CandorQuest_SailorCure) >= 3)
.@nr=.@nr+1;
// Vincent Quest (+1 rep)
if (getq(CandorQuest_Vincent) >= 2)
.@nr=.@nr+1;
// Tolchi Quest (+1 rep)
if (getq(CandorQuest_Tolchi) >= 4)
.@nr=.@nr+1;
// Maya Quest (+1 rep)
if (getq(CandorQuest_Maya) >= 4)
.@nr=.@nr+1;
// Dan Quest (+1 rep)
if (getq(ShipQuests_Dan) >= 3)
.@nr=.@nr+1;
// Chef Gado Quest (+1 rep)
if (getq(ShipQuests_ChefGado) >= 2)
.@nr=.@nr+1;
// Peter Quest (+1 rep)
if (getq(ShipQuests_Peter) == 3 || getq(ShipQuests_Peter) == 5)
.@nr=.@nr+1;
// Tulimshar Quests
// Swezanne Quest (+1 rep)
if (getq(TulimsharQuest_Swezanne) >= 1)
.@nr=.@nr+1;
// Sailors Quest (+1 rep)
if (getq(TulimsharQuest_Sailors) >= 2)
.@nr=.@nr+1;
// Hasan Quest (+1 rep)
if (getq(TulimsharQuest_Hasan) >= 5)
.@nr=.@nr+1;
// Dausen Quest (+1 rep)
if (getq(TulimsharQuest_WaterForGuard) >= 3)
.@nr=.@nr+1;
//debugmes "Reputation: "+str(.@nr);
return .@nr;
}
// Returns reputation with the La Marine for discounts
// Takes one argument (PC_DEST$). Grep for "getarg".
function script reputation {
.@nr=0; // Base reputation
// Tulimshar Quests (12 points)
if (getarg(0) == "Tulim") {
// Swezanne Quest (+1 rep)
if (getq(TulimsharQuest_Swezanne) >= 1)
.@nr=.@nr+1;
// Sailors Quest (+1 rep)
if (getq(TulimsharQuest_Sailors) >= 2)
.@nr=.@nr+1;
// Hasan Quest (+1 rep)
if (getq(TulimsharQuest_Hasan) >= 5)
.@nr=.@nr+1;
// Dausen Quest (+1 rep)
if (getq(TulimsharQuest_WaterForGuard) >= 3)
.@nr=.@nr+1;
// Eugene Quest (+1 rep)
if (getq(TulimsharQuests_Fishman) >= 2)
.@nr=.@nr+1;
// Sarah Quest (+1 rep)
if (getq(TulimsharQuest_Sarah) >= 1)
.@nr=.@nr+1;
// Silvia Quest (+1 rep)
if (getq(TulimsharQuest_Lifestone) >= 2)
.@nr=.@nr+1;
/*
// Eisten Quest (+1 rep)
if (getq(TulimsharQuest_Eistein) >= 6)
.@nr=.@nr+1;
*/
// Devoir Quest (+1 rep)
if (getq(TulimsharQuest_Devoir) >= 1)
.@nr=.@nr+1;
// Zarkor Quest (+1 rep)
if (getq(TulimsharQuest_DarkInvocator) >= 7)
.@nr=.@nr+1;
// Anwar Quest (+1 rep)
if (getq(TulimsharQuest_AnwarField) >= 10)
.@nr=.@nr+1;
// Tycoon Quest (+1 rep)
if (getq(MineQuest_Tycoon) >= 15)
.@nr=.@nr+1;
// Neko Quest (+1 rep)
if (getq(TulimsharQuest_Neko) >= 2)
.@nr=.@nr+1;
// Hurnscald Quests (5 points)
} else if (getarg(0) == "Hurns") {
// Alan Quest (+1 rep)
if (getq(HurnscaldQuest_ForestBow) >= 2)
.@nr=.@nr+1;
// Gwendolyn Quest (+1 rep)
if (getq(HurnscaldQuest_HarkEye) >= 6)
.@nr=.@nr+1;
// Celestia Quest (+1 rep)
if (getq(HurnscaldQuest_TeaParty) >= 2)
.@nr=.@nr+1;
// Farmers Quest (+1 rep)
if (getq(HurnscaldQuest_Farmers) >= 5)
.@nr=.@nr+1;
// Helena Quest (+1 rep)
if (getq(HurnscaldQuest_Bandits) >= 8)
.@nr=.@nr+1;
// Land Of Fire Quests (3 points)
} else if (getarg(0) == "LoF") {
// The EPISODE (+1 rep)
if (getq(LoFQuest_EPISODE) >= 2)
.@nr=.@nr+1;
// George Quest (+1 rep)
if (getq(LoFQuest_George) >= 3)
.@nr=.@nr+1;
// Fairy Quest (+1 rep)
if (getq(LoFQuest_Fairy) >= 3)
.@nr=.@nr+1;
// Final
}
//debugmes "Reputation: "+str(.@nr);
return .@nr;
}
// Returns time for ship travel.
// Can be modified by a factor.
function script nard_time {
// Estimates time to move by ship from LOCATION$ to getarg(0)
// From Candor
if (LOCATION$ == "Candor") {
if (getarg(0) == "Tulim")
return 22000;
}
// From Tulimshar
if (LOCATION$ == "Tulim") {
if (getarg(0) == "Candor")
return 22000;
if (getarg(0) == "Hurns")
return 24000;
}
// From Hurnscald
if (LOCATION$ == "Hurns") {
if (getarg(0) == "Candor")
return 22000;
if (getarg(0) == "Tulim")
return 24000;
}
// Error
debugmes "ERROR, INVALID LOCATION AND DESTINATION";
debugmes l("@@ -> @@", LOCATION$, getarg(0));
dispbottom l("An error on your travel time happened. Please report.");
return INT_MAX;
}
// Determines if player is still in range.
// eg.
// if (reachable(.x, .y, .distance)) {
function script reachable {
.@x=getarg(0);
.@y=getarg(1);
.@z=getarg(2);
getmapxy(.@mp$, .@xp, .@yp, 0);
if (distance(.@x, .@y, .@xp, .@yp) <= .@z)
return 1;
else
return 0;
}
// Determines if party exp sharing is enabled
// ( Party ID )
function script party_expon {
.@nb = query_sql("SELECT exp FROM `party` WHERE party_id="+escape_sql(getarg(0))+" LIMIT 2", .@value);
return .@value[0];
}
// Prepare Mana Stone
// mstone( lvl )
function script mstone {
// Fill variable
.@v=getarg(0);
// Determine how much stats you need, this is based on players
// and change based on $Global Variables
.int=15;
.lvl=20;
.jlv=15;
return (
MAGIC_LVL == .@v &&
readparam(bInt) >= $MANA_BINT+(.int*.@v) &&
BaseLevel >= $MANA_BLVL+(.lvl*.@v) &&
JobLevel >= $MANA_JLVL+(.jlv*.@v) &&
readparam(Sp) == readparam(MaxSp));
}
// Gets how many subclasses were actually filled
// total_subclass( )
function script total_subclass {
.@i=0;
if (MAGIC_SUBCLASS & CL_PALADIN)
.@i+=1;
if (MAGIC_SUBCLASS & CL_TANKER)
.@i+=1;
if (MAGIC_SUBCLASS & CL_BERSERKER)
.@i+=1;
if (MAGIC_SUBCLASS & CL_RANGER)
.@i+=1;
if (MAGIC_SUBCLASS & CL_SNIPER)
.@i+=1;
if (MAGIC_SUBCLASS & CL_WIZARD)
.@i+=1;
if (MAGIC_SUBCLASS & CL_SAGE)
.@i+=1;
if (MAGIC_SUBCLASS & CL_PRIEST)
.@i+=1;
return .@i;
}
// Gets how many subclasses were actually allowed
// max_subclass()
function script max_subclass {
return (MAGIC_LVL/2);
}
// Gets subclass current degree
// degree_subclass()
function script degree_subclass {
return (MAGIC_LVL/2)+(MAGIC_LVL%2);
}
// Returns true if a skill can be leveled up, based on degree_subclass().
// sk_canlvup( sk )
function script sk_canlvup {
if (getskilllv(getarg(0)) <= degree_subclass())
return 1;
return 0;
}
// Level up a skill in 1 level
// sk_lvup( sk )
function script sk_lvup {
.@lvl=getskilllv(getarg(0));
getexp 0, 50*(.@lvl+1);
addtoskill(getarg(0),.@lvl+1,0);
return;
}
// Returns the intelligence cost based on skill level
// sk_intcost( sk )
function script sk_intcost {
.@cost=(getskilllv(getarg(0))+1)*17;
if (readparam(bInt) >= .@cost)
return 1;
return 0;
}
// Returns a value defining your current magic control (affects success ratio, higher is better)
// A value of '5' means perfect control, and a value of '0' means overwhelm.
// abizit()
function script abizit {
.@base=(MAGIC_LVL**3);
return max(MAGIC_EXP/.@base, 5);
}
// Returns, based on a 1-5 range, the title for both thief and merc ranks
// thiefrank() / mercrank()
function script thiefrank {
switch (THIEF_RANK) {
case 5: return l("Bandit Lord");
case 4: return l("Assassin");
case 3: return l("Rogue");
case 2: return l("Bandit");
case 1: return l("Thief");
default: return l("Error");
}
}
function script mercrank {
switch (MERC_RANK) {
case 5: return l("Constable");
case 4: return l("Guardian");
case 3: return l("Merchant");
case 2: return l("Trader");
case 1: return l("Fair Person");
default: return l("Error");
}
}