summaryrefslogtreecommitdiff
path: root/npc/functions/inc_sc_bonus.txt
blob: 7bd243310323eb5b02201ad5720810150b1fe8b2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// TMW-2 Script.
// Author:
//    Jesusalva
// Description:
//    Applies effects for INC_* (STR doesn't exist)
//    Valid values: INCAGI INCVIT INCINT INCDEX INCLUK INCHIT INCFLEE SC_FURY
//    Doesn't works: SC_STRUP
//    Works if .@min == .@max: INCMHP INCMHPRATE INCMSP INCMSPRATE
///   Untested Values: WALKSPEED (reverse logic) INVINCIBLE (broken)
//    PS. SC_FURY causes crit rate to increase
//
// Variables:
//    .@delay    Second of buffing
//    .@type     SC_*
//    .@min      Min amount of type
//    .@max      Max amount of type (optional)

// SC_Bonus(delay, SC, min{, max})
function	script	SC_Bonus	{
    .@delay=getarg(0);
    .@type=getarg(1);
    .@min=getarg(2);
    .@max=getarg(3, .@min);
    if (.@delay <= 0)
        return false;

    // Get the bonus value
    if (.@min != .@max)
        .@bonus=rand2(.@min, .@max);
    else
        .@bonus=.@min;

    // Remaining time and effect conversion
    .@v=getstatus(.@type, 1);
    .@t=getstatus(.@type, 5);

    // Convert remaining time to seconds, rounded down
    if (.@t > 1000)
        .@t=.@t/1000;
    else
        .@t=0;

    // If there was effect previously, get ponderate average
    if (.@v > 0)
        .@v=ponderate_avg(.@bonus, .@delay, .@v, .@t);
    else
        .@v=.@bonus;

    // Update time value to ms and to stack
    .@t+=.@delay;
    .@t*=1000;

    // Debug print if needed
    if (debug || $@GM_OVERRIDE)
        debugmes "Effect %d (+%d percent) for %d ms", .@type, .@bonus, .@t;

    // Restart the bonus
    sc_end .@type;
	sc_start .@type,.@t,.@v;
    return true;
}

// SC_Bonus2(delay, SC1, val1, val2)
function	script	SC_Bonus2	{
    .@delay=getarg(0);
    .@type=getarg(1);
    .@val1=getarg(2);
    .@val2=getarg(3);
    if (.@delay <= 0)
        return false;

    // Remaining time and effect conversion
    .@v1=getstatus(.@type, 1);
    .@v2=getstatus(.@type, 2);
    .@ts=getstatus(.@type, 5);

    // Convert remaining time to seconds, rounded down
    .@ts=.@ts/1000;

    // If there was effect previously, get ponderate average (val1)
    if (.@v1 > 0)
        .@v1=ponderate_avg(.@val1, .@delay, .@v1, .@ts);
    else
        .@v1=.@val1;

    // If there was effect previously, get ponderate average (val2)
    if (.@v2 > 0)
        .@v2=ponderate_avg(.@val2, .@delay, .@v2, .@ts);
    else
        .@v2=.@val2;

    // Update time value to ms and to stack
    .@t+=.@delay;
    .@t*=1000;

    // Debug print if needed
    if (debug || $@GM_OVERRIDE)
        debugmes "Effect %d (%d/%d bonus) for %d ms", .@type, .@v1, .@v2, .@ts;

    // Restart the bonus
    sc_end .@type;
	sc_start2 .@type, .@ts, .@v1, .@v2;
    return true;
}