273 lines
10 KiB
Plaintext
273 lines
10 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Name Summoning include
|
|
//:: FileName SMP_INC_SUMMON
|
|
//:://////////////////////////////////////////////
|
|
This holds the functions to get the correct summoned monster if random,
|
|
or the restrictions on monsters if in conversations.
|
|
|
|
Not sure what else really...
|
|
|
|
Tips:
|
|
|
|
Uses of the summoning spell
|
|
|
|
* When you are being attacked by a flying/swimming/ethereal/etc.
|
|
creature and you don't fly/swim/go ethereal/etc.
|
|
* When you need an ally immune to X
|
|
* When you need some cannon fodder to slow down the main bad guys/give
|
|
them something else to aim at.
|
|
* When your bad guys are in a location that you can't get to (across a
|
|
chasm)
|
|
* When you want to help your thief FLANK someone.
|
|
* When facing someone that has DR/x and you need a creature capable of
|
|
attacking them without penalty.
|
|
* When someone is using an Anti-Life shell or similar effect (Outsiders...)
|
|
* To set off traps, etc.
|
|
* Distractions/cons
|
|
* Short kamikaze missions.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "SMP_INC_CONSTANT"
|
|
|
|
// SMP_INC_SUMMON. Returns TRUE if alignment should influence what we will summon.
|
|
int SMP_GetIsDivineSpellCastingClass(int nClass);
|
|
|
|
// SMP_INC_SUMMON. Will return the choice for nLevel, or FALSE if invalid.
|
|
int SMP_SummonMonsterGetChoice(int nLevel, object oCaster = OBJECT_SELF);
|
|
|
|
// SMP_INC_SUMMON. Returns a resref for nSummonLevel, and nChoice.
|
|
string SMP_SummonMonsterChoice(int nLevel, int nChoice);
|
|
|
|
// SMP_INC_SUMMON. Returns a resref for a random monster on the level 1 Summon Monster list.
|
|
// Uses alignments, if a cleric, paladin, or druid or ranger, to choose a correctly
|
|
// aligned monster.
|
|
string SMP_SummonMonsterRandom_1(object oCaster = OBJECT_SELF);
|
|
|
|
// SMP_INC_SUMMON. Returns TRUE if alignment should influence what we will summon.
|
|
int SMP_GetIsDivineSpellCastingClass(int nClass)
|
|
{
|
|
// Divine spellcasters
|
|
switch(nClass)
|
|
{
|
|
case CLASS_TYPE_CLERIC:
|
|
case CLASS_TYPE_DRUID:
|
|
case CLASS_TYPE_PALADIN:
|
|
case CLASS_TYPE_RANGER:
|
|
{
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// SMP_INC_SUMMON. Will return the choice for nLevel, or FALSE if invalid.
|
|
int SMP_SummonMonsterGetChoice(int nLevel, object oCaster = OBJECT_SELF)
|
|
{
|
|
// Local set on caster (will move to caster item sometime)
|
|
return GetLocalInt(oCaster, "SMP_SUMMON_MONSTER_CHOICE_" + IntToString(nLevel));
|
|
}
|
|
// SMP_INC_SUMMON. Returns a resref for nSummonLevel, and nChoice.
|
|
string SMP_SummonMonsterChoice(int nLevel, int nChoice)
|
|
{
|
|
// String is SMP_smX_Y, where nLevel is X and Y is nChoice
|
|
return "SMP_sm" + IntToString(nLevel) + "_" + IntToString(nChoice);
|
|
}
|
|
// SMP_INC_SUMMON. Returns a resref for a random monster on the level 1 Summon Monster list.
|
|
// Uses alignments, if a cleric, paladin, or druid or ranger, to choose a correctly
|
|
// aligned monster.
|
|
string SMP_SummonMonsterRandom_1(object oCaster = OBJECT_SELF)
|
|
{
|
|
/* Monsters:
|
|
1st Level
|
|
1 Celestial dog - LG
|
|
2 Celestial owl - LG
|
|
3 Celestial giant fire beetle - NG
|
|
4 Celestial badger - CG
|
|
5 Celestial monkey - CG
|
|
|
|
6 Fiendish dire rat - LE
|
|
7 Fiendish raven - LE
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE
|
|
10 Fiendish hawk - CE
|
|
11 Fiendish monstrous spider, Small - CE
|
|
12 Fiendish snake, Small viper - CE
|
|
|
|
*/
|
|
int nSummon;
|
|
// Does alignment influence it?
|
|
if(SMP_GetIsDivineSpellCastingClass(GetLastSpellCastClass()))
|
|
{
|
|
// Random choice (limited only by alignment)
|
|
int nAlignGoodEvil = GetAlignmentGoodEvil(oCaster);
|
|
int nAlignLawChaos = GetAlignmentLawChaos(oCaster);
|
|
// Netural Good/Evil
|
|
if(nAlignGoodEvil == ALIGNMENT_NEUTRAL)
|
|
{
|
|
// Check law/chaos.
|
|
if(nAlignLawChaos == ALIGNMENT_NEUTRAL)
|
|
{
|
|
// Any choice
|
|
nSummon = Random(12) + 1;
|
|
}
|
|
// Can be any Good/Evil, but must be lawful or chaotic.
|
|
else if(nAlignLawChaos == ALIGNMENT_CHAOTIC)
|
|
{
|
|
// Cannot be lawful, must be chaotic or neutral.
|
|
/* Monsters:
|
|
3 Celestial giant fire beetle - NG
|
|
4 Celestial badger - CG
|
|
5 Celestial monkey - CG
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE
|
|
10 Fiendish hawk - CE
|
|
11 Fiendish monstrous spider, Small - CE
|
|
12 Fiendish snake, Small viper - CE */
|
|
switch(Random(8) + 1)
|
|
{
|
|
case 1: nSummon = 3; break;
|
|
case 2: nSummon = 4; break;
|
|
case 3: nSummon = 5; break;
|
|
case 4: nSummon = 8; break;
|
|
case 5: nSummon = 9; break;
|
|
case 6: nSummon = 10; break;
|
|
case 7: nSummon = 11; break;
|
|
case 8: nSummon = 12; break;
|
|
}
|
|
}
|
|
else //if(nAlignLawChaos == nAlignLawChaos)
|
|
{
|
|
// Cannot be chaotic, must be lawful or neutral.
|
|
/* Monsters:
|
|
1 Celestial dog - LG
|
|
2 Celestial owl - LG
|
|
3 Celestial giant fire beetle - NG
|
|
6 Fiendish dire rat - LE
|
|
7 Fiendish raven - LE
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE */
|
|
switch(Random(7) + 1)
|
|
{
|
|
case 1: nSummon = 1; break;
|
|
case 2: nSummon = 2; break;
|
|
case 3: nSummon = 3; break;
|
|
case 4: nSummon = 6; break;
|
|
case 5: nSummon = 7; break;
|
|
case 6: nSummon = 8; break;
|
|
case 7: nSummon = 9; break;
|
|
}
|
|
}
|
|
}
|
|
else if(nAlignGoodEvil == ALIGNMENT_GOOD)
|
|
{
|
|
// Only non-evil (Good/Neutral) creatures. This means any good ones, unless
|
|
// they are also chaotic ETC.
|
|
if(nAlignLawChaos == ALIGNMENT_NEUTRAL)
|
|
{
|
|
// Any choice which isn't evil
|
|
/* Monsters:
|
|
1 Celestial dog - LG
|
|
2 Celestial owl - LG
|
|
3 Celestial giant fire beetle - NG
|
|
4 Celestial badger - CG
|
|
5 Celestial monkey - CG */
|
|
nSummon = Random(5) + 1;
|
|
}
|
|
if(nAlignLawChaos == ALIGNMENT_CHAOTIC)
|
|
{
|
|
// Cannot be lawful, or evil, must be chaotic or neutral.
|
|
/* Monsters:
|
|
3 Celestial giant fire beetle - NG
|
|
4 Celestial badger - CG
|
|
5 Celestial monkey - CG */
|
|
switch(Random(3) + 1)
|
|
{
|
|
case 1: nSummon = 3; break;
|
|
case 2: nSummon = 4; break;
|
|
case 3: nSummon = 5; break;
|
|
}
|
|
}
|
|
else //if(nLawChoas == ALIGNMENT_LAWFUL)
|
|
{
|
|
// Cannot be chaotic, or evil, must be lawful or neutral.
|
|
/* Monsters:
|
|
1 Celestial dog - LG
|
|
2 Celestial owl - LG
|
|
3 Celestial giant fire beetle - NG */
|
|
switch(Random(3) + 1)
|
|
{
|
|
case 1: nSummon = 1; break;
|
|
case 2: nSummon = 2; break;
|
|
case 3: nSummon = 3; break;
|
|
}
|
|
}
|
|
}
|
|
// Evil
|
|
else //if(nAlignGoodEvil == ALIGNMENT_EVIL)
|
|
{
|
|
// No good summons.
|
|
if(nAlignLawChaos == ALIGNMENT_NEUTRAL)
|
|
{
|
|
// Any choice which isn't good
|
|
/* Monsters:
|
|
6 Fiendish dire rat - LE
|
|
7 Fiendish raven - LE
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE
|
|
10 Fiendish hawk - CE
|
|
11 Fiendish monstrous spider, Small - CE
|
|
12 Fiendish snake, Small viper - CE */
|
|
nSummon = Random(7) + 5; // (6 to 12)
|
|
}
|
|
else if(nAlignLawChaos == ALIGNMENT_CHAOTIC)
|
|
{
|
|
// Cannot be lawful, or good, must be chaotic or neutral.
|
|
/* Monsters:
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE
|
|
10 Fiendish hawk - CE
|
|
11 Fiendish monstrous spider, Small - CE
|
|
12 Fiendish snake, Small viper - CE */
|
|
switch(Random(5) + 1)
|
|
{
|
|
case 1: nSummon = 8; break;
|
|
case 2: nSummon = 9; break;
|
|
case 3: nSummon = 10; break;
|
|
case 4: nSummon = 11; break;
|
|
case 5: nSummon = 12; break;
|
|
}
|
|
}
|
|
else //if(nAlignLawChaos == nAlignLawChaos)
|
|
{
|
|
// Cannot be chaotic, or good, must be lawful or neutral.
|
|
/* Monsters:
|
|
6 Fiendish dire rat - LE
|
|
7 Fiendish raven - LE
|
|
8 Fiendish monstrous centipede, Medium - NE
|
|
9 Fiendish monstrous scorpion, Small - NE */
|
|
switch(Random(4) + 1)
|
|
{
|
|
case 1: nSummon = 6; break;
|
|
case 2: nSummon = 7; break;
|
|
case 3: nSummon = 8; break;
|
|
case 4: nSummon = 9; break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Alignment doesn't matter. Randomise it.
|
|
nSummon = Random(12) + 1;
|
|
}
|
|
// Total resref
|
|
string sResRef = "SMP_sm1_" + IntToString(nSummon);
|
|
|
|
return sResRef;
|
|
}
|
|
|
|
|