Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
174 lines
5.4 KiB
Plaintext
174 lines
5.4 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Spell Name Control Weather
|
|
//:: Spell FileName PHS_S_ControlWea
|
|
//:://////////////////////////////////////////////
|
|
//:: In Game Spell desctiption
|
|
//:://////////////////////////////////////////////
|
|
Transmutation
|
|
Level: Air 7, Clr 7, Drd 7, Sor/Wiz 7
|
|
Components: V, S
|
|
Casting Time: 10 minutes; see text
|
|
Range: The current area
|
|
Area: The current area; see text
|
|
Duration: 4d12 hours; see text
|
|
Saving Throw: None
|
|
Spell Resistance: No
|
|
|
|
You change the weather in the local area. It takes 10 minutes to cast
|
|
the spell and then the effects manifest. You can call forth various weather,
|
|
including changing it to Snow, Rain, or making the weather clear.
|
|
|
|
Apart from the few spells that rely upon cirtain weather conditions, this
|
|
spell provides purely visual effects.
|
|
|
|
A druid casting this spell doubles the duration.
|
|
//:://////////////////////////////////////////////
|
|
//:: Spell Effects Applied / Notes
|
|
//:://////////////////////////////////////////////
|
|
Not sure about the "10 minutes later" stuff...that is around 5 hours
|
|
at 2 minutes/hour! :-)
|
|
|
|
Maybe change it - it is, of course, purely cosmetic!
|
|
|
|
Subdials:
|
|
Rain
|
|
Snow
|
|
Clear
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "prc_inc_spells"
|
|
|
|
// Put in nCastTimes to stop the change back in weather if this is cast
|
|
// again. Note that it just resets to area settings.
|
|
void SetWeatherBack(object oArea, int nCastTimes);
|
|
|
|
int IncreaseStoredInteger(object oTarget, string sName, int nAmount = 1)
|
|
{
|
|
// Get old
|
|
int nOriginal = GetLocalInt(oTarget, sName);
|
|
// Add new
|
|
int nNew = nOriginal + nAmount;
|
|
// Set new
|
|
SetLocalInt(oTarget, sName, nNew);
|
|
// Return the new value
|
|
return nNew;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Spell hook check.
|
|
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
|
|
if (!X2PreSpellCastCode()) return;
|
|
|
|
// Declare major variables
|
|
object oCaster = OBJECT_SELF;
|
|
object oArea = GetArea(oCaster);
|
|
int nWeather = GetWeather(oArea);
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nCastTimes;
|
|
|
|
// Doesn't work belowground...
|
|
if(!GetIsAreaAboveGround(oArea))
|
|
{
|
|
SendMessageToPC(oCaster, "You cannot cast Control Weather underground.");
|
|
return;
|
|
}
|
|
// ...or indoors.
|
|
if(GetIsAreaInterior(oArea))
|
|
{
|
|
SendMessageToPC(oCaster, "You cannot cast Control Weather inside.");
|
|
return;
|
|
}
|
|
// ...or with invalid weather (turned off?)
|
|
if(nWeather == WEATHER_INVALID)
|
|
{
|
|
SendMessageToPC(oCaster, "You cannot cast Control Weather here.");
|
|
return;
|
|
}
|
|
|
|
// Duration - 4d12 hours
|
|
float fDuration = PRCGetMetaMagicDuration(HoursToSeconds(d12(4)));
|
|
|
|
// Double duration for druids
|
|
if(GetLastSpellCastClass() == CLASS_TYPE_DRUID)
|
|
{
|
|
fDuration *= 2;
|
|
}
|
|
|
|
// Rain, snow or clear?
|
|
switch(GetSpellId())
|
|
{
|
|
case SPELL_CW_RAIN:
|
|
{
|
|
// Change to rain
|
|
if(nWeather == WEATHER_RAIN)
|
|
{
|
|
SendMessageToPC(oCaster, "It is already raining, Control Weather has no effect.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// Add one to the times it has been cast on this area
|
|
nCastTimes = IncreaseStoredInteger(oArea, "CONTROL_WEATHER_CAST_TIMES");
|
|
// Set and delay the changing back
|
|
SetWeather(oArea, WEATHER_RAIN);
|
|
DelayCommand(fDuration, SetWeatherBack(oArea, nCastTimes));
|
|
}
|
|
}
|
|
break;
|
|
case SPELL_CW_SNOW:
|
|
{
|
|
// Change to snow
|
|
if(nWeather == WEATHER_SNOW)
|
|
{
|
|
SendMessageToPC(oCaster, "It is already snowing, Control Weather has no effect.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// Add one to the times it has been cast on this area
|
|
nCastTimes = IncreaseStoredInteger(oArea, "CONTROL_WEATHER_CAST_TIMES");
|
|
// Set and delay the changing back
|
|
SetWeather(oArea, WEATHER_SNOW);
|
|
DelayCommand(fDuration, SetWeatherBack(oArea, nCastTimes));
|
|
}
|
|
}
|
|
break;
|
|
// All other (Clear/Non-subdial)
|
|
default:
|
|
//case SPELL_CW_CLEAR:
|
|
{
|
|
// Change to clear
|
|
if(nWeather == WEATHER_CLEAR)
|
|
{
|
|
SendMessageToPC(oCaster, "The weather is already clear, Control Weather has no effect.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// Add one to the times it has been cast on this area
|
|
nCastTimes = IncreaseStoredInteger(oArea, "CONTROL_WEATHER_CAST_TIMES");
|
|
// Set and delay the changing back
|
|
SetWeather(oArea, WEATHER_CLEAR);
|
|
DelayCommand(fDuration, SetWeatherBack(oArea, nCastTimes));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
PRCSetSchool();
|
|
}
|
|
|
|
// Put in nCastTimes to stop the change back in weather if this is cast
|
|
// again. Note that it just resets to area settings.
|
|
void SetWeatherBack(object oArea, int nCastTimes)
|
|
{
|
|
// Check nCastTimes
|
|
if(GetLocalInt(oArea, "CONTROL_WEATHER_CAST_TIMES") == nCastTimes)
|
|
{
|
|
// Reset the weather
|
|
SetWeather(oArea, WEATHER_USE_AREA_SETTINGS);
|
|
}
|
|
}
|