summaryrefslogblamecommitdiff
path: root/npc/functions/weather.txt
blob: ea10a3c0dc34c36a679a27839d54382a358ad0e9 (plain) (tree)









































































































































                                                                                                  
// 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;

}