summaryrefslogtreecommitdiff
path: root/npc/functions
diff options
context:
space:
mode:
Diffstat (limited to 'npc/functions')
-rw-r--r--npc/functions/weather.txt138
1 files changed, 138 insertions, 0 deletions
diff --git a/npc/functions/weather.txt b/npc/functions/weather.txt
new file mode 100644
index 000000000..ea10a3c0d
--- /dev/null
+++ b/npc/functions/weather.txt
@@ -0,0 +1,138 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Controls world seasons. RESPECT MASK_* VARS ON CONSTANTS DB
+
+000-0,0,0,0 script #WeatherCore NPC_HIDDEN,{
+ end;
+
+OnInit:
+ // Bind commands
+ bindatcmd "wsnow", "#WeatherCore::OnSnow", 80, 80, 1;
+ bindatcmd "wrain", "#WeatherCore::OnRain", 80, 80, 1;
+ bindatcmd "wsand", "#WeatherCore::OnSand", 80, 80, 1;
+ bindatcmd "wevil", "#WeatherCore::OnEvil", 80, 80, 1;
+ bindatcmd "wnight", "#WeatherCore::OnNight", 80, 80, 1;
+ bindatcmd "wclear", "#WeatherCore::OnClear", 80, 80, 1;
+
+
+ // Determine which maps are subject to weather, and how weather works:
+ // eg. it will never snow on a desert, or a sandstorm on icelands.
+ .wcore = htnew;
+
+ // Deserts
+ htput(.wcore, "003-1", "desert");
+ htput(.wcore, "004-1", "desert");
+ htput(.wcore, "004-2", "desert");
+ htput(.wcore, "009-1", "desert");
+ htput(.wcore, "010-1", "desert");
+ htput(.wcore, "010-2", "desert");
+
+ // Woodlands
+ htput(.wcore, "005-1", "woodland");
+ htput(.wcore, "012-1", "woodland");
+ htput(.wcore, "014-1", "woodland");
+ htput(.wcore, "014-2", "woodland");
+ htput(.wcore, "014-3", "woodland");
+
+ // Icelands
+ htput(.wcore, "001-7", "iceland");
+
+ // No "end" here, so server starts with weather
+OnMinute00:
+OnMinute15:
+OnMinute30:
+OnMinute45:
+
+ debugmes "[Weather.sys] Total Maps = " + htsize(.wcore);
+ .@hti = htiterator(.wcore);
+ for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) {
+
+ // PvP Maps are immune to weather changes (eg. during sieges)
+ // I could use getmapmask, but this is simpler.
+ if (getmapflag(.@key$, mf_pvp))
+ continue;
+
+ // Local variables: .@key$ .@type .@r
+ .@type$=htget(.wcore, .@key$);
+ .@r=rand(0,10000);
+
+ // Remove all current masks, and add rain/snow/sand
+ if (.@type$ == "desert") {
+ if (.@r < 10)
+ setmapmask .@key$, MASK_RAIN;
+ else if (.@r < 100)
+ setmapmask .@key$, MASK_SANDSTORM;
+ else
+ setmapmask .@key$, MASK_NONE;
+
+ } else if (.@type$ == "woodland") {
+ if (.@r < 100)
+ setmapmask .@key$, MASK_RAIN;
+ else if (.@r < 120)
+ setmapmask .@key$, MASK_SANDSTORM;
+ else if (.@r < 140)
+ setmapmask .@key$, MASK_SNOW;
+ else
+ setmapmask .@key$, MASK_NONE;
+
+ } else if (.@type$ == "iceland") {
+ if (.@r < 10)
+ setmapmask .@key$, MASK_RAIN;
+ else if (.@r < 100)
+ setmapmask .@key$, MASK_SNOW;
+ else
+ setmapmask .@key$, MASK_NONE;
+
+ } else {
+ debugmes "Warning warning, blame Saulc! Weather system error on map "+.@key$;
+ announce("ERROR BLAME SAULC! WEATHER SYSTEM CORRUPTED. KILLING MAP SERVERS.", bc_all);
+ atcommand "@mapexit";
+ }
+
+ // Is it night time?
+ // For convenience, night time is from 00:15 to 00:45, every hour.
+ // 2 = GETTIME_MINUTE
+ if (gettime(2) >= 15 && gettime(2) < 45)
+ addmapmask .@key$, MASK_NIGHT;
+ else if (getmapmask(.@key$) & MASK_NIGHT)
+ removemapmask .@key$, MASK_NIGHT;
+
+ }
+ htidelete(.@hti);
+ debugmes "[Weather.sys] Weather reloaded";
+ end;
+
+// Some commands, for GMs manually override weather
+OnRain:
+ getmapxy(.@key$,.@a,.@b,0);
+ addmapmask .@key$, MASK_RAIN;
+ end;
+
+OnSand:
+ getmapxy(.@key$,.@a,.@b,0);
+ addmapmask .@key$, MASK_SANDSTORM;
+ end;
+
+OnSnow:
+ getmapxy(.@key$,.@a,.@b,0);
+ addmapmask .@key$, MASK_SNOW;
+ end;
+
+OnNight:
+ getmapxy(.@key$,.@a,.@b,0);
+ addmapmask .@key$, MASK_NIGHT;
+ end;
+
+OnEvil:
+ getmapxy(.@key$,.@a,.@b,0);
+ addmapmask .@key$, MASK_EVILSANCTUM;
+ end;
+
+OnClear:
+ getmapxy(.@key$,.@a,.@b,0);
+ setmapmask .@key$, MASK_NONE;
+ end;
+
+}