// TMW-2 Script.
// Author:
// Crush
// Jesusalva
// Description:
// Alcohol effects
// TODO: Retroactive, weakens every hour...
//
// Variables:
// @taste Alcohol taste (0~100) - influences exp up
// @Alcohol Alcoholic rating (0~100) - influences Attack Speed Malus, Min. Vit and duration
// ALC_DELAYTIME For how long you are drunk (the delay) - gettimetick(2)
// ALC_THRESHOLD How drunk you are (the bonus)
//
// When drunk, attack speed is lowered but exp gain is increased.
// Attack Speed Reductor: SC_ATTHASTE_INFINITY (reset upon death), SC_ATTHASTE_POTION2 (not reset upon death)
// Max HP Reductor: SC_INCMHPRATE
// EXP Increaser: SC_CASH_PLUSEXP (not reset upon death), SC_OVERLAPEXPUP (reset upon death)
function script ALCReset {
if (ALC_DELAYTIME < gettimetick(2))
ALC_THRESHOLD=0;
return;
}
- script alcohol_sc -1,{
// Stack remaning bonuses if the last one hasn't finished
// remaining_bonuses(sc, type)
// type 0: delay
// type 1: value
function remaining_bonus
{
if (getstatus(getarg(0)))
{
if (getarg(1))
return getstatus(getarg(0), 1);
else
return getstatus(getarg(0), 5); // Shouldn't it be 5?
}
return 0;
}
OnUse:
if (@Alcohol <= 0 || @taste <= 0) {
Exception("Invalid alcoholic item, deleting without any effect.");
end;
}
// Just to be sure
ALCReset();
// Do you have enough vitality to hold your beer?
// Skip this check on the first drink
if (ALC_THRESHOLD) {
.@vit=readparam2(bVit);
if (@Alcohol+ALC_THRESHOLD > .@vit) {
if (GSET_ALCOHOL_NOOVERDRINK) dispbottom l("You vomit, you are too drunk for this to have effect anymore.");
else dispbottom l("You vomit, you are too drunk and drinking is harmful.");
dispbottom l("Raise vitality to be able to drink even more.");
sc_start SC_CONFUSION, 5000, 0, 10000, SCFLAG_NOAVOID; // Warning, forces user to use @resync!
if (GSET_ALCOHOL_NOOVERDRINK) end;
percentheal -@Alcohol, -@Alcohol;
}
}
.@deltatime=2*60*1000; // How long (in ms) each Alcohol point works? (max. 100 points)
// Default value is 2 minutes per alcohol point - you'll be somber after at most four hours.
// Beer (7): 14 minutes
// Wine (16): 32 minutes
// Sake (25): 50 minutes
// Rum (40) : 80 minutes (1h20)
// Ale (70) : 140 minutes (2h20)
// Taste is affected by users near you.
// Each user raises exp bonus in 1.5%, capped to the beverage taste
// If you are with many people, drink a better beverage! ;-)
getmapxy(.@m$, .@x, .@y, 0);
.@bonus=getareausers(.@m$, .@x-12, .@y-12, .@x+12, .@y+12)-1;
.@bonus=.@bonus*15/10;
@taste+=min(@taste, .@bonus);
// Alcohol EXP Bonus - ponderate average, so having more VIT doesn't means
// more experience - only more time (be careful when mixing alcohol!)
.@v=remaining_bonus(SC_OVERLAPEXPUP, true);
.@t=remaining_bonus(SC_OVERLAPEXPUP, false)/1000;
if (.@t) .@val1 = ponderate_avg(@taste, @Alcohol, .@v, .@t);
else .@val1 = @taste;
// Put the delay in ms.
.@delay = remaining_bonus(SC_OVERLAPEXPUP, false);
.@delay = .@t + @Alcohol*.@deltatime;
// Reset EXP Bonus based on the new cumulative delay and average exp bonus
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, .@delay, .@val1;
// Recalculate Alcohol Threshold and time
ALC_THRESHOLD+=@Alcohol;
if (ALC_DELAYTIME < gettimetick(2)) {
ALC_DELAYTIME=gettimetick(2);
ALC_THRESHOLD=@Alcohol;
}
ALC_DELAYTIME+=@Alcohol*.@deltatime;
// Debug comment if you need to check stuff
//debugmes "%d %d | %d %d | f t ", remaining_bonus(SC_OVERLAPEXPUP, false), remaining_bonus(SC_OVERLAPEXPUP, true), remaining_bonus(SC_ATTHASTE_INFINITY, false), remaining_bonus(SC_ATTHASTE_INFINITY, true);
// For debuff I'll use inc_sc_bonus utilities (exp gain = atk speed loss)
.@delay=@Alcohol*(.@deltatime/1000);
.@min=-(remaining_bonus(SC_OVERLAPEXPUP, true)*2);
.@max=-(remaining_bonus(SC_OVERLAPEXPUP, true)*2);
// Sanitization, and nerf the debuff
.@min=(.@min/2)+1;
.@max=(.@max/2)+2;
// DEX and VIT may affect a tiny bit
.@pam=readparam2(bVit)+readparam2(bDex);
.@min=min(0, .@min*limit(0, 500-.@pam, 500)/500);
.@max=min(0, .@min*limit(1, 500-.@pam, 500)/500);
SC_Bonus(.@delay, SC_ATTHASTE_INFINITY, .@min, .@max);
if (debug || $@GM_OVERRIDE)
debugmes "Alcohol penalty: %d ~ %d for %d ms", .@min, .@max, .@delay;
close;
}