summaryrefslogtreecommitdiff
path: root/world/map/npc/magic/level2-magic-knuckles.txt
blob: a67941cf096d8900d6852b6c325e8a05a7ef3a8a (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
-|script|magic-knuckles|32767
{
    if @_U_BLOCK >= 1 goto L_Still_Exhausted;
/*
    set @upmarmu_spell_npc_name$, "#Upmarmu#" + getcharid(3); // make a unique puppet name for every player
    set .upmarmu_spell_npc, getnpcid(@upmarmu_spell_npc_name$);
    if ( .upmarmu_spell_npc >= 1 ) goto L_NPC_Exists; // if this npc already exist reuse it so that idle recovery timer does not get destroyed

    set .upmarmu_spell_npc, puppet(getmap(), 0, 0, @upmarmu_spell_npc_name$, 127); // clone npc => get puppet id (npc 127 is invisible and can't be targeted)
    if (.upmarmu_spell_npc < 1) end;
    set .caster, getcharid(3), .upmarmu_spell_npc; // tell the puppet who controls it
    goto L_NPC_Exists;

L_NPC_Exists:
*/
    if (call("magic_checks")) end;
    if (Sp < 20) end;
    if (getskilllv(SKILL_MAGIC) < .level) end;
    set .@level, getskilllv(.school);
    if (.@level < .level) end;
    if (getequipid(equip_hand1) != -1 || getequipid(equip_hand2) != -1) end;
    if (.@level <= 3 && countitem("Beer") >= 1) delitem "Beer", 1;
    elif (.@level <= 3) end;
    set @_M_BLOCK, 1; // block casting, until the timer clears it
    addtimer 500, "Magic Timer::OnClear"; // set the new debuff
    sc_start SC_COOLDOWN, 500, 0, BL_ID;
    callfunc "adjust_spellpower";
    set Sp, Sp - 20;
    set CASTS, CASTS + 1;
    if (CASTS < 0) set CASTS, 1; // overflow

    set .@delay, (200-(Agi+Agi2))/8;
    if   ( .@delay < 12 ) set .@delay, 12; // 144 attack delay max @ 97 agi
    elif ( .@delay > 22 ) set .@delay, 22; // 484 attack delay min

    misceffect FX_MAGIC_KNUCKLE_CAST, strcharinfo(0);
    setarray @upmarmuspell[0],
        max(1, BASE_ATK + (@spellpower / 6)), // dmg
        ((@spellpower/12) + (((Dex+Dex2) * 8)/(sqrt(BaseLevel + 34)) + 20)), // charges (you get more at lower levels)
        .@delay, // delay
        (((Str+Str2) + (Dex+Dex2)) / 5), // dmg bonus
        (((BaseLevel/5) + Str) * 2); // do not allow to equip light armor, cast, and then switch to heavy armor to get bonus str

    callfunc "magic_exp";
    goto L_FreeRecast;

OnAttack:
    if (getequipid(equip_hand1) != -1 || getequipid(equip_hand2) != -1) goto OnDischarge;
    if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
    void call("elt_damage", @upmarmuspell[0], (@upmarmuspell[3] + @upmarmuspell[4]), ELT_WATER, ELT_FIRE, FX_NONE);

//    addtimer 0, @upmarmu_spell_npc_name$ + "::OnResetTimer";

    set @upmarmuspell[1], @upmarmuspell[1] - 1;
    set @num_upmarmu_hits, @num_upmarmu_hits + 1;

    if @num_upmarmu_hits >= UPMARMU_HITS_TILL_EXHAUST goto L_Exhausted;
    goto L_FreeRecast;

L_FreeRecast:
    if (@upmarmuspell[1] > 0)
        addtimer 0, strnpcinfo(0) + "::OnSetRecast";
    end;

L_Exhausted:
    set @_U_BLOCK, 1;
    set @upmarmuspell[1], 0;
    misceffect FX_MAGIC_DISCHARGE, strcharinfo(0);
    overrideattack;
    addtimer UPMARMU_EXHAUST_DURATION, "Upmarmu Exhaust Timer::OnClear"; // set the exhaustion time
    sc_start SC_COOLDOWN_UPMARMU, UPMARMU_EXHAUST_DURATION, 0, BL_ID;
    smsg SMSG_FAILURE, "Magic: You are too exhausted to use this spell for a while!";
    goto L_StopTimer;

L_Still_Exhausted:
    smsg SMSG_FAILURE, "Magic: You are still too exhausted to use this spell for a while!";
    end;

L_StopTimer:
//    addtimer 0, @upmarmu_spell_npc_name$ + "::OnStopTimer";
    end;

OnDischarge:
    if (@upmarmuspell[1] < 1) end;
    set @upmarmuspell[1], 0;
    misceffect FX_MAGIC_DISCHARGE, strcharinfo(0);
    overrideattack;
    end;

OnSetRecast:
    overrideattack (@upmarmuspell[2] * @upmarmuspell[2]), 1, ATTACK_ICON_GENERIC, OVERRIDE_KNUCKLES, strnpcinfo(0)+"::OnAttack", @upmarmuspell[1]; // delay needs to be squared
    end;

/*
OnResetTimer:
    // This timer is if you stopped somewhere below max hits then after 25sec you recover fully and start at 0 hits again
    stopnpctimer;
    // to get this work stoptimer must be executed here or after setnpctimer and then started again else
    // a timer somehow detaches that cant be set anymore, startnpctimer then attaches it again somehow
    // i think the problem is in npc_timerevent_calc_next somewhere
    if (@num_upmarmu_hits < 1) initnpctimer;
    setnpctimer 0;
    startnpctimer;
    end;

OnStopTimer:
    stopnpctimer;
    setnpctimer 0;
    end;

OnTimer25000:
    if (attachrid(.caster) < 1) end;
    set @num_upmarmu_hits, 0;
    detachrid;

    stopnpctimer;
    setnpctimer 0;
    end;

OnDestroy:
    destroy;
*/

OnInit:
    set .school, SKILL_MAGIC_WAR;
    set .invocation$, chr(MAGIC_SYMBOL) + "upmarmu"; // used in npcs that refer to this spell
    void call("magic_register");
    set .level, 2;
    set .exp_gain, 1;
    end;
}

-|script|Upmarmu Exhaust Timer|32767
{
    end;

OnClear:
    set @_U_BLOCK, 0;
    set @num_upmarmu_hits, 0;
    end;
}