For example, a 1dx dagger with +Sonic damage and +Negative damage, out of 3 attacks, might return any of the following:
x physical, x sonic, x negative
x physical, x negative
x sonic, x negative
I assume this is because of a lack of delays between each function, and perhaps I should be using structs instead.
// -----------------------------------------------------------------------------//
// OnEquipped script that records data about the currently equipped weapon's damage.
// Deals damage info on oPC in slot nSlot.
// slot 0 is the base damage, while slots 1+ are from item properties.
//
// nType is the code from baseitems.2da for slot 0, and an IP_CONST_DAMAGETYPE_*
// constant otherwise.
// nDice is the number of dice rolled.
// nSides is the number of sides of the dice rolled.
// Inflicts all damage found on the item to the target, modified by nDamageModifier.
void DealDamage(int IsBaseDamage, object oPC, object oTarget, int nDamageType, int nNumberOfDie, int nDamagePerDie, int nDamageModifier, int nAddedDamage);
void DealDamage(int IsBaseDamage, object oPC, object oTarget, int nDamageType, int nNumberOfDie, int nDamagePerDie, int nDamageModifier, int nAddedDamage)
{
// If it's flat damage, make sure it's flat, otherwise XdX.
int nBaseDamage, nTotalDamage;
if (nNumberOfDie >= 1)
{
nBaseDamage = nNumberOfDie*Random(nDamagePerDie+1);
}
else
{
nBaseDamage = 1*nDamagePerDie;
}
// Final calculations.
if (IsBaseDamage = 1)
{
nTotalDamage = (nBaseDamage * nDamageModifier) + nAddedDamage;
}
else if (IsBaseDamage = 0)
{
nTotalDamage = nBaseDamage;
}
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nTotalDamage, nDamageType), oTarget));
}
// Deals damage info on oPC about any item properties oWeapon may have.
void GetWeaponBonusDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage);
void GetWeaponBonusDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage)
{
int nType, nDice, nSides, nCost; // Set and used in the loop.
// Loop through the item properties.
itemproperty iProp = GetFirstItemProperty(oWeapon);
while (GetIsItemPropertyValid(iProp) )
{
// Look for damage bonuses.
if (GetItemPropertyType(iProp) == ITEM_PROPERTY_DAMAGE_BONUS)
{
// Get info about the damage bonus.
nCost = GetItemPropertyCostTableValue(iProp);
nType = GetItemPropertySubType(iProp);
nDice = StringToInt(Get2DAString("iprp_damagecost", "NumDice", nCost));
nSides = StringToInt(Get2DAString("iprp_damagecost", "Die", nCost));
switch(nType) // Convert it into a correctly usable damage type.
{
case 0: nType = DAMAGE_TYPE_BLUDGEONING; break;// Bludgeoning
case 1: nType = DAMAGE_TYPE_PIERCING; break;// Piercing
case 2: nType = DAMAGE_TYPE_SLASHING; break;// Slashing
case 3: nType = DAMAGE_TYPE_BLUDGEONING; break;// Unused subdual,
//convert to Bludgeoning
case 4: nType = DAMAGE_TYPE_BLUDGEONING; break;// Unused physical,
//convert to Bludgeoning
case 5: nType = DAMAGE_TYPE_MAGICAL; break;// Magical
case 6: nType = DAMAGE_TYPE_ACID; break;// Acid
case 7: nType = DAMAGE_TYPE_COLD; break;// Cold
case 8: nType = DAMAGE_TYPE_DIVINE; break;// Divine
case 9: nType = DAMAGE_TYPE_ELECTRICAL; break;// Electrical
case 10: nType = DAMAGE_TYPE_FIRE; break;// Fire
case 11: nType = DAMAGE_TYPE_NEGATIVE; break;// Negative
case 12: nType = DAMAGE_TYPE_POSITIVE; break;// Positive
case 13: nType = DAMAGE_TYPE_SONIC; break;// Sonic
}
// Record this info.
DealDamage(0, oPC, oTarget, nType, nDice, nSides, nDamageModifier, nAddedDamage);
}
// Update the loop.
iProp = GetNextItemProperty(oWeapon);
}
}
// Deals damage info about oWeapon on oPC.
void GetWeaponBaseDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage);
void GetWeaponBaseDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage)
{
// Get the info from the .2da file.
int nBaseItem = GetBaseItemType(oWeapon);
int nType = StringToInt(Get2DAString("baseitems", "WeaponType", nBaseItem));
int nDice = StringToInt(Get2DAString("baseitems", "NumDice", nBaseItem));
int nSides = StringToInt(Get2DAString("baseitems", "DieToRoll", nBaseItem));
// Convert it into a correctly usable damage type.
switch(nType)
{
case 0: nType = DAMAGE_TYPE_PIERCING; break;// Piercing
case 1: nType = DAMAGE_TYPE_PIERCING; break;// Piercing
case 2: nType = DAMAGE_TYPE_BLUDGEONING; break;// Bludgeoning
case 3: nType = DAMAGE_TYPE_SLASHING; break;// Slashing
case 4: nType = DAMAGE_TYPE_PIERCING; break;// Piercing+Slashing - Disabled
case 5: nType = DAMAGE_TYPE_BLUDGEONING; break;// Bludgeoning+Piercing - Disabled
}
// Deal the info.
DealDamage(1, oPC, oTarget, nType, nDice, nSides, nDamageModifier, nAddedDamage);
GetWeaponBonusDamage(oPC, oTarget, oWeapon, nDamageModifier, nAddedDamage);
}
// Deals damage info to oTarget from oPC about any item properties oWeapon may have.
void CalculateDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage);
void CalculateDamage(object oPC, object oTarget, object oWeapon, int nDamageModifier, int nAddedDamage)
{
GetWeaponBaseDamage(oPC, oTarget, oWeapon, nDamageModifier, nAddedDamage);
}
//void main(){}
Modifié par Rubies, 08 mai 2011 - 05:03 .





Retour en haut







