107 lines
4.2 KiB
Plaintext
107 lines
4.2 KiB
Plaintext
#include "x2_inc_itemprop"
|
|
#include "inc_baseitem"
|
|
|
|
object ArenaSummon(string sTemplate)
|
|
{
|
|
// do the summon
|
|
object oOrb = GetObjectByTag("CS_ORBSUMMON");
|
|
object oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTemplate, GetLocation(GetObjectByTag("WP_ARENASUMMON")));
|
|
SendMessageToPC(GetPCSpeaker(), "Summoned " + GetName(oCreature) + ".");
|
|
|
|
//visual effects
|
|
location lOrbLocation = GetLocation(oOrb);
|
|
effect eOrbEffect = EffectVisualEffect(VFX_FNF_DISPEL);
|
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eOrbEffect, lOrbLocation, 0.5);
|
|
|
|
location lCreatureLocation = GetLocation(oCreature);
|
|
effect eCreatureEffect = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
|
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eCreatureEffect, lCreatureLocation, 1.0);
|
|
|
|
return oCreature;
|
|
}
|
|
|
|
int RandomDamageType()
|
|
{
|
|
//pick a random damage type
|
|
int iDamageType;
|
|
int iSwitch = Random(6);
|
|
if (iSwitch == 0) iDamageType = IP_CONST_DAMAGETYPE_ACID;
|
|
if (iSwitch == 1) iDamageType = IP_CONST_DAMAGETYPE_COLD;
|
|
if (iSwitch == 2) iDamageType = IP_CONST_DAMAGETYPE_ELECTRICAL;
|
|
if (iSwitch == 3) iDamageType = IP_CONST_DAMAGETYPE_FIRE;
|
|
if (iSwitch == 4) iDamageType = IP_CONST_DAMAGETYPE_MAGICAL;
|
|
if (iSwitch == 5) iDamageType = IP_CONST_DAMAGETYPE_SONIC;
|
|
return iDamageType;
|
|
}
|
|
|
|
void EquipNPC(object oNPC, int iLevel)
|
|
//assigns equipment to NPC based on level
|
|
{
|
|
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC);
|
|
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC);
|
|
object oOffHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC);
|
|
|
|
int iWeaponBonus = iLevel/3;
|
|
if (iWeaponBonus > 12) iWeaponBonus = 12;
|
|
int iArmorBonus = (iLevel+2)/4;
|
|
int iOffhandBonus = iLevel/4;
|
|
|
|
int iDamageType = RandomDamageType();
|
|
|
|
//apply main weapon bonuses
|
|
IPSafeAddItemProperty(oWeapon, ItemPropertyAttackBonus(iWeaponBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
if (isMelee(oWeapon))
|
|
IPSafeAddItemProperty(oWeapon, ItemPropertyDamageBonus(iDamageType, iWeaponBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
else
|
|
{
|
|
object oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oNPC);
|
|
if (GetObjectType(oAmmo)!= OBJECT_TYPE_INVALID)
|
|
IPSafeAddItemProperty(oAmmo, ItemPropertyDamageBonus(iDamageType, iWeaponBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oNPC);
|
|
if (GetObjectType(oAmmo)!= OBJECT_TYPE_INVALID)
|
|
IPSafeAddItemProperty(oAmmo, ItemPropertyDamageBonus(iDamageType, iWeaponBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oNPC);
|
|
if (GetObjectType(oAmmo)!= OBJECT_TYPE_INVALID)
|
|
IPSafeAddItemProperty(oAmmo, ItemPropertyDamageBonus(iDamageType, iWeaponBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
}
|
|
|
|
//apply armor bonus
|
|
IPSafeAddItemProperty(oArmor, ItemPropertyACBonus(iArmorBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
|
|
//apply shield or offhand weapon bonus
|
|
if (GetObjectType(oOffHand)!= OBJECT_TYPE_INVALID)
|
|
{
|
|
if (isArmor(oOffHand))
|
|
IPSafeAddItemProperty(oOffHand, ItemPropertyACBonus(iOffhandBonus), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
|
|
if (isMelee(oOffHand))
|
|
IPSetWeaponEnhancementBonus(oOffHand, iOffhandBonus);
|
|
}
|
|
|
|
//AssignCommand(oNPC, SpeakString("Weapon bonus = " + IntToString(iWeaponBonus), TALKVOLUME_SHOUT));
|
|
//AssignCommand(oNPC, SpeakString("Armor bonus = " + IntToString(iArmorBonus), TALKVOLUME_SHOUT));
|
|
//AssignCommand(oNPC, SpeakString("Offhand bonus = " + IntToString(iOffhandBonus), TALKVOLUME_SHOUT));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
object oCreature = ArenaSummon("cs1_fighter");
|
|
int iPCLevel = GetLevelByPosition(1, oPC) + GetLevelByPosition(2, oPC) + GetLevelByPosition(3, oPC);
|
|
int iLevelUp = 1;
|
|
|
|
while (iLevelUp < iPCLevel)
|
|
{
|
|
iLevelUp = LevelUpHenchman(oCreature, CLASS_TYPE_FIGHTER, TRUE);
|
|
}
|
|
|
|
EquipNPC(oCreature, iLevelUp);
|
|
|
|
SendMessageToPC(oPC, GetName(oCreature) + "'s level = " + IntToString(iLevelUp));
|
|
}
|
|
|
|
|
|
|
|
|