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
142
143
|
// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// Town Siege utilities
// Siege Spawn
// Can be used anywhere to spawn on the whole map, margins respected.
// siege_spawn( map, mobID, Amount, eventID )
function script siege_spawn {
.@mp$=getarg(0);
.@mid=getarg(1);
.@qnt=getarg(2);
.@ev$=getarg(3);
areamonster(.@mp$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@mp$)-20, getmapinfo(MAPINFO_SIZE_Y, .@mp$)-20, strmobinfo(1, .@mid), .@mid, .@qnt, .@ev$);
return;
}
// Calculate player average level
// if highest is set, it will return highest player level, with minimum the value
// passed. (A level "0" is clearly not valid, of course)
// siege_calcdiff ( map{, highest_lvl} )
function script siege_calcdiff {
.@bsum=0;
.@highest=getarg(1, false);
.@c = getunits(BL_PC, .@players, false, getarg(0));
for (.@i = 0; .@i < .@c; .@i++) {
.@b=readparam(BaseLevel, .@players[.@i]);
.@bsum+=.@b;
if (.@b > .@highest)
.@highest=.@b;
}
//debugmes "calcdiff: Total %d Average %d Highest %d", .@bsum, (.@bsum/.@c), .@highest;
if (getarg(1,false))
return .@highest;
else
return (.@bsum/.@c);
}
// push to $@SIEGE_TMPMOBS the <mobID> if their level is within a 15 levels range
// above or below <level>
// siege_push ( mobID, level )
function script siege_push {
.@mi=getarg(0);
.@lv=getarg(1,0);
if ( is_between(.@lv-15, .@lv+15, strmobinfo(3, .@mi)) ) {
//debugmes "Monster %s (%d) level %d ~= %d", strmobinfo(1, .@mi), .@mi, strmobinfo(3, .@mi), .@lv;
array_push($@SIEGE_TMPMOBS, .@mi);
}
return;
}
// Selects a monster based on player average strength and base difficulty
// It'll select monsters from 20 levels below to 20 levels above
// tp_mask is the same as TP_* constants and changes mobs present. Only TP_TULIM,
// TP_HURNS and TP_NIVAL are supported. You can use them with the "|" operand, eg.,
// TP_TULIM | TP_HURNS.
//
// It currently only creates $@SIEGE_TMPMOBS, you need to use any_of() manually.
// siege_selectmob ( blvl, difficulty{, tp_mask} )
function script siege_selectmob {
.@blv=getarg(0);
.@dif=getarg(1);
.@tp=getarg(2, 0);
// We don't need .@dif, so we convert difficulty to levels
.@blv+=.@dif;
deletearray $@SIEGE_TMPMOBS;
setarray $@SIEGE_TMPMOBS, ManaGhost, CandiedSlime, Bif, SlimeBlast;
// Now we must select mobs, using array_push() to $@SIEGE_TMPMOBS
// First, mobs on all envs
siege_push(BlackScorpion, .@blv);
siege_push(GreenSlime, .@blv);
siege_push(CaveMaggot, .@blv);
siege_push(MagicGoblin, .@blv);
siege_push(AngryBat, .@blv);
siege_push(BlackSlime, .@blv);
siege_push(BlackScorpion, .@blv);
siege_push(Forain, .@blv);
siege_push(GreenDragon, .@blv);
siege_push(Terranite, .@blv);
siege_push(JackO, .@blv);
siege_push(BlackMamba, .@blv);
siege_push(TerraniteProtector, .@blv);
siege_push(Reaper, .@blv);
// What if we are trying to select a boss and they're... overleveled?
// We need a level 105, 120 and a level 135 monsters
siege_push(FallenKing2, .@blv);
siege_push(TerraniteKing, .@blv);
// Now, mobs on only certain envs
if (.@tp & TP_TULIM) {
siege_push(AngryScorpion, .@blv);
siege_push(AngryRedScorpion, .@blv);
siege_push(DesertBandit, .@blv);
siege_push(LavaSlime, .@blv);
siege_push(OldSnake, .@blv);
siege_push(Snake, .@blv);
}
if (.@tp & TP_HURNS) {
siege_push(RedSlime, .@blv);
siege_push(Bandit, .@blv);
siege_push(RedMushroom, .@blv);
siege_push(RobinBandit, .@blv);
siege_push(AngryYellowSlime, .@blv);
siege_push(GrassSnake, .@blv);
siege_push(WickedMushroom, .@blv);
}
if (.@tp & TP_NIVAL) {
siege_push(Bluepar, .@blv);
siege_push(Wolvern, .@blv);
siege_push(Yeti, .@blv);
siege_push(Moggun, .@blv); // PS. Not aggressive
}
// Removed
//siege_push(DarkLizard, .@blv);
//siege_push(Crafty, .@blv);
return;
}
// Prepare a siege with optional announce
// siege_setup ( map{, announce} )
function script siege_setup {
debugmes "Cast";
.@m$=getarg(0);
.@msg$=getarg(1, "");
addmapmask .@m$, MASK_MATTACK;
changemusic .@m$, any("mythica.ogg", "eric_matyas_ghouls.ogg", "misuse.ogg", "Arabesque.ogg");
disablenpc("Mana Stone");
pvpon(.@m$);
if (.@msg$ != "")
kamibroadcast(col(.@msg$,1));
return;
}
|