2025/09/07 Update

Added Amulet of Mighty Fists +1 thru +5.
Added Greenbound template.
Fixed Evolved & Paragon templates.
Updated several area names.
This commit is contained in:
Jaysyn904 2025-09-07 17:32:31 -04:00
parent 1771fadbad
commit 0b5b6912d2
54 changed files with 5367 additions and 176 deletions

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Alchemists Shop"
"0": "Town of Ascension: Alchemists Shop"
}
},
"NoRest": {
@ -552,7 +552,7 @@
},
"Version": {
"type": "dword",
"value": 127
"value": 129
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Armor Shop"
"0": "Town of Ascension: Armor Shop"
}
},
"NoRest": {
@ -413,13 +413,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tin01"
},
"Version": {
"type": "dword",
"value": 55
"value": 56
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Ascension Sewer"
"0": "Town of Ascension: Sewers"
}
},
"NoRest": {
@ -2907,13 +2907,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tds01"
},
"Version": {
"type": "dword",
"value": 27
"value": 28
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Cellar"
"0": "Town of Ascension: Cellar"
}
},
"NoRest": {
@ -1187,13 +1187,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tic01"
},
"Version": {
"type": "dword",
"value": 7
"value": 8
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Item Shop"
"0": "Town of Ascension: Item Shop"
}
},
"NoRest": {
@ -413,13 +413,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tin01"
},
"Version": {
"type": "dword",
"value": 44
"value": 45
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Merchant's Emporium"
"0": "Town of Ascension: Merchant's Emporium"
}
},
"NoRest": {
@ -1015,13 +1015,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tin01"
},
"Version": {
"type": "dword",
"value": 51
"value": 53
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Overspawning Jail"
"0": "| Overspawning Jail |"
}
},
"NoRest": {
@ -843,13 +843,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tic01"
},
"Version": {
"type": "dword",
"value": 9
"value": 10
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Sage's Home"
"0": "Town of Ascension: Sage's Home"
}
},
"NoRest": {
@ -542,13 +542,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tic01"
},
"Version": {
"type": "dword",
"value": 37
"value": 38
},
"Width": {
"type": "int",

View File

@ -6357,7 +6357,7 @@
},
"Version": {
"type": "dword",
"value": 522
"value": 525
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Trespasser's Tavern"
"0": "Town of Ascension: Trespasser's Tavern"
}
},
"NoRest": {
@ -1230,13 +1230,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tin01"
},
"Version": {
"type": "dword",
"value": 209
"value": 210
},
"Width": {
"type": "int",

View File

@ -87,7 +87,7 @@
"Name": {
"type": "cexolocstring",
"value": {
"0": "Weapons Shop"
"0": "Town of Ascension: Weapons Shop"
}
},
"NoRest": {
@ -413,13 +413,17 @@
}
]
},
"TileBrdrDisabled": {
"type": "byte",
"value": 0
},
"Tileset": {
"type": "resref",
"value": "tin01"
},
"Version": {
"type": "dword",
"value": 37
"value": 38
},
"Width": {
"type": "int",

View File

@ -2957,7 +2957,7 @@
"__struct_id": 2,
"Orientation": {
"type": "float",
"value": -3.092489242553711
"value": -3.092488765716553
},
"X": {
"type": "float",
@ -3182,7 +3182,7 @@
"__struct_id": 2,
"Orientation": {
"type": "float",
"value": 3.092488765716553
"value": 3.092488288879395
},
"X": {
"type": "float",
@ -5267,7 +5267,7 @@
"__struct_id": 2,
"Orientation": {
"type": "float",
"value": 3.092488765716553
"value": 3.092488288879395
},
"X": {
"type": "float",
@ -5815,7 +5815,7 @@
"__struct_id": 2,
"Orientation": {
"type": "float",
"value": -3.092489242553711
"value": -3.092488765716553
},
"X": {
"type": "float",

File diff suppressed because it is too large Load Diff

View File

@ -13450,11 +13450,11 @@
},
"X": {
"type": "float",
"value": 71.30510711669922
"value": 71.24748992919922
},
"Y": {
"type": "float",
"value": 75.04737854003906
"value": 75.09403228759766
},
"Z": {
"type": "float",
@ -27841,7 +27841,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_MAGIC"
},
"TemplateResRef": {
"type": "resref",
@ -27905,7 +27905,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_WEAPONS"
},
"TemplateResRef": {
"type": "resref",
@ -27969,7 +27969,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_ARMOR"
},
"TemplateResRef": {
"type": "resref",
@ -28033,7 +28033,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_TAVERN"
},
"TemplateResRef": {
"type": "resref",
@ -30253,7 +30253,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_CLOTHES"
},
"TemplateResRef": {
"type": "resref",
@ -30317,7 +30317,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_SAGE"
},
"TemplateResRef": {
"type": "resref",
@ -30372,7 +30372,7 @@
"MapNote": {
"type": "cexolocstring",
"value": {
"0": "Merchants Emporium"
"0": "Merchant's Emporium"
}
},
"MapNoteEnabled": {
@ -30381,7 +30381,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_WAYPOINT001"
"value": "NW_MAP_MERCHANTS"
},
"TemplateResRef": {
"type": "resref",
@ -31209,6 +31209,7 @@
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Map Note",
"id": 14814
}
},
@ -31225,7 +31226,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_MAPNOTE001"
"value": "NW_MAP_BANK"
},
"TemplateResRef": {
"type": "resref",
@ -31237,7 +31238,7 @@
},
"XPosition": {
"type": "float",
"value": 69.18457794189453
"value": 69.61856842041016
},
"YOrientation": {
"type": "float",
@ -31334,6 +31335,7 @@
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Map Note",
"id": 14814
}
},
@ -31350,7 +31352,7 @@
},
"Tag": {
"type": "cexostring",
"value": "NW_MAPNOTE001"
"value": "NW_MAP_CELLAR"
},
"TemplateResRef": {
"type": "resref",
@ -31358,23 +31360,23 @@
},
"XOrientation": {
"type": "float",
"value": -0.9972904920578003
"value": -1.0
},
"XPosition": {
"type": "float",
"value": 54.86586380004883
"value": 55.38000106811523
},
"YOrientation": {
"type": "float",
"value": -0.07356434315443039
"value": 7.549790126404332e-008
},
"YPosition": {
"type": "float",
"value": 79.65332794189453
"value": 78.87999725341797
},
"ZPosition": {
"type": "float",
"value": -5.7220458984375e-006
"value": 0.009999999776482582
}
},
{

View File

@ -1201,7 +1201,7 @@
"Mod_Description": {
"type": "cexolocstring",
"value": {
"0": "Paths of Ascension [PRC8-CEP3]\n\nThis is the revised edition of the classic Paths of Ascension module, which is highly customized & more player friendly. This module has loads of customizing options right at your fingertips, color text, chat commands / emotes / appearances / 2 forges, if it can be created it's IN THERE!\n\nPRC'd By: Jaysyn\n\nSpell & Ability expansion by: rafhot\n\n(Requires PRC8 4.1.11+)"
"0": "Paths of Ascension [PRC8-CEP3]\n\nThis is the revised edition of the classic Paths of Ascension module, which is highly customized & more player friendly. This module has loads of customizing options right at your fingertips, color text, chat commands / emotes / appearances / 2 forges, if it can be created it's IN THERE!\n\nPRC'd By: Jaysyn\n\nSpell & Ability expansion by: rafhot\n\n(Requires PRC8 4.61+)"
}
},
"Mod_DuskHour": {

View File

@ -3477,6 +3477,25 @@
"type": "resref",
"value": "hobgoblin002"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 0.3333333432674408
},
"FACTION": {
"type": "cexostring",
"value": "Hostile"
},
"NAME": {
"type": "cexostring",
"value": "Hobgoblin Thrall"
},
"RESREF": {
"type": "resref",
"value": "prc_wrsl_war"
}
}
]
},
@ -4005,6 +4024,25 @@
"value": "prc_algoid"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 8.0
},
"FACTION": {
"type": "cexostring",
"value": "Defender"
},
"NAME": {
"type": "cexostring",
"value": "Animated Tree"
},
"RESREF": {
"type": "resref",
"value": "prc_anim_tree01"
}
},
{
"__struct_id": 0,
"CR": {
@ -32892,6 +32930,44 @@
"value": 90419
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 12.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Aranea"
},
"RESREF": {
"type": "resref",
"value": "prc_s_aranea001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Badger"
},
"RESREF": {
"type": "resref",
"value": "prc_s_badger001"
}
},
{
"__struct_id": 0,
"CR": {
@ -32930,6 +33006,82 @@
"value": 12735
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 3.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Black Bear"
},
"RESREF": {
"type": "resref",
"value": "prc_s_blkbear001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 3.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Boar"
},
"RESREF": {
"type": "resref",
"value": "prc_s_boar001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 6.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Brown Bear"
},
"RESREF": {
"type": "resref",
"value": "prc_s_brnbear001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 10.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Bulette"
},
"RESREF": {
"type": "resref",
"value": "prc_s_bueltte001"
}
},
{
"__struct_id": 0,
"CR": {
@ -32949,6 +33101,25 @@
"value": 12740
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 3.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Cooshee"
},
"RESREF": {
"type": "resref",
"value": "prc_s_cooshee001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33025,6 +33196,25 @@
"value": 12737
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Dire Rat"
},
"RESREF": {
"type": "resref",
"value": "prc_s_direrat001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33082,6 +33272,25 @@
"value": 12779
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Dog"
},
"RESREF": {
"type": "resref",
"value": "prc_s_dog001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33405,6 +33614,25 @@
"value": "s_ghoulravager"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 8.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Gorgon"
},
"RESREF": {
"type": "resref",
"value": "prc_s_gorgon001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33709,6 +33937,25 @@
"value": 12766
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Hawk"
},
"RESREF": {
"type": "resref",
"value": "prc_s_hawk001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33804,6 +34051,25 @@
"value": 12747
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 5.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Huge Viper"
},
"RESREF": {
"type": "resref",
"value": "prc_s_hgviper001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33842,6 +34108,44 @@
"value": 12752
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 8.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Invisible Stalker"
},
"RESREF": {
"type": "resref",
"value": "prc_s_invstlk001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 8.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Janni"
},
"RESREF": {
"type": "resref",
"value": "prc_s_janni001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33899,6 +34203,25 @@
"value": "prc_s_firelarge"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 3.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Large Viper"
},
"RESREF": {
"type": "resref",
"value": "prc_s_lgviper001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33918,6 +34241,25 @@
"value": "prc_s_waterlarge"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 3.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Leopard"
},
"RESREF": {
"type": "resref",
"value": "prc_s_leopard001"
}
},
{
"__struct_id": 0,
"CR": {
@ -33994,6 +34336,44 @@
"value": 90417
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 5.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Lion"
},
"RESREF": {
"type": "resref",
"value": "prc_s_lion001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 9.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Manticore"
},
"RESREF": {
"type": "resref",
"value": "prc_s_mntcore001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34051,6 +34431,63 @@
"value": 90421
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 10.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Nymph"
},
"RESREF": {
"type": "resref",
"value": "prc_s_nymph001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 10.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Pixie"
},
"RESREF": {
"type": "resref",
"value": "prc_s_pixie001"
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 8.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Polar Bear"
},
"RESREF": {
"type": "resref",
"value": "prc_s_plrbear001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34108,6 +34545,25 @@
"value": 12767
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 5.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Satyr"
},
"RESREF": {
"type": "resref",
"value": "prc_s_satyr001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34317,6 +34773,25 @@
"value": 12764
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Small Viper"
},
"RESREF": {
"type": "resref",
"value": "prc_s_smviper001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34412,6 +34887,25 @@
"value": 12770
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 1.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Tiny Viper"
},
"RESREF": {
"type": "resref",
"value": "prc_s_tnviper001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34564,6 +35058,25 @@
"value": 40645
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 6.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Wereboar"
},
"RESREF": {
"type": "resref",
"value": "prc_s_wrboar001"
}
},
{
"__struct_id": 0,
"CR": {
@ -34583,6 +35096,25 @@
"value": 12778
}
},
{
"__struct_id": 0,
"CR": {
"type": "float",
"value": 2.0
},
"FACTION": {
"type": "cexostring",
"value": "Commoner"
},
"NAME": {
"type": "cexostring",
"value": "Summoned Wolf"
},
"RESREF": {
"type": "resref",
"value": "prc_s_wolf001"
}
},
{
"__struct_id": 0,
"CR": {

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,216 @@
#include "nw_inc_gff"
#include "npc_template_inc"
#include "prc_inc_spells"
#include "prc_inc_util"
#include "prc_inc_json"
//:: Adds Evolved SLA's to jCreature.
//::
json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
{
int nAttempts = 0;
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
if (jSpecAbilityList == JsonNull()) jSpecAbilityList = JsonArray();
while (nAttempts < 20) // safety cap
{
nAttempts++;
int nRandom = d12(1);
json jSpecAbility = JsonObject();
switch(nRandom)
{
case 1:
if (nBaseHD < 6) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 18);
break;
case 2:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 23);
break;
case 3:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 25);
break;
case 4:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 26);
break;
case 5:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 27);
break;
case 6:
if (nBaseHD < 7) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 364);
break;
case 7:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
break;
case 8:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 88);
break;
case 9:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
break;
case 10:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 82);
break;
case 11:
if (nBaseHD < 2) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
break;
case 12:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 566);
break;
default:
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 46); // Doom fallback
break;
}
// If jSpecAbility still empty for some reason, retry
if (JsonGetType(jSpecAbility) != JSON_TYPE_OBJECT) continue;
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD));
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
break;
}
return GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
}
//:: Apply Evolved effects to a non-PC creature
void ApplyEvolvedEffects(object oCreature, int nBaseHD, int nCasterLevel, int iEvolution)
{
//:: Declare major variables
int bIncorporeal = GetIsIncorporeal(oCreature);
effect eVolved;
//:: Boost caster & SLA level
SetLocalInt(oCreature, PRC_CASTERLEVEL_ADJUSTMENT, PRCMax(nCasterLevel, nBaseHD));
//:: AC Bonuses: +1 natural or +1 deflection if Incorporal
if(bIncorporeal)
{
eVolved = EffectACIncrease(1+iEvolution, AC_DEFLECTION_BONUS);
}
else
{
eVolved = EffectACIncrease(1+iEvolution, AC_NATURAL_BONUS);
}
//:: Fast Healing 3
eVolved = EffectLinkEffects(eVolved, EffectRegenerate(3, 6.0f));
//:: Make *really* permanent
eVolved = UnyieldingEffect(eVolved);
//:: Apply everything
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVolved, oCreature);
}
void main()
{
//:: Declare major variables
object oBaseCreature = OBJECT_SELF;
object oNewCreature;
GetObjectUUID(oBaseCreature);
int bIncorporeal = GetIsIncorporeal(oBaseCreature);
int iBaseRace = MyPRCGetRacialType(oBaseCreature);
int nCasterLevel = PRCGetCasterLevel(oBaseCreature);
int iEvolution = 1;
int iOldEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
//:: Creatures & NPCs only
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
{
DoDebug("Not a creature");
return;
}
//:: Undead only
if(iBaseRace != RACIAL_TYPE_UNDEAD)
{
//SendMessageToPC(GetFirstPC(), "make_evolved: Invalid racial type for template.");
DoDebug("make_evolved: Invalid racial type for template.");
return;
}
/* if(DEBUG) */DoDebug("make_evolved: Previous Evolution is: " +IntToString(iOldEvolution));
iEvolution = iEvolution + iOldEvolution;
/* if(DEBUG) */DoDebug("make_evolved: Evolution is: " +IntToString(iEvolution));
int nBaseHD = GetHitDice(oBaseCreature);
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
location lSpawnLoc = GetLocation(oBaseCreature);
json jBaseCreature = ObjectToJson(oBaseCreature, FALSE);
json jNewCreature;
json jFinalCreature;
//:: Update creature's name on first advancement
string sBaseName = GetName(oBaseCreature);
//:: Add Spell-like abilities
jNewCreature = json_AddEvolvedPowers(jBaseCreature, nBaseHD, nCasterLevel, iEvolution);
//:: Update stats
if(bIncorporeal)
{
//:: Incorporeal = CHA only
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 0, 0, 0, 0, 0, 2);
}
else
{
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 2, 0, 0, 0, 0, 2);
}
//:: Apply effects
ApplyEvolvedEffects(oNewCreature, nBaseHD, nCasterLevel, iEvolution);
jFinalCreature = jNewCreature;
//:: Destroy Original creature
DestroyObject(oBaseCreature, 0.0f);
//:: Update the creature
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
if(DEBUG) DoDebug("make_evolved: Final evolution is: " +IntToString(iEvolution));
if (iEvolution == 1)
{
SetName(oNewCreature, "Evolved " + sBaseName);
}
else if (iEvolution == 2)
{
SetName(oNewCreature, "Greater " + sBaseName);
}
else
{
SetName(oNewCreature, sBaseName);
}
//:: Update race field
SetSubRace(oNewCreature, "Undead (Augmented)");
//:: Update Age
SetAge(oNewCreature, GetAge(oNewCreature) + d100(1));
//:: Set variables
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution);
SetLocalInt(oNewCreature, "TEMPLATE_EVOLVED", 1);
}

View File

@ -0,0 +1,10 @@
/* Paragon Creature Template
By: Jaysyn
Created: 2024-11-14 08:27:30
A greenbound creature looks much like it did before transformation, although certain changes are apparent. The creature's flesh has been replaced by pulpy wood and thickly corded creepers, and tiny branches stick out from its torso, arms, and legs. Any feathers, hair, or fur it once had have been replaced by some combination of green vines, moss, flowers, and leaves.
Greenbound creatures speak any languages they knew before transformation, although their voices are now deep and gravelly.
/*

View File

@ -0,0 +1,173 @@
//::///////////////////////////////////////////////
//:: Amulet of Mighty Fists +1
//:: jy_itnk_amf1
//::
//:://////////////////////////////////////////////
/*
Amulet of Mighty Fists +1
Magic Item
(Dungeon Master's Guide v.3.5, p. 246)
Price: 6,000 gp
Body Slot: Throat
Caster Level: 5th
Aura: Faint; (DC 18) Evocation
Activation: —
Weight: — lb.
This amulet grants an enhancement bonus of +1 on attack
and damage rolls with unarmed attacks and natural weapons.
Prerequisites: Craft Wondrous Item , Magic Fang, Greater
creator's caster level must be at least 3x the amulet's bonus.
Cost to Create: 3,000 gp, 240 XP, 6 day(s).
*/
//:://////////////////////////////////////////////
//:: Modified By: Jaysyn
//:: Modified On: 2025-05-25 20:23:47
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "inc_eventhook"
#include "prc_inc_combat"
const string AMULET_RES = "jy_itnk_amf1";
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+1";
const string SCRIPT_NAME = "jy_itnk_amf1";
// check if PC is wearing the amulet
int WearingAmulet(object oPC)
{
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
return (GetIsObjectValid(oNeck) &&
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
}
// remove any lingering effect
void RemoveAmuletEffect(object oPC)
{
effect e = GetFirstEffect(oPC);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == AMULET_EFFECT)
RemoveEffect(oPC, e);
e = GetNextEffect(oPC);
}
}
// apply new effect
void ApplyAmuletEffect(object oPC)
{
RemoveAmuletEffect(oPC);
effect eMightyR = EffectAttackIncrease(1, ATTACK_BONUS_ONHAND);
effect eMightyL = EffectAttackIncrease(1, ATTACK_BONUS_OFFHAND);
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_1, DAMAGE_TYPE_MAGICAL);
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
eLink = TagEffect(eLink, AMULET_EFFECT);
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
object oPC;
object oItem;
// Debug message
if(DEBUG) DoDebug("jy_itnk_amf1 >> Event: " + IntToString(nEvent));
switch (nEvent)
{
// Item equipped (any item)
case X2_ITEM_EVENT_EQUIP:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
if(DEBUG) DoDebug("jy_itnk_amf1 >> Equipped: " + GetName(oItem));
// If this is our amulet being equipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Register for equipment change events
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
// Apply effect if unarmed
if (GetIsUnarmed(oPC))
ApplyAmuletEffect(oPC);
}
// If a weapon is equipped while wearing the amulet, remove the effect
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf1 >> Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
// Item unequipped (any item)
case X2_ITEM_EVENT_UNEQUIP:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
if(DEBUG) DoDebug("jy_itnk_amf1 >> Unequipped: " + GetName(oItem));
// If this is our amulet being unequipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Remove effect immediately when amulet is unequipped
RemoveAmuletEffect(oPC);
// Unregister events
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
}
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
// apply the effect
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf1 >> Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
// Handle PRC eventhooks
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If a weapon was equipped, remove the amulet effect
if (!GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf1 >> PRC Eventhook: Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
case EVENT_ONPLAYERUNEQUIPITEM:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If they're now unarmed after unequipping something, apply the effect
if (GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf1 >> PRC Eventhook: Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
}
}

View File

@ -0,0 +1,175 @@
//::///////////////////////////////////////////////
//:: Amulet of Mighty Fists +2
//:: jy_itnk_amf2
//::
//:://////////////////////////////////////////////
/*
Amulet of Might Fists +2
Magic Item
(Dungeon Master's Guide v.3.5, p. 246)
Price: 24,000 gp
Body Slot: Throat
Caster Level: 5th
Aura: Faint; (DC 18) Evocation
Activation: —
Weight: — lb.
This amulet grants an enhancement bonus of +2
on attack and damage rolls with unarmed attacks
and natural weapons.
Prerequisites: Craft Wondrous Item , Magic Fang,
Greater creators caster level must be at least
3x the amulets bonus.
Cost to Create: 12,000 gp, 960 XP, 24 day(s).
*/
//:://////////////////////////////////////////////
//:: Modified By: Jaysyn
//:: Modified On: 2025-09-03 20:57:04
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "inc_eventhook"
#include "prc_inc_combat"
const string AMULET_RES = "jy_itnk_amf2";
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+2";
const string SCRIPT_NAME = "jy_itnk_amf2";
// check if PC is wearing the amulet
int WearingAmulet(object oPC)
{
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
return (GetIsObjectValid(oNeck) &&
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
}
// remove any lingering effect
void RemoveAmuletEffect(object oPC)
{
effect e = GetFirstEffect(oPC);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == AMULET_EFFECT)
RemoveEffect(oPC, e);
e = GetNextEffect(oPC);
}
}
// apply new effect
void ApplyAmuletEffect(object oPC)
{
RemoveAmuletEffect(oPC);
effect eMightyR = EffectAttackIncrease(2, ATTACK_BONUS_ONHAND);
effect eMightyL = EffectAttackIncrease(2, ATTACK_BONUS_OFFHAND);
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_MAGICAL);
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
eLink = TagEffect(eLink, AMULET_EFFECT);
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
object oPC;
object oItem;
// Debug message
if(DEBUG) DoDebug("jy_itnk_amf2 >> Event: " + IntToString(nEvent));
switch (nEvent)
{
// Item equipped (any item)
case X2_ITEM_EVENT_EQUIP:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
if(DEBUG) DoDebug("jy_itnk_amf2 >> Equipped: " + GetName(oItem));
// If this is our amulet being equipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Register for equipment change events
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
// Apply effect if unarmed
if (GetIsUnarmed(oPC))
ApplyAmuletEffect(oPC);
}
// If a weapon is equipped while wearing the amulet, remove the effect
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf2 >> Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
// Item unequipped (any item)
case X2_ITEM_EVENT_UNEQUIP:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
if(DEBUG) DoDebug("jy_itnk_amf2 >> Unequipped: " + GetName(oItem));
// If this is our amulet being unequipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Remove effect immediately when amulet is unequipped
RemoveAmuletEffect(oPC);
// Unregister events
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
}
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
// apply the effect
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf2 >> Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
// Handle PRC eventhooks
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If a weapon was equipped, remove the amulet effect
if (!GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf2 >> PRC Eventhook: Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
case EVENT_ONPLAYERUNEQUIPITEM:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If they're now unarmed after unequipping something, apply the effect
if (GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf2 >> PRC Eventhook: Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
}
}

View File

@ -0,0 +1,175 @@
//::///////////////////////////////////////////////
//:: Amulet of Mighty Fists +3
//:: jy_itnk_amf3
//::
//:://////////////////////////////////////////////
/*
Amulet of Might Fists +3
Magic Item
(Dungeon Master's Guide v.3.5, p. 246)
Price: 54,000 gp
Body Slot: Throat
Caster Level: 5th
Aura: Faint; (DC 18) Evocation
Activation: —
Weight: — lb.
This amulet grants an enhancement bonus of +3
on attack and damage rolls with unarmed attacks
and natural weapons.
Prerequisites: Craft Wondrous Item , Magic Fang,
Greater creators caster level must be at least
3x the amulets bonus.
Cost to Create: 27,000 gp, 2,160 XP, 54 day(s).
*/
//:://////////////////////////////////////////////
//:: Modified By: Jaysyn
//:: Modified On: 2025-05-25 20:23:47
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "inc_eventhook"
#include "prc_inc_combat"
const string AMULET_RES = "jy_itnk_amf3";
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+3";
const string SCRIPT_NAME = "jy_itnk_amf3";
// check if PC is wearing the amulet
int WearingAmulet(object oPC)
{
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
return (GetIsObjectValid(oNeck) &&
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
}
// remove any lingering effect
void RemoveAmuletEffect(object oPC)
{
effect e = GetFirstEffect(oPC);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == AMULET_EFFECT)
RemoveEffect(oPC, e);
e = GetNextEffect(oPC);
}
}
// apply new effect
void ApplyAmuletEffect(object oPC)
{
RemoveAmuletEffect(oPC);
effect eMightyR = EffectAttackIncrease(3, ATTACK_BONUS_ONHAND);
effect eMightyL = EffectAttackIncrease(3, ATTACK_BONUS_OFFHAND);
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_3, DAMAGE_TYPE_MAGICAL);
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
eLink = TagEffect(eLink, AMULET_EFFECT);
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
object oPC;
object oItem;
// Debug message
if(DEBUG) DoDebug("jy_itnk_amf3 >> Event: " + IntToString(nEvent));
switch (nEvent)
{
// Item equipped (any item)
case X2_ITEM_EVENT_EQUIP:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
if(DEBUG) DoDebug("jy_itnk_amf3 >> Equipped: " + GetName(oItem));
// If this is our amulet being equipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Register for equipment change events
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
// Apply effect if unarmed
if (GetIsUnarmed(oPC))
ApplyAmuletEffect(oPC);
}
// If a weapon is equipped while wearing the amulet, remove the effect
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf3 >> Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
// Item unequipped (any item)
case X2_ITEM_EVENT_UNEQUIP:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
if(DEBUG) DoDebug("jy_itnk_amf3 >> Unequipped: " + GetName(oItem));
// If this is our amulet being unequipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Remove effect immediately when amulet is unequipped
RemoveAmuletEffect(oPC);
// Unregister events
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
}
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
// apply the effect
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf3 >> Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
// Handle PRC eventhooks
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If a weapon was equipped, remove the amulet effect
if (!GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf3 >> PRC Eventhook: Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
case EVENT_ONPLAYERUNEQUIPITEM:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If they're now unarmed after unequipping something, apply the effect
if (GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf3 >> PRC Eventhook: Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
}
}

View File

@ -0,0 +1,174 @@
//::///////////////////////////////////////////////
//:: Amulet of Mighty Fists +4
//:: jy_itnk_amf4
//::
//:://////////////////////////////////////////////
/*
Amulet of Might Fists +4
Magic Item
(Dungeon Master's Guide v.3.5, p. 246)
Price: 96,000 gp
Body Slot: Throat
Caster Level: 5th
Aura: Faint; (DC 18)
Activation: —
Weight: — lb.
This amulet grants an enhancement bonus of +4
on attack and damage rolls with unarmed attacks
and natural weapons.
Prerequisites: creators caster level must be at
least 3x the amulets bonus.
Cost to Create: 48,000 gp, 3,840 XP, 96 day(s).
*/
//:://////////////////////////////////////////////
//:: Modified By: Jaysyn
//:: Modified On: 2025-05-25 20:23:47
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "inc_eventhook"
#include "prc_inc_combat"
const string AMULET_RES = "jy_itnk_amf4";
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+4";
const string SCRIPT_NAME = "jy_itnk_amf4";
// check if PC is wearing the amulet
int WearingAmulet(object oPC)
{
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
return (GetIsObjectValid(oNeck) &&
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
}
// remove any lingering effect
void RemoveAmuletEffect(object oPC)
{
effect e = GetFirstEffect(oPC);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == AMULET_EFFECT)
RemoveEffect(oPC, e);
e = GetNextEffect(oPC);
}
}
// apply new effect
void ApplyAmuletEffect(object oPC)
{
RemoveAmuletEffect(oPC);
effect eMightyR = EffectAttackIncrease(4, ATTACK_BONUS_ONHAND);
effect eMightyL = EffectAttackIncrease(4, ATTACK_BONUS_OFFHAND);
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_4, DAMAGE_TYPE_MAGICAL);
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
eLink = TagEffect(eLink, AMULET_EFFECT);
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
object oPC;
object oItem;
// Debug message
if(DEBUG) DoDebug("jy_itnk_amf4 >> Event: " + IntToString(nEvent));
switch (nEvent)
{
// Item equipped (any item)
case X2_ITEM_EVENT_EQUIP:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
if(DEBUG) DoDebug("jy_itnk_amf4 >> Equipped: " + GetName(oItem));
// If this is our amulet being equipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Register for equipment change events
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
// Apply effect if unarmed
if (GetIsUnarmed(oPC))
ApplyAmuletEffect(oPC);
}
// If a weapon is equipped while wearing the amulet, remove the effect
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf4 >> Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
// Item unequipped (any item)
case X2_ITEM_EVENT_UNEQUIP:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
if(DEBUG) DoDebug("jy_itnk_amf4 >> Unequipped: " + GetName(oItem));
// If this is our amulet being unequipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Remove effect immediately when amulet is unequipped
RemoveAmuletEffect(oPC);
// Unregister events
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
}
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
// apply the effect
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf4 >> Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
// Handle PRC eventhooks
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If a weapon was equipped, remove the amulet effect
if (!GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf4 >> PRC Eventhook: Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
case EVENT_ONPLAYERUNEQUIPITEM:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If they're now unarmed after unequipping something, apply the effect
if (GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf4 >> PRC Eventhook: Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
}
}

View File

@ -0,0 +1,173 @@
//::///////////////////////////////////////////////
//:: Amulet of Mighty Fists +1
//:: jy_itnk_amf5
//::
//:://////////////////////////////////////////////
/*
Amulet of Mighty Fists +1
Magic Item
(Dungeon Master's Guide v.3.5, p. 246)
Price: 6,000 gp
Body Slot: Throat
Caster Level: 5th
Aura: Faint; (DC 18) Evocation
Activation: —
Weight: — lb.
This amulet grants an enhancement bonus of +1 on attack
and damage rolls with unarmed attacks and natural weapons.
Prerequisites: Craft Wondrous Item , Magic Fang, Greater
creator's caster level must be at least 3x the amulet's bonus.
Cost to Create: 3,000 gp, 240 XP, 6 day(s).
*/
//:://////////////////////////////////////////////
//:: Modified By: Jaysyn
//:: Modified On: 2025-05-25 20:23:47
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "inc_eventhook"
#include "prc_inc_combat"
const string AMULET_RES = "jy_itnk_amf5";
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+5";
const string SCRIPT_NAME = "jy_itnk_amf5";
// check if PC is wearing the amulet
int WearingAmulet(object oPC)
{
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
return (GetIsObjectValid(oNeck) &&
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
}
// remove any lingering effect
void RemoveAmuletEffect(object oPC)
{
effect e = GetFirstEffect(oPC);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == AMULET_EFFECT)
RemoveEffect(oPC, e);
e = GetNextEffect(oPC);
}
}
// apply new effect
void ApplyAmuletEffect(object oPC)
{
RemoveAmuletEffect(oPC);
effect eMightyR = EffectAttackIncrease(5, ATTACK_BONUS_ONHAND);
effect eMightyL = EffectAttackIncrease(5, ATTACK_BONUS_OFFHAND);
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_5, DAMAGE_TYPE_MAGICAL);
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
eLink = TagEffect(eLink, AMULET_EFFECT);
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
object oPC;
object oItem;
// Debug message
if(DEBUG) DoDebug("jy_itnk_amf5 >> Event: " + IntToString(nEvent));
switch (nEvent)
{
// Item equipped (any item)
case X2_ITEM_EVENT_EQUIP:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
if(DEBUG) DoDebug("jy_itnk_amf5 >> Equipped: " + GetName(oItem));
// If this is our amulet being equipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Register for equipment change events
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
// Apply effect if unarmed
if (GetIsUnarmed(oPC))
ApplyAmuletEffect(oPC);
}
// If a weapon is equipped while wearing the amulet, remove the effect
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf5 >> Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
// Item unequipped (any item)
case X2_ITEM_EVENT_UNEQUIP:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
if(DEBUG) DoDebug("jy_itnk_amf5 >> Unequipped: " + GetName(oItem));
// If this is our amulet being unequipped
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
{
// Remove effect immediately when amulet is unequipped
RemoveAmuletEffect(oPC);
// Unregister events
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
}
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
// apply the effect
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf5 >> Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
// Handle PRC eventhooks
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetPCItemLastEquippedBy();
oItem = GetPCItemLastEquipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If a weapon was equipped, remove the amulet effect
if (!GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf5 >> PRC Eventhook: Removing effect due to weapon equip");
RemoveAmuletEffect(oPC);
}
break;
case EVENT_ONPLAYERUNEQUIPITEM:
oPC = GetPCItemLastUnequippedBy();
oItem = GetPCItemLastUnequipped();
// If not wearing the amulet, do nothing
if (!WearingAmulet(oPC))
return;
// If they're now unarmed after unequipping something, apply the effect
if (GetIsUnarmed(oPC))
{
if(DEBUG) DoDebug("jy_itnk_amf5 >> PRC Eventhook: Adding effect due to weapon unequip");
ApplyAmuletEffect(oPC);
}
break;
}
}

View File

@ -18,6 +18,86 @@
//:: Adds Evolved SLA's to jCreature.
//::
json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
{
int nAttempts = 0;
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
if (jSpecAbilityList == JsonNull()) jSpecAbilityList = JsonArray();
while (nAttempts < 20) // safety cap
{
nAttempts++;
int nRandom = d12(1);
json jSpecAbility = JsonObject();
switch(nRandom)
{
case 1:
if (nBaseHD < 6) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 18);
break;
case 2:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 23);
break;
case 3:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 25);
break;
case 4:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 26);
break;
case 5:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 27);
break;
case 6:
if (nBaseHD < 7) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 364);
break;
case 7:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
break;
case 8:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 88);
break;
case 9:
if (nBaseHD < 3) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
break;
case 10:
if (nBaseHD < 4) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 82);
break;
case 11:
if (nBaseHD < 2) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
break;
case 12:
if (nBaseHD < 5) continue;
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 566);
break;
default:
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 46); // Doom fallback
break;
}
// If jSpecAbility still empty for some reason, retry
if (JsonGetType(jSpecAbility) != JSON_TYPE_OBJECT) continue;
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD));
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
break;
}
return GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
}
/* json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
{
int nRandom = d12(1);
@ -44,7 +124,7 @@ json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iE
12 unholy blight 566 - 5th
*/
switch(nRandom)
/* switch(nRandom)
{
case 1:
if (nBaseHD >= 6)
@ -302,6 +382,7 @@ json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iE
return jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
}
*/
//:: Apply Evolved effects to a non-PC creature
void ApplyEvolvedEffects(object oCreature, int nBaseHD, int nCasterLevel, int iEvolution)
@ -340,34 +421,47 @@ void main()
object oBaseCreature = OBJECT_SELF;
object oNewCreature;
GetObjectUUID(oBaseCreature);
int bIncorporeal = GetIsIncorporeal(oBaseCreature);
int iBaseRace = MyPRCGetRacialType(oBaseCreature);
int nCasterLevel = PRCGetCasterLevel(oBaseCreature);
int iEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
int iEvolution = 1;
int iOldEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
//:: Creatures & NPCs only
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
{
if(DEBUG) DoDebug("Not a creature");
DoDebug("Not a creature");
return;
}
//:: Undead only
if(iBaseRace != RACIAL_TYPE_UNDEAD)
{
//SendMessageToPC(GetFirstPC(), "make_evolved: Invalid racial type for template.");
if(DEBUG) DoDebug("make_evolved: Invalid racial type for template.");
DoDebug("make_evolved: Invalid racial type for template.");
return;
}
}
if(DEBUG) DoDebug("make_evolved: Previous Evolution is: " +IntToString(iOldEvolution));
iEvolution = iEvolution + iOldEvolution;
if(DEBUG) DoDebug("make_evolved: Evolution is: " +IntToString(iEvolution));
int nBaseHD = GetHitDice(oBaseCreature);
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
json jBaseCreature = ObjectToJson(oBaseCreature, TRUE);
location lSpawnLoc = GetLocation(oBaseCreature);
json jBaseCreature = ObjectToJson(oBaseCreature, FALSE);
json jNewCreature;
json jFinalCreature;
//:: Get original name
string sBaseName = GetName(oBaseCreature);
//:: Add Spell-like abilities
jNewCreature = json_AddEvolvedPowers(jBaseCreature, nBaseHD, nCasterLevel, iEvolution);
@ -381,35 +475,52 @@ void main()
{
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 2, 0, 0, 0, 0, 2);
}
//:: Delete original creature.
if (GetIsObjectValid(oBaseCreature))
{
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
// optional fade / vanish visuals
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
DestroyObject(oBaseCreature, 0.1f);
}
//:: Update CR
jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 1);
//:: Update the creature
oNewCreature = JsonToObject(jFinalCreature, GetLocation(oBaseCreature));
DestroyObject(oBaseCreature, 0.0f);
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
//:: Apply effects
ApplyEvolvedEffects(oNewCreature, nBaseHD, nCasterLevel, iEvolution);
PRCForceRest(oNewCreature);
//:: Update creature's name on first advancement
string sBaseName = GetName(oNewCreature);
if(iEvolution < 1)
//:: Update name
if(DEBUG) DoDebug("make_evolved: Final evolution is: " +IntToString(iEvolution));
if (iEvolution == 1)
{
SetName(oNewCreature, "Evolved "+ sBaseName);
SetName(oNewCreature, "Evolved " + sBaseName);
}
if(iEvolution < 4)
else if (iEvolution == 2)
{
SetName(oNewCreature, "Greater "+ sBaseName);
SetName(oNewCreature, "Greater " + sBaseName);
}
else
{
SetName(oNewCreature, sBaseName);
}
//:: Update race field
SetSubRace(oNewCreature, "Undead (Augmented)");
//:: Update age
SetAge(oNewCreature, GetAge(oNewCreature) + d100(1));
//:: Freshen up
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
//:: Set variables
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution+1);
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution);
SetLocalInt(oNewCreature, "TEMPLATE_EVOLVED", 1);
}

View File

@ -0,0 +1,259 @@
/* Greenbound Creature Template
By: Jaysyn
Created: 2025-09-06 22:24:15
A greenbound creature looks much like it did before
transformation, although certain changes are apparent.
The creature's flesh has been replaced by pulpy wood
and thickly corded creepers, and tiny branches stick
out from its torso, arms, and legs. Any feathers, hair,
or fur it once had have been replaced by some combination
of green vines, moss, flowers, and leaves.
Greenbound creatures speak any languages they knew before
transformation, although their voices are now deep and
gravelly.
/*///////////////////////////////////////////////////////////
#include "nw_inc_gff"
#include "prc_inc_spells"
#include "prc_inc_util"
#include "npc_template_inc"
#include "inc_debug"
#include "prc_inc_json"
//:: Adds Greenbound SLA's to jCreature.
//::
json json_AddGreenboundPowers(json jCreature)
{
// Get the existing SpecAbilityList (if it exists)
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
//:: Get creature's HD
int iHD = json_GetCreatureHD(jCreature);
// Create the SpecAbilityList if it doesn't exist
if (jSpecAbilityList == JsonNull())
{
jSpecAbilityList = JsonArray();
}
//:: Add Entangle at will (capped @ 20)
int i;
for (i = 0; i < 20; i++)
{
json jSpecAbility = JsonObject();
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 53);
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD);
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
// Manually add to the array
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
}
//:: Add Vine Mine 1x / Day
for (i = 0; i < 1; i++)
{
json jSpecAbility = JsonObject();
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 529);
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD);
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
// Manually add to the array
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
}
//:: Add the list to the creature
jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
return jCreature;
}
//:: Apply Greenbound effects
void ApplyGreenboundEffects(object oCreature, int nBaseHD)
{
//:: Declare major variables
int nNewCR;
object oSkin = GetPCSkin(oCreature);
itemproperty ipIP;
effect eGreenbound;
//:: Give it a barkskin vfx
eGreenbound = EffectLinkEffects(eGreenbound, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN));
//:: Plant Immunities
eGreenbound = EffectLinkEffects(eGreenbound, EffectImmunity(IMMUNITY_TYPE_STUN));
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
//:: Set maximum hit points for each HD
int nMaxHP = GetMaxPossibleHP(oCreature);
SetCurrentHitPoints(oCreature, nMaxHP);
DoDebug("nMaxHP is: "+IntToString(nMaxHP)+",");
//:: Resistance to Cold and Electricity (Ex): A greenbound creature gains resistance 10 to cold and electricity.
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, 10));
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_COLD, 10));
//:: Damage Reduction (Ex): A greenbound creature has damage reduction 10/magic and slashing.
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageReduction(10, DAMAGE_POWER_PLUS_ONE));
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, 10));
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 10));
//:: Fast Healing (Ex): A greenbound creature heals 3 points of damage each round so long as it has at least 1 hit point.
eGreenbound = EffectLinkEffects(eGreenbound, EffectRegenerate(3, 6.0f));
//:: Tremorsense (Ex): Greenbound creatures can automatically sense the location of
//:: anything within 60 feet that is in contact with the ground.
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(488));
//:: Grapple Bonus (Ex): The thorny hooks on a greenbound creature's hands and feet
//:: grant it a +4 bonus on grapple checks. (Imp. Grapple)
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(2804));
//:: Immunity to Critical Hits
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3585));
//:: Immunity to Sneak Attack
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3591));
//:: Immunity to Poison
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3590));
//:: Immunity to Mind Effects
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3588));
//:: Low-Light Vision
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(354));
//:: Make *really* permanent
eGreenbound = UnyieldingEffect(eGreenbound);
//:: Apply everything
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGreenbound, oCreature);
//:: Add slam attack
string sResRef;
int nSize = PRCGetCreatureSize(oCreature);
//primary weapon
sResRef = "prc_warf_slam_";
sResRef += GetAffixForSize(nSize+1);
AddNaturalPrimaryWeapon(oCreature, sResRef, 1);
}
void main ()
{
//:: Declare major variables
object oBaseCreature = OBJECT_SELF;
object oNewCreature;
string sBaseName = GetName(oBaseCreature);
GetObjectUUID(oBaseCreature);
int nRacial = MyPRCGetRacialType(oBaseCreature);
//:: No Template Stacking
if(GetLocalInt(oBaseCreature, "TEMPLATE_GREENBOUND") > 0)
{
if(DEBUG) DoDebug("No Template Stacking");
return;
}
//:: Creatures & NPCs only
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
{
if(DEBUG) DoDebug("Not a creature");
return;
}
/*
A "greenbound creature" is an acquired template that can be added to
any animal, fey, giant, humanoid, monstrous humanoid, or vermin.
*/
if(nRacial == RACIAL_TYPE_ABERRATION || nRacial == RACIAL_TYPE_CONSTRUCT || nRacial == RACIAL_TYPE_DRAGON ||
nRacial == RACIAL_TYPE_ELEMENTAL || nRacial == RACIAL_TYPE_MAGICAL_BEAST || nRacial == RACIAL_TYPE_OOZE ||
nRacial == RACIAL_TYPE_OUTSIDER || nRacial == RACIAL_TYPE_PLANT || nRacial == RACIAL_TYPE_UNDEAD )
{
DoDebug("make_greenbound: Invalid racial type for template.");
return;
}
int nBaseHD = GetHitDice(oBaseCreature);
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
location lSpawnLoc = GetLocation(oBaseCreature);
json jBaseCreature = ObjectToJson(oBaseCreature, TRUE);
json jNewCreature;
json jFinalCreature;
//:: The creature's type changes to plant with the appropriate augmented subtype.
//:: Hit Dice: Change all current Hit Dice to d8s.
jNewCreature = JsonModifyRacialType(jBaseCreature, RACIAL_TYPE_PLANT);
//:: Armor Class: A greenbound creature's natural armor bonus improves by 6 over that of the base creature.
jNewCreature = json_IncreaseBaseAC(jNewCreature, 6);
//:: Abilities: Increase from the base creature as follows: Str +6, Dex +2, Con +4, Cha +4.
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 6, 2, 4, 0, 0, 4);
if (GetIsObjectValid(oBaseCreature))
{
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
// optional fade / vanish visuals
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
DestroyObject(oBaseCreature, 0.1f);
}
//:: Spell-Like Abilities: At will - entangle, pass without trace, speak with plants; 1/day - wall of thorns.
jNewCreature = json_AddGreenboundPowers(jNewCreature);
//:: Hit Dice: Change all current Hit Dice to d8s.
jNewCreature = json_RecalcMaxHP(jNewCreature, 8);
//:: Challenge Rating: Same as the base creature +2
jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 2);
//:: Update the creature
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
//:: Apply the non-json effects
ApplyGreenboundEffects(oNewCreature, nBaseHD);
//:: Update creature's name
SetName(oNewCreature, "Greenbound "+ sBaseName);
//:: Update race field
SetSubRace(oNewCreature, "Plant (Augmented)");
//:: Freshen Up
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
//:: Set variables
SetLocalInt(oNewCreature, "TEMPLATE_GREENBOUND", 1);
}

View File

@ -448,6 +448,10 @@ void main ()
object oBaseCreature = OBJECT_SELF;
object oNewCreature;
location lSpawnLoc = GetLocation(oBaseCreature);
GetObjectUUID(oBaseCreature);
//:: No Template Stacking
if(GetLocalInt(oBaseCreature, "TEMPLATE_PARAGON") > 0)
{
@ -474,14 +478,23 @@ void main ()
jNewCreature = json_UpdateBaseAC(jNewCreature, 5);
jFinalCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 15, 15, 15, 15, 15, 15);
//:: Delete original creature.
if (GetIsObjectValid(oBaseCreature))
{
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
// optional fade / vanish visuals
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
DestroyObject(oBaseCreature, 0.1f);
}
//:: Update the creature
oNewCreature = JsonToObject(jFinalCreature, GetLocation(oBaseCreature));
DestroyObject(oBaseCreature, 0.0f);
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
//:: Apply effects
ApplyParagonEffects(oNewCreature, nBaseHD, nBaseCR);
PRCForceRest(oNewCreature);
//:: Adding extra 12 HP per HD as Temporary HP.
effect eTempHP = EffectTemporaryHitpoints(nBaseHD * 12);
@ -491,5 +504,9 @@ void main ()
string sBaseName = GetName(oNewCreature);
SetName(oNewCreature, "Paragon "+ sBaseName);
//:: Freshen Up
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
//:: Set variables
SetLocalInt(oNewCreature, "TEMPLATE_PARAGON", 1);
}

View File

@ -64,9 +64,11 @@
///// FUNCTION DECLARATIONS ////////////////////////////////////////////////////
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
//:: Function to get the class type with the highest level
int GetHighestClassType(object oCreature);
int GetHighestClassLevel(object oCreature = OBJECT_SELF);
//:: Returns class level based NPC titles
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
// Generates a Random First Name
// based on Race and Gender
@ -103,7 +105,10 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
//:: Handles class level based NPC titles
if (bClassTitle)
{
sClassTitle = GetClassLevelTitle(GetHighestClassLevel(oNPC), oNPC);
int nClassType = GetHighestClassType(oNPC);
sClassTitle = GetClassLevelTitle(nClassType, oNPC);
FloatingTextStringOnCreature("Title: " + sClassTitle, oNPC);
}
//:: Handles class based Henchman titles
@ -972,7 +977,7 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
if (bClassTitle)
{
sRandomName = sBaseRace +" "+ sTitle;
sRandomName = sBaseRace +" "+ sClassTitle;
}
SetName(oNPC, (sRandomName));
@ -1048,34 +1053,38 @@ string ms_RandomLastName(object oNPC = OBJECT_SELF)
return Name;
}
//:: Function to get the highest class level of an object, excluding racialtype classes
int GetHighestClassLevel(object oCreature)
//:: Function to get the class type with the highest level
int GetHighestClassType(object oCreature)
{
int nHighestLevel = -1;
int nClassTypes = 254; // Maximum number of class types
int i;
int nHighestClass = -1;
int nClassTypes = 254; // maximum
for (i = 0; i <= nClassTypes; i++)
int i = 0;
while (i <= nClassTypes)
{
// Check if the class type is excluded
// Exclude racial/monster pseudo-classes
if (i == CLASS_TYPE_ABERRATION ||
i == CLASS_TYPE_ANIMAL ||
i == CLASS_TYPE_BEAST ||
i == CLASS_TYPE_CONSTRUCT ||
i == CLASS_TYPE_DRAGON ||
i == CLASS_TYPE_ELEMENTAL ||
i == CLASS_TYPE_FEY ||
i == CLASS_TYPE_GIANT ||
i == CLASS_TYPE_HUMANOID ||
i == CLASS_TYPE_MAGICAL_BEAST ||
i == CLASS_TYPE_MONSTROUS ||
i == CLASS_TYPE_OOZE ||
i == CLASS_TYPE_OUTSIDER ||
i == CLASS_TYPE_PLANT ||
i == CLASS_TYPE_SHAPECHANGER ||
i == CLASS_TYPE_UNDEAD ||
i == CLASS_TYPE_VERMIN)
i == CLASS_TYPE_ANIMAL ||
i == CLASS_TYPE_BEAST ||
i == CLASS_TYPE_CONSTRUCT ||
i == CLASS_TYPE_DRAGON ||
i == CLASS_TYPE_ELEMENTAL ||
i == CLASS_TYPE_FEY ||
i == CLASS_TYPE_GIANT ||
i == CLASS_TYPE_HUMANOID ||
i == CLASS_TYPE_MAGICAL_BEAST ||
i == CLASS_TYPE_MONSTROUS ||
i == CLASS_TYPE_OOZE ||
i == CLASS_TYPE_OUTSIDER ||
i == CLASS_TYPE_PLANT ||
i == CLASS_TYPE_SHAPECHANGER ||
i == CLASS_TYPE_UNDEAD ||
i == CLASS_TYPE_VERMIN)
{
i++;
continue;
}
int nLevel = GetLevelByClass(i, oCreature);
if (nLevel > 0)
@ -1083,27 +1092,29 @@ int GetHighestClassLevel(object oCreature)
if (nLevel > nHighestLevel)
{
nHighestLevel = nLevel;
nHighestClass = i;
}
}
else
{
break; // Reached an invalid class level, exit the loop
}
i++;
}
return nHighestLevel;
if (nHighestClass != -1)
{
FloatingTextStringOnCreature("Highest Level class is " + IntToString(nHighestClass) +
" at level " + IntToString(nHighestLevel) + ".", oCreature);
}
return nHighestClass;
}
//:: Handles class level based NPC titles
//:: Returns class level based NPC titles
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
{
string sTitle;
int nHighClass = GetHighestClassLevel(oNPC);
int nLevel = GetLevelByClass(nHighClass, oNPC);
int nGender = GetGender(oNPC);
switch (nHighClass)
string sTitle;
int nLevel = GetLevelByClass(nClassType, oNPC);
int nGender = GetGender(oNPC);
switch (nClassType)
{
case CLASS_TYPE_BARBARIAN:
switch(nLevel)
@ -1174,8 +1185,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
{sTitle = "Conqueress"; break;}
else
{sTitle = "Conqueror"; break;}
}
break;
case CLASS_TYPE_ROGUE:
switch(nLevel)
@ -1236,6 +1247,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Master Rogue"; break;
}
break;
case CLASS_TYPE_BARD:
switch(nLevel)
@ -1335,6 +1347,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Master Bard"; break;
}
break;
case CLASS_TYPE_SORCERER:
case CLASS_TYPE_WIZARD:
@ -1396,6 +1409,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Archmage"; break;
}
break;
case CLASS_TYPE_CLERIC:
switch(nLevel)
@ -1468,6 +1482,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
{sTitle = "High Priest"; break;}
}
break;
case CLASS_TYPE_DRUID:
switch(nLevel)
@ -1528,6 +1543,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Archdruid"; break;
}
break;
case CLASS_TYPE_FIGHTER:
switch(nLevel)
@ -1588,6 +1604,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Grandmaster"; break;
}
break;
case CLASS_TYPE_MONK:
switch(nLevel)
@ -1659,6 +1676,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "High Master"; break;
}
break;
case CLASS_TYPE_PALADIN:
switch(nLevel)
@ -1730,7 +1748,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "High Master"; break;
}
break;
case CLASS_TYPE_RANGER:
switch(nLevel)
{
@ -1817,7 +1836,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
sTitle = "Ranger Lord"; break;
}
break;
}
return sTitle;

View File

@ -81,7 +81,10 @@ void main()
string sCurrentDate = SQLite_GetSystemDate();
string sMonthDay = GetSubString(sCurrentDate, 0, 5);
object oArea = GetArea(OBJECT_SELF);
object oArea = GetArea(OBJECT_SELF);
int bIsNatural = GetIsAreaNatural(oArea);
int bAboveGround = GetIsAreaAboveGround(oArea);
object oSkelly;
object oPC = GetFirstObjectInArea(oArea);
@ -137,7 +140,7 @@ void main()
}
//:: Paragon Check
if (Random(9999) == 0)
if (Random(10000) == 0)
{
if(GetLocalInt(OBJECT_SELF, "TEMPLATE_PARAGON") < 1)
{
@ -145,6 +148,37 @@ void main()
}
}
//:: Greenbound Check
if (bIsNatural && bAboveGround)
{
if (iRacial == RACIAL_TYPE_FEY
|| iRacial == RACIAL_TYPE_ANIMAL
|| iRacial == RACIAL_TYPE_BEAST
|| iRacial == RACIAL_TYPE_GIANT
|| iRacial == RACIAL_TYPE_VERMIN)
{
if (Random(1000) == 0)
{
if (GetLocalInt(OBJECT_SELF, "TEMPLATE_GREENBOUND") < 1)
{
ExecuteScript("make_greenbound", OBJECT_SELF);
}
else
{
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Creature already has the Greenbound template.");
}
}
}
else
{
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Invalid racial type for template.");
}
}
else
{
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Area must be natural & above ground.");
}
//:: Setup Evolved Undead
if(iRacial == RACIAL_TYPE_UNDEAD)
{

View File

@ -733,14 +733,14 @@
"__struct_id": 1,
"Feat": {
"type": "word",
"value": 2511
"value": 2510
}
},
{
"__struct_id": 1,
"Feat": {
"type": "word",
"value": 2510
"value": 2511
}
},
{
@ -848,13 +848,6 @@
"value": 5072
}
},
{
"__struct_id": 1,
"Feat": {
"type": "word",
"value": 5078
}
},
{
"__struct_id": 1,
"Feat": {
@ -866,7 +859,7 @@
"__struct_id": 1,
"Feat": {
"type": "word",
"value": 5090
"value": 5078
}
},
{
@ -876,6 +869,13 @@
"value": 878
}
},
{
"__struct_id": 1,
"Feat": {
"type": "word",
"value": 5090
}
},
{
"__struct_id": 1,
"Feat": {

View File

@ -0,0 +1,117 @@
{
"__data_type": "UTI ",
"AddCost": {
"type": "dword",
"value": 5999
},
"BaseItem": {
"type": "int",
"value": 19
},
"Charges": {
"type": "byte",
"value": 0
},
"Comment": {
"type": "cexostring",
"value": "Amulet of Mighty Fists +1"
},
"Cost": {
"type": "dword",
"value": 6000
},
"Cursed": {
"type": "byte",
"value": 0
},
"DescIdentified": {
"type": "cexolocstring",
"value": {
"0": "This amulet grants an enhancement bonus of +1 on attack and damage rolls with unarmed attacks and natural weapons."
}
},
"Description": {
"type": "cexolocstring",
"value": {
"0": ""
}
},
"Identified": {
"type": "byte",
"value": 0
},
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Amulet of Mighty Fists +1"
}
},
"ModelPart1": {
"type": "byte",
"value": 24
},
"PaletteID": {
"type": "byte",
"value": 21
},
"Plot": {
"type": "byte",
"value": 0
},
"PropertiesList": {
"type": "list",
"value": [
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 28
},
"CostValue": {
"type": "word",
"value": 16
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 85
},
"Subtype": {
"type": "word",
"value": 0
}
}
]
},
"StackSize": {
"type": "word",
"value": 1
},
"Stolen": {
"type": "byte",
"value": 0
},
"Tag": {
"type": "cexostring",
"value": "JY_ITNK_AMF1"
},
"TemplateResRef": {
"type": "resref",
"value": "jy_itnk_amf1"
},
"xModelPart1": {
"type": "word",
"value": 24
}
}

View File

@ -0,0 +1,117 @@
{
"__data_type": "UTI ",
"AddCost": {
"type": "dword",
"value": 23999
},
"BaseItem": {
"type": "int",
"value": 19
},
"Charges": {
"type": "byte",
"value": 0
},
"Comment": {
"type": "cexostring",
"value": "Amulet of Mighty Fists +2"
},
"Cost": {
"type": "dword",
"value": 24000
},
"Cursed": {
"type": "byte",
"value": 0
},
"DescIdentified": {
"type": "cexolocstring",
"value": {
"0": "This amulet grants an enhancement bonus of +2 on attack and damage rolls with unarmed attacks and natural weapons."
}
},
"Description": {
"type": "cexolocstring",
"value": {
"0": ""
}
},
"Identified": {
"type": "byte",
"value": 0
},
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Amulet of Mighty Fists +2"
}
},
"ModelPart1": {
"type": "byte",
"value": 24
},
"PaletteID": {
"type": "byte",
"value": 21
},
"Plot": {
"type": "byte",
"value": 0
},
"PropertiesList": {
"type": "list",
"value": [
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 28
},
"CostValue": {
"type": "word",
"value": 16
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 85
},
"Subtype": {
"type": "word",
"value": 0
}
}
]
},
"StackSize": {
"type": "word",
"value": 1
},
"Stolen": {
"type": "byte",
"value": 0
},
"Tag": {
"type": "cexostring",
"value": "JY_ITNK_AMF2"
},
"TemplateResRef": {
"type": "resref",
"value": "jy_itnk_amf2"
},
"xModelPart1": {
"type": "word",
"value": 24
}
}

View File

@ -0,0 +1,148 @@
{
"__data_type": "UTI ",
"AddCost": {
"type": "dword",
"value": 23991
},
"BaseItem": {
"type": "int",
"value": 19
},
"Charges": {
"type": "byte",
"value": 0
},
"Comment": {
"type": "cexostring",
"value": "Amulet of Mighty Fists +3"
},
"Cost": {
"type": "dword",
"value": 54000
},
"Cursed": {
"type": "byte",
"value": 0
},
"DescIdentified": {
"type": "cexolocstring",
"value": {
"0": "This amulet grants an enhancement bonus of +3 on attack and damage rolls with unarmed attacks and natural weapons."
}
},
"Description": {
"type": "cexolocstring",
"value": {
"0": ""
}
},
"Identified": {
"type": "byte",
"value": 0
},
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Amulet of Mighty Fists +3"
}
},
"ModelPart1": {
"type": "byte",
"value": 24
},
"PaletteID": {
"type": "byte",
"value": 21
},
"Plot": {
"type": "byte",
"value": 0
},
"PropertiesList": {
"type": "list",
"value": [
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 35
},
"CostValue": {
"type": "word",
"value": 3
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 128
},
"Subtype": {
"type": "word",
"value": 0
}
},
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 28
},
"CostValue": {
"type": "word",
"value": 16
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 85
},
"Subtype": {
"type": "word",
"value": 0
}
}
]
},
"StackSize": {
"type": "word",
"value": 1
},
"Stolen": {
"type": "byte",
"value": 0
},
"Tag": {
"type": "cexostring",
"value": "JY_ITNK_AMF3"
},
"TemplateResRef": {
"type": "resref",
"value": "jy_itnk_amf3"
},
"xModelPart1": {
"type": "word",
"value": 24
}
}

View File

@ -0,0 +1,148 @@
{
"__data_type": "UTI ",
"AddCost": {
"type": "dword",
"value": 25993
},
"BaseItem": {
"type": "int",
"value": 19
},
"Charges": {
"type": "byte",
"value": 0
},
"Comment": {
"type": "cexostring",
"value": "Amulet of Mighty Fists +4"
},
"Cost": {
"type": "dword",
"value": 96000
},
"Cursed": {
"type": "byte",
"value": 0
},
"DescIdentified": {
"type": "cexolocstring",
"value": {
"0": "This amulet grants an enhancement bonus of +4 on attack and damage rolls with unarmed attacks and natural weapons."
}
},
"Description": {
"type": "cexolocstring",
"value": {
"0": ""
}
},
"Identified": {
"type": "byte",
"value": 0
},
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Amulet of Mighty Fists +4"
}
},
"ModelPart1": {
"type": "byte",
"value": 24
},
"PaletteID": {
"type": "byte",
"value": 21
},
"Plot": {
"type": "byte",
"value": 0
},
"PropertiesList": {
"type": "list",
"value": [
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 35
},
"CostValue": {
"type": "word",
"value": 7
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 128
},
"Subtype": {
"type": "word",
"value": 0
}
},
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 28
},
"CostValue": {
"type": "word",
"value": 16
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 85
},
"Subtype": {
"type": "word",
"value": 0
}
}
]
},
"StackSize": {
"type": "word",
"value": 1
},
"Stolen": {
"type": "byte",
"value": 0
},
"Tag": {
"type": "cexostring",
"value": "JY_ITNK_AMF4"
},
"TemplateResRef": {
"type": "resref",
"value": "jy_itnk_amf4"
},
"xModelPart1": {
"type": "word",
"value": 24
}
}

View File

@ -0,0 +1,210 @@
{
"__data_type": "UTI ",
"AddCost": {
"type": "dword",
"value": 6733
},
"BaseItem": {
"type": "int",
"value": 19
},
"Charges": {
"type": "byte",
"value": 0
},
"Comment": {
"type": "cexostring",
"value": "Amulet of Mighty Fists +5"
},
"Cost": {
"type": "dword",
"value": 150000
},
"Cursed": {
"type": "byte",
"value": 0
},
"DescIdentified": {
"type": "cexolocstring",
"value": {
"0": "This amulet grants an enhancement bonus of +5 on attack and damage rolls with unarmed attacks and natural weapons."
}
},
"Description": {
"type": "cexolocstring",
"value": {
"0": ""
}
},
"Identified": {
"type": "byte",
"value": 0
},
"LocalizedName": {
"type": "cexolocstring",
"value": {
"0": "Amulet of Mighty Fists +5"
}
},
"ModelPart1": {
"type": "byte",
"value": 24
},
"PaletteID": {
"type": "byte",
"value": 21
},
"Plot": {
"type": "byte",
"value": 0
},
"PropertiesList": {
"type": "list",
"value": [
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 33
},
"CostValue": {
"type": "word",
"value": 6
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 123
},
"Subtype": {
"type": "word",
"value": 0
}
},
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 35
},
"CostValue": {
"type": "word",
"value": 1
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 128
},
"Subtype": {
"type": "word",
"value": 0
}
},
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 36
},
"CostValue": {
"type": "word",
"value": 1
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 129
},
"Subtype": {
"type": "word",
"value": 0
}
},
{
"__struct_id": 0,
"ChanceAppear": {
"type": "byte",
"value": 100
},
"CostTable": {
"type": "byte",
"value": 28
},
"CostValue": {
"type": "word",
"value": 16
},
"Param1": {
"type": "byte",
"value": 255
},
"Param1Value": {
"type": "byte",
"value": 0
},
"PropertyName": {
"type": "word",
"value": 85
},
"Subtype": {
"type": "word",
"value": 0
}
}
]
},
"StackSize": {
"type": "word",
"value": 1
},
"Stolen": {
"type": "byte",
"value": 0
},
"Tag": {
"type": "cexostring",
"value": "JY_ITNK_AMF5"
},
"TemplateResRef": {
"type": "resref",
"value": "jy_itnk_amf5"
},
"xModelPart1": {
"type": "word",
"value": 24
}
}