Updated AMS marker feats

Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
This commit is contained in:
Jaysyn904
2024-02-11 14:01:05 -05:00
parent 618cd42b82
commit 6ec137a24e
24762 changed files with 1528530 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
*S* signifies a Sanctified spell. These need
to have special colored icons; something that
portrays their exalted nature. Maybe something
using gold, white, light blue or something. A
possible example if you want to use it can
be found here:
http://i27.photobucket.com/albums/c171/Tenjac/exalted14ge.gif
If you like that coloration, that's fine. If
you would like to try to come up with something
better, go for it. Up to you :P Thanks for
helping us out with this, also. :D
Amber Sarcophagus
Ayailla's Radiant Burst *S*
Blinding Glory
Bolt of Glory
Brilliant Emanation *S*
Call Faithful Servants (lantern archons only)
Celestion Blood
Chaav's Laugh
Convert Wand
Dancing Web
Diamond Spray *S*
Divine Inspiration *S*
Divine Sacrifice
Dragon Cloud *S*
Energize Potion
Exalted Fury *S*
Exalted Raiment *S*
Eyes of the Avoral
Hammer of Righteousness *S*
Lantern Light
Last Judgement
Leonal's Roar
Luminous Armor *S*
Luminous Armor, Greater *S*
Phoenix Fire *S*
Rain of Black Tulips
Rain of Embers *S*
Rain of Roses
Ray of Hope
Righteous Smite
Sicken Evil *S*
Starmantle
Storm of Shards *S*
Sunmantle *S*
Tomb of Light
Twilight Luck *S*

View File

@@ -0,0 +1,88 @@
{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f91\froman\fcharset238\fprq2 Times New Roman CE;}{\f92\froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f94\froman\fcharset161\fprq2 Times New Roman Greek;}{\f95\froman\fcharset162\fprq2 Times New Roman Tur;}{\f96\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f97\froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f98\froman\fcharset186\fprq2 Times New Roman Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0
\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{
\s2\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s3\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel2\rin0\lin0\itap0
\b\fs28\ul\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs10 \additive Default Paragraph Font;}}{\info{\author Bob}{\operator Bob}{\creatim\yr2006\mo7\dy14\hr10\min49}{\revtim\yr2006\mo7\dy14\hr11\min7}{\version4}
{\edmins18}{\nofpages2}{\nofwords180}{\nofchars1029}{\nofcharsws1263}{\vern8247}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3
\jcompress\viewkind4\viewscale100\nolnhtadjtbl \fet0\sectd \linex0\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang
{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7
\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain
\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\ul Corrupt Spells}{ \endash
These are special spells that we would like to have a different color icon. Something evil but not bright red... perhaps a really dark blood red.
\par
\par Absorb Strength
\par Apocalypse From the Sky
\par Claws of the Bebelith
\par Death by Thorns \line Evil Weather
\par Fangs of the Vampire King
\par Lahm's Finger Darts
\par Power Leech
\par Rapture of Rupture
\par Red Fester
\par Rotting Curse of Urfestra
\par Seething Eyebane
\par Touch of Juiblex
\par
\par }\pard\plain \s3\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel2\rin0\lin0\itap0 \b\fs28\ul\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\fs24 Standard Spells
\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {Abberate
\par Abyssal Might
\par Addiction
\par Angry Ache
\par Bestow Wound
\par Bodak Birth
\par Bone Blade
\par Boneblast
\par Call Dretch Horde
\par Call Lemure Horde
\par Claws of the Savage
\par Cloud of the Achaierai
\par Clutch of Orcus
\par Curse of the Putrid Husk
\par Damning Darkness
\par Demoncall
\par Demonflesh
\par Despoil\page Devil's Ego
\par Devil's Eye
\par Devil's Tail
\par Dread Word
\par Drug Resistance
\par Eternity of Torture
\par Evil Eye
\par Extract Drug
\par Eye of the Beholder
\par Fiendish Clarity
\par Flesh Armor
\par Flesh Ripper
\par Grim Revenge
\par Gutwrench
\par Heartache
\par Heartclutch
\par Hellfire
\par Hellfire Storm
\par Hell's Power
\par Liquid Pain
\par Morality Undone
\par Reality Blind
\par Resonating Resistance
\par Shriveling
\par Song of Festering Death
\par Sorrow
\par Spores of the Vrock
\par Stop Heart
\par Stunning Screech
\par Thousand Needles
\par Tongue of Baalzebul
\par Unheavened
\par Unliving Weapon
\par Unnerving Gaze
\par Utterdark
\par Wave of Grief
\par Wave of Pain
\par Whirlwind of Teeth
\par Wrack
\par Wretched Blight
\par
\par
\par }}

Binary file not shown.

View File

@@ -0,0 +1,578 @@
/*
forge_conv
Dynamic conversation file for forge, modified from
psi_powconv, borrowed from prc_ccc
By: Flaming_Sword
Created: January 2, 2006
Modified: January 12, 2006
LIMITATIONS:
ITEM_PROPERTY_BONUS_FEAT
not all feats available, anything much higher killed the game
some of the feats added can be silly (blame the 2das)
IPRP_SPELLS
anything involving this 2da file can only use the bioware spells
since anything much higher produced TMIs
Not all item properties have returning functions
Needs updating if item property 2da files increase in size
USE:
Place this script in the OnUsed event of a placable object
Placeable must be plot, have inventory, locked
CHECK:
89 properties with constants, 15 without
*/
#include "forge_include"
#include "inc_dynconv"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
//const int STAGE_ = ;
const int STAGE_START = 0;
const int STAGE_SELECT_ITEM = 1;
const int STAGE_SELECT_TYPE = 2;
const int STAGE_SELECT_SUBTYPE = 3;
const int STAGE_SELECT_COSTTABLEVALUE = 4;
const int STAGE_SELECT_PARAM1VALUE = 5;
const int STAGE_CONFIRM = 6;
//const int CHOICE_ = ;
const int CHOICE_FORGE = 20001;
const int CHOICE_BOOST = 20002;
const int CHOICE_BACK = 20003;
const int CHOICE_CLEAR = 20004;
const int CHOICE_CONFIRM = 20005;
const int CHOICE_SETNAME = 20006;
//const int NUM_MAX_COSTTABLEVALUES = 70;
//const int NUM_MAX_PARAM1VALUES = 70;
const int HAS_SUBTYPE = 1;
const int HAS_COSTTABLE = 2;
const int HAS_PARAM1 = 4;
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const int SORT = TRUE; // If the sorting takes too much CPU, set to FALSE
const int DEBUG_LIST = FALSE;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void PrintList(object oPC)
{
string tp = "Printing list:\n";
string s = GetLocalString(oPC, "ForgeConvo_List_Head");
if(s == ""){
tp += "Empty\n";
}
else{
tp += s + "\n";
s = GetLocalString(oPC, "ForgeConvo_List_Next_" + s);
while(s != ""){
tp += "=> " + s + "\n";
s = GetLocalString(oPC, "ForgeConvo_List_Next_" + s);
}
}
DoDebug(tp);
}
/**
* Creates a linked list of entries that is sorted into alphabetical order
* as it is built.
* Assumption: Power names are unique.
*
* @param oPC The storage object aka whomever is gaining powers in this conversation
* @param sChoice The choice string
* @param nChoice The choice value
*/
void AddToTempList(object oPC, string sChoice, int nChoice)
{
if(DEBUG_LIST) DoDebug("\nAdding to temp list: '" + sChoice + "' - " + IntToString(nChoice));
if(DEBUG_LIST) PrintList(oPC);
// If there is nothing yet
if(!GetLocalInt(oPC, "ForgeConvo_ListInited"))
{
SetLocalString(oPC, "ForgeConvo_List_Head", sChoice);
SetLocalInt(oPC, "ForgeConvo_List_" + sChoice, nChoice);
SetLocalInt(oPC, "ForgeConvo_ListInited", TRUE);
}
else
{
// Find the location to instert into
string sPrev = "", sNext = GetLocalString(oPC, "ForgeConvo_List_Head");
while(sNext != "" && StringCompare(sChoice, sNext) >= 0)
{
if(DEBUG_LIST) DoDebug("Comparison between '" + sChoice + "' and '" + sNext + "' = " + IntToString(StringCompare(sChoice, sNext)));
sPrev = sNext;
sNext = GetLocalString(oPC, "ForgeConvo_List_Next_" + sNext);
}
// Insert the new entry
// Does it replace the head?
if(sPrev == "")
{
if(DEBUG_LIST) DoDebug("New head");
SetLocalString(oPC, "ForgeConvo_List_Head", sChoice);
}
else
{
if(DEBUG_LIST) DoDebug("Inserting into position between '" + sPrev + "' and '" + sNext + "'");
SetLocalString(oPC, "ForgeConvo_List_Next_" + sPrev, sChoice);
}
SetLocalString(oPC, "ForgeConvo_List_Next_" + sChoice, sNext);
SetLocalInt(oPC, "ForgeConvo_List_" + sChoice, nChoice);
}
}
/**
* Reads the linked list built with AddToTempList() to AddChoice() and
* deletes it.
*
* @param oPC A PC gaining powers at the moment
*/
void TransferTempList(object oPC)
{
string sChoice = GetLocalString(oPC, "ForgeConvo_List_Head");
int nChoice = GetLocalInt (oPC, "ForgeConvo_List_" + sChoice);
DeleteLocalString(oPC, "ForgeConvo_List_Head");
string sPrev;
if(DEBUG_LIST) DoDebug("Head is: '" + sChoice + "' - " + IntToString(nChoice));
while(sChoice != "")
{
// Add the choice
AddChoice(sChoice, nChoice, oPC);
// Get next
sChoice = GetLocalString(oPC, "ForgeConvo_List_Next_" + (sPrev = sChoice));
nChoice = GetLocalInt (oPC, "ForgeConvo_List_" + sChoice);
if(DEBUG_LIST) DoDebug("Next is: '" + sChoice + "' - " + IntToString(nChoice) + "; previous = '" + sPrev + "'");
// Delete the already handled data
DeleteLocalString(oPC, "ForgeConvo_List_Next_" + sPrev);
DeleteLocalInt (oPC, "ForgeConvo_List_" + sPrev);
}
DeleteLocalInt(oPC, "ForgeConvo_ListInited");
}
//Returns the next conversation stage according
// to item property
int GetNextItemPropStage(int nStage, object oPC, int nPropList)
{
nStage++;
if(nStage == STAGE_SELECT_SUBTYPE && !(nPropList & HAS_SUBTYPE))
nStage++;
if(nStage == STAGE_SELECT_COSTTABLEVALUE && !(nPropList & HAS_COSTTABLE))
nStage++;
if(nStage == STAGE_SELECT_PARAM1VALUE && !(nPropList & HAS_PARAM1))
nStage++;
MarkStageNotSetUp(nStage, oPC);
return nStage;
}
//Returns the previous conversation stage according
// to item property
int GetPrevItemPropStage(int nStage, object oPC, int nPropList)
{
nStage--;
if(nStage == STAGE_SELECT_PARAM1VALUE && !(nPropList & HAS_PARAM1))
nStage--;
if(nStage == STAGE_SELECT_COSTTABLEVALUE && !(nPropList & HAS_COSTTABLE))
nStage--;
if(nStage == STAGE_SELECT_SUBTYPE && !(nPropList & HAS_SUBTYPE))
nStage--;
MarkStageNotSetUp(nStage, oPC);
return nStage;
}
//Adds names to a list based on sTable (2da), delayed recursion
// to avoid TMI
void PopulateList(object oPC, int MaxValue, int bSort, string sTable, int nStage, int nBase, int i = 0)
{
if(GetLocalInt(oPC, "DynConv_Waiting") == FALSE)
return;
int bValid = TRUE;
string sTemp = "";
if(i < MaxValue)
{
if(nStage == STAGE_SELECT_TYPE) bValid = ValidProperty(nBase, i);
sTemp = Get2DACache(sTable, "Name", i);
if((sTemp != "") && bValid)//this is going to kill
{
if(bSort) AddToTempList(oPC, ActionString(GetStringByStrRef(StringToInt(sTemp))), i);
else AddChoice(ActionString(GetStringByStrRef(StringToInt(sTemp))), i, oPC);
}
if(!(i % 100) && i) //i != 0, i % 100 == 0
FloatingTextStringOnCreature("*Tick*", oPC, FALSE);
}
else
{
if(bSort) TransferTempList(oPC);
DeleteLocalInt(oPC, "DynConv_Waiting");
FloatingTextStringOnCreature("*Done*", oPC, FALSE);
return;
}
DelayCommand(0.01, PopulateList(oPC, MaxValue, bSort, sTable, nStage, nBase, i + 1));
}
void main()
{
object oPC = GetPCSpeaker();
if(!(GetIsObjectValid(oPC) || IsInConversation(GetLastUsedBy())))
{
oPC = GetLastUsedBy();
StartDynamicConversation("forge_conv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, OBJECT_SELF);
return;
}
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
object oItem = GetLocalObject(oPC, "Forge_Item");
int nType = GetLocalInt(oPC, "Forge_Type");
string sSubtype = GetLocalString(oPC, "Forge_SubType");
int nSubTypeValue = GetLocalInt(oPC, "Forge_SubTypeValue");
string sCostTable = GetLocalString(oPC, "Forge_CostTable");
int nCostTableValue = GetLocalInt(oPC, "Forge_CostTableValue");
string sParam1 = GetLocalString(oPC, "Forge_Param1");
int nParam1Value = GetLocalInt(oPC, "Forge_Param1Value");
int nBase = GetBaseItemType(oItem);
object oNewItem = GetFirstItemInInventory(OBJECT_SELF);
int nPropList = GetLocalInt(oPC, "Forge_PropList");
int nCost = GetLocalInt(oPC, "Forge_Cost");
string sTemp = "";
int nTemp = 0;
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
//if(DEBUG) DoDebug("forge_conv: Running setup stage for stage " + IntToString(nStage));
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oPC))
{
int i;
switch(nStage)
{
case STAGE_START:
{
SetHeader("Please make a selection.");
SetDefaultTokens();
AddChoice(ActionString("Forge Item"), CHOICE_FORGE, oPC);
AddChoice(ActionString("Boost Crafting Skills For 24 Hours"), CHOICE_BOOST, oPC);
SetCustomToken(DYNCONV_TOKEN_EXIT, ActionString("Leave"));
SetCustomToken(DYNCONV_TOKEN_NEXT, ActionString("Next"));
SetCustomToken(DYNCONV_TOKEN_PREV, ActionString("Previous"));
AllowExit(DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, FALSE, oPC);
MarkStageSetUp(nStage, oPC);
break;
}
case STAGE_SELECT_ITEM:
{
SetHeader("Select an equipped item to forge.");
AllowExit(DYNCONV_EXIT_NOT_ALLOWED, FALSE, oPC);
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
for(i = 0; i < 14; i++) //no creature items
{
sTemp = GetName(GetItemInSlot(i, oPC));
if(sTemp != "")
AddChoice(ActionString(sTemp), i, oPC);
}
MarkStageSetUp(nStage, oPC);
break;
}
case STAGE_SELECT_TYPE:
{
SetHeader(ItemStats(oItem) + "\nSelect an item property.");
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
AddChoice(ActionString("Remove all item properties") +
" [<c<>>WARNING</c>]",
CHOICE_CLEAR, oPC);
AddChoice(ActionString("Change Name"), CHOICE_SETNAME, oPC);
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
SetLocalInt(oPC, "Forge_Type", -1);
SetLocalString(oPC, "Forge_SubType", "");
SetLocalInt(oPC, "Forge_SubTypeValue", -1);
SetLocalString(oPC, "Forge_CostTable", "");
SetLocalInt(oPC, "Forge_CostTableValue", -1);
SetLocalString(oPC, "Forge_Param1", "");
SetLocalInt(oPC, "Forge_Param1Value", -1);
PopulateList(oPC, NUM_MAX_PROPERTIES, TRUE, "itempropdef", nStage, nBase);
MarkStageSetUp(nStage);
break;
}
case STAGE_SELECT_SUBTYPE:
{
SetHeader("Select a subtype.");
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
nTemp = MaxListSize(sSubtype);
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
PopulateList(oPC, nTemp, TRUE, sSubtype, nStage, nBase);
MarkStageSetUp(nStage);
break;
}
case STAGE_SELECT_COSTTABLEVALUE:
{
SetHeader("Select a costtable value.");
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
nTemp = MaxListSize(sCostTable);
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
PopulateList(oPC, nTemp, FALSE, sCostTable, nStage, nBase);
MarkStageSetUp(nStage);
break;
}
case STAGE_SELECT_PARAM1VALUE:
{
SetHeader("Select a param1 value.");
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
nTemp = MaxListSize(sParam1);
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
PopulateList(oPC, nTemp, FALSE, sParam1, nStage, nBase);
MarkStageSetUp(nStage);
break;
}
case STAGE_CONFIRM:
{
itemproperty ip = ConstructIP(nType, nSubTypeValue, nCostTableValue, nParam1Value);
IPSafeAddItemProperty(oNewItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
nTemp = GetGoldPieceValue(oNewItem) - GetGoldPieceValue(oItem);
SetLocalInt(oPC, "Forge_Cost", nTemp);
sTemp = InsertSpaceAfterString(GetStringByStrRef(StringToInt(Get2DACache("itempropdef", "GameStrRef", nType))));
if(sSubtype != "")
sTemp += InsertSpaceAfterString(GetStringByStrRef(StringToInt(Get2DACache(sSubtype, "Name", nSubTypeValue))));
if(sCostTable != "")
sTemp += InsertSpaceAfterString(GetStringByStrRef(StringToInt(Get2DACache(sCostTable, "Name", nCostTableValue))));
if(sParam1 != "")
sTemp += InsertSpaceAfterString(GetStringByStrRef(StringToInt(Get2DACache(sParam1, "Name", nParam1Value))));
sTemp += "\n\nCost: " + IntToString(nTemp);
SetHeader("You have selected:\n\n" + sTemp + "\n\nPlease confirm your selection.");
AddChoice(ActionString("Back"), CHOICE_BACK, oPC);
if(GetGold(oPC) >= nTemp)
AddChoice(ActionString("Confirm"), CHOICE_CONFIRM, oPC);
MarkStageSetUp(nStage);
break;
}
default:
{
if(DEBUG) DoDebug("Invalid Stage: " + IntToString(nStage));
break;
}
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("forge_conv: Running exit handler");
// End of conversation cleanup
DeleteLocalObject(oPC, "Forge_Item");
DeleteLocalInt(oPC, "Forge_Type");
DeleteLocalString(oPC, "Forge_SubType");
DeleteLocalInt(oPC, "Forge_SubTypeValue");
DeleteLocalString(oPC, "Forge_CostTable");
DeleteLocalInt(oPC, "Forge_CostTableValue");
DeleteLocalString(oPC, "Forge_Param1");
DeleteLocalInt(oPC, "Forge_Param1Value");
DeleteLocalInt(oPC, "Forge_PropList");
DeleteLocalInt(oPC, "Forge_Cost");
while(GetIsObjectValid(oNewItem)) //clearing inventory
{
DestroyObject(oNewItem);
oNewItem = GetNextItemInInventory(OBJECT_SELF);
}
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
if(DEBUG) DoDebug("forge_conv: ERROR: Conversation abort section run");
}
// Handle PC response
else
{
int nChoice = GetChoice(oPC);
switch(nStage)
{
case STAGE_START:
{
switch(nChoice)
{
case CHOICE_FORGE: nStage = GetNextItemPropStage(nStage, oPC, nPropList); break;
case CHOICE_BOOST:
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSkillIncrease(SKILL_CRAFT_ARMOR, 50), oPC, HoursToSeconds(24));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSkillIncrease(SKILL_CRAFT_TRAP, 50), oPC, HoursToSeconds(24));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSkillIncrease(SKILL_CRAFT_WEAPON, 50), oPC, HoursToSeconds(24));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oPC);
break;
}
}
break;
}
case STAGE_SELECT_ITEM:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
else
{
oItem = GetItemInSlot(nChoice, oPC);
SetLocalObject(oPC, "Forge_Item", oItem);
//object oNewItem = GetFirstItemInInventory(OBJECT_SELF);
while(GetIsObjectValid(oNewItem)) //clearing inventory
{
DestroyObject(oNewItem);
oNewItem = GetNextItemInInventory(OBJECT_SELF);
}
oNewItem = CopyItem(oItem, OBJECT_SELF, FALSE); //temp item for cost
nStage = GetNextItemPropStage(nStage, oPC, nPropList);
}
break;
}
case STAGE_SELECT_TYPE:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
else if(nChoice == CHOICE_CLEAR) //strips item properties
{
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oPC);
SetHeader(ItemStats(oItem) + "\nSelect an item property.");
}
else if(nChoice == CHOICE_SETNAME)
{
SetLocalInt(oPC, "Item_Name_Change", 1);
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
SendMessageToPC(oPC, "Please state (use chat) the new name of the item.");
}
else
{
nType = nChoice;
SetLocalInt(oPC, "Forge_Type", nType);
sSubtype = Get2DACache("itempropdef", "SubTypeResRef", nType);
SetLocalString(oPC, "Forge_SubType", sSubtype);
sCostTable = Get2DACache("itempropdef", "CostTableResRef", nType);
if(sCostTable == "0") //IPRP_BASE1 is blank
sCostTable = "";
if(sCostTable != "")
sCostTable = Get2DACache("iprp_costtable", "Name", StringToInt(sCostTable));
SetLocalString(oPC, "Forge_CostTable", sCostTable);
sParam1 = Get2DACache("itempropdef", "Param1ResRef", nType);
if(sParam1 != "")
sParam1 = Get2DACache("iprp_paramtable", "TableResRef", StringToInt(sParam1));
SetLocalString(oPC, "Forge_Param1", sParam1);
nPropList = 0;
if(sSubtype != "")
nPropList |= HAS_SUBTYPE;
if(sCostTable != "")
nPropList |= HAS_COSTTABLE;
if(sParam1 != "")
nPropList |= HAS_PARAM1;
SetLocalInt(oPC, "Forge_PropList", nPropList);
nStage = GetNextItemPropStage(nStage, oPC, nPropList);
}
break;
}
case STAGE_SELECT_SUBTYPE:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
else
{
nSubTypeValue = nChoice;
if(nType == ITEM_PROPERTY_ON_HIT_PROPERTIES) //Param1 depends on subtype
{
sParam1 = Get2DACache(sSubtype, "Param1ResRef", nSubTypeValue);
if(sParam1 != "") //if subtype has a Param1
{
sParam1 = Get2DACache("iprp_paramtable", "TableResRef", StringToInt(sParam1));
nPropList |= HAS_PARAM1;
}
else //if(nPropList & HAS_PARAM1)
nPropList &= (~HAS_PARAM1);
SetLocalString(oPC, "Forge_Param1", sParam1);
SetLocalInt(oPC, "Forge_PropList", nPropList);
}
SetLocalInt(oPC, "Forge_PropList", nPropList);
SetLocalInt(oPC, "Forge_SubTypeValue", nSubTypeValue);
nStage = GetNextItemPropStage(nStage, oPC, nPropList);
}
break;
}
case STAGE_SELECT_COSTTABLEVALUE:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
else
{
nCostTableValue = nChoice;
SetLocalInt(oPC, "Forge_CostTableValue", nCostTableValue);
nStage = GetNextItemPropStage(nStage, oPC, nPropList);
}
break;
}
case STAGE_SELECT_PARAM1VALUE:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
else
{
nParam1Value = nChoice;
SetLocalInt(oPC, "Forge_Param1Value", nParam1Value);
nStage = GetNextItemPropStage(nStage, oPC, nPropList);
}
break;
}
case STAGE_CONFIRM:
{
if(nChoice == CHOICE_BACK)
nStage = GetPrevItemPropStage(nStage, oPC, nPropList);
if(nChoice == CHOICE_CONFIRM)
{
itemproperty ip = ConstructIP(nType, nSubTypeValue, nCostTableValue, nParam1Value);
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oPC);
TakeGoldFromCreature(GetLocalInt(oPC, "Forge_Cost"), oPC, TRUE);
nStage = STAGE_SELECT_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
break;
}
}
if(DEBUG) DoDebug("Next stage: " + IntToString(nStage));
SetStage(nStage, oPC);
}
}

View File

@@ -0,0 +1,743 @@
/*
forge_include
Include file for forge scripts, currently restricted to equipable items
By: Flaming_Sword
Created: January 1, 2006
Modified: January 12, 2006
GetItemPropertySubType() returns 0 or 65535, not -1
on no subtype as in Lexicon
Item Cost = [BaseCost + 1000 * (Multiplier ^ 2 - NegMultiplier ^ 2) + SpellCosts] * Stack * BaseMult + AdditionalCost
Multiplier = sum(ItemPropertyCost) (+ve)
NegMultiplier = sum(ItemPropertyCost) (-ve)
ItemPropertyCost = (PropertyCost + SubTypeCost) * CostValue
NOT IMPLEMENTED
*/
#include "prc_alterations"
const int NUM_MAX_PROPERTIES = 152;
const int NUM_MAX_SUBTYPES = 256;
//const int NUM_MAX_FEAT_SUBTYPES = 16384; //because iprp_feats is frickin' huge
const int NUM_MAX_FEAT_SUBTYPES = 397; //because the above screwed the game
const int NUM_MAX_SPELL_SUBTYPES = 540; //restricted to bioware spells
// to avoid crashes
//Returns TRUE if nBaseItem can have nItemProp
int ValidProperty(int nBaseItem, int nItemProp)
{
int nPropColumn = StringToInt(Get2DACache("baseitems", "PropColumn", nBaseItem));
string sReturn = "";
string sPropCloumn = "";
switch(nPropColumn)
{
case 0: sPropCloumn = "0_Melee"; break;
case 1: sPropCloumn = "1_Ranged"; break;
case 2: sPropCloumn = "2_Thrown"; break;
case 3: sPropCloumn = "3_Staves"; break;
case 4: sPropCloumn = "4_Rods"; break;
case 5: sPropCloumn = "5_Ammo"; break;
case 6: sPropCloumn = "6_Arm_Shld"; break;
case 7: sPropCloumn = "7_Helm"; break;
case 8: sPropCloumn = "8_Potions"; break;
case 9: sPropCloumn = "9_Scrolls"; break;
case 10: sPropCloumn = "10_Wands"; break;
case 11: sPropCloumn = "11_Thieves"; break;
case 12: sPropCloumn = "12_TrapKits"; break;
case 13: sPropCloumn = "13_Hide"; break;
case 14: sPropCloumn = "14_Claw"; break;
case 15: sPropCloumn = "15_Misc_Uneq"; break;
case 16: sPropCloumn = "16_Misc"; break;
case 17: sPropCloumn = "17_No_Props"; break;
case 18: sPropCloumn = "18_Containers"; break;
case 19: sPropCloumn = "19_HealerKit"; break;
case 20: sPropCloumn = "20_Torch"; break;
case 21: sPropCloumn = "21_Glove"; break;
}
return(Get2DACache("itemprops", sPropCloumn, nItemProp) == "1");
}
//Adds action highlight to a conversation string
string ActionString(string sString)
{
return "<c<01>>" + sString + "</c>";
}
//Inserts a space at the end of a string if the string
// is not empty
string InsertSpaceAfterString(string sString)
{
if(sString != "")
return sString + " ";
else return "";
}
//Returns a string describing the item
string ItemStats(object oItem)
{
string sDesc = GetName(oItem) +
"\n\n" +
GetStringByStrRef(StringToInt(Get2DACache("baseitems", "Name", GetBaseItemType(oItem)))) +
"\n\n" +
"Price: " +
IntToString(GetGoldPieceValue(oItem)) +
"\n\n";
itemproperty ip = GetFirstItemProperty(oItem);
int nType;
int nSubType;
int nCostTable;
int nCostTableValue;
int nParam1;
int nParam1Value;
while(GetIsItemPropertyValid(ip))
{
if(GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
{
int nType = GetItemPropertyType(ip);
int nSubType = GetItemPropertySubType(ip);
int nCostTable = GetItemPropertyCostTable(ip);
int nCostTableValue = GetItemPropertyCostTableValue(ip);
int nParam1 = GetItemPropertyParam1(ip);
int nParam1Value = GetItemPropertyParam1Value(ip);
sDesc += InsertSpaceAfterString(
GetStringByStrRef(StringToInt(Get2DACache("itempropdef", "GameStrRef", nType)))
);
string sSubType = Get2DACache("itempropdef", "SubTypeResRef", nType);
string sSubType2 = Get2DACache(sSubType, "Name", nSubType);
if(sSubType2 != "")
sDesc += InsertSpaceAfterString(GetStringByStrRef(StringToInt(sSubType2)));
string sCostTable = Get2DACache("itempropdef", "CostTableResRef", nType);
string sCostTable2 = Get2DACache("iprp_costtable", "Name", StringToInt(sCostTable));
string sCostTable3 = Get2DACache(sCostTable2, "Name", nCostTableValue);
if(sCostTable3 != "")
sDesc += InsertSpaceAfterString(GetStringByStrRef(StringToInt(sCostTable3)));
string sParam1 = Get2DACache("itempropdef", "Param1ResRef", nType);
string sParam12 = Get2DACache("iprp_paramtable", "Name", StringToInt(sParam1));
string sParam13 = Get2DACache(sParam12, "Name", nParam1Value);
if(sParam13 != "")
sDesc += InsertSpaceAfterString(GetStringByStrRef(StringToInt(sParam13)));
sDesc += "\n";
}
ip = GetNextItemProperty(oItem);
}
return sDesc;
}
//Extra function for speed, minimises 2da reads
int MaxListSize(string sTable)
{
sTable = GetStringLowerCase(sTable); //sanity check
if(sTable == "classes")
return 256;
if(sTable == "disease")
return 53;
if(sTable == "iprp_abilities")
return 6;
if(sTable == "iprp_aligngrp")
return 6;
if(sTable == "iprp_alignment")
return 9;
if(sTable == "iprp_ammocost")
return 16;
if(sTable == "iprp_ammotype")
return 3;
if(sTable == "iprp_amount")
return 5;
if(sTable == "iprp_aoe")
return 6;
if(sTable == "iprp_arcspell")
return 20;
if(sTable == "iprp_bladecost")
return 6;
if(sTable == "iprp_bonuscost")
return 13;
if(sTable == "iprp_casterlvl")
return 61;
if(sTable == "iprp_chargecost")
return 14;
if(sTable == "iprp_color")
return 7;
if(sTable == "iprp_combatdam")
return 3;
if(sTable == "iprp_damagecost")
return 81;
if(sTable == "iprp_damagetype")
return 14;
if(sTable == "iprp_damvulcost")
return 8;
if(sTable == "iprp_decvalue1")
return 10;
if(sTable == "iprp_decvalue2")
return 10;
if(sTable == "iprp_feats")
return NUM_MAX_FEAT_SUBTYPES;
if(sTable == "iprp_immuncost")
return 8;
if(sTable == "iprp_immunity")
return 10;
if(sTable == "iprp_incvalue1")
return 10;
if(sTable == "iprp_incvalue2")
return 10;
if(sTable == "iprp_kitcost")
return 51;
if(sTable == "iprp_lightcost")
return 5;
if(sTable == "iprp_meleecost")
return 21;
if(sTable == "iprp_monstcost")
return 58;
if(sTable == "iprp_monsterhit")
return 10;
if(sTable == "iprp_metamagic")
return 7;
if(sTable == "iprp_monstcost")
return 59;
if(sTable == "iprp_neg10cost")
return 11;
if(sTable == "iprp_neg5cost")
return 11;
if(sTable == "iprp_onhit")
return 26;
if(sTable == "iprp_onhitcost")
return 71;
if(sTable == "iprp_onhitdur")
return 28;
if(sTable == "iprp_onhitspell")
return 210;
if(sTable == "iprp_poison")
return 6;
if(sTable == "iprp_protection")
return 20;
if(sTable == "iprp_redcost")
return 6;
if(sTable == "iprp_resistcost")
return 25;
if(sTable == "iprp_saveelement")
return 22;
if(sTable == "iprp_savingthrow")
return 4;
if(sTable == "iprp_skillcost")
return 51;
if(sTable == "iprp_soakcost")
return 51;
if(sTable == "iprp_speed_dec")
return 10;
if(sTable == "iprp_speed_enh")
return 10;
if(sTable == "iprp_spellcost")
return 244;
if(sTable == "iprp_spells")
return NUM_MAX_SPELL_SUBTYPES;
if(sTable == "iprp_spellcstr")
return 40;
if(sTable == "iprp_spelllvcost")
return 10;
if(sTable == "iprp_spelllvlimm")
return 10;
if(sTable == "iprp_spellshl")
return 8;
if(sTable == "iprp_srcost")
return 62;
if(sTable == "iprp_trapcost")
return 12;
if(sTable == "iprp_traps")
return 5;
if(sTable == "iprp_visualfx")
return 7;
if(sTable == "iprp_walk")
return 2;
if(sTable == "iprp_weightcost")
return 6;
if(sTable == "iprp_weightinc")
return 6;
if(sTable == "poison")
return 147;
if(sTable == "racialtypes")
return 256;
if(sTable == "skills")
return 29;
if(DEBUG) DoDebug("MaxListSize: Unrecognised 2da file: " + sTable);
return NUM_MAX_SUBTYPES;
}
//Makes an item property from values - total pain in the arse, need 1 per itemprop
itemproperty ConstructIP(int nType, int nSubTypeValue = 0, int nCostTableValue = 0, int nParam1Value = 0)
{
itemproperty ip;
switch(nType)
{
case ITEM_PROPERTY_ABILITY_BONUS:
{
ip = ItemPropertyAbilityBonus(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_AC_BONUS:
{
ip = ItemPropertyACBonus(nCostTableValue);
break;
}
case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP:
{
ip = ItemPropertyACBonusVsAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE:
{
ip = ItemPropertyACBonusVsDmgType(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP:
{
ip = ItemPropertyACBonusVsRace(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT:
{
ip = ItemPropertyACBonusVsSAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ENHANCEMENT_BONUS:
{
ip = ItemPropertyEnhancementBonus(nCostTableValue);
break;
}
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP:
{
ip = ItemPropertyEnhancementBonusVsAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP:
{
ip = ItemPropertyEnhancementBonusVsRace(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT:
{
ip = ItemPropertyEnhancementBonusVsSAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER:
{
ip = ItemPropertyEnhancementPenalty(nCostTableValue);
break;
}
case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION:
{
ip = ItemPropertyWeightReduction(nCostTableValue);
break;
}
case ITEM_PROPERTY_BONUS_FEAT:
{
ip = PRCItemPropertyBonusFeat(nSubTypeValue);
break;
}
case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
{
ip = ItemPropertyBonusLevelSpell(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_CAST_SPELL:
{
ip = ItemPropertyCastSpell(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DAMAGE_BONUS:
{
ip = ItemPropertyDamageBonus(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
{
ip = ItemPropertyDamageBonusVsAlign(nSubTypeValue, nCostTableValue, nParam1Value);
break;
}
case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
{
ip = ItemPropertyDamageBonusVsRace(nSubTypeValue, nCostTableValue, nParam1Value);
break;
}
case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
{
ip = ItemPropertyDamageBonusVsSAlign(nSubTypeValue, nCostTableValue, nParam1Value);
break;
}
case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE:
{
ip = ItemPropertyDamageImmunity(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_DAMAGE:
{
ip = ItemPropertyDamagePenalty(nCostTableValue);
break;
}
case ITEM_PROPERTY_DAMAGE_REDUCTION:
{
ip = ItemPropertyDamageReduction(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DAMAGE_RESISTANCE:
{
ip = ItemPropertyDamageResistance(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DAMAGE_VULNERABILITY:
{
ip = ItemPropertyDamageVulnerability(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DARKVISION:
{
ip = ItemPropertyDarkvision();
break;
}
case ITEM_PROPERTY_DECREASED_ABILITY_SCORE:
{
ip = ItemPropertyDecreaseAbility(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_AC:
{
ip = ItemPropertyDecreaseAC(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER:
{
ip = ItemPropertyDecreaseSkill(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT:
{
ip = ItemPropertyWeightReduction(nCostTableValue);
break;
}
case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
{
ip = ItemPropertyExtraMeleeDamageType(nSubTypeValue);
break;
}
case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
{
ip = ItemPropertyExtraRangeDamageType(nSubTypeValue);
break;
}
case ITEM_PROPERTY_HASTE:
{
ip = ItemPropertyHaste();
break;
}
case ITEM_PROPERTY_HOLY_AVENGER:
{
ip = ItemPropertyHolyAvenger();
break;
}
case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
{
ip = ItemPropertyImmunityMisc(nSubTypeValue);
break;
}
case ITEM_PROPERTY_IMPROVED_EVASION:
{
ip = ItemPropertyImprovedEvasion();
break;
}
case ITEM_PROPERTY_SPELL_RESISTANCE:
{
ip = ItemPropertyBonusSpellResistance(nCostTableValue);
break;
}
case ITEM_PROPERTY_SAVING_THROW_BONUS:
{
ip = ItemPropertyBonusSavingThrowVsX(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
{
ip = ItemPropertyBonusSavingThrow(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_KEEN:
{
ip = ItemPropertyKeen();
break;
}
case ITEM_PROPERTY_LIGHT:
{
ip = ItemPropertyLight(nCostTableValue, nParam1Value);
break;
}
case ITEM_PROPERTY_MIGHTY:
{
ip = ItemPropertyMaxRangeStrengthMod(nCostTableValue);
break;
}
case ITEM_PROPERTY_NO_DAMAGE:
{
ip = ItemPropertyNoDamage();
break;
}
case ITEM_PROPERTY_ON_HIT_PROPERTIES:
{
//if(nParam1Value == -1) nParam1Value = 0;
ip = ItemPropertyOnHitProps(nSubTypeValue, nCostTableValue, nParam1Value);
break;
}
case ITEM_PROPERTY_DECREASED_SAVING_THROWS:
{
ip = ItemPropertyReducedSavingThrowVsX(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC:
{
ip = ItemPropertyReducedSavingThrow(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_REGENERATION:
{
ip = ItemPropertyRegeneration(nCostTableValue);
break;
}
case ITEM_PROPERTY_SKILL_BONUS:
{
ip = ItemPropertySkillBonus(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL:
{
ip = ItemPropertySpellImmunitySpecific(nCostTableValue);
break;
}
case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL:
{
ip = ItemPropertySpellImmunitySchool(nSubTypeValue);
break;
}
case ITEM_PROPERTY_THIEVES_TOOLS:
{
ip = ItemPropertyThievesTools(nCostTableValue);
break;
}
case ITEM_PROPERTY_ATTACK_BONUS:
{
ip = ItemPropertyAttackBonus(nCostTableValue);
break;
}
case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
{
ip = ItemPropertyAttackBonusVsAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
{
ip = ItemPropertyAttackBonusVsRace(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
{
ip = ItemPropertyAttackBonusVsSAlign(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
{
ip = ItemPropertyAttackPenalty(nCostTableValue);
break;
}
case ITEM_PROPERTY_UNLIMITED_AMMUNITION:
{ //IP_CONST_UNLIMITEDAMMO_* is costtablevalue, not subtype
ip = ItemPropertyUnlimitedAmmo(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP:
{
ip = ItemPropertyLimitUseByAlign(nSubTypeValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_CLASS:
{
ip = ItemPropertyLimitUseByClass(nSubTypeValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE:
{
ip = ItemPropertyLimitUseByRace(nSubTypeValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT:
{
ip = ItemPropertyLimitUseBySAlign(nSubTypeValue);
break;
}
case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
{
ip = ItemPropertyVampiricRegeneration(nCostTableValue);
break;
}
case ITEM_PROPERTY_TRAP:
{
ip = ItemPropertyTrap(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_TRUE_SEEING:
{
ip = ItemPropertyTrueSeeing();
break;
}
case ITEM_PROPERTY_ON_MONSTER_HIT:
{
ip = ItemPropertyOnMonsterHitProperties(nSubTypeValue);
break;
}
case ITEM_PROPERTY_TURN_RESISTANCE:
{
ip = ItemPropertyTurnResistance(nCostTableValue);
break;
}
case ITEM_PROPERTY_MASSIVE_CRITICALS:
{
ip = ItemPropertyMassiveCritical(nCostTableValue);
break;
}
case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
{
ip = ItemPropertyFreeAction();
break;
}
case ITEM_PROPERTY_MONSTER_DAMAGE:
{
ip = ItemPropertyMonsterDamage(nCostTableValue);
break;
}
case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL:
{ //+1 because the function is bugged
ip = ItemPropertyImmunityToSpellLevel(nCostTableValue);
break;
}
case ITEM_PROPERTY_SPECIAL_WALK:
{
ip = ItemPropertySpecialWalk(nSubTypeValue);
break;
}
case ITEM_PROPERTY_HEALERS_KIT:
{
ip = ItemPropertyHealersKit(nCostTableValue);
break;
}
case ITEM_PROPERTY_WEIGHT_INCREASE:
{
ip = ItemPropertyWeightIncrease(nParam1Value);
break;
}
case ITEM_PROPERTY_ONHITCASTSPELL:
{
ip = ItemPropertyOnHitCastSpell(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_VISUALEFFECT:
{
ip = ItemPropertyVisualEffect(nSubTypeValue);
break;
}
case ITEM_PROPERTY_ARCANE_SPELL_FAILURE:
{
ip = ItemPropertyArcaneSpellFailure(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_ABILITY_SCORE:
{
ip = ItemPropertyLimitUseByAbility(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_SKILL_RANKS:
{
ip = ItemPropertyLimitUseBySkill(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_SPELL_LEVEL:
{
ip = ItemPropertyLimitUseBySpellcasting(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_ARCANE_SPELL_LEVEL:
{
ip = ItemPropertyLimitUseByArcaneSpellcasting(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_DIVINE_SPELL_LEVEL:
{
ip = ItemPropertyLimitUseByDivineSpellcasting(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_SNEAK_ATTACK:
{
ip = ItemPropertyLimitUseBySneakAttackDice(nCostTableValue);
break;
}
case ITEM_PROPERTY_USE_LIMITATION_GENDER:
{ //no Use Limitation: Gender function entry
//ip = ItemPropertyAbilityBonus(nSubTypeValue);
break;
}
case ITEM_PROPERTY_SPEED_INCREASE:
{ //no Speed Increase function entry
//ip = ItemPropertyAbilityBonus(nCostTableValue);
break;
}
case ITEM_PROPERTY_SPEED_DECREASE:
{ //no Speed Decrease function entry
//ip = ItemPropertyAbilityBonus(nCostTableValue);
break;
}
case ITEM_PROPERTY_AREA_OF_EFFECT:
{
ip = ItemPropertyAreaOfEffect(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_CAST_SPELL_CASTER_LEVEL:
{
ip = ItemPropertyCastSpellCasterLevel(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_CAST_SPELL_METAMAGIC:
{
ip = ItemPropertyCastSpellMetamagic(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_CAST_SPELL_DC:
{
ip = ItemPropertyCastSpellDC(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_PNP_HOLY_AVENGER:
{
ip = ItemPropertyPnPHolyAvenger();
break;
}
//ROOM FOR MORE - 89 so far, need increase/decrease cost
/*
case ITEM_PROPERTY_ABILITY_BONUS:
{
ip = ItemPropertyAbilityBonus(nSubTypeValue, nCostTableValue);
break;
}
case ITEM_PROPERTY_ABILITY_BONUS:
{
ip = ItemPropertyAbilityBonus(nSubTypeValue, nCostTableValue);
break;
}
*/
}
return ip;
}

View File

@@ -0,0 +1,203 @@
2DA V2.0
Label 0_Melee 1_Ranged 2_Thrown 5_Ammo
0 Ability 1 1 1 ****
1 Armor 1 1 **** ****
2 ArmorAlignmentGroup 1 1 **** ****
3 ArmorDamageType 1 1 **** ****
4 ArmorRacialGroup 1 1 **** ****
5 ArmorSpecificAlignment 1 1 **** ****
6 Enhancement 1 1 1 1
7 EnhancementAlignmentGroup 1 1 1 ****
8 EnhancementRacialGroup 1 1 1 ****
9 EnhancementSpecificAlignment 1 1 1 ****
10 AttackPenalty 1 **** 1 ****
11 WeightReduction 1 1 1 1
12 BonusFeats 1 1 1 ****
13 SingleBonusSpellOfLevel 1 1 1 ****
14 Boomerang **** **** **** ****
15 CastSpell 1 1 **** ****
16 Damage 1 **** 1 1
17 DamageAlignmentGroup 1 **** 1 1
18 DamageRacialGroup 1 **** 1 1
19 DamageSpecificAlignment 1 **** 1 1
20 DamageImmunity 1 1 **** ****
21 DamagePenalty 1 **** 1 ****
22 DamageReduced 1 1 **** ****
23 DamageResist 1 1 **** ****
24 Damage_Vulnerability 1 1 1 ****
25 Dancing_Scimitar **** **** **** ****
26 Darkvision 1 1 1 ****
27 DecreaseAbilityScore 1 1 1 ****
28 DecreaseAC 1 1 1 ****
29 DecreasedSkill 1 1 1 ****
30 DoubleStack **** **** **** ****
31 EnhancedContainer_BonusSlot **** **** **** ****
32 EnhancedContainer_Weight **** **** **** ****
33 DamageMelee 1 **** **** ****
34 DamageRanged **** 1 1 1
35 Haste 1 1 1 ****
36 HolyAvenger 1 **** **** ****
37 Immunity 1 1 **** ****
38 ImprovedEvasion 1 1 **** ****
39 ImprovedMagicResist 1 1 1 ****
40 ImprovedSavingThrows 1 1 **** ****
41 ImprovedSavingThrowsSpecific 1 1 **** ****
42 bio_reserved **** **** **** ****
43 Keen 1 **** **** ****
44 Light 1 1 1 ****
45 Mighty **** 1 1 ****
46 MindBlank **** **** **** ****
47 DamageNone 1 1 1 ****
48 OnHit 1 **** 1 1
49 ReducedSavingThrows 1 1 1 1
50 ReducedSpecificSavingThrow 1 1 1 1
51 Regeneration 1 1 **** ****
52 Skill 1 1 1 ****
53 SpellImmunity_Specific 1 1 **** ****
54 SpellSchool_Immunity 1 1 **** ****
55 ThievesTools **** **** **** ****
56 AttackBonus 1 1 1 1
57 AttackBonusAlignmentGroup 1 1 1 ****
58 AttackBonusRacialGroup 1 1 1 ****
59 AttackBonusSpecificAlignment 1 1 1 ****
60 ToHitPenalty 1 1 1 ****
61 UnlimitedAmmo **** 1 **** ****
62 UseLimitationAlignmentGroup 1 1 1 1
63 UseLimitationClass 1 1 1 1
64 UseLimitationRacial 1 1 1 1
65 UseLimitationSpecificAlignment 1 1 1 1
66 UseLimitationTerrain **** **** **** ****
67 VampiricRegeneration 1 **** 1 1
68 Vorpal **** **** **** ****
69 Wounding **** **** **** ****
70 Trap **** **** **** ****
71 True_Seeing 1 1 **** ****
72 OnMonsterHit **** **** **** ****
73 Turn_Resistance **** **** **** ****
74 Massive_Criticals 1 1 1 ****
75 Freedom_of_Movement 1 1 **** ****
76 Poison **** **** **** ****
77 Monster_damage **** **** **** ****
78 Immunity_To_Spell_By_Level 1 1 **** ****
79 Special_Walk **** **** **** ****
80 Healers_Kit **** **** **** ****
81 Weight_Increase **** **** **** ****
82 OnHitCastSpell 1 **** 1 1
83 VisualEffect 1 **** **** ****
84 ArcaneSpellFailure **** **** **** ****
85 ItemCasterLevel 1 1 **** ****
86 UseLimitationAbility 1 1 1 1
87 UseLimitationSkill 1 1 1 1
88 UseLimitationAllSpell 1 1 1 1
89 UseLimitationArcaneSpell 1 1 1 1
90 UseLimitationDivineSpell 1 1 1 1
91 UseLimitationSneak 1 1 1 1
92 ItemMetamagic 1 1 **** ****
93 ItemDC 1 1 **** ****
94 bio_reserved **** **** **** ****
95 bio_reserved **** **** **** ****
96 bio_reserved **** **** **** ****
97 bio_reserved **** **** **** ****
98 bio_reserved **** **** **** ****
99 bio_reserved **** **** **** ****
100 AreaEffect 1 1 1 ****
101 PnPHolyAvenger 1 **** **** ****
102 bio_reserved **** **** **** ****
103 bio_reserved **** **** **** ****
104 bio_reserved **** **** **** ****
105 bio_reserved **** **** **** ****
106 bio_reserved **** **** **** ****
107 bio_reserved **** **** **** ****
108 bio_reserved **** **** **** ****
109 bio_reserved **** **** **** ****
110 bio_reserved **** **** **** ****
111 bio_reserved **** **** **** ****
112 bio_reserved **** **** **** ****
113 bio_reserved **** **** **** ****
114 bio_reserved **** **** **** ****
115 bio_reserved **** **** **** ****
116 bio_reserved **** **** **** ****
117 bio_reserved **** **** **** ****
118 bio_reserved **** **** **** ****
119 bio_reserved **** **** **** ****
120 Decrease_Value_A **** **** **** ****
121 Decrease_Value_B 1 1 1 1
122 Decrease_Value_c 1 1 1 1
123 Decrease_Value_d 1 1 1 1
124 Decrease_Value_e 1 1 1 1
125 Decrease_Value_f 1 1 1 1
126 Decrease_Value_g 1 1 1 1
127 Decrease_Value_h 1 1 1 1
128 Increase_Value_a 1 1 1 1
129 Increase_Value_b 1 1 1 1
130 Increase_Value_c 1 1 1 1
131 Increase_Value_d 1 1 1 1
132 Increase_Value_e 1 1 1 1
133 Spd_Increase 1 1 1 1
134 Spd_Decrease 1 1 **** ****
135 bio_reserved 1 1 **** ****
136 bio_reserved **** **** **** ****
137 bio_reserved **** **** **** ****
138 bio_reserved **** **** **** ****
139 bio_reserved **** **** **** ****
140 bio_reserved **** **** **** ****
141 bio_reserved **** **** **** ****
142 bio_reserved **** **** **** ****
143 bio_reserved **** **** **** ****
144 bio_reserved **** **** **** ****
145 bio_reserved **** **** **** ****
146 bio_reserved **** **** **** ****
147 bio_reserved **** **** **** ****
148 bio_reserved **** **** **** ****
149 bio_reserved **** **** **** ****
150 UseLimitationGender 1 1 1 1
151 cep_reserved **** **** **** ****
152 cep_reserved **** **** **** ****
153 cep_reserved **** **** **** ****
154 cep_reserved **** **** **** ****
155 cep_reserved **** **** **** ****
156 cep_reserved **** **** **** ****
157 cep_reserved **** **** **** ****
158 cep_reserved **** **** **** ****
159 cep_reserved **** **** **** ****
160 cep_reserved **** **** **** ****
161 cep_reserved **** **** **** ****
162 cep_reserved **** **** **** ****
163 cep_reserved **** **** **** ****
164 cep_reserved **** **** **** ****
165 cep_reserved **** **** **** ****
166 cep_reserved **** **** **** ****
167 cep_reserved **** **** **** ****
168 cep_reserved **** **** **** ****
169 cep_reserved **** **** **** ****
170 cep_reserved **** **** **** ****
171 cep_reserved **** **** **** ****
172 cep_reserved **** **** **** ****
173 cep_reserved **** **** **** ****
174 cep_reserved **** **** **** ****
175 cep_reserved **** **** **** ****
176 cep_reserved **** **** **** ****
177 cep_reserved **** **** **** ****
178 cep_reserved **** **** **** ****
179 cep_reserved **** **** **** ****
180 cep_reserved **** **** **** ****
181 cep_reserved **** **** **** ****
182 cep_reserved **** **** **** ****
183 cep_reserved **** **** **** ****
184 cep_reserved **** **** **** ****
185 cep_reserved **** **** **** ****
186 cep_reserved **** **** **** ****
187 cep_reserved **** **** **** ****
188 cep_reserved **** **** **** ****
189 cep_reserved **** **** **** ****
190 cep_reserved **** **** **** ****
191 cep_reserved **** **** **** ****
192 cep_reserved **** **** **** ****
193 cep_reserved **** **** **** ****
194 cep_reserved **** **** **** ****
195 cep_reserved **** **** **** ****
196 cep_reserved **** **** **** ****
197 cep_reserved **** **** **** ****
198 cep_reserved **** **** **** ****
199 cep_reserved **** **** **** ****

View File

@@ -0,0 +1,203 @@
2DA V2.0
0_Melee 1_Ranged 2_Thrown 3_Staves 4_Rods 5_Ammo 6_Arm_Shld 7_Helm 8_Potions 9_Scrolls 10_Wands 11_Thieves 12_TrapKits 13_Hide 14_Claw 15_Misc_Uneq 16_Misc 17_No_Props 18_Containers 19_HealerKit 20_Torch 21_Glove StringRef Label
0 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 649 Ability_Bonus
1 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 652 AC_Bonus
2 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 653 AC_Bonus_vs_Alignment_Group
3 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 654 AC_Bonus_vs_Damage_Type
4 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 651 AC_Bonus_vs_Racial_Group
5 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 655 AC_Bonus_vs_Specific_Alignment
6 1 1 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 659 Enhancement_Bonus
7 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 656 Enhancement_Bonus_vs_Alignment_Group
8 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 657 Enchancement_Bonus_vs_Racial_Group
9 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 658 Enhancement_Bonus_vs_Specific_Alignement
10 1 **** 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 660 Attack_Penalty
11 1 1 1 1 1 1 1 1 **** **** 1 **** **** **** **** 1 1 **** 1 **** **** 1 661 Base_Item_Weight_Reduction
12 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 662 Bonus_Feat
13 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 663 Bonus_Spell_Slot_of_Level_n
14 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 667 Boomerang
15 1 1 **** 1 1 **** 1 1 1 1 1 **** **** 1 **** 1 1 **** **** **** **** 1 668 Cast_Spell
16 1 1 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 650 Damage_Bonus
17 1 1 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 670 Damage_Bonus_vs_Alignment_Group
18 1 1 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 673 Damage_Bonus_vs_Racial_Group
19 1 **** 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 675 Damage_Bonus_vs_Specific_Alignment
20 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 680 Damage_Immunity
21 1 **** 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 672 Damage_Penalty
22 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 674 Damage_Reduction
23 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 681 Damage_Resistance
24 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 696 Damage_Vulnerability
25 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 748 Dancing
26 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 1493 Darkvision
27 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 **** **** 1 **** **** **** **** 1 677 Decreased_Ability_Score
28 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 **** **** 1 **** **** **** **** 1 678 Decreased_AC
29 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 **** **** 1 **** **** **** **** 1 679 Decreased_Skill_Modifier
30 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 676 Double_Stack
31 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** Enhanced_Container:_Bonus_Slots
32 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** 728 Enhanced_Container:_Reduced_Weight
33 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 669 Extra_Melee_Damage_Type
34 **** 1 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 671 Extra_Ranged_Damage_Type
35 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 704 Haste
36 1 **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 1023 Holy_Avenger
37 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 1022 Immunity
38 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 710 Improved_Evasion
39 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 666 Improved_Magic_Resistance
40 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 711 Improved_Saving_Throws
41 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 712 Improved_Saving_Throws:_Specific
42 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
43 1 **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 713 Keen_Blade
44 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** 1 1 714 Light
45 **** 1 1 **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 1500 Mighty
46 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 721 Mind_Blank
47 1 1 1 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 722 No_Damage
48 1 **** 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 723 On_Hit_Properties
49 1 1 1 1 **** 1 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 726 Reduced_Saving_Throws
50 1 1 1 1 **** 1 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 727 Reduced_Saving_Throws_Specific
51 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 729 Regeneration
52 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 731 Skill_Bonus
53 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 733 Spell_Immunity
54 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 730 Spell_School_Immunity
55 **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** 1492 Thieves_Tools
56 1 1 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** 1 **** **** **** **** 1 735 Attack_Bonus
57 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** 1 **** **** **** **** **** 734 Attack_Bonus_vs_Alignment_Group
58 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** 1 **** **** **** **** **** 737 Attack_Bonus_vs_Racial_Group
59 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** 1 **** **** **** **** **** 738 Attack_Bonus_vsSpecific_Alignment
60 1 1 1 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 736 To_Hit_Penalty
61 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 739 Unlimited_Ammunition
62 1 1 1 1 1 1 1 1 **** **** 1 **** **** **** **** 1 1 **** **** **** **** 1 715 Use_Limitation_Alignment_Group
63 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 716 Use_Limitation_Class
64 1 1 1 1 1 1 1 1 **** **** 1 **** **** **** **** 1 1 **** **** **** **** 1 724 Use_Limitation_Racial_Type
65 1 1 1 1 1 1 1 1 **** **** 1 **** **** **** **** 1 1 **** **** **** **** 1 717 Use_Limitation_Specific_Alignment
66 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 718 Use_Limitation_Tileset
67 1 **** 1 1 **** 1 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 732 Vampiric_Regeneration
68 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** Vorpal_Blade
69 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** Wounding
70 **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** 1663 Trap
71 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 1775 TRUE_Seeing
72 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 1776 On_Monster_Hit
73 **** **** **** **** **** **** **** **** **** **** **** **** **** 1 1 **** **** **** **** **** **** **** 1777 Turn_Resistance
74 1 1 1 1 **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 1778 Massive_Criticals
75 1 1 **** **** **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 1779 Freedom_of_Movement
76 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 879 Poison
77 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 5060 Monster_Damage
78 1 1 **** 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 5604 Immunity_to_Spells_by_Level
79 **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** 6637 Special_Walk
80 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** 8338 Healers_Kit
81 **** **** **** **** 1 **** **** **** **** **** 1 **** **** **** **** 1 **** **** **** **** **** **** 58325 Weight_Increase
82 1 **** 1 1 **** 1 1 **** **** **** **** **** **** 1 1 **** **** **** **** **** **** 1 723 On_Hit_Cast_Spell
83 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 723 Visual_Effect
84 **** **** **** **** **** **** 1 **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** 84321 Arcane_Spell_Failure
85 1 1 **** 1 1 **** 1 1 1 1 1 **** **** 1 **** 1 1 **** **** **** **** 1 16824964 Spell_level
86 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825167 Use_Limitation_Ability
87 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825168 Use_Limitation_Skill
88 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825170 Use_Limitation_All_Spells
89 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825171 Use_Limitation_Arcane_Spells
90 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825172 Use_Limitation_Divine_Spells
91 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** **** 1 16825173 Use_Limitation_Sneak
92 1 1 **** 1 1 **** 1 1 1 1 1 **** **** 1 **** 1 1 **** **** **** **** 1 16824992 Spell_metamagic
93 1 1 **** 1 1 **** 1 1 1 1 1 **** **** 1 **** 1 1 **** **** **** **** 1 16824961 Spell_DC
94 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
95 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
96 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
97 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
98 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
99 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
100 1 1 1 1 **** **** 1 1 **** **** **** **** **** 1 1 **** 1 **** **** **** **** 1 16826695 AreaEffect
101 1 **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 16832064 PnP_Holy_Avenger
102 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
103 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
104 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
105 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
106 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
107 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
108 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
109 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
110 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
111 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
112 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
113 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
114 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
115 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
116 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
117 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
118 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
119 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
120 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
121 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_1
122 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_10
123 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_100
124 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_1000
125 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_10000
126 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_100000
127 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_1000000
128 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Decrease_Value_10000000
129 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Increase_Value_1000
130 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Increase_Value_10000
131 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Increase_Value_100000
132 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Increase_Value_1000000
133 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 **** Increase_Value_10000000
134 1 1 **** 1 1 **** 1 1 **** **** 1 **** **** 1 1 **** 1 **** **** **** **** 1 16833551 Spd_Increase
135 1 1 **** 1 1 **** 1 1 **** **** 1 **** **** 1 1 **** 1 **** **** **** **** 1 16833552 Spd_Decrease
136 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
137 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
138 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
139 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
140 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
141 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
142 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
143 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
144 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
145 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
146 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
147 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
148 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
149 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
150 1 1 1 1 1 1 1 1 **** 1 1 **** **** **** **** 1 1 **** **** **** 1 1 716 Use_Limitation_Gender
151 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
152 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
153 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
154 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
155 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
156 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
157 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
158 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
159 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
160 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
161 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
162 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
163 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
164 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
165 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
166 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
167 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
168 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
169 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
170 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
171 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
172 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
173 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
174 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
175 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
176 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
177 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
178 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
179 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
180 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
181 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
182 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
183 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
184 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
185 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
186 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
187 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
188 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
189 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
190 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
191 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
192 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
193 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
194 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
195 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
196 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
197 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
198 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
199 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@@ -0,0 +1,93 @@
Material use off by default (use switch)
unique ids for storage in limbo chest
XXX_PRC_UID_PREFIX + <stuff> + PRC_CRAFT_UID_SUFFIX
where XXX identifies masterwork, material, bit flags
base AC 0-1 requires cloth
SRD magic item crafting properties and prices
wearable wonderous items only?
Crafting delays:
Here's a compromise: Make it a switch. 5 options: Off, Round/1000, Turn/1000, Hour/1000, Day/1000, and have the default be Hour
potions excepted, always 1 day (depending on switch)
add truespeaking bonuses to wonderous item 2da
add psionics to crafting
[23:46] Annihilator-X17: yerp
[23:48] Annihilator-X17: i know leof and ca have some
[23:48] Annihilator-X17: oh, there is attune gem in mof
[23:49] Annihilator-X17: might be another there as well
[23:49] Annihilator-X17: you have that book?
[23:49] Flaming_Sword: magic of faerun?
[23:49] Flaming_Sword: i think so, lemme check
[23:49] Annihilator-X17: yah
[23:50] Flaming_Sword: silly me, that's where i got spellfire from
[23:50] Annihilator-X17: yerp
[23:50] Annihilator-X17: also, look at the gnome class in there, its another crafter
[23:51] Annihilator-X17: not going to say you should do that one though
[23:51] Flaming_Sword: and to think i thought it would only take a week when i started it :P
[23:52] Annihilator-X17: take the amount of time and x4 and its usually closer
[23:52] Flaming_Sword: i think it's been 6x already
[23:53] Annihilator-X17: that long? yikes ;p
[23:53] Annihilator-X17: sounds like psionics, 19th months or so
[23:53] Flaming_Sword: lol
[23:54] Annihilator-X17: partly that was me being lazy
[23:54] Flaming_Sword: happens to me all the time :P
[23:54] Annihilator-X17: yerp
[23:58] Stratovarius: You see Attune Gem and the Gnome Arti or whatever its called?
[23:58] Flaming_Sword: lemme take a look
[00:01] Stratovarius: just going to list crafting feats as I find them
[00:01] Stratovarius: Bind Elemental, ECS p51
[00:02] Flaming_Sword: omg gnome arti's gonna need a whole new thing for crafting devices
[00:02] Stratovarius: Craft Aboleth Glyph LoM 22
[00:02] Stratovarius: Thats why I said you didnt have to do it
[00:02] Stratovarius: Craft Cognizance Crystal, XPH (I think you know of this one)
[00:03] Stratovarius: Craft Contingent Spell, Complete Arcane (have fun here)
[00:03] Flaming_Sword: i've got the xph :)
[00:03] Stratovarius: thought so
[00:03] Stratovarius: Craft Psionic Seal, Lords of Madness
[00:03] Stratovarius: Craft Rune Circle, Races of Stone
[00:03] Stratovarius: Craft Sceptre, LEoF
[00:04] Flaming_Sword: please don't tell me crafting will end up on the same scale as psionics
[00:04] Stratovarius: if you do everything, it will
[00:04] Stratovarius: Craft Skull Talisman, Frostburn
[00:04] Stratovarius: Craft Talisman, OA
[00:04] Flaming_Sword: methinks i'll save this list for later
[00:04] Stratovarius: Create Infusion, Masters of the Wild
[00:05] Stratovarius: Create Portal, FRCS
[00:05] Stratovarius: Dragoncrafter, Draco
[00:05] Stratovarius: Great Crafter, OA
[00:05] *** Tenjac|Work is now known as Tenjac.
[00:07] Primogenitor: And the epic crafting feats ;)
[00:07] Primogenitor: With the golems, I could make 1-level varients rather than 5-level if required
[00:08] Stratovarius: Thats all of em that are in the consolidated list
[00:08] Stratovarius: so its not as bad as it sounded at first
[00:08] Stratovarius: skipping most of the XPH ones of course
[00:08] Flaming_Sword: i think i've already taken the epic ones in the srd into account
[00:08] Stratovarius: I think you did
Changes since 3.1a3 (that i can remember, anyway)
Disabled change appearance option since it doesn't do anything except screw the game
Fixed TMI with armour with skill bonuses
Fixed skill check reading a non-existent 2da
Added ranged weapon support (including ammo and thrown weapons, largely untested)
Modified 2das to allow actual enhancement and damage bonuses on ranged weapons that are conferred upon their ammo (see above)
Filtered some properties for ranged weapons because onhit properties don't work on them :(
Fixed display bug for bane weapons (untested)
Fixed spell/power prerequisite checking
Fixed some 2da errors
Added time cost notification
Added support for an extra time scale switch (PRC_CRAFT_TIMER_MULTIPLIER)
Fixed application of onhit properties
Added support for eventual inclusion of psionic properties (power checking, special materials)
Added option to clone an item (untested)
Cleaned up code a bit

View File

@@ -0,0 +1,29 @@
/*
<SCRIPT NAME>
<DESCRIPTION>
By:
Created:
Modified:
<EXTRA NOTES>
*/
#include "prc_sp_func"
void main()
{
object oCaster = OBJECT_SELF;
int nCasterLevel = PRCGetCasterLevel(oCaster);
int nSpellID = PRCGetSpellId();
PRCSetSchool(GetSpellSchool(nSpellID));
if (!X2PreSpellCastCode()) return;
object oTarget = PRCGetSpellTargetObject();
int nMetaMagic = PRCGetMetaMagicFeat();
int nSaveDC = PRCGetSaveDC(oTarget, oCaster);
int nPenetr = nCasterLevel + SPGetPenetr();
float fMaxDuration = RoundsToSeconds(nCasterLevel); //modify if necessary
PRCSetSchool();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,28 @@
Antimagic/Null Psionics Field
Coding prestige class for lesserhellspawn
Crafting tweaks for PWs - merge craft 2da entries into delimited string, use code for parsing
Sohei resting TMI in PWs
Epic progression for miniatures handbook classes http://www.wizards.com/default.asp?x=dnd/ei/20031206a
Knight of the weave - champions of valour
battlesmith - races of stone
artificer
shadow smith
weapons of legacy
tome of battle - weapons of legacy
magic of incarnum
http://www.wizards.com/default.asp?x=dnd/psm/20050830a
http://www.wizards.com/default.asp?x=dnd/psm/20050930a
http://www.wizards.com/default.asp?x=dnd/psm/20060217a

View File

@@ -0,0 +1,4 @@
oi, no putting passwords to my webserver in here :p
Smith Gloomy Winter's Now Away - Custer La Rue, s; Chris Norman, wooden f; Kim Robertson, celtic h
ABC 461 728-2 "From Winter's Stillness" 5.19

View File

@@ -0,0 +1,118 @@
/*
----------------
Null Psionics Field
psi_pow_npf
----------------
6/10/05 by Stratovarius
*/ /** @file
Null Psionics Field
Psychokinesis
Level: Kineticist 6
Manifesting Time: 1 standard action
Range: 10 ft.
Area: 10-ft.-radius emanation centered on you
Duration: 10 min./level(D)
Saving Throw: None
Power Resistance: See text
Power Points: 11
Metapsionics: Extend, Widen
An invisible barrier surrounds you and moves with you. The space within this
barrier is impervious to most psionic effects, including powers, psi-like
abilities, and supernatural abilities. Likewise, it prevents the functioning
of any psionic items or powers within its confines. A null psionics field
negates any power or psionic effect used within, brought into, or manifested
into its area.
Dispel psionics does not remove the field. Two or more null psionics fields
sharing any of the same space have no effect on each other. Certain powers
may be unaffected by null psionics field (see the individual power
descriptions).
Implementation note: To dismiss the power, use the control feat again. If
the power is active, that will end it instead of
manifesting it.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_alterations"
int PresenceCheck(object oManifester);
void main()
{
object oManifester = OBJECT_SELF;
// Check if NPF is already active on the manifester
if(PresenceCheck(oManifester))
{
PRCRemoveSpellEffects(POWER_NULL_PSIONICS_FIELD, oManifester, oManifester);
return;
}
// Psihook
if(!PsiPrePowerCastCode()) return;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif =
EvaluateManifestation(oManifester, oTarget,
PowerAugmentationProfile(),
METAPSIONIC_EXTEND | METAPSIONIC_WIDEN
);
if(manif.bCanManifest)
{
int nAoEIndex = manif.bWiden ? AOE_PER_NULL_PSIONICS_FIELD_WIDENED : AOE_PER_NULL_PSIONICS_FIELD;
float fDuration = 600.0f * manif.nManifesterLevel;
if(manif.bExtend) fDuration *= 2;
// Apply the AoE effect
effect eAOE = EffectAreaOfEffect(nAoEIndex);
// This power is not dispellable
eAOE = ExtraordinaryEffect(eAOE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration);
/* Probably not necessary
// Get an object reference to the newly created AoE
location lTarget = GetLocation(oTarget);
object oAoE = GetFirstObjectInShape(SHAPE_SPHERE, 1.0f, lTarget, FALSE, OBJECT_TYPE_AREA_OF_EFFECT);
while(GetIsObjectValid(oAoE))
{
// Test if we found the correct AoE
if(GetTag(oAoE) == Get2DACache("vfx_persistent", "LABEL", nAoEIndex) &&
!GetLocalInt(oAoE, "PRC_NullPsionicsField_Inited")
)
{
break;
}
// Didn't find, get next
oAoE = GetNextObjectInShape(SHAPE_SPHERE, 1.0f, lTarget, FALSE, OBJECT_TYPE_AREA_OF_EFFECT);
}
SetLocalInt(oAoE, "PRC_NullPsionicsField_Inited", TRUE);
*/
}// end if - Successfull manifestation
}
int PresenceCheck(object oManifester)
{
effect eTest = GetFirstEffect(oManifester);
while(GetIsEffectValid(eTest))
{
if(GetEffectSpellId(eTest) == POWER_NULL_PSIONICS_FIELD &&
GetEffectType(eTest) == EFFECT_TYPE_AREA_OF_EFFECT &&
GetEffectCreator(eTest) == oManifester
)
return TRUE;
eTest = GetNextEffect(oManifester);
}
return FALSE;
}

View File

@@ -0,0 +1,233 @@
/*
----------------
Null Psionics Field - OnEnter
psi_pow_npfent
----------------
6/10/05 by Stratovarius
Modified: Nov 1, 2007 - Flaming_Sword
*/ /** @file
Null Psionics Field - OnEnter
Psychokinesis
Level: Kineticist 6
Manifesting Time: 1 standard action
Range: 10 ft.
Area: 10-ft.-radius emanation centered on you
Duration: 10 min./level(D)
Saving Throw: None
Power Resistance: See text
Power Points: 11
Metapsionics: Extend, Widen
An invisible barrier surrounds you and moves with you. The space within this
barrier is impervious to most psionic effects, including powers, psi-like
abilities, and supernatural abilities. Likewise, it prevents the functioning
of any psionic items or powers within its confines. A null psionics field
negates any power or psionic effect used within, brought into, or manifested
into its area.
Dispel psionics does not remove the field. Two or more null psionics fields
sharing any of the same space have no effect on each other. Certain powers
may be unaffected by null psionics field (see the individual power
descriptions).
Implementation note: To dismiss the power, use the control feat again. If
the power is active, that will end it instead of
manifesting it.
*/
#include "prc_craft_inc"
int GetIsAlcohol(object oItem)
{
itemproperty ip;
ip = GetFirstItemProperty(oItem);
// if there is more than 1 property then this item should be stripped
if(GetIsItemPropertyValid(GetNextItemProperty(oItem)))
return FALSE;
if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
{
if(GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_BEER ||
GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_SPIRITS ||
GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_WINE)
return TRUE;
}
return FALSE;
}
int GetIsPoisonAmmo(object oItem)
{
itemproperty ip;
ip = GetFirstItemProperty(oItem);
// if there is more than 1 property then this item should be stripped
if(GetIsItemPropertyValid(GetNextItemProperty(oItem)))
return FALSE;
if(IPGetItemHasItemOnHitPropertySubType(oItem, IP_CONST_ONHIT_ITEMPOISON))
return TRUE; // single poison property
return FALSE;
}
int GetIsDyeKit(object oItem)
{
if(GetBaseItemType(oItem) == BASE_ITEM_MISCSMALL)
{
itemproperty ip = GetFirstItemProperty(oItem);
if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
{
int nSubType = GetItemPropertySubType(ip);
return (nSubType >= 490 && nSubType <= 497);
}
return FALSE;
}
return FALSE;
}
void RemoveEffectsNPF(object oObject)
{
effect eEff = GetFirstEffect(oObject);
while(GetIsEffectValid(eEff))
{
int nType = GetEffectType(eEff);
if(GetEffectSubType(eEff) != SUBTYPE_EXTRAORDINARY &&
(nType == EFFECT_TYPE_ABILITY_INCREASE ||
nType == EFFECT_TYPE_AC_INCREASE ||
nType == EFFECT_TYPE_ATTACK_INCREASE ||
nType == EFFECT_TYPE_BLINDNESS ||
nType == EFFECT_TYPE_CHARMED ||
nType == EFFECT_TYPE_CONCEALMENT ||
nType == EFFECT_TYPE_CONFUSED ||
nType == EFFECT_TYPE_CURSE ||
nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE ||
nType == EFFECT_TYPE_DAMAGE_INCREASE ||
nType == EFFECT_TYPE_DAMAGE_REDUCTION ||
nType == EFFECT_TYPE_DAMAGE_RESISTANCE ||
nType == EFFECT_TYPE_DAZED ||
nType == EFFECT_TYPE_DEAF ||
nType == EFFECT_TYPE_DOMINATED ||
nType == EFFECT_TYPE_ELEMENTALSHIELD ||
nType == EFFECT_TYPE_ETHEREAL ||
nType == EFFECT_TYPE_FRIGHTENED ||
nType == EFFECT_TYPE_HASTE ||
nType == EFFECT_TYPE_IMMUNITY ||
nType == EFFECT_TYPE_IMPROVEDINVISIBILITY ||
nType == EFFECT_TYPE_INVISIBILITY ||
nType == EFFECT_TYPE_INVULNERABLE ||
nType == EFFECT_TYPE_ABILITY_INCREASE ||
nType == EFFECT_TYPE_NEGATIVELEVEL ||
nType == EFFECT_TYPE_PARALYZE ||
nType == EFFECT_TYPE_POLYMORPH ||
nType == EFFECT_TYPE_REGENERATE ||
nType == EFFECT_TYPE_SANCTUARY ||
nType == EFFECT_TYPE_SAVING_THROW_INCREASE ||
nType == EFFECT_TYPE_SEEINVISIBLE ||
nType == EFFECT_TYPE_SILENCE ||
nType == EFFECT_TYPE_SKILL_INCREASE ||
nType == EFFECT_TYPE_SLOW ||
nType == EFFECT_TYPE_SPELL_IMMUNITY ||
nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE ||
nType == EFFECT_TYPE_SPELLLEVELABSORPTION ||
nType == EFFECT_TYPE_TEMPORARY_HITPOINTS ||
nType == EFFECT_TYPE_TRUESEEING ||
nType == EFFECT_TYPE_ULTRAVISION ||
nType == EFFECT_TYPE_INVULNERABLE
)
)
RemoveEffect(oObject, eEff);
eEff = GetNextEffect(oObject);
}
}
int GetIsExempt(object oItem)
{
return (GetIsAlcohol(oItem) || GetIsPoisonAmmo(oItem) || GetIsDyeKit(oItem));
}
//Stores the itemprops of an item in a persistent array
void StoreItemprops(object oCreature, object oItem, int nObjectCount, int bRemove)
{
string sItem = ObjectToString(oItem);
string sIP;
int nIpCount = 0;
itemproperty ip = GetFirstItemProperty(oItem);
string sCreature = GetName(oCreature);
string sItemName = GetName(oItem);
persistant_array_set_object(oCreature, "PRC_NPF_ItemList_obj", nObjectCount, oItem);
persistant_array_set_string(oCreature, "PRC_NPF_ItemList_str", nObjectCount, sItem);
persistant_array_create(oCreature, "PRC_NPF_ItemList_" + sItem); //stores object strings
if(DEBUG) DoDebug("StoreItemprops: " + sCreature + ", " + sItemName + ", " + sItem);
while(GetIsItemPropertyValid(ip))
{
if(GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
{ //only store the permanent ones as underscore delimited strings
sIP = IntToString(GetItemPropertyType(ip)) + "_" +
IntToString(GetItemPropertySubType(ip)) + "_" +
IntToString(GetItemPropertyCostTableValue(ip)) + "_" +
IntToString(GetItemPropertyParam1Value(ip));
if(DEBUG) DoDebug("StoreItemprops: " + sCreature + ", " + sItem + ", " + sIP);
persistant_array_set_string(oCreature, "PRC_NPF_ItemList_" + sItem, nIpCount++, sIP);
}
if(bRemove)
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
}
//Stores an array of objects and their itemprops
void StoreObjects(object oCreature, int bRemove = TRUE)
{
int nSlotMax = INVENTORY_SLOT_CWEAPON_L; //max slot number, to exempt creature items
int i;
int nObjectCount = 0;
object oItem;
persistant_array_create(oCreature, "PRC_NPF_ItemList_obj"); //stores objects
persistant_array_create(oCreature, "PRC_NPF_ItemList_str"); //stores object strings
for(i = 0; i < nSlotMax; i++) //equipped items
{
oItem = GetItemInSlot(i, oCreature);
if(GetIsObjectValid(oItem) && !GetIsExempt(oItem))
{
if((i < INVENTORY_SLOT_ARROWS && i > INVENTORY_SLOT_BOLTS) || !GetIsPoisonAmmo(oItem)) //ammo placeholders
{
StoreItemprops(oCreature, oItem, nObjectCount++, bRemove);
}
}
}
oItem = GetFirstItemInInventory(oCreature);
while(GetIsObjectValid(oItem) && !GetIsExempt(oItem))
{
StoreItemprops(oCreature, oItem, nObjectCount++, bRemove);
oItem = GetNextItemInInventory(oCreature);
}
}
void main()
{ //testing code
object oEnter = GetFirstPC(); //GetEnteringObject();
if(GetObjectType(oEnter) == OBJECT_TYPE_CREATURE && !GetPlotFlag(oEnter) && !GetIsDM(oEnter) && !GetPersistantLocalInt(oEnter, "NullPsionicsField"))
{
if(DEBUG) DoDebug("psi_pow_npfent: Creatured entered Null Psionics Field: " + DebugObject2Str(oEnter));
SetPersistantLocalInt(oEnter, "NullPsionicsField", TRUE);
// Set the marker variable
SetLocalInt(oEnter, "NullPsionicsField", TRUE);
// Remove all non-extraordinary effects
RemoveEffectsNPF(oEnter);
// Apply absolute spell failure
effect eSpellFailure = EffectSpellFailure(100, SPELL_SCHOOL_GENERAL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpellFailure, oEnter);
// Store itemproperties and remove them from objects
StoreObjects(oEnter);
}
}

View File

@@ -0,0 +1,107 @@
/*
----------------
Null Psionics Field - OnExit
psi_pow_npfext
----------------
6/10/05 by Stratovarius
Modified: Nov 1, 2007 - Flaming_Sword
*/ /** @file
Null Psionics Field - OnExit
Psychokinesis
Level: Kineticist 6
Manifesting Time: 1 standard action
Range: 10 ft.
Area: 10-ft.-radius emanation centered on you
Duration: 10 min./level(D)
Saving Throw: None
Power Resistance: See text
Power Points: 11
Metapsionics: Extend, Widen
An invisible barrier surrounds you and moves with you. The space within this
barrier is impervious to most psionic effects, including powers, psi-like
abilities, and supernatural abilities. Likewise, it prevents the functioning
of any psionic items or powers within its confines. A null psionics field
negates any power or psionic effect used within, brought into, or manifested
into its area.
Dispel psionics does not remove the field. Two or more null psionics fields
sharing any of the same space have no effect on each other. Certain powers
may be unaffected by null psionics field (see the individual power
descriptions).
Implementation note: To dismiss the power, use the control feat again. If
the power is active, that will end it instead of
manifesting it.
*/
#include "prc_craft_inc"
void RemoveEffectsNPF(object oObject)
{
effect eEff = GetFirstEffect(oObject);
while(GetIsEffectValid(eEff))
{
if(GetEffectType(eEff) == EFFECT_TYPE_SPELL_FAILURE)
RemoveEffect(oObject, eEff);
eEff = GetNextEffect(oObject);
}
}
//Restores object itemprops
void RestoreObjects(object oCreature)
{
int i = 0;
int j = 0;
int nIP = 0;
object oItem;
string sItem;
itemproperty ip;
string sIP;
struct ipstruct iptemp;
string sCreature = GetName(oCreature);
string sItemName;
int nSize = persistant_array_get_size(oCreature, "PRC_NPF_ItemList_obj");
for(i = 0; i < nSize; i++)
{
oItem = persistant_array_get_object(oCreature, "PRC_NPF_ItemList_obj", i);
sItem = persistant_array_get_string(oCreature, "PRC_NPF_ItemList_str", i);
sItemName = GetName(oItem);
if(DEBUG)
{
DoDebug("RestoreObjects: " + sCreature + ", " + sItemName + ", " + sItem + ", " + ObjectToString(oItem));
}
nIP = persistant_array_get_size(oCreature, "PRC_NPF_ItemList_" + sItem);
for(j = 0; j < nIP; j++)
{
sIP = persistant_array_get_string(oCreature, "PRC_NPF_ItemList_" + sItem, j);
iptemp = GetIpStructFromString(sIP);
ip = ConstructIP(iptemp.type, iptemp.subtype, iptemp.costtablevalue, iptemp.param1value);
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
if(DEBUG) DoDebug("RestoreObjects: " + sCreature + ", " + sItem + ", " + sIP);
}
persistant_array_delete(oCreature, "PRC_NPF_ItemList_" + sItem);
}
persistant_array_delete(oCreature, "PRC_NPF_ItemList_obj");
persistant_array_delete(oCreature, "PRC_NPF_ItemList_str");
}
void main()
{
object oExit = GetExitingObject();
if(GetObjectType(oExit) == OBJECT_TYPE_CREATURE)
{
if(DEBUG) DoDebug("psi_pow_npfext: Creature exiting NPF: " + DebugObject2Str(oExit));
DeleteLocalInt(oExit, "NullPsionicsField");
RemoveEffectsNPF(oExit);
// Restore objects
RestoreObjects(oExit);
}
}

View File

@@ -0,0 +1,277 @@
/*
----------------
Null Psionics Field - OnEnter
psi_pow_npfent
----------------
6/10/05 by Stratovarius
Null Psionics Field Testing Code
Modified: Nov 1, 2007 - Flaming_Sword
*/ /** @file
Null Psionics Field - OnEnter
Psychokinesis
Level: Kineticist 6
Manifesting Time: 1 standard action
Range: 10 ft.
Area: 10-ft.-radius emanation centered on you
Duration: 10 min./level(D)
Saving Throw: None
Power Resistance: See text
Power Points: 11
Metapsionics: Extend, Widen
An invisible barrier surrounds you and moves with you. The space within this
barrier is impervious to most psionic effects, including powers, psi-like
abilities, and supernatural abilities. Likewise, it prevents the functioning
of any psionic items or powers within its confines. A null psionics field
negates any power or psionic effect used within, brought into, or manifested
into its area.
Dispel psionics does not remove the field. Two or more null psionics fields
sharing any of the same space have no effect on each other. Certain powers
may be unaffected by null psionics field (see the individual power
descriptions).
Implementation note: To dismiss the power, use the control feat again. If
the power is active, that will end it instead of
manifesting it.
*/
#include "prc_craft_inc"
int GetIsAlcohol(object oItem)
{
itemproperty ip;
ip = GetFirstItemProperty(oItem);
// if there is more than 1 property then this item should be stripped
if(GetIsItemPropertyValid(GetNextItemProperty(oItem)))
return FALSE;
if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
{
if(GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_BEER ||
GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_SPIRITS ||
GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_WINE)
return TRUE;
}
return FALSE;
}
int GetIsPoisonAmmo(object oItem)
{
itemproperty ip;
ip = GetFirstItemProperty(oItem);
// if there is more than 1 property then this item should be stripped
if(GetIsItemPropertyValid(GetNextItemProperty(oItem)))
return FALSE;
if(IPGetItemHasItemOnHitPropertySubType(oItem, IP_CONST_ONHIT_ITEMPOISON))
return TRUE; // single poison property
return FALSE;
}
int GetIsDyeKit(object oItem)
{
if(GetBaseItemType(oItem) == BASE_ITEM_MISCSMALL)
{
itemproperty ip = GetFirstItemProperty(oItem);
if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
{
int nSubType = GetItemPropertySubType(ip);
return (nSubType >= 490 && nSubType <= 497);
}
return FALSE;
}
return FALSE;
}
void RemoveEffectsNPF(object oObject)
{
effect eEff = GetFirstEffect(oObject);
while(GetIsEffectValid(eEff))
{
int nType = GetEffectType(eEff);
if(GetEffectSubType(eEff) != SUBTYPE_EXTRAORDINARY &&
(nType == EFFECT_TYPE_ABILITY_INCREASE ||
nType == EFFECT_TYPE_AC_INCREASE ||
nType == EFFECT_TYPE_ATTACK_INCREASE ||
nType == EFFECT_TYPE_BLINDNESS ||
nType == EFFECT_TYPE_CHARMED ||
nType == EFFECT_TYPE_CONCEALMENT ||
nType == EFFECT_TYPE_CONFUSED ||
nType == EFFECT_TYPE_CURSE ||
nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE ||
nType == EFFECT_TYPE_DAMAGE_INCREASE ||
nType == EFFECT_TYPE_DAMAGE_REDUCTION ||
nType == EFFECT_TYPE_DAMAGE_RESISTANCE ||
nType == EFFECT_TYPE_DAZED ||
nType == EFFECT_TYPE_DEAF ||
nType == EFFECT_TYPE_DOMINATED ||
nType == EFFECT_TYPE_ELEMENTALSHIELD ||
nType == EFFECT_TYPE_ETHEREAL ||
nType == EFFECT_TYPE_FRIGHTENED ||
nType == EFFECT_TYPE_HASTE ||
nType == EFFECT_TYPE_IMMUNITY ||
nType == EFFECT_TYPE_IMPROVEDINVISIBILITY ||
nType == EFFECT_TYPE_INVISIBILITY ||
nType == EFFECT_TYPE_INVULNERABLE ||
nType == EFFECT_TYPE_ABILITY_INCREASE ||
nType == EFFECT_TYPE_NEGATIVELEVEL ||
nType == EFFECT_TYPE_PARALYZE ||
nType == EFFECT_TYPE_POLYMORPH ||
nType == EFFECT_TYPE_REGENERATE ||
nType == EFFECT_TYPE_SANCTUARY ||
nType == EFFECT_TYPE_SAVING_THROW_INCREASE ||
nType == EFFECT_TYPE_SEEINVISIBLE ||
nType == EFFECT_TYPE_SILENCE ||
nType == EFFECT_TYPE_SKILL_INCREASE ||
nType == EFFECT_TYPE_SLOW ||
nType == EFFECT_TYPE_SPELL_IMMUNITY ||
nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE ||
nType == EFFECT_TYPE_SPELLLEVELABSORPTION ||
nType == EFFECT_TYPE_TEMPORARY_HITPOINTS ||
nType == EFFECT_TYPE_TRUESEEING ||
nType == EFFECT_TYPE_ULTRAVISION ||
nType == EFFECT_TYPE_INVULNERABLE
)
)
RemoveEffect(oObject, eEff);
eEff = GetNextEffect(oObject);
}
}
int GetIsExempt(object oItem)
{
return (GetIsAlcohol(oItem) || GetIsPoisonAmmo(oItem) || GetIsDyeKit(oItem));
}
//Stores the itemprops of an item in a persistent array
void StoreItemprops(object oCreature, object oItem, int nObjectCount, int bRemove)
{
string sItem = ObjectToString(oItem);
string sIP;
int nIpCount = 0;
itemproperty ip = GetFirstItemProperty(oItem);
string sCreature = GetName(oCreature);
string sItemName = GetName(oItem);
persistant_array_set_object(oCreature, "PRC_NPF_ItemList_obj", nObjectCount, oItem);
persistant_array_set_string(oCreature, "PRC_NPF_ItemList_str", nObjectCount, sItem);
persistant_array_create(oCreature, "PRC_NPF_ItemList_" + sItem); //stores object strings
if(DEBUG) DoDebug("StoreItemprops: " + sCreature + ", " + sItemName + ", " + sItem);
while(GetIsItemPropertyValid(ip))
{
if(GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
{ //only store the permanent ones as underscore delimited strings
sIP = IntToString(GetItemPropertyType(ip)) + "_" +
IntToString(GetItemPropertySubType(ip)) + "_" +
IntToString(GetItemPropertyCostTableValue(ip)) + "_" +
IntToString(GetItemPropertyParam1Value(ip));
if(DEBUG) DoDebug("StoreItemprops: " + sCreature + ", " + sItem + ", " + sIP);
persistant_array_set_string(oCreature, "PRC_NPF_ItemList_" + sItem, nIpCount++, sIP);
}
if(bRemove)
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
}
//Stores an array of objects and their itemprops
void StoreObjects(object oCreature, int bRemove = TRUE)
{
int nSlotMax = INVENTORY_SLOT_CWEAPON_L; //max slot number, to exempt creature items
int i;
int nObjectCount = 0;
object oItem;
persistant_array_create(oCreature, "PRC_NPF_ItemList_obj"); //stores objects
persistant_array_create(oCreature, "PRC_NPF_ItemList_str"); //stores object strings
for(i = 0; i < nSlotMax; i++) //equipped items
{
oItem = GetItemInSlot(i, oCreature);
if(GetIsObjectValid(oItem) && !GetIsExempt(oItem))
{
if((i < INVENTORY_SLOT_ARROWS && i > INVENTORY_SLOT_BOLTS) || !GetIsPoisonAmmo(oItem)) //ammo placeholders
{
StoreItemprops(oCreature, oItem, nObjectCount++, bRemove);
}
}
}
oItem = GetFirstItemInInventory(oCreature);
while(GetIsObjectValid(oItem) && !GetIsExempt(oItem))
{
StoreItemprops(oCreature, oItem, nObjectCount++, bRemove);
oItem = GetNextItemInInventory(oCreature);
}
}
//Restores object itemprops
void RestoreObjects(object oCreature)
{
int i = 0;
int j = 0;
int nIP = 0;
object oItem;
string sItem;
itemproperty ip;
string sIP;
struct ipstruct iptemp;
string sCreature = GetName(oCreature);
string sItemName;
int nSize = persistant_array_get_size(oCreature, "PRC_NPF_ItemList_obj");
for(i = 0; i < nSize; i++)
{
oItem = persistant_array_get_object(oCreature, "PRC_NPF_ItemList_obj", i);
sItem = persistant_array_get_string(oCreature, "PRC_NPF_ItemList_str", i);
sItemName = GetName(oItem);
if(DEBUG)
{
DoDebug("RestoreObjects: " + sCreature + ", " + sItemName + ", " + sItem + ", " + ObjectToString(oItem));
}
nIP = persistant_array_get_size(oCreature, "PRC_NPF_ItemList_" + sItem);
for(j = 0; j < nIP; j++)
{
sIP = persistant_array_get_string(oCreature, "PRC_NPF_ItemList_" + sItem, j);
iptemp = GetIpStructFromString(sIP);
ip = ConstructIP(iptemp.type, iptemp.subtype, iptemp.costtablevalue, iptemp.param1value);
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
if(DEBUG) DoDebug("RestoreObjects: " + sCreature + ", " + sItem + ", " + sIP);
}
persistant_array_delete(oCreature, "PRC_NPF_ItemList_" + sItem);
}
persistant_array_delete(oCreature, "PRC_NPF_ItemList_obj");
persistant_array_delete(oCreature, "PRC_NPF_ItemList_str");
}
void main()
{ //testing code
object oEnter = GetFirstPC(); //GetEnteringObject();
if(GetObjectType(oEnter) == OBJECT_TYPE_CREATURE && !GetPlotFlag(oEnter) && !GetIsDM(oEnter) && !GetPersistantLocalInt(oEnter, "NullPsionicsField"))
{
if(DEBUG) DoDebug("psi_pow_npfent: Creatured entered Null Psionics Field: " + DebugObject2Str(oEnter));
/*
SetPersistantLocalInt(oEnter, "NullPsionicsField", TRUE);
// Set the marker variable
SetLocalInt(oEnter, "NullPsionicsField", TRUE);
// Remove all non-extraordinary effects
RemoveEffectsNPF(oEnter);
// Apply absolute spell failure
effect eSpellFailure = EffectSpellFailure(100, SPELL_SCHOOL_GENERAL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpellFailure, oEnter);
*/
// Store itemproperties and remove them from objects
StoreObjects(oEnter);
// Restore objects
RestoreObjects(oEnter);
}
}

Binary file not shown.

View File

@@ -0,0 +1,44 @@
2DA V2.0
Name Label Description CasterType Level Skills DC Spells MarketPrice SpecialCost Size AppearanceSize HD Blueprint Epic Special
0 12572 Clay 12571 **** 11 38 15 1790_COMMUNE_153_*_*_* 40000 1500 4 4 11_18_33 **** 0 ****
1 12574 Flesh 12573 **** 8 38_4 13 2_9_LIMITED-WISH_*_GEAS/QUEST 20000 500 4 4 9_18_27 **** 0 ****
2 12576 Iron 12575 **** 16 25_26 20 23_POLYMORPH-ANY-OBJECT_LIMITED-WISH_*_GEAS/QUEST 150000 10000 4 4 18_24_54 **** 0 ****
3 12578 Stone 12577 **** 14 38 17 2076_SYMBOL-OF-STUNNING_*_*_GEAS/QUEST 90000 5000 4 4 14_21_42 **** 0 ****
4 0 Homunculus 0 **** 4 38 12 3659_3209_MENDING_*_*_* 2000 50 1 1 2_6_-1 **** 0 1
5 12693 Shield_Guardian 12692 **** 15 38 16 3656_417_LIMITED-WISH_SHIELD-OTHER_*_* 120000 5000 4 4 15_24_45 **** 0 1
6 111381 Ruby 111382 **** 16 38_4 15 LIMITED-WISH_MOVE-EARTH_POLYMORPH-ANY-OBJECT_STONE-SHAPE_*_* 40000 1500 4 4 10_20_30 **** 0 ****
7 111379 Emerald 111380 **** 17 38_4 15 2889_POLYMORPH-ANY-OBJECT_STONE-SHAPE_2877_*_* 40000 1500 4 4 12_24_36 **** 0 ****
8 111377 Diamond 111378 **** 16 38_4 16 41_LIMITED-WISH_POLYMORPH-ANY-OBJECT_STONE-SHAPE_183_* 40000 1500 4 4 14_28_42 **** 0 ****
9 84195 Demonflesh 86785 **** 18 7_4 20 36_366_367_128_UNHOLY-AURA_UNHOLY-BLIGHT_GEAS/QUEST 260000 1000 5 4 24_36_72 **** 1 ****
10 90391 Mithral 84406 **** 25 25_26 30 78_POLYMORPH-ANY-OBJECT_WISH_GEAS/QUEST 500000 5000 5 4 36_54_72 **** 1 ****
11 90392 Adamantine 84405 **** 30 25_26 40 463_POLYMORPH-ANY-OBJECT_WISH_GEAS/QUEST 1000000 25000 5 4 54_82_108 **** 1 ****
12 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
13 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
14 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
15 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
16 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
17 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
18 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
20 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
21 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
22 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
23 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
24 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
26 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
27 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
28 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
29 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
30 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
31 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
32 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
33 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
34 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
35 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
36 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
37 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
38 **** Stained_Glass 0 1 16 38 25 POLYMORPH-ANY-OBJECT_LIMITED-WISH_*_*_GEAS/QUEST 10000 5000 3 3 12_24_36 **** 0 ****
39 **** Brass 0 1 16 25_26 25 POLYMORPH-ANY-OBJECT_LIMITED-WISH_2888_123_GEAS/QUEST 108000 8000 4 4 16_32_48 **** 0 ****
40 **** Dragonflesh 0 1 16 4_7 25 POLYMORPH-ANY-OBJECT_LIMITED-WISH_*_*_GEAS/QUEST 400000 100000 4 4 30_60_90 **** 0 ****

View File

@@ -0,0 +1,26 @@
#include "prc_alterations"
#include "prc_craft_inc"
void main()
{
//struct ipstruct iptemp = GetIpStructFromString("1_*_1_*");
//itemproperty ip = ConstructIP(iptemp.type, iptemp.subtype, iptemp.costtablevalue, iptemp.param1value);
//PrintString(GetItemPropertyString(ip));
DoDebug("fs_test: starting");
//DoDebug(GetItemPropertyString(ip));
object oPC = GetFirstPC();
GetIsSkillSuccessful(oPC, SKILL_PERFORM, 10);
GetIsSkillSuccessful(oPC, SKILL_PERFORM, 20);
GetIsSkillSuccessful(oPC, SKILL_PERFORM, 20);
GetIsSkillSuccessful(oPC, SKILL_PERFORM, 20);
GetPRCIsSkillSuccessful(oPC, SKILL_PERFORM, 20, d20());
GetPRCIsSkillSuccessful(oPC, SKILL_PERFORM, 20, 10);
GetPRCIsSkillSuccessful(oPC, SKILL_PERFORM, 20, 20);
GetIsSkillSuccessful(oPC, SKILL_PERFORM, 40);
GetPRCIsSkillSuccessful(oPC, SKILL_PERFORM, 40, d20());
GetIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 10);
GetIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 40);
GetIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 1);
//DoDebug(IntToString(PRCGetHasSpell(368, oPC)));
DoDebug("fs_test: ending");
}

View File

@@ -0,0 +1,312 @@
DelayCommand(2.6, MakeLookupLoop(CLASS_TYPE_BLACKGUARD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(2.7, MakeLookupLoop(CLASS_TYPE_ANTI_PALADIN, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(2.8, MakeLookupLoop(CLASS_TYPE_SOLDIER_OF_LIGHT, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(2.9, MakeLookupLoop(CLASS_TYPE_KNIGHT_MIDDLECIRCLE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.0, MakeLookupLoop(CLASS_TYPE_KNIGHT_CHALICE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.1, MakeLookupLoop(CLASS_TYPE_VIGILANT, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.2, MakeLookupLoop(CLASS_TYPE_VASSAL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.3, MakeLookupLoop(CLASS_TYPE_OCULAR, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.4, MakeLookupLoop(CLASS_TYPE_ASSASSIN, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.5, MakeLookupLoop(CLASS_TYPE_SUEL_ARCHANAMACH, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(4.0, MakeLookupLoop(CLASS_TYPE_SHADOWLORD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(4.0, MakeLookupLoop(CLASS_TYPE_BARD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(4.0, MakeLookupLoop(CLASS_TYPE_SORCERER, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(4.2, MakeLookupLoop(CLASS_TYPE_FAVOURED_SOUL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(7.9, MakeLookupLoop(CLASS_TYPE_HEXBLADE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(7.9, MakeLookupLoop(CLASS_TYPE_SOHEI, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(8.9, MakeLookupLoop(CLASS_TYPE_SLAYER_OF_DOMIEL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(9.5, MakeLookupLoop(CLASS_TYPE_DUSKBLADE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(10.2, MakeLookupLoop(CLASS_TYPE_HEALER, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(11.4, MakeLookupLoop(CLASS_TYPE_WARMAGE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "SpellID", "", "GetRowFromSpellID"));
DelayCommand(3.0, MakeSpellIDLevelLoop(CLASS_TYPE_BLACKGUARD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.1, MakeSpellIDLevelLoop(CLASS_TYPE_ANTI_PALADIN, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.2, MakeSpellIDLevelLoop(CLASS_TYPE_SOLDIER_OF_LIGHT, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.3, MakeSpellIDLevelLoop(CLASS_TYPE_KNIGHT_MIDDLECIRCLE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.4, MakeSpellIDLevelLoop(CLASS_TYPE_KNIGHT_CHALICE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.5, MakeSpellIDLevelLoop(CLASS_TYPE_VIGILANT, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.6, MakeSpellIDLevelLoop(CLASS_TYPE_VASSAL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.7, MakeSpellIDLevelLoop(CLASS_TYPE_OCULAR, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.8, MakeSpellIDLevelLoop(CLASS_TYPE_ASSASSIN, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(3.9, MakeSpellIDLevelLoop(CLASS_TYPE_SUEL_ARCHANAMACH, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.0, MakeSpellIDLevelLoop(CLASS_TYPE_SHADOWLORD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.1, MakeSpellIDLevelLoop(CLASS_TYPE_BARD, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.2, MakeSpellIDLevelLoop(CLASS_TYPE_SORCERER, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.3, MakeSpellIDLevelLoop(CLASS_TYPE_FAVOURED_SOUL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.4, MakeSpellIDLevelLoop(CLASS_TYPE_HEXBLADE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.5, MakeSpellIDLevelLoop(CLASS_TYPE_SOHEI, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.6, MakeSpellIDLevelLoop(CLASS_TYPE_SLAYER_OF_DOMIEL, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.7, MakeSpellIDLevelLoop(CLASS_TYPE_DUSKBLADE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.8, MakeSpellIDLevelLoop(CLASS_TYPE_HEALER, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
DelayCommand(4.9, MakeSpellIDLevelLoop(CLASS_TYPE_WARMAGE, 0, GetPRCSwitch(FILE_END_CLASS_SPELLBOOK) , "RealSpellID", "GetRowFromRealSpellID"));
void MakeSpellIDLevelLoop(int nClass, int nMin, int nMax, string sRealColumn,
string sVarNameBase, int nLoopSize = 100, string sTag = "")
{
if(DEBUG) DoDebug("MakeLookupLoop("
+IntToString(nClass)+", "
+IntToString(nMin)+", "
+IntToString(nMax)+", "
+sRealColumn+", "
+sVarNameBase+", "
+IntToString(nLoopSize)+", "
+") : sTag = "+sTag);
string sFile;
// Stuff handled in GetAMSDefinitionFileName()
if(nClass == CLASS_TYPE_PSION ||
nClass == CLASS_TYPE_PSYWAR ||
nClass == CLASS_TYPE_WILDER ||
nClass == CLASS_TYPE_FIST_OF_ZUOKEN ||
nClass == CLASS_TYPE_WARMIND ||
// Add new psionic classes here
// Tome of Battle
nClass == CLASS_TYPE_CRUSADER ||
nClass == CLASS_TYPE_SWORDSAGE ||
nClass == CLASS_TYPE_WARBLADE ||
// Other new caster types
nClass == CLASS_TYPE_TRUENAMER
)
sFile = GetAMSDefinitionFileName(nClass);
// New spellbook class
else
{
sFile = Get2DACache("classes", "FeatsTable", nClass);
//sFile = GetStringLeft(sFile, 4)+"spell"+GetStringRight(sFile, GetStringLength(sFile)-8);
sFile = "cls_spell" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
}
// If on the first iteration, generate the storage token tag
if(sTag == "")
sTag = "PRC_" + sVarNameBase;
// Get the token to store the lookup table on. The token is piggybacked in the 2da cache creature's inventory
object oToken = _inc_lookups_GetCacheObject(sTag);
// Failed to obtain a valid token - nothing to store on
if(!GetIsObjectValid(oToken))
return;
// Starting a new run and the data is present already. Assume the whole thing is present and abort
if(nMin == 0
&& GetLocalInt(oToken, IntToString(StringToInt(Get2DACache(sFile, sRealColumn, nMin + 1)))))//+1 cos 0 is always null
{
DoDebug("MakeSpellIDLevelLoop("+sTag+") restored from database");
return;
}
int i;
int nSource, nDest;
int nTemp = 0;
int nCount = 0;
for(i = nMin; i < nMin + nLoopSize; i++)
{
// None of the relevant 2da files have blank Label entries on rows other than 0. We can assume i is greater than 0 at this point
if(i > 0 && Get2DAString(sFile, "Label", i) == "") // Using Get2DAString() instead of Get2DACache() to avoid caching extra
return;
nSource = StringToInt(Get2DACache(sFile, sRealColumn, i));
if(i != 0)
{
if(nSource == nTemp)
{
nCount += 1;
continue;
}
else
{
nDest = i;
SetLocalInt(oToken, IntToString(nTemp) + "_Count", i);
nCount = 0;
SetLocalInt(oToken, IntToString(nSource) + "_Start", i);
//;
}
}
}
// And delay continuation to avoid TMI
if(i < nMax)
DelayCommand(0.0, MakeSpellIDLevelLoop(nClass, i, nMax, sRealColumn, sVarNameBase, nLoopSize, sTag));
}
void MakeLookupLoop(int nClass, int nMin, int nMax, string sSourceColumn,
string sDestColumn, string sVarNameBase, int nLoopSize = 100, string sTag = "")
void MakeSpellbookLevelLoop(int nClass, int nMin, int nMax, string sVarNameBase,
string sColumnName, string sColumnValue, int nLoopSize = 100, string sTag = "")
{
if(DEBUG) DoDebug("MakeSpellbookLevelLoop("
+IntToString(nClass)+", "
+IntToString(nMin)+", "
+IntToString(nMax)+", "
+sVarNameBase+", "
+sColumnName+", "
+sColumnValue+", "
+IntToString(nLoopSize)+", "
+") : sTag = "+sTag);
/// Determine the 2da to use
int bNewSpellbook = FALSE;
string sFile;
// Stuff handled in GetAMSDefinitionFileName()
if(nClass == CLASS_TYPE_PSION ||
nClass == CLASS_TYPE_PSYWAR ||
nClass == CLASS_TYPE_WILDER ||
nClass == CLASS_TYPE_FIST_OF_ZUOKEN ||
nClass == CLASS_TYPE_WARMIND ||
// Add new psionic classes here
// Tome of Battle
nClass == CLASS_TYPE_CRUSADER ||
nClass == CLASS_TYPE_SWORDSAGE ||
nClass == CLASS_TYPE_WARBLADE ||
// Other new caster types
nClass == CLASS_TYPE_TRUENAMER
)
sFile = GetAMSDefinitionFileName(nClass);
// New spellbook class
else
{
sFile = Get2DACache("classes", "FeatsTable", nClass);
//sFile = GetStringLeft(sFile, 4)+"spell"+GetStringRight(sFile, GetStringLength(sFile)-8);
sFile = "cls_spell" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
bNewSpellbook = TRUE;
}
// If on the first iteration, generate the storage token tag
if(sTag == "")
sTag = sVarNameBase + "_" + IntToString(nClass) + "_" + sColumnName + "_" + sColumnValue;
// Get the token to store the lookup table on. The token is piggybacked in the 2da cache creature's inventory
object oToken = _inc_lookups_GetCacheObject(sTag);
// Failed to obtain a valid token - nothing to store on
if(!GetIsObjectValid(oToken))
return;
// Starting a new run and the array exists already. Assume the whole thing is present and abort
if(nMin == 0 && array_exists(oToken, "Lkup"))
{
DoDebug("MakeSpellbookLevelLoop("+sTag+") restored from database");
return;
}
// New run, create the array
if(nMin == 0)
array_create(oToken, "Lkup");
// Cache loopsize rows
int i;
for(i = nMin; i < nMin + nLoopSize; i++)
{
// None of the relevant 2da files have blank Label entries on rows other than 0. We can assume i is greater than 0 at this point
if(i > 0 && Get2DAString(sFile, "Label", i) == "") // Using Get2DAString() instead of Get2DACache() to avoid caching useless data
return;
if(Get2DACache(sFile, sColumnName, i) == sColumnValue &&
(!bNewSpellbook ||Get2DACache(sFile, "ReqFeat", i) == "") // Only new spellbooks have the ReqFeat column. No sense in caching it for other stuff
)
{
array_set_int(oToken, "Lkup", array_get_size(oToken, "Lkup"), i);
}
}
// And delay continuation to avoid TMI
if(i < nMax)
DelayCommand(0.0, MakeSpellbookLevelLoop(nClass, i, nMax, sVarNameBase, sColumnName, sColumnValue, nLoopSize, sTag));
}
void MakeLookupLoop(int nClass, int nMin, int nMax, string sSourceColumn,
string sDestColumn, string sVarNameBase, int nLoopSize = 100, string sTag = "")
{
if(DEBUG) DoDebug("MakeLookupLoop("
+IntToString(nClass)+", "
+IntToString(nMin)+", "
+IntToString(nMax)+", "
+sSourceColumn+", "
+sDestColumn+", "
+sVarNameBase+", "
+IntToString(nLoopSize)+", "
+") : sTag = "+sTag);
string sFile;
// Stuff handled in GetAMSDefinitionFileName()
if(nClass == CLASS_TYPE_PSION ||
nClass == CLASS_TYPE_PSYWAR ||
nClass == CLASS_TYPE_WILDER ||
nClass == CLASS_TYPE_FIST_OF_ZUOKEN ||
nClass == CLASS_TYPE_WARMIND ||
// Add new psionic classes here
// Tome of Battle
nClass == CLASS_TYPE_CRUSADER ||
nClass == CLASS_TYPE_SWORDSAGE ||
nClass == CLASS_TYPE_WARBLADE ||
// Other new caster types
nClass == CLASS_TYPE_TRUENAMER
)
sFile = GetAMSDefinitionFileName(nClass);
// New spellbook class
else
{
sFile = Get2DACache("classes", "FeatsTable", nClass);
//sFile = GetStringLeft(sFile, 4)+"spell"+GetStringRight(sFile, GetStringLength(sFile)-8);
sFile = "cls_spell" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
}
// If on the first iteration, generate the storage token tag
if(sTag == "")
sTag = "PRC_" + sVarNameBase;
// Get the token to store the lookup table on. The token is piggybacked in the 2da cache creature's inventory
object oToken = _inc_lookups_GetCacheObject(sTag);
// Failed to obtain a valid token - nothing to store on
if(!GetIsObjectValid(oToken))
return;
// Starting a new run and the data is present already. Assume the whole thing is present and abort
if(nMin == 0
&& GetLocalInt(oToken, /*sTag + "_" + */IntToString(StringToInt(Get2DACache(sFile, sSourceColumn, nMin + 1)))))//+1 cos 0 is always null
{
DoDebug("MakeLookupLoop("+sTag+") restored from database");
return;
}
int i;
int nSource, nDest;
for(i = nMin; i < nMin + nLoopSize; i++)
{
// None of the relevant 2da files have blank Label entries on rows other than 0. We can assume i is greater than 0 at this point
if(i > 0 && Get2DAString(sFile, "Label", i) == "") // Using Get2DAString() instead of Get2DACache() to avoid caching extra
return;
// In case of blank source or destination column, use current row index
// Otherwise, read the relevant data from the 2da and convert it to an integer - we assume that the 2da data is numeral
if(sSourceColumn == "") nSource = i;
else nSource = StringToInt(Get2DACache(sFile, sSourceColumn, i));
if(sDestColumn == "") nDest = i;
else nDest = StringToInt(Get2DACache(sFile, sDestColumn, i));
// Skip storing invalid values. The source column value should always be non-zero in valid cases.
// The destination column value might be zero in some cases. However, due to non-presence = 0, it works out OK.
if(nSource != 0 && nDest != 0)
{
if(DEBUG) Assert(!GetLocalInt(oToken, IntToString(nSource)) || (GetLocalInt(oToken, IntToString(nSource)) == nDest),
"!GetLocalInt(" + DebugObject2Str(oToken) + ", IntToString(" + IntToString(nSource) + ")) || GetLocalInt(" + DebugObject2Str(oToken) + ", IntToString(" + IntToString(nSource) + ")) == " + IntToString(nDest) + ")\n"
+ " = !" + IntToString(GetLocalInt(oToken, IntToString(nSource))) + " || " + IntToString(GetLocalInt(oToken, IntToString(nSource))) + " == " + IntToString(nDest)
,
"sFile = " + sFile + "\n"
+ "i = " + IntToString(i)
+ "sSourceColumn = " + sSourceColumn + "\n"
+ "sDestColumn = " + sDestColumn
, "inc_lookups", "MakeLookupLoop");
SetLocalInt(oToken, /*sTag + "_" + */IntToString(nSource), nDest);
}
}
// And delay continuation to avoid TMI
if(i < nMax)
DelayCommand(0.0, MakeLookupLoop(nClass, i, nMax, sSourceColumn, sDestColumn, sVarNameBase, nLoopSize, sTag));
}

View File

@@ -0,0 +1,125 @@
#include "prc_alterations"
#include "prc_craft_inc"
itemproperty ReadIPFrom2DA(string sFile, int nLine, int nIndex)
{
itemproperty ip;
int nTemp;
string sTemp = Get2DACache(sFile, "Type" + IntToString(nIndex), nLine);
if(sTemp == "") return ip;
int nType = StringToInt(sTemp);
int nSubType = StringToInt(Get2DACache(sFile, "SubType" + IntToString(nIndex), nLine));
int nCostTableValue = StringToInt(Get2DACache(sFile, "CostTableValue" + IntToString(nIndex), nLine));
int nParam1Value = StringToInt(Get2DACache(sFile, "Param1Value" + IntToString(nIndex), nLine));
return ConstructIP(nType, nSubType, nCostTableValue, nParam1Value);
}
void DumpCrafting2DAHB(string sFile, int nEnd, int i = 0)
{
string sDesc, sTemp1, sTemp2, sType;
string sName = GetName(GetTempCraftChest());
string sDoubleQuote = GetStringLeft(sName, 1);
itemproperty ip;
int j, nTemp1;
// ";\n
// <entry id="51521" lang="en" sex="m">
sDesc;
sDesc += " <entry id=" + sDoubleQuote;
sDesc += IntToString(StringToInt(Get2DACache(sFile, "Description", i)) - 16777216);
sDesc += sDoubleQuote + " lang=" + sDoubleQuote + "en" + sDoubleQuote + " sex=";
sDesc += sDoubleQuote + "m" + sDoubleQuote + ">";
if(sFile == "craft_wondrous")
{
sDesc += "Base Item: " + GetStringByStrRef(StringToInt(Get2DACache("baseitems", "Name", StringToInt(Get2DACache(sFile, "BaseItem", i))))) + "\n\n";
}
sDesc += "Description: \n\n";
for(j = 1; j <= 6; j++)
{
ip = ReadIPFrom2DA(sFile, i, j);
if(Get2DACache(sFile, "Type" + IntToString(j), i) != "")
sDesc += GetItemPropertyString(ip);
}
sDesc += "\nPrerequisites: \n\n";
sType = Get2DACache(sFile, "PropertyType", i);
if(sType == "M")
sDesc += "Caster ";
else if(sType == "P")
sDesc += "Manifester ";
sDesc += "Level: " + Get2DACache(sFile, "Level", i) + "\n";
sTemp1 = Get2DACache(sFile, "Race", i);
if(sTemp1 != "")
sDesc += "Race: " + GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", StringToInt(sTemp1)))) + "\n";
sTemp1 = Get2DACache(sFile, "Feat", i);
if(sTemp1 != "")
sDesc += "Feat: " + GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", StringToInt(sTemp1)))) + "\n";
sTemp1 = Get2DACache(sFile, "Skill", i);
if(sTemp1 != "")
sDesc += "Skill: " + GetStringByStrRef(StringToInt(Get2DACache("skills", "Name", StringToInt(sTemp1)))) + " " + Get2DACache(sFile, "SkillRanks", i) + " ranks\n";
sTemp1 = Get2DACache(sFile, "AlignGE", i);
sTemp2 = Get2DACache(sFile, "AlignLC", i);
if(sTemp1 != "" || sTemp2 != "")
{
sDesc += "Alignment: ";
if(sTemp1 == "N" && sTemp2 == "N")
sDesc += "True Neutral";
else
{
if(sTemp2 != "")
{
if(sTemp2 == "L") sDesc += "Lawful ";
else if(sTemp2 == "C") sDesc += "Chaotic ";
else if(sTemp2 == "N") sDesc += "Neutral ";
}
if(sTemp1 != "")
{
if(sTemp1 == "G") sDesc += "Good";
else if(sTemp1 == "E") sDesc += "Evil";
else if(sTemp1 == "N") sDesc += "Neutral";
}
}
sDesc += "\n";
}
sTemp1 = Get2DACache(sFile, "SpellPattern", i);
if(sTemp1 != "")
{
nTemp1 = StringToInt(sTemp1);
if(sType == "M")
sDesc += "Spell(s): ";
else if(sType == "P")
sDesc += "Power(s): ";
if(nTemp1 & 1)
sDesc += GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", StringToInt(Get2DACache(sFile, "Spell1", i)))));
if(nTemp1 & 2)
sDesc += ", " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", StringToInt(Get2DACache(sFile, "Spell2", i)))));
if(nTemp1 & 4)
sDesc += ", " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", StringToInt(Get2DACache(sFile, "Spell3", i)))));
if(nTemp1 & 8)
sDesc += ", " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", StringToInt(Get2DACache(sFile, "SpellOR1", i)))));
if(nTemp1 & 16)
sDesc += " or " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", StringToInt(Get2DACache(sFile, "SpellOR2", i)))));
sDesc += "\n";
}
if(StringToInt(Get2DACache(sFile, "Epic", i)))
sDesc += "Epic\n";
sDesc += "\nCost: \n\n";
sTemp1 = Get2DACache(sFile, "Enhancement", i);
if(sTemp1 != "")
sDesc += "+" + sTemp1 + " Enhancement\n";
sTemp1 = Get2DACache(sFile, "AdditionalCost", i);
if(sTemp1 != "")
sDesc += "+" + sTemp1 + "gp\n";
sDesc += "</entry>\n";
PrintString(sDesc);
if(i < nEnd)
DelayCommand(0.01, DumpCrafting2DAHB(sFile, nEnd, i + 1));
else
if(DEBUG) DoDebug("DumpCrafting2DAHB: Finished " + sFile);
}
void main()
{
//DumpCrafting2DAHB("craft_armour", PRCGetFileEnd("craft_armour"), 20);
//DelayCommand(6.0, DumpCrafting2DAHB("craft_weapon", PRCGetFileEnd("craft_weapon"), 20));
DumpCrafting2DAHB("craft_wondrous", 113);
}

View File

@@ -0,0 +1,106 @@
2DA V2.0
Label TrapScript SetDC DetectDCMod DisarmDCMod TrapName ResRef IconResRef
0 MinorSpike NW_T1_SpikeMinoC 5 10 22 6846 NW_IT_TRAP001 iit_trap_009
1 AverageSpike NW_T1_SpikeAvgC 20 10 22 6847 NW_IT_TRAP002 iit_trap_009
2 StrongSpike NW_T1_SpikeStrC 25 10 22 6848 NW_IT_TRAP003 iit_trap_009
3 DeadlySpike NW_T1_SpikeDeadC 35 22 36 6849 NW_IT_TRAP004 iit_trap_009
4 MinorHoly NW_T1_HolyMinoC 15 10 22 6850 NW_IT_TRAP005 iit_trap_006
5 AverageHoly NW_T1_HolyAvgC 20 10 22 6851 NW_IT_TRAP006 iit_trap_006
6 StrongHoly NW_T1_HolyStrC 25 14 26 6852 NW_IT_TRAP007 iit_trap_006
7 DeadlyHoly NW_T1_HolyDeadC 30 14 26 6853 NW_IT_TRAP008 iit_trap_006
8 MinorTangle NW_T1_TangMinoC 15 10 22 6854 NW_IT_TRAP009 iit_trap_010
9 AverageTangle NW_T1_TangAvgC 20 14 26 6855 NW_IT_TRAP010 iit_trap_010
10 StrongTangle NW_T1_TangStrC 25 14 26 6856 NW_IT_TRAP011 iit_trap_010
11 DeadlyTangle NW_T1_TangDeadC 30 18 31 6857 NW_IT_TRAP012 iit_trap_010
12 MinorAcid NW_T1_AcidMinoC 15 10 22 6858 NW_IT_TRAP013 iit_trap_002
13 AverageAcid NW_T1_AcidAvgC 25 14 26 6859 NW_IT_TRAP014 iit_trap_002
14 StrongAcid NW_T1_AcidStrC 30 18 31 6860 NW_IT_TRAP015 iit_trap_002
15 DeadlyAcid NW_T1_AcidDeadC 35 18 31 6861 NW_IT_TRAP016 iit_trap_002
16 MinorFire NW_T1_FireMinoC 20 14 26 6862 NW_IT_TRAP017 iit_trap_004
17 AverageFire NW_T1_FireAvgC 25 14 26 6863 NW_IT_TRAP018 iit_trap_004
18 StrongFire NW_T1_FireStrC 30 18 31 6864 NW_IT_TRAP019 iit_trap_004
19 DeadlyFire NW_T1_FireDeadC 35 22 36 6865 NW_IT_TRAP020 iit_trap_004
20 MinorElectrical NW_T1_ElecMinoC 20 14 26 6866 NW_IT_TRAP021 iit_trap_003
21 AverageElectrical NW_T1_ElecAvgC 25 18 31 6867 NW_IT_TRAP022 iit_trap_003
22 StrongElectrical NW_T1_ElecStrC 30 22 36 6868 NW_IT_TRAP023 iit_trap_003
23 DeadlyElectrical NW_T1_ElecDeadC 35 22 36 6869 NW_IT_TRAP024 iit_trap_003
24 MinorGas NW_T1_GasMinoC 30 18 31 6870 NW_IT_TRAP025 iit_trap_005
25 AverageGas NW_T1_GasAvgC 35 18 31 6871 NW_IT_TRAP026 iit_trap_005
26 StrongGas NW_T1_GasStrC 45 22 36 6872 NW_IT_TRAP027 iit_trap_005
27 DeadlyGas NW_T1_GasDeadC 45 22 36 6873 NW_IT_TRAP028 iit_trap_005
28 MinorFrost NW_T1_ColdMinoC 15 10 22 6874 NW_IT_TRAP029 iit_trap_011
29 AverageFrost NW_T1_ColdAvgC 20 10 22 6875 NW_IT_TRAP030 iit_trap_011
30 StrongFrost NW_T1_ColdStrC 25 10 22 6876 NW_IT_TRAP031 iit_trap_011
31 DeadlyFrost NW_T1_ColdDeadC 30 10 22 6877 NW_IT_TRAP032 iit_trap_011
32 MinorNegative NW_T1_NegMinC 15 10 22 6878 NW_IT_TRAP041 iit_trap_007
33 AverageNegative NW_T1_NegAvgC 20 10 22 6879 NW_IT_TRAP042 iit_trap_007
34 StrongNegative NW_T1_NegStrC 25 14 26 6880 NW_IT_TRAP043 iit_trap_007
35 DeadlyNegative NW_T1_NegDeadC 30 14 26 6881 NW_IT_TRAP044 iit_trap_007
36 MinorSonic NW_T1_SoncMinC 15 10 22 6882 NW_IT_TRAP037 iit_trap_008
37 AverageSonic NW_T1_SoncAvgC 20 10 22 6883 NW_IT_TRAP038 iit_trap_008
38 StrongSonic NW_T1_SoncStrC 25 10 22 6884 NW_IT_TRAP039 iit_trap_008
39 DeadlySonic NW_T1_SoncDeadC 30 10 22 6885 NW_IT_TRAP040 iit_trap_008
40 MinorAcidSplash NW_T1_SplshMinC 15 10 22 6886 NW_IT_TRAP033 iit_trap_001
41 AverageAcidSplash NW_T1_SplshAvgC 20 10 22 6887 NW_IT_TRAP034 iit_trap_001
42 StrongAcidSplash NW_T1_SplshStrC 25 10 22 6888 NW_IT_TRAP035 iit_trap_001
43 DeadlyAcidSplash NW_T1_SplshDeadC 30 10 22 6889 NW_IT_TRAP036 iit_trap_001
44 EpicElectrical X2_T1_ElecEpicC 65 43 58 83329 X2_IT_TRAP001 iit_trap_003
45 EpicFire X2_T1_FireEpicC 65 43 58 83330 X2_IT_TRAP002 iit_trap_004
46 EpicFrost X2_T1_ColdEpicC 65 43 58 83331 X2_IT_TRAP003 iit_trap_011
47 EpicSonic X2_T1_SoncEpicC 65 43 58 83332 X2_IT_TRAP004 iit_trap_008
48 **** **** **** **** **** **** **** ****
49 **** **** **** **** **** **** **** ****
50 **** **** **** **** **** **** **** ****
51 **** **** **** **** **** **** **** ****
52 **** **** **** **** **** **** **** ****
53 **** **** **** **** **** **** **** ****
54 **** **** **** **** **** **** **** ****
55 **** **** **** **** **** **** **** ****
56 **** **** **** **** **** **** **** ****
57 **** **** **** **** **** **** **** ****
58 **** **** **** **** **** **** **** ****
59 **** **** **** **** **** **** **** ****
60 **** **** **** **** **** **** **** ****
61 **** **** **** **** **** **** **** ****
62 **** **** **** **** **** **** **** ****
63 **** **** **** **** **** **** **** ****
64 **** **** **** **** **** **** **** ****
65 **** **** **** **** **** **** **** ****
66 **** **** **** **** **** **** **** ****
67 **** **** **** **** **** **** **** ****
68 **** **** **** **** **** **** **** ****
69 **** **** **** **** **** **** **** ****
70 **** **** **** **** **** **** **** ****
71 **** **** **** **** **** **** **** ****
72 **** **** **** **** **** **** **** ****
73 **** **** **** **** **** **** **** ****
74 **** **** **** **** **** **** **** ****
75 **** **** **** **** **** **** **** ****
76 **** **** **** **** **** **** **** ****
77 **** **** **** **** **** **** **** ****
78 **** **** **** **** **** **** **** ****
79 **** **** **** **** **** **** **** ****
80 **** **** **** **** **** **** **** ****
81 **** **** **** **** **** **** **** ****
82 **** **** **** **** **** **** **** ****
83 **** **** **** **** **** **** **** ****
84 **** **** **** **** **** **** **** ****
85 **** **** **** **** **** **** **** ****
86 **** **** **** **** **** **** **** ****
87 **** **** **** **** **** **** **** ****
88 **** **** **** **** **** **** **** ****
89 **** **** **** **** **** **** **** ****
90 **** **** **** **** **** **** **** ****
91 **** **** **** **** **** **** **** ****
92 **** **** **** **** **** **** **** ****
93 **** **** **** **** **** **** **** ****
94 **** **** **** **** **** **** **** ****
95 **** **** **** **** **** **** **** ****
96 **** **** **** **** **** **** **** ****
97 **** **** **** **** **** **** **** ****
98 **** **** **** **** **** **** **** ****
99 **** **** **** **** **** **** **** ****
100 PRGT **** 0 0 0 **** prgt_kit iit_trap_009
101 TeleCircle prc_telecirc_trg **** 0 34 16825707 **** ****
102 Symbol **** **** 25 25 **** **** ****