summaryrefslogtreecommitdiff
path: root/npc/042-2/boss.txt
blob: 49219e9c5794ee2b98c9fdc4155b887b49001809 (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
// TMW 2 Script
// Author:
//  Jesusalva
//  Micksha
// Description:
//  Basement Boss Fight

042-2,41,22,0	script	#KDoor0422	NPC_HIDDEN,0,0,{
    function kdoor0422Spawn;
    end;

OnTouch:
    .@label$=instance_npcname(.name$)+"::OnKillBoss";
    .@g=getcharid(2);
    if (($KAMELOT_QUEST[.@g] & 4) && !mobcount(getmap(), .@label$)) {
        warp "042-2@"+.@g, 58, 139;
    } else {
        dispbottom l("Powerful magic repels you!");
        percentheal -5, -5;
        slide 38, 28;
    }
    end;

OnArrival:
    .@g=getcharid(2);
    if (.@g < 1)
        percentheal -100, -100;
    if (getmap() != "042-2@"+.@g)
        end;
    if ($@KAMELOT_WAVE[.@g] != 3)
        end;
    $@KAMELOT_WAVE[.@g]+=1;
    initnpctimer;
    //if ($@KAMELOT_WAVE == 0)
    //    goto OnKillMob;
    // TODO: Fire dialog
    // TODO: Stun yourself for cutscene
    // ...
    end;

OnTimer1000:
    .@m$=instance_mapname("042-2");
    .@n$=instance_npcname(.name$);
    mapannounce .@m$, "??? : Where's Micksha? WHRE IS ARTHUR MICKSHA", 0;
    // 2 is meaningless, as we're not using their acc ids, but sounded faster
    getguildmember(.@g, 2);
    .@gcount=$@guildmembercount;
    kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
    end;


OnKillMob:
    if (!playerattached()) end;
    .@g=getcharid(2);
    if (.@g < 1) percentheal -100, -100;
    getexp $KAMELOT_MX[.@g]*5, $KAMELOT_MX[.@g]*2;
    end;

OnKillBoss:
    .@g=getcharid(2);
    dispbottom l("This is all in KAMELOT for now.");
    $KAMELOT_QUEST[.@g]=$KAMELOT_QUEST[.@g]|4; // FIXME
    // Player Reward for completing this stage
    getitem GuildCoin, min(1, $KAMELOT_MX[.@g]/20);
    getexp $KAMELOT_MX[.@g]*50, $KAMELOT_MX[.@g]*10;
    // Guild Reward for completing this stage
    .@ggp=300+$KAMELOT_MX[.@g]*5;
    .@gxp=$KAMELOT_MX[.@g]*10;
    $GUILD_BANK[.@g]+=.@ggp;
    guildgetexp(.@gxp); // 5xp per player average level (max 500/750)
    // Announce
    mapannounce getmap(), strcharinfo(0)+" has defeated Krukan!", 0;
    // Guild Master Notification
    .@gm$=getguildmaster(.@g);
    if (!getcharid(3, .@gm$)) end;
    .@gma=getcharid(3, .@gm$);
    .@gmb=getcharid(0, .@gm$);
    if (!isloggedin(.@gma, .@gmb)) end;
    message .@gm$, strcharinfo(0)+" defeated Krukan: Guild GP +"+.@ggp+" Guild XP +"+.@gxp;

    // TODO: maptimer to give EXP to helpers/survivors
    end;

function kdoor0422Spawn {
    .@label$=instance_npcname(.name$)+"::OnKillMob";
    .@gcount=getarg(0);
    .@x1=getarg(1);
    .@y1=getarg(2);
    .@x2=getarg(3);
    .@y2=getarg(4);
    .@g=getcharid(2);
    if (.@g < 1) percentheal -100, -100;
    .@avg=$KAMELOT_MX[.@g];
    .@m$=getmap();
    freeloop(true);
    for (.@i=0; .@i < .@gcount; .@i++) {
        .@mobId=any(CursedSoldier, CursedArcher); // 50-50 ratio
        .@mob=areamonster(.@m$, 21, 24, 59, 99, strmobinfo(1, .@mobId), .@mobId, 1, .@label$);
        // Reconfigure the monster
        setunitdata(.@mob, UDT_LEVEL, .@avg);
        setunitdata(.@mob, UDT_STR, 1+.@avg/4);
        setunitdata(.@mob, UDT_AGI, 1+.@avg/4);
        setunitdata(.@mob, UDT_VIT, 1+.@avg/4);
        setunitdata(.@mob, UDT_INT, 1+.@avg/4);
        setunitdata(.@mob, UDT_DEX, 1+.@avg/4);
        setunitdata(.@mob, UDT_LUK, 1+.@avg/4);
        setunitdata(.@mob, UDT_ADELAY, 1672);
        setunitdata(.@mob, UDT_ATKRANGE, (.@mobId == CursedArcher ? any(6,7) : any(1,2)));
        // Battle Status
        setunitdata(.@mob, UDT_MAXHP,    .@avg*33);
        setunitdata(.@mob, UDT_HP,       .@avg*33);
        setunitdata(.@mob, UDT_ATKMIN,   .@avg*45/10);
        setunitdata(.@mob, UDT_ATKMAX,   .@avg*65/10);
        setunitdata(.@mob, UDT_DEF,      1+.@avg*9/10);
        setunitdata(.@mob, UDT_MDEF,     1+.@avg*5/10);
        setunitdata(.@mob, UDT_HIT,      .@avg*4); // Advised: x3
        setunitdata(.@mob, UDT_FLEE,     .@avg*35/10); // Advised: x4
        // Critical calculation
        .@min=2;
        .@max=max(.@min, min(25, .@avg/5));
        setunitdata(.@mob, UDT_CRIT,     rand2(.@min, .@max));
        // Loop through
    }
    freeloop(false);
    return;
}

// Script end
}