LoT_PRC8/_module/nss/lot_magicmushrm.nss
Jaysyn904 ec287507a1 Initial upload
Initial upload.
2023-09-25 21:32:17 -04:00

247 lines
9.5 KiB
Plaintext

#include "x0_i0_position"
#include "x0_i0_match"
#include "x2_inc_itemprop"
// Custom Glowing Mushroom Script needed - Mushroom should only do this once per mushroom random effect:
// for shrooms on Maze Area 2: https://steamuserimages-a.akamaihd.net/ugc/1475445820089242044/8641BAB874C8FAFF0E12CDE6ECF27B00E142BF1F/
// EFFECTS OF MUSHROOMS (LIKE RUSSIAN ROULLETTE)
// 1) Immediately causes blindness to the PC
// 2) Raises strength permanently by 1 point
// 3) Raises charisma permanently by 1 point
// 4) Raises wisdom permanently by 1 point
// 5) Raises intelligence permanently by 1 point
// 6) Raises dexterity permanently by 1 point
// 7) Causes PC to become invisible for a while
// 8) Lowers strength permanently by 1 point
// 9) Lowers charisma permanently by 1 point
// 10) Lowers wisdom permanently by 1 point
// 11) Lowers intelligence permanently by 1 point
// 12) Lowers dexterity permanently by 1 point
// 13) PC Is poisoned
// 14) Add a random gemstone to PC's inventory worth approx. 1000GP
// 15) Gives +1 to primary weapon
// 16) Heals all lost hitpoints and cures all dieseases / poisons / negative effects of the PC
// 17) Makes the PC into a complete idiot for a while (temporary incapacitating intelligence loss)
// 18) Adds +5 - +10 HP to the PC permanently
// 19) Causes Narcolepsy temporarily to the PC for 5 minutes
// 20) PC Pukes (Can use script for fishguts barrel that makes you puke)
void DoMushroomEffect();
void Puke();
void Narcolepsy();
void main()
{
int iPiecesEaten = GetLocalInt(OBJECT_SELF, "PIECES_EATEN");
if(iPiecesEaten < 6)
{
DoMushroomEffect();
SetLocalInt(OBJECT_SELF, "PIECES_EATEN", iPiecesEaten+1);
if(iPiecesEaten == 0) //This is first piece eaten.
{
SetLocalInt(OBJECT_SELF, "DAY_EATEN", GetCalendarDay());
SetLocalInt(OBJECT_SELF, "MONTH_EATEN", GetCalendarMonth());
SetLocalInt(OBJECT_SELF, "YEAR_EATEN", GetCalendarYear());
}
}
}
void DoMushroomEffect(){
int iEffect = d20();
object oPC = GetLastUsedBy();
//Bad Effects
effect eBlindness = EffectBlindness();
effect eSTRDec = SupernaturalEffect(EffectAbilityDecrease(ABILITY_STRENGTH, 1));
effect eCHADec = SupernaturalEffect(EffectAbilityDecrease(ABILITY_CHARISMA, 1));
effect eWISDec = SupernaturalEffect(EffectAbilityDecrease(ABILITY_WISDOM, 1));
effect eINTDec = SupernaturalEffect(EffectAbilityDecrease(ABILITY_INTELLIGENCE, 1));
effect eDEXDec = SupernaturalEffect(EffectAbilityDecrease(ABILITY_DEXTERITY, 1));
effect ePosion = EffectPoison(POISON_STRIPED_TOADSTOOL);
effect eIdiot = EffectAbilityDecrease(ABILITY_INTELLIGENCE, 10); //Temp for 5 mins
//effect eNarco = EffectSleep(); //Force player to fall asleep randomly for the next 5 mins.
//effect ePuke = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL); //Player pukes
effect eVisAbilityDec = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
//Good Effects
effect eSTRInc = SupernaturalEffect(EffectAbilityIncrease(ABILITY_STRENGTH, 1));
effect eCHAInc = SupernaturalEffect(EffectAbilityIncrease(ABILITY_CHARISMA, 1));
effect eWISInc = SupernaturalEffect(EffectAbilityIncrease(ABILITY_WISDOM, 1));
effect eINTInc = SupernaturalEffect(EffectAbilityIncrease(ABILITY_INTELLIGENCE, 1));
effect eDEXInc = SupernaturalEffect(EffectAbilityIncrease(ABILITY_DEXTERITY, 1));
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
//cleric heal
itemproperty ipEnhanceBonus; //+1 to weapon
effect eTempHP = EffectTemporaryHitpoints(4 + d6());
int iRandGem;
string sRandGemResRef;
effect eVisAbilityInc = EffectVisualEffect(VFX_IMP_ELEMENTAL_PROTECTION);
effect eVisEnhanceWep = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
object oItem;
float fTimer = 0.0;
switch(iEffect){
//Bad effects
case 1:
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlindness, oPC, 10.0);
break;
case 2:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSTRDec, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 3:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCHADec, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 4:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eWISDec, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 5:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eINTDec, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 6:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDEXDec, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 7:
ApplyEffectToObject(DURATION_TYPE_INSTANT, ePosion, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 8:
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eIdiot, oPC, 300.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
case 9:
while(fTimer < 300.0){
DelayCommand(
fTimer,
AssignCommand(oPC, Narcolepsy())
);
fTimer += IntToFloat(30 + Random(120));
}
break;
case 10:
while(fTimer < 300.0){
DelayCommand(
fTimer,
AssignCommand(oPC, Puke())
);
fTimer += IntToFloat(60 + Random(120));
}
break;
// Good effects
case 11:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSTRInc, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityInc, oPC);
break;
case 12:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCHAInc, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityInc, oPC);
break;
case 13:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eWISInc, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityInc, oPC);
break;
case 14:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eINTInc, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityInc, oPC);
break;
case 15:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDEXInc, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityInc, oPC);
break;
case 16:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oPC);
break;
case 17:
ActionCastSpellAtObject(SPELL_GREATER_RESTORATION, oPC, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
break;
case 18:
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
ipEnhanceBonus = ItemPropertyEnhancementBonus(1);
if(GetItemHasItemProperty(oItem, ITEM_PROPERTY_ENHANCEMENT_BONUS)){
itemproperty ipLoop = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ipLoop)){
if(GetItemPropertyType(ipLoop) == ITEM_PROPERTY_ENHANCEMENT_BONUS){
ipEnhanceBonus = ItemPropertyEnhancementBonus(
GetItemPropertyCostTableValue(ipLoop) + 1
);
break;
}
}
}
IPSafeAddItemProperty(
oItem,
ipEnhanceBonus
);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisEnhanceWep, oPC);
break;
case 19:
iRandGem = Random(5);
switch(iRandGem){
case 0:
sRandGemResRef = "nw_it_gem010";
break;
case 1:
sRandGemResRef = "nw_it_gem008";
break;
case 2:
sRandGemResRef = "nw_it_gem006";
break;
case 3:
sRandGemResRef = "nw_it_gem005";
break;
case 4:
sRandGemResRef = "nw_it_gem012";
break;
}
CreateItemOnObject(sRandGemResRef, oPC);
ActionSpeakString("You bite into something hard!");
break;
case 20:
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eTempHP, oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisAbilityDec, oPC);
break;
default:
}
}
void Puke()
{
effect ePuke = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL); //Player pukes
string sPukeTalk = "BBBLLLLAAAARRRRGGGGHHHHH!!!!";
vector vPukeAt = GetChangedPosition(
GetPosition(OBJECT_SELF),
1.0,
GetFacing(OBJECT_SELF)
);
location lPukeAt = Location(GetArea(OBJECT_SELF), vPukeAt, IntToFloat(Random(360)));
ClearAllActions();
ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE);
ActionSpeakString(sPukeTalk);
DelayCommand(
2.0,
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, ePuke, lPukeAt, 1.0)
);
}
void Narcolepsy()
{
effect eNarco = EffectSleep(); //Force player to fall asleep randomly for the next 5 mins.
effect eZzz = EffectVisualEffect(VFX_IMP_SLEEP);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eNarco, OBJECT_SELF, 10.0);
if(GetHasEffect(EFFECT_TYPE_SLEEP, OBJECT_SELF))
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eZzz, OBJECT_SELF, 10.0);
}