309 lines
11 KiB
C++
309 lines
11 KiB
C++
#include "PapyrusSpell.h"
|
|
|
|
#include "GameObjects.h"
|
|
#include "GameReferences.h"
|
|
|
|
namespace papyrusSpell
|
|
{
|
|
float GetCastTime(SpellItem* thisSpell)
|
|
{
|
|
return (thisSpell) ? thisSpell->data.castTime : 0.0;
|
|
}
|
|
|
|
BGSPerk* GetPerk(SpellItem* thisSpell)
|
|
{
|
|
return (thisSpell) ? thisSpell->data.spellPerk : NULL;
|
|
}
|
|
|
|
UInt32 GetNumEffects(SpellItem* thisMagic)
|
|
{ return magicItemUtils::GetNumEffects(thisMagic); }
|
|
|
|
float GetNthEffectMagnitude(SpellItem* thisMagic, UInt32 index)
|
|
{ return magicItemUtils::GetNthEffectMagnitude(thisMagic, index); }
|
|
|
|
UInt32 GetNthEffectArea(SpellItem* thisMagic, UInt32 index)
|
|
{ return magicItemUtils::GetNthEffectArea(thisMagic, index); }
|
|
|
|
UInt32 GetNthEffectDuration(SpellItem* thisMagic, UInt32 index)
|
|
{ return magicItemUtils::GetNthEffectDuration(thisMagic, index); }
|
|
|
|
EffectSetting* GetNthEffectMagicEffect(SpellItem* thisMagic, UInt32 index)
|
|
{ return magicItemUtils::GetNthEffectMagicEffect(thisMagic, index); }
|
|
|
|
UInt32 GetCostliestEffectIndex(SpellItem* thisMagic)
|
|
{ return magicItemUtils::GetCostliestEffectIndex(thisMagic); }
|
|
|
|
UInt32 GetMagickaCost(SpellItem* thisSpell)
|
|
{
|
|
return thisSpell ? thisSpell->GetMagickaCost() : 0;
|
|
}
|
|
|
|
UInt32 GetEffectiveMagickaCost(SpellItem* thisSpell, Character* caster)
|
|
{
|
|
return thisSpell ? CALL_MEMBER_FN(thisSpell,GetEffectiveMagickaCost)(caster) : 0;
|
|
}
|
|
|
|
void SetNthEffectMagnitude(SpellItem* thisMagic, UInt32 index, float value)
|
|
{ magicItemUtils::SetNthEffectMagnitude(thisMagic, index, value); }
|
|
|
|
void SetNthEffectArea(SpellItem* thisMagic, UInt32 index, UInt32 value)
|
|
{ magicItemUtils::SetNthEffectArea(thisMagic, index, value); }
|
|
|
|
void SetNthEffectDuration(SpellItem* thisMagic, UInt32 index, UInt32 value)
|
|
{ magicItemUtils::SetNthEffectDuration(thisMagic, index, value); }
|
|
|
|
BGSEquipSlot * GetEquipType(SpellItem* thisMagic)
|
|
{
|
|
if (thisMagic) {
|
|
return thisMagic->equipType.GetEquipSlot();
|
|
}
|
|
|
|
// Invalid EquipSlot
|
|
return NULL;
|
|
}
|
|
|
|
void SetEquipType(SpellItem* thisMagic, BGSEquipSlot * slot)
|
|
{
|
|
if (thisMagic && slot) {
|
|
thisMagic->equipType.SetEquipSlot(slot);
|
|
}
|
|
}
|
|
|
|
VMResultArray<float> GetEffectMagnitudes(SpellItem* thisMagic) { return magicItemUtils::GetEffectMagnitudes(thisMagic); }
|
|
VMResultArray<UInt32> GetEffectAreas(SpellItem* thisMagic) { return magicItemUtils::GetEffectAreas(thisMagic); }
|
|
VMResultArray<UInt32> GetEffectDurations(SpellItem* thisMagic) { return magicItemUtils::GetEffectDurations(thisMagic); }
|
|
VMResultArray<EffectSetting*> GetMagicEffects(SpellItem* thisMagic) { return magicItemUtils::GetMagicEffects(thisMagic); }
|
|
}
|
|
|
|
namespace magicItemUtils
|
|
{
|
|
UInt32 GetNumEffects(MagicItem* thisMagic)
|
|
{
|
|
return thisMagic ? thisMagic->effectItemList.count : 0;
|
|
}
|
|
|
|
float GetNthEffectMagnitude(MagicItem* thisMagic, UInt32 index)
|
|
{
|
|
if (!thisMagic)
|
|
return 0.0;
|
|
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
return (pEI) ? pEI->magnitude : 0.0;
|
|
}
|
|
|
|
UInt32 GetNthEffectArea(MagicItem* thisMagic, UInt32 index)
|
|
{
|
|
if (!thisMagic)
|
|
return 0;
|
|
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
return (pEI) ? pEI->area : 0;
|
|
}
|
|
|
|
UInt32 GetNthEffectDuration(MagicItem* thisMagic, UInt32 index)
|
|
{
|
|
if (!thisMagic)
|
|
return 0;
|
|
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
return (pEI) ? pEI->duration : 0;
|
|
}
|
|
|
|
EffectSetting* GetNthEffectMagicEffect(MagicItem* thisMagic, UInt32 index)
|
|
{
|
|
if (!thisMagic)
|
|
return NULL;
|
|
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
return (pEI) ? pEI->mgef : NULL;
|
|
}
|
|
|
|
void SetNthEffectMagnitude(MagicItem* thisMagic, UInt32 index, float value)
|
|
{
|
|
if(thisMagic)
|
|
{
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
if(pEI)
|
|
pEI->magnitude = value;
|
|
}
|
|
}
|
|
|
|
void SetNthEffectArea(MagicItem* thisMagic, UInt32 index, UInt32 value)
|
|
{
|
|
if (thisMagic) {
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
if(pEI)
|
|
pEI->area = value;
|
|
}
|
|
}
|
|
|
|
void SetNthEffectDuration(MagicItem* thisMagic, UInt32 index, UInt32 value)
|
|
{
|
|
if (thisMagic) {
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(index, pEI);
|
|
if(pEI)
|
|
pEI->duration = value;
|
|
}
|
|
}
|
|
|
|
UInt32 GetCostliestEffectIndex(MagicItem* thisMagic)
|
|
{
|
|
if (!thisMagic)
|
|
return 0;
|
|
|
|
MagicItem::EffectItem * pEI = CALL_MEMBER_FN(thisMagic, GetCostliestEffectItem)(5, false);
|
|
return pEI ? thisMagic->effectItemList.GetItemIndex(pEI) : 0;
|
|
}
|
|
|
|
VMResultArray<float> GetEffectMagnitudes(MagicItem* thisMagic)
|
|
{
|
|
VMResultArray<float> result;
|
|
for(UInt32 i = 0; i < thisMagic->effectItemList.count; i++)
|
|
{
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(i, pEI);
|
|
if(pEI)
|
|
result.push_back(pEI->magnitude);
|
|
else
|
|
result.push_back(0.0f);
|
|
}
|
|
return result;
|
|
}
|
|
VMResultArray<UInt32> GetEffectAreas(MagicItem* thisMagic)
|
|
{
|
|
VMResultArray<UInt32> result;
|
|
for(UInt32 i = 0; i < thisMagic->effectItemList.count; i++)
|
|
{
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(i, pEI);
|
|
if(pEI)
|
|
result.push_back(pEI->area);
|
|
else
|
|
result.push_back(0);
|
|
}
|
|
return result;
|
|
}
|
|
VMResultArray<UInt32> GetEffectDurations(MagicItem* thisMagic)
|
|
{
|
|
VMResultArray<UInt32> result;
|
|
for(UInt32 i = 0; i < thisMagic->effectItemList.count; i++)
|
|
{
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(i, pEI);
|
|
if(pEI)
|
|
result.push_back(pEI->duration);
|
|
else
|
|
result.push_back(0);
|
|
}
|
|
return result;
|
|
}
|
|
VMResultArray<EffectSetting*> GetMagicEffects(MagicItem* thisMagic)
|
|
{
|
|
VMResultArray<EffectSetting*> result;
|
|
for(UInt32 i = 0; i < thisMagic->effectItemList.count; i++)
|
|
{
|
|
MagicItem::EffectItem* pEI = NULL;
|
|
thisMagic->effectItemList.GetNthItem(i, pEI);
|
|
if(pEI)
|
|
result.push_back(pEI->mgef);
|
|
else
|
|
result.push_back(NULL);
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
#include "PapyrusVM.h"
|
|
#include "PapyrusNativeFunctions.h"
|
|
|
|
void papyrusSpell::RegisterFuncs(VMClassRegistry* registry)
|
|
{
|
|
registry->RegisterFunction(
|
|
new NativeFunction0<SpellItem, float>("GetCastTime", "Spell", papyrusSpell::GetCastTime, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0<SpellItem, BGSPerk*>("GetPerk", "Spell", papyrusSpell::GetPerk, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0<SpellItem, UInt32>("GetNumEffects", "Spell", papyrusSpell::GetNumEffects, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1<SpellItem, float, UInt32>("GetNthEffectMagnitude", "Spell", papyrusSpell::GetNthEffectMagnitude, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1<SpellItem, UInt32, UInt32>("GetNthEffectArea", "Spell", papyrusSpell::GetNthEffectArea, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1<SpellItem, UInt32, UInt32>("GetNthEffectDuration", "Spell", papyrusSpell::GetNthEffectDuration, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1<SpellItem, EffectSetting*, UInt32>("GetNthEffectMagicEffect", "Spell", papyrusSpell::GetNthEffectMagicEffect, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0<SpellItem, UInt32>("GetCostliestEffectIndex", "Spell", papyrusSpell::GetCostliestEffectIndex, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0<SpellItem, UInt32>("GetMagickaCost", "Spell", papyrusSpell::GetMagickaCost, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1<SpellItem, UInt32, Character*>("GetEffectiveMagickaCost", "Spell", papyrusSpell::GetEffectiveMagickaCost, registry));
|
|
|
|
// Sets
|
|
registry->RegisterFunction(
|
|
new NativeFunction2<SpellItem, void, UInt32, float>("SetNthEffectMagnitude", "Spell", papyrusSpell::SetNthEffectMagnitude, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction2<SpellItem, void, UInt32, UInt32>("SetNthEffectArea", "Spell", papyrusSpell::SetNthEffectArea, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction2<SpellItem, void, UInt32, UInt32>("SetNthEffectDuration", "Spell", papyrusSpell::SetNthEffectDuration, registry));
|
|
|
|
// EquipType
|
|
registry->RegisterFunction(
|
|
new NativeFunction0 <SpellItem, BGSEquipSlot*>("GetEquipType", "Spell", papyrusSpell::GetEquipType, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction1 <SpellItem, void, BGSEquipSlot*>("SetEquipType", "Spell", papyrusSpell::SetEquipType, registry));
|
|
|
|
// Array gets
|
|
registry->RegisterFunction(
|
|
new NativeFunction0 <SpellItem, VMResultArray<float>>("GetEffectMagnitudes", "Spell", papyrusSpell::GetEffectMagnitudes, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0 <SpellItem, VMResultArray<UInt32>>("GetEffectAreas", "Spell", papyrusSpell::GetEffectAreas, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0 <SpellItem, VMResultArray<UInt32>>("GetEffectDurations", "Spell", papyrusSpell::GetEffectDurations, registry));
|
|
|
|
registry->RegisterFunction(
|
|
new NativeFunction0 <SpellItem, VMResultArray<EffectSetting*>>("GetMagicEffects", "Spell", papyrusSpell::GetMagicEffects, registry));
|
|
|
|
registry->SetFunctionFlags("Spell", "GetCastTime", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetPerk", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetNumEffects", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetNthEffectMagnitude", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetNthEffectArea", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetNthEffectDuration", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetNthEffectMagicEffect", VMClassRegistry::kFunctionFlag_NoWait);
|
|
// registry->SetFunctionFlags("Spell", "GetCostliestEffectIndex", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetMagickaCost", VMClassRegistry::kFunctionFlag_NoWait);
|
|
// registry->SetFunctionFlags("Spell", "GetEffectiveMagickaCost", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetEquipType", VMClassRegistry::kFunctionFlag_NoWait);
|
|
|
|
registry->SetFunctionFlags("Spell", "SetNthEffectMagnitude", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "SetNthEffectArea", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "SetNthEffectDuration", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "SetEquipType", VMClassRegistry::kFunctionFlag_NoWait);
|
|
|
|
registry->SetFunctionFlags("Spell", "GetEffectMagnitudes", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetEffectAreas", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetEffectDurations", VMClassRegistry::kFunctionFlag_NoWait);
|
|
registry->SetFunctionFlags("Spell", "GetMagicEffects", VMClassRegistry::kFunctionFlag_NoWait);
|
|
} |