summaryrefslogtreecommitdiff
path: root/npc/functions/weather.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/functions/weather.txt')
-rw-r--r--npc/functions/weather.txt169
1 files changed, 169 insertions, 0 deletions
diff --git a/npc/functions/weather.txt b/npc/functions/weather.txt
new file mode 100644
index 000000000..cc7285721
--- /dev/null
+++ b/npc/functions/weather.txt
@@ -0,0 +1,169 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Controls world seasons. RESPECT MASK_* VARS ON CONSTANTS DB
+
+000-0,0,0,0 script #WeatherCore NPC_HIDDEN,{
+ end;
+
+/*
+ * removemapflag("<map name>", <flag>)
+ * setmapflag("<map name>", <flag>{, <val>})
+ * getmapflag("<map name>", <flag>)
+
+ mf_snow: 16
+
+ mf_jexp: 39
+ mf_bexp: 40
+
+ setmapflag(.@key$, mf_nightenabled);
+ removemapflag(.@key$, mf_nightenabled);
+
+*/
+
+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) {
+ setmapflag(.@key$, mf_nightenabled);
+ addmapmask .@key$, MASK_NIGHT;
+ } else if (getmapmask(.@key$) & MASK_NIGHT) {
+ removemapflag(.@key$, mf_nightenabled);
+ removemapmask .@key$, MASK_NIGHT;
+ }
+
+ }
+ htidelete(.@hti);
+ debugmes "[Weather.sys] Weather reloaded";
+ end;
+
+ // Function to check stuff
+ // WeatherSwitch ( MASK )
+ function WeatherSwitch {
+ // Get map
+ getmapxy(.@key$,.@a,.@b,0);
+
+ // Sanitize
+ .@m$ = htget(.wcore, .@key$, "Not found");
+
+ // Change Weather or abort
+ if (.@m$ == "Not found")
+ dispbottom l("Command not permitted on this map! Check npc/functions/weather.conf");
+ else
+ addmapmask(.@key$, MASK_RAIN);
+ return;
+ }
+
+// Some commands, for GMs manually override weather
+OnRain:
+ WeatherSwitch(MASK_RAIN);
+ end;
+
+OnSand:
+ WeatherSwitch(MASK_SANDSTORM);
+ end;
+
+OnSnow:
+ WeatherSwitch(MASK_SNOW);
+ end;
+
+OnNight:
+ WeatherSwitch(MASK_NIGHT);
+ end;
+
+OnEvil:
+ WeatherSwitch(MASK_EVILSANCTUM);
+ end;
+
+// Clear works on any map
+OnClear:
+ getmapxy(.@key$,.@a,.@b,0);
+ setmapmask(.@key$, MASK_NONE);
+ end;
+
+}