Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
234 lines
7.2 KiB
Plaintext
234 lines
7.2 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Name Summon Monster - On Conversation
|
|
//:: FileName SMP_AI_Summ_Conv
|
|
//:://////////////////////////////////////////////
|
|
On Conversation.
|
|
|
|
It will react to shouts sent to it, including Bioware's associate shouts
|
|
for hold ground and so on.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "PHS_AI_INCLUDE"
|
|
|
|
void main()
|
|
{
|
|
// Get who spoke
|
|
object oSelf = OBJECT_SELF;
|
|
object oSpeaker = GetLastSpeaker();
|
|
object oMaster = GetMaster();
|
|
object oTarget;
|
|
int nConversation = GetListenPatternNumber();
|
|
|
|
// Cannot not be the master
|
|
if(oSpeaker != oMaster) return;
|
|
|
|
// Check nConversation's number.
|
|
switch(nConversation)
|
|
{
|
|
// If -1, it is a converastion thing
|
|
case -1:
|
|
{
|
|
if(GetCommandable() == TRUE)
|
|
{
|
|
// Start the conversation
|
|
BeginConversation();
|
|
}
|
|
}
|
|
break;
|
|
// Other things (not -1)
|
|
|
|
// * toggle search mode for henchmen
|
|
case ASSOCIATE_COMMAND_TOGGLESEARCH:
|
|
{
|
|
if(GetActionMode(OBJECT_SELF, ACTION_MODE_DETECT) == TRUE)
|
|
{
|
|
SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, FALSE);
|
|
}
|
|
else
|
|
{
|
|
SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, TRUE);
|
|
}
|
|
}
|
|
break;
|
|
// * toggle stealth mode for henchmen
|
|
case ASSOCIATE_COMMAND_TOGGLESTEALTH:
|
|
{
|
|
if(GetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH) == TRUE)
|
|
{
|
|
SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, FALSE);
|
|
}
|
|
else
|
|
{
|
|
SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, TRUE);
|
|
}
|
|
}
|
|
break;
|
|
// * Stop spellcasting
|
|
case ASSOCIATE_COMMAND_TOGGLECASTING:
|
|
{
|
|
// Use spawn conditions
|
|
if(SMPAI_GetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS))
|
|
{
|
|
SMPAI_SetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS, FALSE);
|
|
}
|
|
else
|
|
{
|
|
SMPAI_SetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS);
|
|
}
|
|
}
|
|
break;
|
|
// Open inventory
|
|
case ASSOCIATE_COMMAND_INVENTORY:
|
|
{
|
|
// Don't open for summons.
|
|
FloatingTextStringOnCreature("Summon's inventory cannot be edited", oMaster, FALSE);
|
|
return;
|
|
}
|
|
break;
|
|
// Pick the nearest lock or bash it.
|
|
case ASSOCIATE_COMMAND_PICKLOCK:
|
|
{
|
|
// Call function "Pick Lock" with the nearest locked door.
|
|
//oTarget =
|
|
|
|
}
|
|
break;
|
|
// Disarm any traps.
|
|
case ASSOCIATE_COMMAND_DISARMTRAP: // Disarm trap
|
|
{
|
|
// Call function "Disarm trap" with no target
|
|
oTarget = GetNearestTrapToObject(oSelf, TRUE);
|
|
|
|
|
|
}
|
|
break;
|
|
// Attack the nearest enemy - force combat!
|
|
case ASSOCIATE_COMMAND_ATTACKNEAREST:
|
|
{
|
|
// Attack our masters target if they are valid.
|
|
oTarget = GetAttackTarget(oMaster);
|
|
if(GetIsObjectValid(oTarget) == TRUE)
|
|
{
|
|
if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE ||
|
|
GetObjectType(oTarget) == OBJECT_TYPE_DOOR)
|
|
{
|
|
ActionAttack(oTarget);
|
|
return;
|
|
}
|
|
}
|
|
// Else normal attack (even if oTarget is invalid, it'll use the nearest).
|
|
SMPAI_SummonAttack(oTarget);
|
|
}
|
|
break;
|
|
// Just move to the master
|
|
case ASSOCIATE_COMMAND_FOLLOWMASTER:
|
|
{
|
|
ClearAllActions();
|
|
ActionForceFollowObject(oMaster, 2.0);
|
|
}
|
|
break;
|
|
// Attack the masters last attacker
|
|
case ASSOCIATE_COMMAND_GUARDMASTER:
|
|
{
|
|
oTarget = GetLastHostileActor(oMaster);
|
|
if(!GetIsObjectValid(oTarget))
|
|
{
|
|
oTarget = GetAttackTarget(oMaster);
|
|
}
|
|
SMPAI_SummonAttack(oTarget);
|
|
}
|
|
break;
|
|
// Heal our master
|
|
case ASSOCIATE_COMMAND_HEALMASTER:
|
|
{
|
|
// Heal the master! Well, only if we can...
|
|
}
|
|
break;
|
|
// Will not guard master or follow.
|
|
case ASSOCIATE_COMMAND_STANDGROUND:
|
|
{
|
|
|
|
}
|
|
break;
|
|
// Next ones are all done by the game engine!
|
|
// Master failed to pick a lock. We can't get what lock was failed, so
|
|
// get nearest locked object to the.
|
|
case ASSOCIATE_COMMAND_MASTERFAILEDLOCKPICK:
|
|
{
|
|
|
|
}
|
|
break;
|
|
// Master saw a trap
|
|
// We can get the trap via. GetLastTrapDetected(oMaster).
|
|
case ASSOCIATE_COMMAND_MASTERSAWTRAP:
|
|
{
|
|
if(!GetIsInCombat())
|
|
{
|
|
// if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND))
|
|
// {
|
|
oTarget = GetLastTrapDetected(oMaster);
|
|
// }
|
|
}
|
|
}
|
|
break;
|
|
// Master under attack
|
|
// We can get the last attacker with GetLastHostileActor().
|
|
case ASSOCIATE_COMMAND_MASTERUNDERATTACK:
|
|
{
|
|
// Start combat if not already in combat
|
|
oTarget = GetLastHostileActor(oMaster);
|
|
if(!GetIsInCombat())
|
|
{
|
|
SMPAI_SummonAttack(oTarget);
|
|
}
|
|
}
|
|
break;
|
|
// Master has attacked someone - we should go into combat.
|
|
// We can get their target using GetAttackTarget().
|
|
case ASSOCIATE_COMMAND_MASTERATTACKEDOTHER:
|
|
{
|
|
// Get the target
|
|
oTarget = GetAttackTarget(oMaster);
|
|
|
|
|
|
}
|
|
break;
|
|
// Master is going to be attacked.
|
|
// We can get who they will be attacked by with GetGoingToBeAttackedBy().
|
|
// Not sure when this is fired.
|
|
case ASSOCIATE_COMMAND_MASTERGOINGTOBEATTACKED:
|
|
{
|
|
//if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND))
|
|
//{
|
|
if(!GetIsInCombat(OBJECT_SELF))
|
|
{
|
|
oTarget = GetGoingToBeAttackedBy(oMaster);
|
|
// April 2003: If my master can see the enemy, then I can too.
|
|
// Potential Side effect : Henchmen may run
|
|
// to stupid places, trying to get an enemy
|
|
if(GetIsObjectValid(oTarget) && GetObjectSeen(oTarget, oMaster))
|
|
{
|
|
ClearAllActions();
|
|
ActionMoveToObject(oTarget, TRUE, 7.0);
|
|
SMPAI_SummonAttack(oTarget);
|
|
}
|
|
}
|
|
//}
|
|
}
|
|
break;
|
|
// We should leave the party.
|
|
// Summons become "unsummoned" and destroy themselves.
|
|
case ASSOCIATE_COMMAND_LEAVEPARTY:
|
|
{
|
|
// Destroy self with nice effect
|
|
// Do nothing for now (might change later, or it might be internal)
|
|
// SMPAI_UnsummonSelf();
|
|
return;
|
|
}
|
|
break;
|
|
// End
|
|
}
|
|
}
|