summaryrefslogblamecommitdiff
path: root/npc/functions/weather.txt
blob: cb426516dcb98c08fa154e94c2d0eb30c93d3b05 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                 








                                            
  
 






















































































                                                                                                  

                                                  
                                          

                                                     
                                             
         





                                              
















                                                                                                

                                                   
                             


        
                                  


        
                             


        
                              


        
                                    

        
                         

                               
                                  


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

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;

}