From d77404f15764dfbd327afe5ba9b3fbb807b7d1ce Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:19:46 -0400 Subject: [PATCH] 2025/07/15 Update Added PEPS AI. Updated module name. Set all henchmen to have a random race &/or class based name using a custom version of Markshire's Nomeclature scripts, as well as appearance. Set Constructs, Undead, Outsiders & Elementals to not require food or drink. Full compile. --- README.md | 2 +- _module/PackModule.cmd | 2 +- _module/UnpackModule.cmd | 2 +- _module/are/forge001.are.json | 2 +- _module/are/valeford.are.json | 2 +- _module/are/valefordblacksmi.are.json | 2 +- _module/are/valefordgenerals.are.json | 2 +- _module/are/valefordtavernan.are.json | 2 +- _module/are/valefordtemple.are.json | 2 +- _module/dlg/nw_g_animal.dlg.json | 49670 ++++++++++++++++++++++++ _module/dlg/nw_g_fam.dlg.json | 23412 +++++++++++ _module/dlg/oc_ai_henchmen.dlg.json | 27180 +++++++++++++ _module/git/forge001.git.json | 477 +- _module/git/valeford.git.json | 1207 +- _module/git/valefordblacksmi.git.json | 60 + _module/git/valefordgenerals.git.json | 65 + _module/git/valefordtavernan.git.json | 75 + _module/git/valefordtemple.git.json | 114 +- _module/ifo/module.ifo.json | 11 +- _module/jrl/module.jrl.json | 106 +- _module/ncs/0c_assoc_actions.ncs | Bin 0 -> 24402 bytes _module/ncs/0c_cast_polymorp.ncs | Bin 0 -> 239 bytes _module/ncs/0c_fire_henchmen.ncs | Bin 0 -> 409 bytes _module/ncs/0c_get_convo.ncs | Bin 0 -> 1934 bytes _module/ncs/0c_get_henchman.ncs | Bin 0 -> 381 bytes _module/ncs/0c_h_cast_spell.ncs | Bin 0 -> 73 bytes _module/ncs/0c_henchmenspell.ncs | Bin 0 -> 49533 bytes _module/ncs/0c_if_a_magic_m.ncs | Bin 0 -> 336 bytes _module/ncs/0c_if_ass_convo.ncs | Bin 0 -> 5402 bytes _module/ncs/0c_if_assoc_mode.ncs | Bin 0 -> 674 bytes _module/ncs/0c_if_cntrspell.ncs | Bin 0 -> 1040 bytes _module/ncs/0c_if_com_script.ncs | Bin 0 -> 238 bytes _module/ncs/0c_if_convo.ncs | Bin 0 -> 737 bytes _module/ncs/0c_if_has_assoc.ncs | Bin 0 -> 363 bytes _module/ncs/0c_if_has_class.ncs | Bin 0 -> 283 bytes _module/ncs/0c_if_has_feat.ncs | Bin 0 -> 555 bytes _module/ncs/0c_if_has_spell.ncs | Bin 0 -> 335 bytes _module/ncs/0c_if_hen_leave.ncs | Bin 0 -> 139 bytes _module/ncs/0c_if_identify.ncs | Bin 0 -> 634 bytes _module/ncs/0c_if_not_master.ncs | Bin 0 -> 69 bytes _module/ncs/0c_if_open_inven.ncs | Bin 0 -> 202 bytes _module/ncs/0c_if_pickuploot.ncs | Bin 0 -> 139 bytes _module/ncs/0c_if_polymorph.ncs | Bin 0 -> 220 bytes _module/ncs/0c_if_scout.ncs | Bin 0 -> 139 bytes _module/ncs/0c_if_skillrank.ncs | Bin 0 -> 221 bytes _module/ncs/0c_if_taunt.ncs | Bin 0 -> 412 bytes _module/ncs/0c_listhenchman.ncs | Bin 0 -> 238 bytes _module/ncs/0c_no_com_script.ncs | Bin 0 -> 601 bytes _module/ncs/0c_remove_effect.ncs | Bin 0 -> 288 bytes _module/ncs/0c_summon_assoc.ncs | Bin 0 -> 223 bytes _module/ncs/0c_use_feat.ncs | Bin 0 -> 161 bytes _module/ncs/0e_c2_1_hb.ncs | Bin 0 -> 1232 bytes _module/ncs/0e_c2_7_ondeath.ncs | Bin 0 -> 2419 bytes _module/ncs/0e_ch_1_hb.ncs | Bin 0 -> 626 bytes _module/ncs/0e_ch_7_ondeath.ncs | Bin 0 -> 4544 bytes _module/ncs/0e_do_combat_rnd.ncs | Bin 0 -> 18993 bytes _module/ncs/0e_gui_events.ncs | Bin 0 -> 73990 bytes _module/ncs/0e_m1_3_endround.ncs | Bin 0 -> 19747 bytes _module/ncs/0e_nui.ncs | Bin 0 -> 476627 bytes _module/ncs/0e_nui_dm.ncs | Bin 0 -> 111374 bytes _module/ncs/0e_onclientload.ncs | Bin 0 -> 75004 bytes _module/ncs/0e_player_target.ncs | Bin 0 -> 197946 bytes _module/ncs/0e_prc_ch_events.ncs | Bin 0 -> 1002 bytes _module/ncs/69_hench_pickup.ncs | Bin 1729 -> 1719 bytes _module/ncs/69_hench_scout1.ncs | Bin 765 -> 739 bytes _module/ncs/69_henchscoutno.ncs | Bin 106 -> 112 bytes _module/ncs/BookOfTownPortal.ncs | Bin 1539 -> 1557 bytes _module/ncs/_kb_corpse_damg.ncs | Bin 92 -> 98 bytes _module/ncs/_kb_corpse_death.ncs | Bin 2522 -> 2808 bytes _module/ncs/_kb_corpse_distb.ncs | Bin 1754 -> 2062 bytes _module/ncs/_kb_corpse_phatk.ncs | Bin 92 -> 98 bytes _module/ncs/_kb_corpse_spell.ncs | Bin 152 -> 164 bytes _module/ncs/_kb_corpse_used.ncs | Bin 263 -> 275 bytes _module/ncs/_kb_corpse_user.ncs | Bin 119 -> 125 bytes _module/ncs/_kb_plc_corpse.ncs | Bin 217 -> 207 bytes _module/ncs/_kb_plugins.ncs | Bin 260 -> 266 bytes _module/ncs/_kb_raise_res.ncs | Bin 4006 -> 4332 bytes _module/ncs/addkeen.ncs | Bin 1345 -> 1475 bytes _module/ncs/ai_a_ambusher.ncs | Bin 0 -> 76573 bytes _module/ncs/ai_a_atk_casters.ncs | Bin 0 -> 149219 bytes _module/ncs/ai_a_atk_nearest.ncs | Bin 0 -> 149040 bytes _module/ncs/ai_a_atk_warrior.ncs | Bin 0 -> 149219 bytes _module/ncs/ai_a_barbarian.ncs | Bin 0 -> 134693 bytes _module/ncs/ai_a_bard.ncs | Bin 0 -> 136056 bytes _module/ncs/ai_a_cleric.ncs | Bin 0 -> 138867 bytes _module/ncs/ai_a_cntrspell.ncs | Bin 0 -> 93630 bytes _module/ncs/ai_a_default.ncs | Bin 0 -> 149173 bytes _module/ncs/ai_a_defensive.ncs | Bin 0 -> 146105 bytes _module/ncs/ai_a_druid.ncs | Bin 0 -> 138050 bytes _module/ncs/ai_a_fighter.ncs | Bin 0 -> 134424 bytes _module/ncs/ai_a_flanker.ncs | Bin 0 -> 140981 bytes _module/ncs/ai_a_invisible.ncs | Bin 0 -> 138508 bytes _module/ncs/ai_a_monk.ncs | Bin 0 -> 133895 bytes _module/ncs/ai_a_no_cmb_mode.ncs | Bin 0 -> 140289 bytes _module/ncs/ai_a_paladin.ncs | Bin 0 -> 140530 bytes _module/ncs/ai_a_peaceful.ncs | Bin 0 -> 141726 bytes _module/ncs/ai_a_polymorphed.ncs | Bin 0 -> 103866 bytes _module/ncs/ai_a_ranged.ncs | Bin 0 -> 149092 bytes _module/ncs/ai_a_ranger.ncs | Bin 0 -> 139178 bytes _module/ncs/ai_a_rogue.ncs | Bin 0 -> 136578 bytes _module/ncs/ai_a_sorcerer.ncs | Bin 0 -> 124515 bytes _module/ncs/ai_a_taunter.ncs | Bin 0 -> 148078 bytes _module/ncs/ai_a_wizard.ncs | Bin 0 -> 124838 bytes _module/ncs/ai_ambusher.ncs | Bin 0 -> 76524 bytes _module/ncs/ai_barbarian.ncs | Bin 0 -> 133088 bytes _module/ncs/ai_bard.ncs | Bin 0 -> 132241 bytes _module/ncs/ai_cleric.ncs | Bin 0 -> 137047 bytes _module/ncs/ai_cntrspell.ncs | Bin 0 -> 93298 bytes _module/ncs/ai_coward.ncs | Bin 0 -> 144830 bytes _module/ncs/ai_default.ncs | Bin 0 -> 151316 bytes _module/ncs/ai_defensive.ncs | Bin 0 -> 148639 bytes _module/ncs/ai_dragon.ncs | Bin 0 -> 104045 bytes _module/ncs/ai_druid.ncs | Bin 0 -> 136145 bytes _module/ncs/ai_fighter.ncs | Bin 0 -> 132815 bytes _module/ncs/ai_flanker.ncs | Bin 0 -> 143110 bytes _module/ncs/ai_incorporeal.ncs | Bin 0 -> 121908 bytes _module/ncs/ai_invisible.ncs | Bin 0 -> 137534 bytes _module/ncs/ai_monk.ncs | Bin 0 -> 131935 bytes _module/ncs/ai_paladin.ncs | Bin 0 -> 137883 bytes _module/ncs/ai_polymorphed.ncs | Bin 0 -> 103450 bytes _module/ncs/ai_ranged.ncs | Bin 0 -> 148166 bytes _module/ncs/ai_ranger.ncs | Bin 0 -> 137628 bytes _module/ncs/ai_rogue.ncs | Bin 0 -> 135498 bytes _module/ncs/ai_shadow.ncs | Bin 0 -> 122056 bytes _module/ncs/ai_sorcerer.ncs | Bin 0 -> 122910 bytes _module/ncs/ai_taunter.ncs | Bin 0 -> 138987 bytes _module/ncs/ai_wizard.ncs | Bin 0 -> 123288 bytes _module/ncs/at_enter_pc_room.ncs | Bin 748 -> 754 bytes _module/ncs/bleeding_ondying.ncs | Bin 1559 -> 1589 bytes _module/ncs/c_con_riddler.ncs | Bin 643 -> 639 bytes _module/ncs/calcmodvalue1.ncs | Bin 3244 -> 3278 bytes _module/ncs/calcmodvalue1a.ncs | Bin 3250 -> 3284 bytes _module/ncs/calcmodvalue2.ncs | Bin 516 -> 490 bytes _module/ncs/cannotafford.ncs | Bin 268 -> 280 bytes _module/ncs/cast_heal_circle.ncs | Bin 188 -> 172 bytes _module/ncs/chk_has10gp.ncs | Bin 131 -> 149 bytes _module/ncs/chk_has500gp.ncs | Bin 131 -> 149 bytes _module/ncs/chk_has5gp.ncs | Bin 131 -> 149 bytes _module/ncs/chk_has_bluff.ncs | Bin 114 -> 132 bytes _module/ncs/chk_has_intimida.ncs | Bin 114 -> 132 bytes _module/ncs/chk_has_persuade.ncs | Bin 114 -> 132 bytes _module/ncs/chk_hascowhelm.ncs | Bin 147 -> 165 bytes _module/ncs/chk_high_cha.ncs | Bin 143 -> 161 bytes _module/ncs/chk_is_chaotic.ncs | Bin 101 -> 119 bytes _module/ncs/chk_is_evil.ncs | Bin 101 -> 119 bytes _module/ncs/chk_is_orc.ncs | Bin 2222 -> 2672 bytes _module/ncs/chk_isgoodor_nue.ncs | Bin 101 -> 119 bytes _module/ncs/chk_manroot.ncs | Bin 147 -> 165 bytes _module/ncs/chk_niceorc.ncs | Bin 140 -> 158 bytes _module/ncs/chk_percy.ncs | Bin 113 -> 131 bytes _module/ncs/chk_pointyears.ncs | Bin 2318 -> 2792 bytes _module/ncs/chk_sm_rc_cls.ncs | Bin 286 -> 318 bytes _module/ncs/con_a_townportal.ncs | Bin 563 -> 551 bytes _module/ncs/con_c_townport0.ncs | Bin 74 -> 80 bytes _module/ncs/con_c_townport1.ncs | Bin 219 -> 225 bytes _module/ncs/cook_meat.ncs | Bin 708 -> 710 bytes _module/ncs/create_gemstore.ncs | Bin 132 -> 170 bytes _module/ncs/create_wmstore.ncs | Bin 134 -> 172 bytes _module/ncs/cv_inn_door.ncs | Bin 96 -> 118 bytes _module/ncs/death_dummy.ncs | Bin 267 -> 273 bytes _module/ncs/death_save.ncs | Bin 175 -> 229 bytes _module/ncs/disarm_trap.ncs | Bin 132 -> 202 bytes _module/ncs/door_bash.ncs | Bin 584 -> 596 bytes _module/ncs/door_click.ncs | Bin 1721 -> 1729 bytes _module/ncs/drink.ncs | Bin 901 -> 943 bytes _module/ncs/empty_destroy.ncs | Bin 79 -> 101 bytes _module/ncs/flavortext.ncs | Bin 309 -> 321 bytes _module/ncs/flintandtinder.ncs | Bin 465 -> 471 bytes _module/ncs/food.ncs | Bin 355 -> 361 bytes _module/ncs/food_disease.ncs | Bin 504 -> 510 bytes _module/ncs/food_poison.ncs | Bin 504 -> 510 bytes _module/ncs/get_is_not_hired.ncs | Bin 227 -> 251 bytes _module/ncs/give_root.ncs | Bin 389 -> 425 bytes _module/ncs/heal_grtr_restor.ncs | Bin 188 -> 172 bytes _module/ncs/hench_level.ncs | Bin 3356 -> 3566 bytes _module/ncs/hire_henchman.ncs | Bin 3881 -> 3921 bytes _module/ncs/isamtrefund.ncs | Bin 78 -> 84 bytes _module/ncs/isamttopay.ncs | Bin 78 -> 84 bytes _module/ncs/isitemonanvil.ncs | Bin 3300 -> 3330 bytes _module/ncs/kill_undead.ncs | Bin 281 -> 287 bytes _module/ncs/map_reveal_trig.ncs | Bin 105 -> 127 bytes _module/ncs/mm_prc_spells.ncs | Bin 0 -> 5896 bytes _module/ncs/mmd_onnui.ncs | Bin 9947 -> 10909 bytes _module/ncs/mmd_onplaytarget.ncs | Bin 9941 -> 10919 bytes _module/ncs/mod_nui.ncs | Bin 33029 -> 33760 bytes _module/ncs/mod_target.ncs | Bin 6405 -> 6657 bytes _module/ncs/modifyitem.ncs | Bin 3296 -> 3342 bytes _module/ncs/modifyitema.ncs | Bin 3308 -> 3354 bytes _module/ncs/mp_hen_spawn.ncs | Bin 1782 -> 39719 bytes _module/ncs/nui_f_storage.ncs | Bin 40276 -> 54768 bytes _module/ncs/nw_c2_default1.ncs | Bin 86342 -> 192886 bytes _module/ncs/nw_c2_default2.ncs | Bin 64825 -> 58069 bytes _module/ncs/nw_c2_default3.ncs | Bin 63054 -> 20590 bytes _module/ncs/nw_c2_default4.ncs | Bin 65277 -> 114667 bytes _module/ncs/nw_c2_default5.ncs | Bin 64914 -> 18916 bytes _module/ncs/nw_c2_default6.ncs | Bin 66143 -> 32072 bytes _module/ncs/nw_c2_default8.ncs | Bin 61652 -> 323 bytes _module/ncs/nw_c2_defaultb.ncs | Bin 66865 -> 67993 bytes _module/ncs/nw_c2_defaulte.ncs | Bin 299 -> 52335 bytes _module/ncs/nw_ch_ac1.ncs | Bin 0 -> 200181 bytes _module/ncs/nw_ch_ac2.ncs | Bin 66649 -> 51073 bytes _module/ncs/nw_ch_ac3.ncs | Bin 0 -> 15448 bytes _module/ncs/nw_ch_ac4.ncs | Bin 0 -> 185537 bytes _module/ncs/nw_ch_ac5.ncs | Bin 0 -> 46470 bytes _module/ncs/nw_ch_ac6.ncs | Bin 0 -> 30735 bytes _module/ncs/nw_ch_ac8.ncs | Bin 0 -> 293 bytes _module/ncs/nw_ch_aca.ncs | Bin 0 -> 90584 bytes _module/ncs/nw_ch_acb.ncs | Bin 0 -> 67119 bytes _module/ncs/nw_ch_ace.ncs | Bin 0 -> 105218 bytes _module/ncs/nw_ch_summon_9.ncs | Bin 0 -> 470 bytes _module/ncs/nw_o2_boss.ncs | Bin 148147 -> 142883 bytes _module/ncs/nw_o2_classweap.ncs | Bin 71157 -> 76297 bytes _module/ncs/nw_o2_generalhig.ncs | Bin 148013 -> 142743 bytes _module/ncs/nw_o2_generallow.ncs | Bin 148005 -> 148197 bytes _module/ncs/nw_o2_generalmed.ncs | Bin 148013 -> 142743 bytes _module/ncs/obj_us_chest.ncs | Bin 8316 -> 7543 bytes _module/ncs/on_mod_enter.ncs | Bin 471 -> 580 bytes _module/ncs/on_pc_respawn.ncs | Bin 2884 -> 2890 bytes _module/ncs/on_pcdie.ncs | Bin 512 -> 530 bytes _module/ncs/onrest.ncs | Bin 3496 -> 6216 bytes _module/ncs/open_gemstore.ncs | Bin 2007 -> 1973 bytes _module/ncs/open_shop.ncs | Bin 2041 -> 2007 bytes _module/ncs/pc_ondeath.ncs | Bin 4601 -> 4767 bytes _module/ncs/pc_room_onexit.ncs | Bin 190 -> 196 bytes _module/ncs/pc_savebuffs.ncs | Bin 0 -> 4602 bytes _module/ncs/pe_buffing.ncs | Bin 0 -> 20237 bytes _module/ncs/pe_crafting.ncs | Bin 0 -> 66994 bytes _module/ncs/pe_debug.ncs | Bin 0 -> 33615 bytes _module/ncs/pe_henchmen.ncs | Bin 0 -> 72640 bytes _module/ncs/pe_mod_set.ncs | Bin 0 -> 3936 bytes _module/ncs/pe_test.ncs | Bin 0 -> 6436 bytes _module/ncs/pi_buffing.ncs | Bin 0 -> 18298 bytes _module/ncs/pi_crafting.ncs | Bin 0 -> 35203 bytes _module/ncs/pi_debug.ncs | Bin 0 -> 15880 bytes _module/ncs/pi_forcerest.ncs | Bin 0 -> 90831 bytes _module/ncs/pi_henchmen.ncs | Bin 0 -> 22829 bytes _module/ncs/pi_test.ncs | Bin 0 -> 8555 bytes _module/ncs/picklock.ncs | Bin 704 -> 674 bytes _module/ncs/plo_townport_use.ncs | Bin 725 -> 707 bytes _module/ncs/plo_townport_usr.ncs | Bin 145 -> 151 bytes _module/ncs/port_archspire.ncs | Bin 395 -> 407 bytes _module/ncs/port_valeford.ncs | Bin 395 -> 407 bytes _module/ncs/prc_pw_raisedead.ncs | Bin 277 -> 381 bytes _module/ncs/prc_pw_res.ncs | Bin 6503 -> 7121 bytes _module/ncs/prc_pwonspawn.ncs | Bin 31578 -> 36602 bytes _module/ncs/rest_inn.ncs | Bin 543 -> 627 bytes _module/ncs/riddler_a.ncs | Bin 31726 -> 31742 bytes _module/ncs/riddler_g.ncs | Bin 2945 -> 3005 bytes _module/ncs/riddler_q.ncs | Bin 44986 -> 45044 bytes _module/ncs/rnd_addcsc.ncs | Bin 3830 -> 3846 bytes _module/ncs/rnd_addcsd.ncs | Bin 3830 -> 3846 bytes _module/ncs/rnd_addwand.ncs | Bin 3830 -> 3846 bytes _module/ncs/rnd_amlt.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_arrow.ncs | Bin 475 -> 481 bytes _module/ncs/rnd_belt.ncs | Bin 479 -> 485 bytes _module/ncs/rnd_blnt.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_boot.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_clok.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_exot.ncs | Bin 471 -> 477 bytes _module/ncs/rnd_gaun.ncs | Bin 475 -> 481 bytes _module/ncs/rnd_gossip.ncs | Bin 7810 -> 7954 bytes _module/ncs/rnd_harm.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_helm.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_larm.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_long.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_magicitem.ncs | Bin 2095 -> 2091 bytes _module/ncs/rnd_marm.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_ring.ncs | Bin 479 -> 485 bytes _module/ncs/rnd_robe.ncs | Bin 479 -> 485 bytes _module/ncs/rnd_rwep.ncs | Bin 483 -> 489 bytes _module/ncs/rnd_shld.ncs | Bin 481 -> 487 bytes _module/ncs/rnd_stff.ncs | Bin 475 -> 481 bytes _module/ncs/rnd_swrd.ncs | Bin 481 -> 487 bytes _module/ncs/scrolloftownport.ncs | Bin 1492 -> 1510 bytes _module/ncs/se_door_death.ncs | Bin 1577 -> 1519 bytes _module/ncs/sei_sit.ncs | Bin 196 -> 192 bytes _module/ncs/sell_root.ncs | Bin 358 -> 394 bytes _module/ncs/sob_examine002.ncs | Bin 76 -> 92 bytes _module/ncs/spawn.ncs | Bin 3279 -> 3297 bytes _module/ncs/spawn_mummy_onds.ncs | Bin 184 -> 238 bytes _module/ncs/spawn_percy.ncs | Bin 265 -> 271 bytes _module/ncs/spawn_towners.ncs | Bin 894 -> 38615 bytes _module/ncs/ss_treas_auto_on.ncs | Bin 2218 -> 2322 bytes _module/ncs/ss_treas_chest.ncs | Bin 246 -> 236 bytes _module/ncs/ss_treasure.ncs | Bin 1515 -> 1425 bytes _module/ncs/ss_treasure_spwn.ncs | Bin 6471 -> 7261 bytes _module/ncs/store_cleaner.ncs | Bin 433 -> 403 bytes _module/ncs/townportal.ncs | Bin 372 -> 384 bytes _module/ncs/trig_can_refill.ncs | Bin 157 -> 179 bytes _module/ncs/trig_cant_refill.ncs | Bin 63 -> 79 bytes _module/ncs/trig_sleep.ncs | Bin 321 -> 327 bytes _module/ncs/ucd_xpawardtraps.ncs | Bin 292 -> 260 bytes _module/ncs/use_altar_evil.ncs | Bin 7835 -> 8247 bytes _module/ncs/use_altar_good.ncs | Bin 7637 -> 8065 bytes _module/ncs/use_archery_targ.ncs | Bin 743 -> 855 bytes _module/ncs/use_contraption.ncs | Bin 7852 -> 8956 bytes _module/ncs/use_controlpanel.ncs | Bin 642 -> 654 bytes _module/ncs/use_crystalball.ncs | Bin 506 -> 512 bytes _module/ncs/use_drink_d.ncs | Bin 740 -> 752 bytes _module/ncs/use_drink_p.ncs | Bin 740 -> 752 bytes _module/ncs/use_gong.ncs | Bin 447 -> 453 bytes _module/ncs/use_healfount.ncs | Bin 394 -> 390 bytes _module/ncs/use_mirror.ncs | Bin 1828 -> 1834 bytes _module/ncs/use_obelisk.ncs | Bin 6913 -> 7341 bytes _module/ncs/vat_setcharges.ncs | Bin 136 -> 184 bytes _module/ncs/vtw_chargecost.ncs | Bin 398 -> 404 bytes _module/ncs/vtw_false.ncs | Bin 51 -> 57 bytes _module/ncs/vtw_gmrt.ncs | Bin 1902 -> 2508 bytes _module/ncs/vtw_gmta.ncs | Bin 1838 -> 2416 bytes _module/ncs/vtw_hasgold.ncs | Bin 161 -> 221 bytes _module/ncs/vtw_m.ncs | Bin 1207 -> 1683 bytes _module/ncs/vtw_mrt.ncs | Bin 1681 -> 2325 bytes _module/ncs/vtw_mt.ncs | Bin 1412 -> 1958 bytes _module/ncs/vtw_mta.ncs | Bin 1681 -> 2233 bytes _module/ncs/vtw_nonsupported.ncs | Bin 3112 -> 4060 bytes _module/ncs/vtw_notgold.ncs | Bin 161 -> 221 bytes _module/ncs/vtw_r.ncs | Bin 375 -> 487 bytes _module/ncs/vtw_rt.ncs | Bin 580 -> 762 bytes _module/ncs/vtw_s.ncs | Bin 343 -> 441 bytes _module/ncs/vtw_shgmr.ncs | Bin 2283 -> 3013 bytes _module/ncs/vtw_shgmrt.ncs | Bin 2504 -> 3288 bytes _module/ncs/vtw_shgmrw.ncs | Bin 2600 -> 3426 bytes _module/ncs/x0_ch_hen_conv.ncs | Bin 80997 -> 87855 bytes _module/ncs/x0_ch_hen_heart.ncs | Bin 1552 -> 1674 bytes _module/ncs/x0_ch_hen_percep.ncs | Bin 10788 -> 11222 bytes _module/ncs/x2_def_spawn.ncs | Bin 0 -> 38410 bytes _module/ncs/x2_mod_def_equ.ncs | Bin 2289 -> 2343 bytes _module/ncs/x2_mod_def_load.ncs | Bin 13170 -> 13660 bytes _module/ncs/xx_pc_1_hb.ncs | Bin 0 -> 119083 bytes _module/ncs/xx_pc_2_percept.ncs | Bin 0 -> 51051 bytes _module/ncs/xx_pc_3_endround.ncs | Bin 0 -> 15528 bytes _module/ncs/xx_pc_4_convers.ncs | Bin 0 -> 184749 bytes _module/ncs/xx_pc_5_phyatked.ncs | Bin 0 -> 16230 bytes _module/ncs/xx_pc_6_damaged.ncs | Bin 0 -> 30232 bytes _module/ncs/xx_pc_8_disturb.ncs | Bin 0 -> 89 bytes _module/ncs/xx_pc_b_castat.ncs | Bin 0 -> 66915 bytes _module/ncs/xx_pc_e_blocked.ncs | Bin 0 -> 105497 bytes _module/ncs/zep_onoff_cruel.ncs | Bin 444 -> 428 bytes _module/nss/0c_assoc_actions.nss | 172 + _module/nss/0c_cast_polymorp.nss | 18 + _module/nss/0c_fire_henchmen.nss | 15 + _module/nss/0c_get_convo.nss | 22 + _module/nss/0c_get_henchman.nss | 25 + _module/nss/0c_h_cast_spell.nss | 12 + _module/nss/0c_henchmenspell.nss | 81 + _module/nss/0c_if_a_magic_m.nss | 16 + _module/nss/0c_if_ass_convo.nss | 132 + _module/nss/0c_if_assoc_mode.nss | 22 + _module/nss/0c_if_cntrspell.nss | 17 + _module/nss/0c_if_com_script.nss | 16 + _module/nss/0c_if_convo.nss | 21 + _module/nss/0c_if_has_assoc.nss | 18 + _module/nss/0c_if_has_class.nss | 28 + _module/nss/0c_if_has_feat.nss | 22 + _module/nss/0c_if_has_spell.nss | 26 + _module/nss/0c_if_hen_leave.nss | 12 + _module/nss/0c_if_identify.nss | 17 + _module/nss/0c_if_not_master.nss | 11 + _module/nss/0c_if_open_inven.nss | 13 + _module/nss/0c_if_pickuploot.nss | 12 + _module/nss/0c_if_polymorph.nss | 11 + _module/nss/0c_if_scout.nss | 11 + _module/nss/0c_if_skillrank.nss | 18 + _module/nss/0c_if_taunt.nss | 15 + _module/nss/0c_listhenchman.nss | 19 + _module/nss/0c_no_com_script.nss | 27 + _module/nss/0c_remove_effect.nss | 14 + _module/nss/0c_summon_assoc.nss | 17 + _module/nss/0c_use_feat.nss | 15 + _module/nss/0e_c2_1_hb.nss | 16 + _module/nss/0e_c2_7_ondeath.nss | 32 + _module/nss/0e_ch_1_hb.nss | 14 + _module/nss/0e_ch_7_ondeath.nss | 41 + _module/nss/0e_do_combat_rnd.nss | 22 + _module/nss/0e_gui_events.nss | 60 + _module/nss/0e_m1_3_endround.nss | 46 + _module/nss/0e_nui.nss | 1975 + _module/nss/0e_nui_dm.nss | 700 + _module/nss/0e_onclientload.nss | 23 + _module/nss/0e_player_target.nss | 154 + _module/nss/0e_prc_ch_events.nss | 78 + _module/nss/0i_actions.nss | 2325 ++ _module/nss/0i_associates.nss | 2192 ++ _module/nss/0i_color.nss | 70 + _module/nss/0i_combat.nss | 3498 ++ _module/nss/0i_constants.nss | 667 + _module/nss/0i_gui_events.nss | 1032 + _module/nss/0i_items.nss | 1243 + _module/nss/0i_main.nss | 1328 + _module/nss/0i_menus.nss | 4823 +++ _module/nss/0i_menus_dm.nss | 1386 + _module/nss/0i_messages.nss | 88 + _module/nss/0i_module.nss | 544 + _module/nss/0i_nui.nss | 434 + _module/nss/0i_player_target.nss | 793 + _module/nss/0i_spells.nss | 2157 + _module/nss/0i_states_cond.nss | 423 + _module/nss/0i_talents.nss | 3098 ++ _module/nss/0i_time.nss | 95 + _module/nss/ai_a_ambusher.nss | 105 + _module/nss/ai_a_atk_casters.nss | 159 + _module/nss/ai_a_atk_nearest.nss | 80 + _module/nss/ai_a_atk_warrior.nss | 159 + _module/nss/ai_a_barbarian.nss | 87 + _module/nss/ai_a_bard.nss | 83 + _module/nss/ai_a_cleric.nss | 102 + _module/nss/ai_a_cntrspell.nss | 69 + _module/nss/ai_a_default.nss | 80 + _module/nss/ai_a_defensive.nss | 77 + _module/nss/ai_a_druid.nss | 86 + _module/nss/ai_a_fighter.nss | 82 + _module/nss/ai_a_flanker.nss | 117 + _module/nss/ai_a_invisible.nss | 123 + _module/nss/ai_a_monk.nss | 82 + _module/nss/ai_a_no_cmb_mode.nss | 131 + _module/nss/ai_a_paladin.nss | 110 + _module/nss/ai_a_peaceful.nss | 81 + _module/nss/ai_a_polymorphed.nss | 70 + _module/nss/ai_a_ranged.nss | 129 + _module/nss/ai_a_ranger.nss | 96 + _module/nss/ai_a_rogue.nss | 83 + _module/nss/ai_a_sorcerer.nss | 75 + _module/nss/ai_a_taunter.nss | 53 + _module/nss/ai_a_wizard.nss | 77 + _module/nss/ai_ambusher.nss | 100 + _module/nss/ai_barbarian.nss | 71 + _module/nss/ai_bard.nss | 67 + _module/nss/ai_cleric.nss | 68 + _module/nss/ai_cntrspell.nss | 68 + _module/nss/ai_coward.nss | 133 + _module/nss/ai_default.nss | 49 + _module/nss/ai_defensive.nss | 48 + _module/nss/ai_dragon.nss | 51 + _module/nss/ai_druid.nss | 70 + _module/nss/ai_fighter.nss | 65 + _module/nss/ai_flanker.nss | 102 + _module/nss/ai_incorporeal.nss | 83 + _module/nss/ai_invisible.nss | 93 + _module/nss/ai_monk.nss | 65 + _module/nss/ai_paladin.nss | 71 + _module/nss/ai_polymorphed.nss | 55 + _module/nss/ai_ranged.nss | 116 + _module/nss/ai_ranger.nss | 79 + _module/nss/ai_rogue.nss | 66 + _module/nss/ai_shadow.nss | 77 + _module/nss/ai_sorcerer.nss | 61 + _module/nss/ai_taunter.nss | 78 + _module/nss/ai_wizard.nss | 63 + _module/nss/food.nss | 3 +- _module/nss/mm_prc_spells.nss | 161 + _module/nss/mmd_inc_random.nss | 91 + _module/nss/mp_hen_spawn.nss | 69 +- _module/nss/ms_name_inc.nss | 1929 +- _module/nss/nui_i_library.nss | 44 + _module/nss/nui_i_main.nss | 77 +- _module/nss/nw_c2_default1.nss | 160 +- _module/nss/nw_c2_default2.nss | 254 +- _module/nss/nw_c2_default3.nss | 106 +- _module/nss/nw_c2_default4.nss | 135 +- _module/nss/nw_c2_default5.nss | 92 +- _module/nss/nw_c2_default6.nss | 131 +- _module/nss/nw_c2_default8.nss | 44 +- _module/nss/nw_c2_defaultb.nss | 183 +- _module/nss/nw_c2_defaulte.nss | 82 +- _module/nss/nw_ch_ac1.nss | 158 + _module/nss/nw_ch_ac2.nss | 146 +- _module/nss/nw_ch_ac3.nss | 56 + _module/nss/nw_ch_ac4.nss | 45 + _module/nss/nw_ch_ac5.nss | 51 + _module/nss/nw_ch_ac6.nss | 32 + _module/nss/nw_ch_ac8.nss | 25 + _module/nss/nw_ch_aca.nss | 46 + _module/nss/nw_ch_acb.nss | 42 + _module/nss/nw_ch_ace.nss | 60 + _module/nss/nw_ch_summon_9.nss | 40 + _module/nss/on_mod_enter.nss | 2 + _module/nss/onrest.nss | 326 +- _module/nss/pc_savebuffs.nss | 182 + _module/nss/pe_buffing.nss | 534 + _module/nss/pe_crafting.nss | 2153 + _module/nss/pe_debug.nss | 900 + _module/nss/pe_henchmen.nss | 589 + _module/nss/pe_mod_set.nss | 119 + _module/nss/pe_test.nss | 227 + _module/nss/pi_buffing.nss | 338 + _module/nss/pi_crafting.nss | 717 + _module/nss/pi_debug.nss | 200 + _module/nss/pi_forcerest.nss | 70 + _module/nss/pi_henchmen.nss | 209 + _module/nss/pi_test.nss | 103 + _module/nss/pinc_henchmen.nss | 1531 + _module/nss/spawn_towners.nss | 25 +- _module/nss/x2_def_spawn.nss | 101 + _module/nss/xx_pc_1_hb.nss | 79 + _module/nss/xx_pc_2_percept.nss | 107 + _module/nss/xx_pc_3_endround.nss | 60 + _module/nss/xx_pc_4_convers.nss | 30 + _module/nss/xx_pc_5_phyatked.nss | 29 + _module/nss/xx_pc_6_damaged.nss | 27 + _module/nss/xx_pc_8_disturb.nss | 21 + _module/nss/xx_pc_b_castat.nss | 35 + _module/nss/xx_pc_e_blocked.nss | 68 + 502 files changed, 147824 insertions(+), 2042 deletions(-) create mode 100644 _module/dlg/nw_g_animal.dlg.json create mode 100644 _module/dlg/nw_g_fam.dlg.json create mode 100644 _module/dlg/oc_ai_henchmen.dlg.json create mode 100644 _module/ncs/0c_assoc_actions.ncs create mode 100644 _module/ncs/0c_cast_polymorp.ncs create mode 100644 _module/ncs/0c_fire_henchmen.ncs create mode 100644 _module/ncs/0c_get_convo.ncs create mode 100644 _module/ncs/0c_get_henchman.ncs create mode 100644 _module/ncs/0c_h_cast_spell.ncs create mode 100644 _module/ncs/0c_henchmenspell.ncs create mode 100644 _module/ncs/0c_if_a_magic_m.ncs create mode 100644 _module/ncs/0c_if_ass_convo.ncs create mode 100644 _module/ncs/0c_if_assoc_mode.ncs create mode 100644 _module/ncs/0c_if_cntrspell.ncs create mode 100644 _module/ncs/0c_if_com_script.ncs create mode 100644 _module/ncs/0c_if_convo.ncs create mode 100644 _module/ncs/0c_if_has_assoc.ncs create mode 100644 _module/ncs/0c_if_has_class.ncs create mode 100644 _module/ncs/0c_if_has_feat.ncs create mode 100644 _module/ncs/0c_if_has_spell.ncs create mode 100644 _module/ncs/0c_if_hen_leave.ncs create mode 100644 _module/ncs/0c_if_identify.ncs create mode 100644 _module/ncs/0c_if_not_master.ncs create mode 100644 _module/ncs/0c_if_open_inven.ncs create mode 100644 _module/ncs/0c_if_pickuploot.ncs create mode 100644 _module/ncs/0c_if_polymorph.ncs create mode 100644 _module/ncs/0c_if_scout.ncs create mode 100644 _module/ncs/0c_if_skillrank.ncs create mode 100644 _module/ncs/0c_if_taunt.ncs create mode 100644 _module/ncs/0c_listhenchman.ncs create mode 100644 _module/ncs/0c_no_com_script.ncs create mode 100644 _module/ncs/0c_remove_effect.ncs create mode 100644 _module/ncs/0c_summon_assoc.ncs create mode 100644 _module/ncs/0c_use_feat.ncs create mode 100644 _module/ncs/0e_c2_1_hb.ncs create mode 100644 _module/ncs/0e_c2_7_ondeath.ncs create mode 100644 _module/ncs/0e_ch_1_hb.ncs create mode 100644 _module/ncs/0e_ch_7_ondeath.ncs create mode 100644 _module/ncs/0e_do_combat_rnd.ncs create mode 100644 _module/ncs/0e_gui_events.ncs create mode 100644 _module/ncs/0e_m1_3_endround.ncs create mode 100644 _module/ncs/0e_nui.ncs create mode 100644 _module/ncs/0e_nui_dm.ncs create mode 100644 _module/ncs/0e_onclientload.ncs create mode 100644 _module/ncs/0e_player_target.ncs create mode 100644 _module/ncs/0e_prc_ch_events.ncs create mode 100644 _module/ncs/ai_a_ambusher.ncs create mode 100644 _module/ncs/ai_a_atk_casters.ncs create mode 100644 _module/ncs/ai_a_atk_nearest.ncs create mode 100644 _module/ncs/ai_a_atk_warrior.ncs create mode 100644 _module/ncs/ai_a_barbarian.ncs create mode 100644 _module/ncs/ai_a_bard.ncs create mode 100644 _module/ncs/ai_a_cleric.ncs create mode 100644 _module/ncs/ai_a_cntrspell.ncs create mode 100644 _module/ncs/ai_a_default.ncs create mode 100644 _module/ncs/ai_a_defensive.ncs create mode 100644 _module/ncs/ai_a_druid.ncs create mode 100644 _module/ncs/ai_a_fighter.ncs create mode 100644 _module/ncs/ai_a_flanker.ncs create mode 100644 _module/ncs/ai_a_invisible.ncs create mode 100644 _module/ncs/ai_a_monk.ncs create mode 100644 _module/ncs/ai_a_no_cmb_mode.ncs create mode 100644 _module/ncs/ai_a_paladin.ncs create mode 100644 _module/ncs/ai_a_peaceful.ncs create mode 100644 _module/ncs/ai_a_polymorphed.ncs create mode 100644 _module/ncs/ai_a_ranged.ncs create mode 100644 _module/ncs/ai_a_ranger.ncs create mode 100644 _module/ncs/ai_a_rogue.ncs create mode 100644 _module/ncs/ai_a_sorcerer.ncs create mode 100644 _module/ncs/ai_a_taunter.ncs create mode 100644 _module/ncs/ai_a_wizard.ncs create mode 100644 _module/ncs/ai_ambusher.ncs create mode 100644 _module/ncs/ai_barbarian.ncs create mode 100644 _module/ncs/ai_bard.ncs create mode 100644 _module/ncs/ai_cleric.ncs create mode 100644 _module/ncs/ai_cntrspell.ncs create mode 100644 _module/ncs/ai_coward.ncs create mode 100644 _module/ncs/ai_default.ncs create mode 100644 _module/ncs/ai_defensive.ncs create mode 100644 _module/ncs/ai_dragon.ncs create mode 100644 _module/ncs/ai_druid.ncs create mode 100644 _module/ncs/ai_fighter.ncs create mode 100644 _module/ncs/ai_flanker.ncs create mode 100644 _module/ncs/ai_incorporeal.ncs create mode 100644 _module/ncs/ai_invisible.ncs create mode 100644 _module/ncs/ai_monk.ncs create mode 100644 _module/ncs/ai_paladin.ncs create mode 100644 _module/ncs/ai_polymorphed.ncs create mode 100644 _module/ncs/ai_ranged.ncs create mode 100644 _module/ncs/ai_ranger.ncs create mode 100644 _module/ncs/ai_rogue.ncs create mode 100644 _module/ncs/ai_shadow.ncs create mode 100644 _module/ncs/ai_sorcerer.ncs create mode 100644 _module/ncs/ai_taunter.ncs create mode 100644 _module/ncs/ai_wizard.ncs create mode 100644 _module/ncs/mm_prc_spells.ncs create mode 100644 _module/ncs/nw_ch_ac1.ncs create mode 100644 _module/ncs/nw_ch_ac3.ncs create mode 100644 _module/ncs/nw_ch_ac4.ncs create mode 100644 _module/ncs/nw_ch_ac5.ncs create mode 100644 _module/ncs/nw_ch_ac6.ncs create mode 100644 _module/ncs/nw_ch_ac8.ncs create mode 100644 _module/ncs/nw_ch_aca.ncs create mode 100644 _module/ncs/nw_ch_acb.ncs create mode 100644 _module/ncs/nw_ch_ace.ncs create mode 100644 _module/ncs/nw_ch_summon_9.ncs create mode 100644 _module/ncs/pc_savebuffs.ncs create mode 100644 _module/ncs/pe_buffing.ncs create mode 100644 _module/ncs/pe_crafting.ncs create mode 100644 _module/ncs/pe_debug.ncs create mode 100644 _module/ncs/pe_henchmen.ncs create mode 100644 _module/ncs/pe_mod_set.ncs create mode 100644 _module/ncs/pe_test.ncs create mode 100644 _module/ncs/pi_buffing.ncs create mode 100644 _module/ncs/pi_crafting.ncs create mode 100644 _module/ncs/pi_debug.ncs create mode 100644 _module/ncs/pi_forcerest.ncs create mode 100644 _module/ncs/pi_henchmen.ncs create mode 100644 _module/ncs/pi_test.ncs create mode 100644 _module/ncs/x2_def_spawn.ncs create mode 100644 _module/ncs/xx_pc_1_hb.ncs create mode 100644 _module/ncs/xx_pc_2_percept.ncs create mode 100644 _module/ncs/xx_pc_3_endround.ncs create mode 100644 _module/ncs/xx_pc_4_convers.ncs create mode 100644 _module/ncs/xx_pc_5_phyatked.ncs create mode 100644 _module/ncs/xx_pc_6_damaged.ncs create mode 100644 _module/ncs/xx_pc_8_disturb.ncs create mode 100644 _module/ncs/xx_pc_b_castat.ncs create mode 100644 _module/ncs/xx_pc_e_blocked.ncs create mode 100644 _module/nss/0c_assoc_actions.nss create mode 100644 _module/nss/0c_cast_polymorp.nss create mode 100644 _module/nss/0c_fire_henchmen.nss create mode 100644 _module/nss/0c_get_convo.nss create mode 100644 _module/nss/0c_get_henchman.nss create mode 100644 _module/nss/0c_h_cast_spell.nss create mode 100644 _module/nss/0c_henchmenspell.nss create mode 100644 _module/nss/0c_if_a_magic_m.nss create mode 100644 _module/nss/0c_if_ass_convo.nss create mode 100644 _module/nss/0c_if_assoc_mode.nss create mode 100644 _module/nss/0c_if_cntrspell.nss create mode 100644 _module/nss/0c_if_com_script.nss create mode 100644 _module/nss/0c_if_convo.nss create mode 100644 _module/nss/0c_if_has_assoc.nss create mode 100644 _module/nss/0c_if_has_class.nss create mode 100644 _module/nss/0c_if_has_feat.nss create mode 100644 _module/nss/0c_if_has_spell.nss create mode 100644 _module/nss/0c_if_hen_leave.nss create mode 100644 _module/nss/0c_if_identify.nss create mode 100644 _module/nss/0c_if_not_master.nss create mode 100644 _module/nss/0c_if_open_inven.nss create mode 100644 _module/nss/0c_if_pickuploot.nss create mode 100644 _module/nss/0c_if_polymorph.nss create mode 100644 _module/nss/0c_if_scout.nss create mode 100644 _module/nss/0c_if_skillrank.nss create mode 100644 _module/nss/0c_if_taunt.nss create mode 100644 _module/nss/0c_listhenchman.nss create mode 100644 _module/nss/0c_no_com_script.nss create mode 100644 _module/nss/0c_remove_effect.nss create mode 100644 _module/nss/0c_summon_assoc.nss create mode 100644 _module/nss/0c_use_feat.nss create mode 100644 _module/nss/0e_c2_1_hb.nss create mode 100644 _module/nss/0e_c2_7_ondeath.nss create mode 100644 _module/nss/0e_ch_1_hb.nss create mode 100644 _module/nss/0e_ch_7_ondeath.nss create mode 100644 _module/nss/0e_do_combat_rnd.nss create mode 100644 _module/nss/0e_gui_events.nss create mode 100644 _module/nss/0e_m1_3_endround.nss create mode 100644 _module/nss/0e_nui.nss create mode 100644 _module/nss/0e_nui_dm.nss create mode 100644 _module/nss/0e_onclientload.nss create mode 100644 _module/nss/0e_player_target.nss create mode 100644 _module/nss/0e_prc_ch_events.nss create mode 100644 _module/nss/0i_actions.nss create mode 100644 _module/nss/0i_associates.nss create mode 100644 _module/nss/0i_color.nss create mode 100644 _module/nss/0i_combat.nss create mode 100644 _module/nss/0i_constants.nss create mode 100644 _module/nss/0i_gui_events.nss create mode 100644 _module/nss/0i_items.nss create mode 100644 _module/nss/0i_main.nss create mode 100644 _module/nss/0i_menus.nss create mode 100644 _module/nss/0i_menus_dm.nss create mode 100644 _module/nss/0i_messages.nss create mode 100644 _module/nss/0i_module.nss create mode 100644 _module/nss/0i_nui.nss create mode 100644 _module/nss/0i_player_target.nss create mode 100644 _module/nss/0i_spells.nss create mode 100644 _module/nss/0i_states_cond.nss create mode 100644 _module/nss/0i_talents.nss create mode 100644 _module/nss/0i_time.nss create mode 100644 _module/nss/ai_a_ambusher.nss create mode 100644 _module/nss/ai_a_atk_casters.nss create mode 100644 _module/nss/ai_a_atk_nearest.nss create mode 100644 _module/nss/ai_a_atk_warrior.nss create mode 100644 _module/nss/ai_a_barbarian.nss create mode 100644 _module/nss/ai_a_bard.nss create mode 100644 _module/nss/ai_a_cleric.nss create mode 100644 _module/nss/ai_a_cntrspell.nss create mode 100644 _module/nss/ai_a_default.nss create mode 100644 _module/nss/ai_a_defensive.nss create mode 100644 _module/nss/ai_a_druid.nss create mode 100644 _module/nss/ai_a_fighter.nss create mode 100644 _module/nss/ai_a_flanker.nss create mode 100644 _module/nss/ai_a_invisible.nss create mode 100644 _module/nss/ai_a_monk.nss create mode 100644 _module/nss/ai_a_no_cmb_mode.nss create mode 100644 _module/nss/ai_a_paladin.nss create mode 100644 _module/nss/ai_a_peaceful.nss create mode 100644 _module/nss/ai_a_polymorphed.nss create mode 100644 _module/nss/ai_a_ranged.nss create mode 100644 _module/nss/ai_a_ranger.nss create mode 100644 _module/nss/ai_a_rogue.nss create mode 100644 _module/nss/ai_a_sorcerer.nss create mode 100644 _module/nss/ai_a_taunter.nss create mode 100644 _module/nss/ai_a_wizard.nss create mode 100644 _module/nss/ai_ambusher.nss create mode 100644 _module/nss/ai_barbarian.nss create mode 100644 _module/nss/ai_bard.nss create mode 100644 _module/nss/ai_cleric.nss create mode 100644 _module/nss/ai_cntrspell.nss create mode 100644 _module/nss/ai_coward.nss create mode 100644 _module/nss/ai_default.nss create mode 100644 _module/nss/ai_defensive.nss create mode 100644 _module/nss/ai_dragon.nss create mode 100644 _module/nss/ai_druid.nss create mode 100644 _module/nss/ai_fighter.nss create mode 100644 _module/nss/ai_flanker.nss create mode 100644 _module/nss/ai_incorporeal.nss create mode 100644 _module/nss/ai_invisible.nss create mode 100644 _module/nss/ai_monk.nss create mode 100644 _module/nss/ai_paladin.nss create mode 100644 _module/nss/ai_polymorphed.nss create mode 100644 _module/nss/ai_ranged.nss create mode 100644 _module/nss/ai_ranger.nss create mode 100644 _module/nss/ai_rogue.nss create mode 100644 _module/nss/ai_shadow.nss create mode 100644 _module/nss/ai_sorcerer.nss create mode 100644 _module/nss/ai_taunter.nss create mode 100644 _module/nss/ai_wizard.nss create mode 100644 _module/nss/mm_prc_spells.nss create mode 100644 _module/nss/mmd_inc_random.nss create mode 100644 _module/nss/nui_i_library.nss create mode 100644 _module/nss/nw_ch_ac1.nss create mode 100644 _module/nss/nw_ch_ac3.nss create mode 100644 _module/nss/nw_ch_ac4.nss create mode 100644 _module/nss/nw_ch_ac5.nss create mode 100644 _module/nss/nw_ch_ac6.nss create mode 100644 _module/nss/nw_ch_ac8.nss create mode 100644 _module/nss/nw_ch_aca.nss create mode 100644 _module/nss/nw_ch_acb.nss create mode 100644 _module/nss/nw_ch_ace.nss create mode 100644 _module/nss/nw_ch_summon_9.nss create mode 100644 _module/nss/pc_savebuffs.nss create mode 100644 _module/nss/pe_buffing.nss create mode 100644 _module/nss/pe_crafting.nss create mode 100644 _module/nss/pe_debug.nss create mode 100644 _module/nss/pe_henchmen.nss create mode 100644 _module/nss/pe_mod_set.nss create mode 100644 _module/nss/pe_test.nss create mode 100644 _module/nss/pi_buffing.nss create mode 100644 _module/nss/pi_crafting.nss create mode 100644 _module/nss/pi_debug.nss create mode 100644 _module/nss/pi_forcerest.nss create mode 100644 _module/nss/pi_henchmen.nss create mode 100644 _module/nss/pi_test.nss create mode 100644 _module/nss/pinc_henchmen.nss create mode 100644 _module/nss/x2_def_spawn.nss create mode 100644 _module/nss/xx_pc_1_hb.nss create mode 100644 _module/nss/xx_pc_2_percept.nss create mode 100644 _module/nss/xx_pc_3_endround.nss create mode 100644 _module/nss/xx_pc_4_convers.nss create mode 100644 _module/nss/xx_pc_5_phyatked.nss create mode 100644 _module/nss/xx_pc_6_damaged.nss create mode 100644 _module/nss/xx_pc_8_disturb.nss create mode 100644 _module/nss/xx_pc_b_castat.nss create mode 100644 _module/nss/xx_pc_e_blocked.nss diff --git a/README.md b/README.md index 83f762e8..d0f40026 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Mordenkainen's Magnificent Dungeon [PRC8] +# Mordenkainen's Magnificent Dungeon [PRC8-PEPS-CEP3] Repository for development of the PRC8 version of the rogue-like multiplayer module, Mordenkainen's Magnificent Dungeon. diff --git a/_module/PackModule.cmd b/_module/PackModule.cmd index 3cee7cdf..fe606b48 100644 --- a/_module/PackModule.cmd +++ b/_module/PackModule.cmd @@ -1 +1 @@ -Module.Packer.exe "Mordenkainen's Magnificent Dungeon [PRC8-CEP3].mod" p \ No newline at end of file +Module.Packer.exe "Mordenkainen's Magnificent Dungeon [PRC8-PEPS-CEP3].mod" p \ No newline at end of file diff --git a/_module/UnpackModule.cmd b/_module/UnpackModule.cmd index 81165457..d5a7acf5 100644 --- a/_module/UnpackModule.cmd +++ b/_module/UnpackModule.cmd @@ -1 +1 @@ -Module.Packer.exe "Mordenkainen's Magnificent Dungeon [PRC8-CEP3].mod" u \ No newline at end of file +Module.Packer.exe "Mordenkainen's Magnificent Dungeon [PRC8-PEPS-CEP3].mod" u \ No newline at end of file diff --git a/_module/are/forge001.are.json b/_module/are/forge001.are.json index 71c40723..67cecdaa 100644 --- a/_module/are/forge001.are.json +++ b/_module/are/forge001.are.json @@ -1713,7 +1713,7 @@ }, "Version": { "type": "dword", - "value": 13 + "value": 14 }, "Width": { "type": "int", diff --git a/_module/are/valeford.are.json b/_module/are/valeford.are.json index e75e9cb5..3b91f7b9 100644 --- a/_module/are/valeford.are.json +++ b/_module/are/valeford.are.json @@ -11173,7 +11173,7 @@ }, "Version": { "type": "dword", - "value": 80 + "value": 83 }, "Width": { "type": "int", diff --git a/_module/are/valefordblacksmi.are.json b/_module/are/valefordblacksmi.are.json index dfa5f71c..62b551ea 100644 --- a/_module/are/valefordblacksmi.are.json +++ b/_module/are/valefordblacksmi.are.json @@ -853,7 +853,7 @@ }, "Version": { "type": "dword", - "value": 8 + "value": 9 }, "Width": { "type": "int", diff --git a/_module/are/valefordgenerals.are.json b/_module/are/valefordgenerals.are.json index b8cc81f3..3d784365 100644 --- a/_module/are/valefordgenerals.are.json +++ b/_module/are/valefordgenerals.are.json @@ -1713,7 +1713,7 @@ }, "Version": { "type": "dword", - "value": 11 + "value": 12 }, "Width": { "type": "int", diff --git a/_module/are/valefordtavernan.are.json b/_module/are/valefordtavernan.are.json index 4e2913f1..4e0fedfa 100644 --- a/_module/are/valefordtavernan.are.json +++ b/_module/are/valefordtavernan.are.json @@ -1197,7 +1197,7 @@ }, "Version": { "type": "dword", - "value": 7 + "value": 8 }, "Width": { "type": "int", diff --git a/_module/are/valefordtemple.are.json b/_module/are/valefordtemple.are.json index d1771cbc..09eca0a0 100644 --- a/_module/are/valefordtemple.are.json +++ b/_module/are/valefordtemple.are.json @@ -1713,7 +1713,7 @@ }, "Version": { "type": "dword", - "value": 15 + "value": 16 }, "Width": { "type": "int", diff --git a/_module/dlg/nw_g_animal.dlg.json b/_module/dlg/nw_g_animal.dlg.json new file mode 100644 index 00000000..a65a225c --- /dev/null +++ b/_module/dlg/nw_g_animal.dlg.json @@ -0,0 +1,49670 @@ +{ + "__data_type": "DLG ", + "DelayEntry": { + "type": "dword", + "value": 0 + }, + "DelayReply": { + "type": "dword", + "value": 0 + }, + "EndConverAbort": { + "type": "resref", + "value": "" + }, + "EndConversation": { + "type": "resref", + "value": "" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_scout" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 439 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_identify" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 438 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " You feel warm thoughts from your animal companion, as it wonders what you would like.", + "id": 53321 + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58454 + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58455 + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58456 + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58457 + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58458 + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58459 + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58460 + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58461 + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58462 + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58463 + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "The animal seems confused about your actions, but slinks away to appease you.", + "id": 58464 + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st-11" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58464 + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58465 + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58466 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58467 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_12" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "The animal is quite famished and devours the food you offer. The companion seems content.", + "id": 58468 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58469 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 141 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + }, + { + "__struct_id": 7, + "Key": { + "type": "cexostring", + "value": "nClass8" + }, + "Value": { + "type": "cexostring", + "value": "46" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " looks up at you, obviously willing to do as you ask.", + "id": 58470 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x2_hen_tomishad3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " waits for you to tell it what to summon." + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 58 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 48 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 38 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Ready to cast it waits for your command.", + "id": 88866 + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 37 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 47 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 46 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 45 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 44 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 43 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 42 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 41 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 40 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 39 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 57 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 54 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 53 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 52 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 51 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 50 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 49 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 140 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 139 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 130 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 129 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 128 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 127 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 126 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 125 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 124 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 123 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 122 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 121 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 120 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 119 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 116 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 115 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 16, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 114 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 17, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 113 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 18, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 112 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 19, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 111 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 20, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 110 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 21, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 109 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 22, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 108 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 23, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 107 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 24, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 106 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 25, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 105 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 26, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 104 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 27, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 103 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 28, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 102 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 29, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 101 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 30, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 100 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 31, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 99 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 32, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 98 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 33, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 97 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 34, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 96 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 35, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 95 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 36, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 94 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 37, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 93 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 38, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 92 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 39, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 91 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 40, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 90 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 41, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 89 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 42, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 88 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 43, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 87 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 44, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 86 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 45, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 85 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 46, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 84 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 47, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 83 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 48, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 82 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 49, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 81 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 50, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 80 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 51, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 79 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 52, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 78 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 53, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 77 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 54, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 76 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 55, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 75 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 56, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 74 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 57, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 73 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 58, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 72 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 59, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 71 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 60, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 70 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 61, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 69 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 62, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 68 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 63, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 67 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 64, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 66 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 65, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 65 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 66, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 64 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 67, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 63 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 68, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 62 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 69, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 70, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 71, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 72, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "At the ready your companion listens.", + "id": 87720 + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 118 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 117 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 138 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 137 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 136 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 135 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 134 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 133 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 132 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 131 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Okay. Who shoulds I cast it on?", + "id": 87722 + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 150 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 149 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 148 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 147 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 146 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 145 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 144 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 143 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 142 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Looking at you it waits.", + "id": 87722 + } + } + }, + { + "__struct_id": 29, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 180 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 179 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 178 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_pickuploot" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 177 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 170 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 159 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 158 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 157 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_skillrank" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSkill" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nRank" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 153 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " looks at you awaiting your instructions on tactics." + } + } + }, + { + "__struct_id": 30, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 156 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 155 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 154 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Looking around, it listens for you to tell them how to deal with objects." + } + } + }, + { + "__struct_id": 31, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 169 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 168 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 167 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 166 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 165 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 164 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 163 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_cntrspell" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 162 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 161 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 160 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Your companion looks up to the sky while you tell it how to use magic." + } + } + }, + { + "__struct_id": 32, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 176 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 175 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 174 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 173 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 172 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 171 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Looking at you, waits for instructon on how it should heal.", + "id": 55427 + } + } + }, + { + "__struct_id": 33, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 437 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_defensive" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 436 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ambusher" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 435 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ranged" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 187 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_peaceful" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 186 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_taunt" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 185 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_taunt" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 184 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 183 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_assoc_mode" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nMode" + }, + "Value": { + "type": "cexostring", + "value": "16384" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 182 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 181 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Your companion listens intently for your combat tactics." + } + } + }, + { + "__struct_id": 34, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 434 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_defensive" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 433 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ambusher" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 432 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ranged" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 187 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 431 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_taunt" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 430 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 429 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 428 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 427 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 426 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What do you think is the best tactic?" + } + } + }, + { + "__struct_id": 35, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 425 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 424 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 423 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_pickuploot" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 422 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 415 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 403 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 402 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 401 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 397 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What do you have in mind?" + } + } + }, + { + "__struct_id": 36, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 38 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_scout" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 396 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_identify" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 395 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_open_inven" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 391 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 380 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 298 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 266 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + }, + { + "__struct_id": 7, + "Key": { + "type": "cexostring", + "value": "nClass8" + }, + "Value": { + "type": "cexostring", + "value": "46" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 251 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 195 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_hen_leave" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 192 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_convo" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 191 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What would you like to discuss?" + } + } + }, + { + "__struct_id": 37, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 194 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 193 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Are you sure you want to do that?" + } + } + }, + { + "__struct_id": 38, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_polymorph" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 250 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "305" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 244 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "304" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 239 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "898" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 233 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "900" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 229 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "901" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 225 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "903" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 221 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "902" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 217 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "1060" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 213 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "1061" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 209 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "257" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 208 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "x2_d2_haslayon" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 198 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "x2_d1_dmight" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 197 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "x2_d1_dshield" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 196 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's see what I can do...", + "id": 95904 + } + } + }, + { + "__struct_id": 39, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 207 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 206 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 205 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 204 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 201 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 200 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And who should be the target of my healing?", + "id": 87722 + } + } + }, + { + "__struct_id": 40, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 212 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 211 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 210 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 41, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 216 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 215 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 214 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 42, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 220 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 219 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 218 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 43, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 224 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 223 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 222 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 44, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 228 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 227 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 226 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 45, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 232 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 231 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 230 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 46, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 238 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 237 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 236 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 235 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 234 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 47, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 243 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 242 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 241 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 240 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 48, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 249 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 248 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 247 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 246 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 245 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 49, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 265 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 264 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x2_hen_tomishad3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 263 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 262 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 261 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 260 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 259 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 258 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 257 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 256 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 255 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 254 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 253 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 252 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What would you have me summon?" + } + } + }, + { + "__struct_id": 50, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 297 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 287 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 277 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 267 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What would you like to discuss about my defensive spells?", + "id": 88866 + } + } + }, + { + "__struct_id": 51, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 276 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 275 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 274 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 273 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 272 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 271 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 270 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 269 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 268 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 52, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 286 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 285 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 284 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 283 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 282 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 281 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 280 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 279 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 278 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 53, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 296 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 295 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 294 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 293 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 292 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 291 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 290 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 289 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 288 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 54, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 379 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 378 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 369 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 368 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 367 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 366 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 365 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 364 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 363 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 362 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 361 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 360 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 359 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 358 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 355 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 354 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 16, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 353 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 17, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 352 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 18, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 351 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 19, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 350 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 20, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 349 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 21, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 348 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 22, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 347 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 23, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 346 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 24, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 345 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 25, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 344 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 26, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 343 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 27, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 342 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 28, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 341 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 29, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 340 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 30, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 339 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 31, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 338 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 32, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 337 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 33, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 336 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 34, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 335 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 35, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 334 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 36, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 333 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 37, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 332 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 38, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 331 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 39, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 330 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 40, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 329 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 41, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 328 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 42, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 327 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 43, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 326 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 44, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 325 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 45, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 324 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 46, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 323 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 47, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 322 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 48, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 321 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 49, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 320 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 50, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 319 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 51, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 318 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 52, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 317 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 53, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 316 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 54, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 315 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 55, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 314 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 56, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 313 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 57, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 312 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 58, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 311 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 59, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 310 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 60, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 309 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 61, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 308 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 62, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 307 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 63, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 306 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 64, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 305 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 65, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 304 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 66, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 303 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 67, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 302 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 68, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 301 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 69, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 300 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 70, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 299 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 71, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 381 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What you want me to cast?", + "id": 87720 + } + } + }, + { + "__struct_id": 55, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 357 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 356 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 56, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 377 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 376 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 375 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 374 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 373 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 372 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 371 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 370 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 381 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Okay. Who shoulds I cast it on?", + "id": 87722 + } + } + }, + { + "__struct_id": 57, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 390 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 389 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 388 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 387 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 386 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 385 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 384 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 383 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 382 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 381 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And who should be the target of my healing?", + "id": 87722 + } + } + }, + { + "__struct_id": 58, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 394 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 393 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 392 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sure, what would you like me to do?" + } + } + }, + { + "__struct_id": 59, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_skillrank" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSkill" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nRank" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 400 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_skillrank" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSkill" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nRank" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 399 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 398 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Should I do something else?" + } + } + }, + { + "__struct_id": 60, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 414 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 413 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_a_magic_m" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nMode" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 412 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 411 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 410 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 409 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 408 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 407 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_cntrspell" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 406 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 405 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 404 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " How would you like me to use magic in combat?" + } + } + }, + { + "__struct_id": 61, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 421 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 420 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 419 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 418 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 417 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 416 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " When do you think I should heal our allies?", + "id": 55427 + } + } + }, + { + "__struct_id": 62, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "The creature looks at you strangely and resumes what it was doing before.", + "id": 53320 + } + } + } + ] + }, + "NumWords": { + "type": "dword", + "value": 2384 + }, + "PreventZoomIn": { + "type": "byte", + "value": 1 + }, + "ReplyList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_03" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_04" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 53319 + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_03" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_04" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 53318 + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58436 + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58437 + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_03" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_04" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58438 + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_11" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58439 + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Me needs you to do something for me.", + "id": 58440 + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I would like you to do something different for me.", + "id": 58441 + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Nevermind." + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets do something else." + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to summon something if you can." + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IX.", + "id": 88353 + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VIII.", + "id": 88354 + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VII.", + "id": 88355 + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VI.", + "id": 88356 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature V.", + "id": 88358 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IV.", + "id": 88358 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature III.", + "id": 88359 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature II.", + "id": 88360 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature I.", + "id": 88361 + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Create Undead.", + "id": 88425 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Animate Dead.", + "id": 88446 + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "Henchmen" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_hen_tomishad4" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Shadow." + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Familiar." + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Companion." + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about your defensive spells.", + "id": 89061 + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your defensive spells.", + "id": 89063 + } + } + }, + { + "__struct_id": 29, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 30, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 31, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 32, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 33, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 34, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 35, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 36, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 37, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 38, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your long duration defensive spells.", + "id": 89064 + } + } + }, + { + "__struct_id": 39, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 40, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 41, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 42, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 43, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 44, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 45, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 46, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 47, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 48, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your short duration defensive spells.", + "id": 89065 + } + } + }, + { + "__struct_id": 49, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 50, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 51, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 52, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 53, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 54, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 55, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 56, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 57, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 58, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast long duration spells after resting." + } + } + }, + { + "__struct_id": 59, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a spell.", + "id": 88348 + } + } + }, + { + "__struct_id": 60, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wounding Whispers.", + "id": 88350 + } + } + }, + { + "__struct_id": 61, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ultravision.", + "id": 88351 + } + } + }, + { + "__struct_id": 62, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "True Seeing.", + "id": 88352 + } + } + }, + { + "__struct_id": 63, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stoneskin.", + "id": 88362 + } + } + }, + { + "__struct_id": 64, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Resistance.", + "id": 88363 + } + } + }, + { + "__struct_id": 65, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Mantle.", + "id": 88364 + } + } + }, + { + "__struct_id": 66, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield of Faith.", + "id": 88365 + } + } + }, + { + "__struct_id": 67, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield.", + "id": 88366 + } + } + }, + { + "__struct_id": 68, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shadow Shield.", + "id": 88367 + } + } + }, + { + "__struct_id": 69, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "See Invisibility.", + "id": 88368 + } + } + }, + { + "__struct_id": 70, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sanctuary.", + "id": 88369 + } + } + }, + { + "__struct_id": 71, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Restoration.", + "id": 88370 + } + } + }, + { + "__struct_id": 72, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resistance.", + "id": 88371 + } + } + }, + { + "__struct_id": 73, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resist Elements.", + "id": 88372 + } + } + }, + { + "__struct_id": 74, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Paralysis.", + "id": 88373 + } + } + }, + { + "__struct_id": 75, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Fear.", + "id": 88374 + } + } + }, + { + "__struct_id": 76, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Disease.", + "id": 88375 + } + } + }, + { + "__struct_id": 77, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Curse.", + "id": 88376 + } + } + }, + { + "__struct_id": 78, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Blindness/Deafness.", + "id": 88377 + } + } + }, + { + "__struct_id": 79, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Regenerate.", + "id": 88378 + } + } + }, + { + "__struct_id": 80, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Spells.", + "id": 88379 + } + } + }, + { + "__struct_id": 81, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Evil." + } + } + }, + { + "__struct_id": 82, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Elements.", + "id": 88380 + } + } + }, + { + "__struct_id": 83, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Premonition.", + "id": 88381 + } + } + }, + { + "__struct_id": 84, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Prayer.", + "id": 88382 + } + } + }, + { + "__struct_id": 85, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Owl's Wisdom.", + "id": 88383 + } + } + }, + { + "__struct_id": 86, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Neutralize poison.", + "id": 88384 + } + } + }, + { + "__struct_id": 87, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Monstrous Regeneration.", + "id": 88385 + } + } + }, + { + "__struct_id": 88, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minor Globe of Invulnerability.", + "id": 88386 + } + } + }, + { + "__struct_id": 89, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mind Blank.", + "id": 88387 + } + } + }, + { + "__struct_id": 90, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mass Haste.", + "id": 88388 + } + } + }, + { + "__struct_id": 91, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Magical Vestment.", + "id": 88389 + } + } + }, + { + "__struct_id": 92, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mage Armor.", + "id": 88390 + } + } + }, + { + "__struct_id": 93, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Light.", + "id": 88391 + } + } + }, + { + "__struct_id": 94, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Spell Mantle.", + "id": 88392 + } + } + }, + { + "__struct_id": 95, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Restoration.", + "id": 88393 + } + } + }, + { + "__struct_id": 96, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Mind Blank", + "id": 88394 + } + } + }, + { + "__struct_id": 97, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Dispel.", + "id": 88395 + } + } + }, + { + "__struct_id": 98, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Knock.", + "id": 88396 + } + } + }, + { + "__struct_id": 99, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility Sphere.", + "id": 88397 + } + } + }, + { + "__struct_id": 100, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility", + "id": 88398 + } + } + }, + { + "__struct_id": 101, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Improved Invisibility.", + "id": 88399 + } + } + }, + { + "__struct_id": 102, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Haste.", + "id": 88400 + } + } + }, + { + "__struct_id": 103, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Stoneskin.", + "id": 88401 + } + } + }, + { + "__struct_id": 104, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Spell Mantle.", + "id": 88402 + } + } + }, + { + "__struct_id": 105, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Sanctuary.", + "id": 88403 + } + } + }, + { + "__struct_id": 106, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Restoration.", + "id": 88404 + } + } + }, + { + "__struct_id": 107, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Magic Weapon.", + "id": 88405 + } + } + }, + { + "__struct_id": 108, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Dispelling.", + "id": 88406 + } + } + }, + { + "__struct_id": 109, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Globe of Invulnerability.", + "id": 88407 + } + } + }, + { + "__struct_id": 110, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ghostly Visage.", + "id": 88408 + } + } + }, + { + "__struct_id": 111, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Freedom of Movement.", + "id": 88409 + } + } + }, + { + "__struct_id": 112, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fox's Cunning", + "id": 88410 + } + } + }, + { + "__struct_id": 113, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Find Traps.", + "id": 88411 + } + } + }, + { + "__struct_id": 114, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ethereal Visage.", + "id": 88412 + } + } + }, + { + "__struct_id": 115, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Entropic Shield.", + "id": 88413 + } + } + }, + { + "__struct_id": 116, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Energy Buffer.", + "id": 88414 + } + } + }, + { + "__struct_id": 117, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 118, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 119, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endure Elements.", + "id": 88417 + } + } + }, + { + "__struct_id": 120, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endurance.", + "id": 88418 + } + } + }, + { + "__struct_id": 121, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Elemental Shield.", + "id": 88419 + } + } + }, + { + "__struct_id": 122, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Eagle's Splendour.", + "id": 88420 + } + } + }, + { + "__struct_id": 123, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Power.", + "id": 88421 + } + } + }, + { + "__struct_id": 124, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dispel Magic.", + "id": 88422 + } + } + }, + { + "__struct_id": 125, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Ward.", + "id": 88423 + } + } + }, + { + "__struct_id": 126, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Armor.", + "id": 88424 + } + } + }, + { + "__struct_id": 127, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Continual Flame.", + "id": 88426 + } + } + }, + { + "__struct_id": 128, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Clarity.", + "id": 88427 + } + } + }, + { + "__struct_id": 129, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cat's Grace.", + "id": 88428 + } + } + }, + { + "__struct_id": 130, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bull's Strength.", + "id": 88429 + } + } + }, + { + "__struct_id": 131, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 132, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 133, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 134, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 135, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 136, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 137, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 138, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 139, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bless.", + "id": 88445 + } + } + }, + { + "__struct_id": 140, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Aid.", + "id": 88447 + } + } + }, + { + "__struct_id": 141, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a healing spell." + } + } + }, + { + "__struct_id": 142, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Heal up the whole party.", + "id": 88431 + } + } + }, + { + "__struct_id": 143, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 144, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 145, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 146, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "Target" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 147, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 148, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 149, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 150, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 151, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to discuss your tactics." + } + } + }, + { + "__struct_id": 152, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about something else." + } + } + }, + { + "__struct_id": 153, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets discuss how you deal with objects." + } + } + }, + { + "__struct_id": 154, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Bash" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your bashing tactics.", + "id": 96501 + } + } + }, + { + "__struct_id": 155, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Locks" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your lock picking tactics.", + "id": 96501 + } + } + }, + { + "__struct_id": 156, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Traps" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your trap tactics.", + "id": 96502 + } + } + }, + { + "__struct_id": 157, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Search" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your search tactics." + } + } + }, + { + "__struct_id": 158, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Stealth" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your stealth tactics." + } + } + }, + { + "__struct_id": 159, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's change how you use magic in combat." + } + } + }, + { + "__struct_id": 160, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you use magic items or not.", + "id": 96498 + } + } + }, + { + "__struct_id": 161, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Dispel" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your dispel tactics.", + "id": 96500 + } + } + }, + { + "__struct_id": 162, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stop countering the enemies spells.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 163, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 164, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BuffFirst" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change who you cast defensive spells on first.", + "id": 96500 + } + } + }, + { + "__struct_id": 165, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "OffensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast offensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 166, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast defensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 167, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "NoMagic" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change how you use magic spells in combat." + } + } + }, + { + "__struct_id": 168, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic more in combat." + } + } + }, + { + "__struct_id": 169, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic less in combat." + } + } + }, + { + "__struct_id": 170, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change when you decide to heal me.", + "id": 54985 + } + } + }, + { + "__struct_id": 171, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal out of combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 172, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health an one needs for you to heal out of combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 173, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal during combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 174, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health any one needs for you to heal during combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 175, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealSelf" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal yourself.", + "id": 54990 + } + } + }, + { + "__struct_id": 176, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealAllies" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal any allies.", + "id": 54989 + } + } + }, + { + "__struct_id": 177, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Pickup" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change if you retrieve items and gold." + } + } + }, + { + "__struct_id": 178, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowFarther" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow farther away from me.", + "id": 96508 + } + } + }, + { + "__struct_id": 179, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowCloser" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow closer to me.", + "id": 96508 + } + } + }, + { + "__struct_id": 180, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about your tactics in combat." + } + } + }, + { + "__struct_id": 181, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AttackTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you fight every opponent during combat." + } + } + }, + { + "__struct_id": 182, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AtkAssociates" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your tactics against familiars, companions, and summons." + } + } + }, + { + "__struct_id": 183, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Ranged" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your ranged combat tactics." + } + } + }, + { + "__struct_id": 184, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!" + } + } + }, + { + "__struct_id": 185, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Taunt" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to taunt the enemy!" + } + } + }, + { + "__struct_id": 186, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "PeaceTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Don't engage in combat." + } + } + }, + { + "__struct_id": 187, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RangedTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use agressive ranged tactics, stay out of melee.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 188, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "That will be all for now." + } + } + }, + { + "__struct_id": 189, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to discuss how we can work together." + } + } + }, + { + "__struct_id": 190, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about something else." + } + } + }, + { + "__struct_id": 191, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_get_convo" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about something completely different." + } + } + }, + { + "__struct_id": 192, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 37 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "We should part ways." + } + } + }, + { + "__struct_id": 193, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I like having you around." + } + } + }, + { + "__struct_id": 194, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_fire_henchmen" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes I'm sure, Perhapse we'll meet again." + } + } + }, + { + "__struct_id": 195, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 38 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you use a special ability?", + "id": 96382 + } + } + }, + { + "__struct_id": 196, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_d2_dshield" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Shield.", + "id": 96383 + } + } + }, + { + "__struct_id": 197, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_d2_dmight" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Might.", + "id": 96384 + } + } + }, + { + "__struct_id": 198, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 39 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lay on Hands.", + "id": 96385 + } + } + }, + { + "__struct_id": 199, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I've changed my mind.", + "id": 88430 + } + } + }, + { + "__struct_id": 200, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 201, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 202, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 203, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 204, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 205, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 206, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 207, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 208, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "257" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_use_feat" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your bard song.", + "id": 88342 + } + } + }, + { + "__struct_id": 209, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 40 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your construction shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 210, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "740" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Iron Golem" + } + } + }, + { + "__struct_id": 211, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "739" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Demon Flesh Golem" + } + } + }, + { + "__struct_id": 212, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "738" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stone Golem" + } + } + }, + { + "__struct_id": 213, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 41 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your outsider shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 214, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "735" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Slaad" + } + } + }, + { + "__struct_id": 215, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "734" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Rakshasa" + } + } + }, + { + "__struct_id": 216, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "733" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Azer" + } + } + }, + { + "__struct_id": 217, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 42 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your humanoid shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 218, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "684" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Kobold Assasin" + } + } + }, + { + "__struct_id": 219, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "683" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lizard folk" + } + } + }, + { + "__struct_id": 220, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "682" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Drow" + } + } + }, + { + "__struct_id": 221, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 43 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape V.", + "id": 88342 + } + } + }, + { + "__struct_id": 222, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "691" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mindflayer" + } + } + }, + { + "__struct_id": 223, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "679" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Medusa" + } + } + }, + { + "__struct_id": 224, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "694" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dire Tiger" + } + } + }, + { + "__struct_id": 225, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 44 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape III.", + "id": 88342 + } + } + }, + { + "__struct_id": 226, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "674" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Manticore" + } + } + }, + { + "__struct_id": 227, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "673" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Drider" + } + } + }, + { + "__struct_id": 228, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "670" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Basilisk" + } + } + }, + { + "__struct_id": 229, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 45 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape II.", + "id": 88342 + } + } + }, + { + "__struct_id": 230, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "680" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minotaur" + } + } + }, + { + "__struct_id": 231, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "678" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Gargoyle" + } + } + }, + { + "__struct_id": 232, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "672" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Harpy" + } + } + }, + { + "__struct_id": 233, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 46 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape I.", + "id": 88342 + } + } + }, + { + "__struct_id": 234, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "662" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Green Wyrmling" + } + } + }, + { + "__struct_id": 235, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "661" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "White Wyrmling" + } + } + }, + { + "__struct_id": 236, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "660" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Black Wyrmling" + } + } + }, + { + "__struct_id": 237, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "659" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Blue Wyrmling" + } + } + }, + { + "__struct_id": 238, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "658" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Red Wyrmling" + } + } + }, + { + "__struct_id": 239, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 47 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your elemental shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 240, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "398" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Water" + } + } + }, + { + "__struct_id": 241, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "397" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fire" + } + } + }, + { + "__struct_id": 242, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "399" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Earth" + } + } + }, + { + "__struct_id": 243, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "400" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Air" + } + } + }, + { + "__struct_id": 244, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 48 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your wild shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 245, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "405" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Badger" + } + } + }, + { + "__struct_id": 246, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "404" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Boar" + } + } + }, + { + "__struct_id": 247, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "403" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wolf" + } + } + }, + { + "__struct_id": 248, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "402" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Panther" + } + } + }, + { + "__struct_id": 249, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "401" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bear" + } + } + }, + { + "__struct_id": 250, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nEffectType" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_remove_effect" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Transform back into your natural form.", + "id": 96384 + } + } + }, + { + "__struct_id": 251, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 49 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to summon something if you can." + } + } + }, + { + "__struct_id": 252, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IX.", + "id": 88353 + } + } + }, + { + "__struct_id": 253, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VIII.", + "id": 88354 + } + } + }, + { + "__struct_id": 254, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VII.", + "id": 88355 + } + } + }, + { + "__struct_id": 255, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VI.", + "id": 88356 + } + } + }, + { + "__struct_id": 256, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature V.", + "id": 88358 + } + } + }, + { + "__struct_id": 257, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IV.", + "id": 88358 + } + } + }, + { + "__struct_id": 258, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature III.", + "id": 88359 + } + } + }, + { + "__struct_id": 259, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature II.", + "id": 88360 + } + } + }, + { + "__struct_id": 260, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature I.", + "id": 88361 + } + } + }, + { + "__struct_id": 261, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Create Undead.", + "id": 88425 + } + } + }, + { + "__struct_id": 262, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Animate Dead.", + "id": 88446 + } + } + }, + { + "__struct_id": 263, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_hen_tomishad4" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Shadow." + } + } + }, + { + "__struct_id": 264, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Familiar." + } + } + }, + { + "__struct_id": 265, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Companion." + } + } + }, + { + "__struct_id": 266, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 50 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about your defensive spells.", + "id": 89061 + } + } + }, + { + "__struct_id": 267, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 51 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your defensive spells.", + "id": 89063 + } + } + }, + { + "__struct_id": 268, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 269, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 270, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 271, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 272, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 273, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 274, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 275, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 276, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 277, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 52 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your long duration defensive spells.", + "id": 89064 + } + } + }, + { + "__struct_id": 278, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 279, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 280, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 281, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 282, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 283, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 284, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 285, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 286, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 287, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 53 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your short duration defensive spells.", + "id": 89065 + } + } + }, + { + "__struct_id": 288, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 289, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 290, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 291, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 292, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 293, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 294, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 295, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 296, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 297, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 50 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast long duration spells after resting." + } + } + }, + { + "__struct_id": 298, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 54 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a spell.", + "id": 88348 + } + } + }, + { + "__struct_id": 299, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wounding Whispers.", + "id": 88350 + } + } + }, + { + "__struct_id": 300, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ultravision.", + "id": 88351 + } + } + }, + { + "__struct_id": 301, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "True Seeing.", + "id": 88352 + } + } + }, + { + "__struct_id": 302, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stoneskin.", + "id": 88362 + } + } + }, + { + "__struct_id": 303, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Resistance.", + "id": 88363 + } + } + }, + { + "__struct_id": 304, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Mantle.", + "id": 88364 + } + } + }, + { + "__struct_id": 305, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield of Faith.", + "id": 88365 + } + } + }, + { + "__struct_id": 306, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield.", + "id": 88366 + } + } + }, + { + "__struct_id": 307, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shadow Shield.", + "id": 88367 + } + } + }, + { + "__struct_id": 308, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "See Invisibility.", + "id": 88368 + } + } + }, + { + "__struct_id": 309, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sanctuary.", + "id": 88369 + } + } + }, + { + "__struct_id": 310, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Restoration.", + "id": 88370 + } + } + }, + { + "__struct_id": 311, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resistance.", + "id": 88371 + } + } + }, + { + "__struct_id": 312, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resist Elements.", + "id": 88372 + } + } + }, + { + "__struct_id": 313, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Paralysis.", + "id": 88373 + } + } + }, + { + "__struct_id": 314, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Fear.", + "id": 88374 + } + } + }, + { + "__struct_id": 315, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Disease.", + "id": 88375 + } + } + }, + { + "__struct_id": 316, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Curse.", + "id": 88376 + } + } + }, + { + "__struct_id": 317, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Blindness/Deafness.", + "id": 88377 + } + } + }, + { + "__struct_id": 318, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Regenerate.", + "id": 88378 + } + } + }, + { + "__struct_id": 319, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Spells.", + "id": 88379 + } + } + }, + { + "__struct_id": 320, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Evil." + } + } + }, + { + "__struct_id": 321, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Elements.", + "id": 88380 + } + } + }, + { + "__struct_id": 322, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Premonition.", + "id": 88381 + } + } + }, + { + "__struct_id": 323, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Prayer.", + "id": 88382 + } + } + }, + { + "__struct_id": 324, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Owl's Wisdom.", + "id": 88383 + } + } + }, + { + "__struct_id": 325, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Neutralize poison.", + "id": 88384 + } + } + }, + { + "__struct_id": 326, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Monstrous Regeneration.", + "id": 88385 + } + } + }, + { + "__struct_id": 327, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minor Globe of Invulnerability.", + "id": 88386 + } + } + }, + { + "__struct_id": 328, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mind Blank.", + "id": 88387 + } + } + }, + { + "__struct_id": 329, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mass Haste.", + "id": 88388 + } + } + }, + { + "__struct_id": 330, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Magical Vestment.", + "id": 88389 + } + } + }, + { + "__struct_id": 331, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mage Armor.", + "id": 88390 + } + } + }, + { + "__struct_id": 332, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Light.", + "id": 88391 + } + } + }, + { + "__struct_id": 333, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Spell Mantle.", + "id": 88392 + } + } + }, + { + "__struct_id": 334, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Restoration.", + "id": 88393 + } + } + }, + { + "__struct_id": 335, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Mind Blank", + "id": 88394 + } + } + }, + { + "__struct_id": 336, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Dispel.", + "id": 88395 + } + } + }, + { + "__struct_id": 337, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Knock.", + "id": 88396 + } + } + }, + { + "__struct_id": 338, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility Sphere.", + "id": 88397 + } + } + }, + { + "__struct_id": 339, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility", + "id": 88398 + } + } + }, + { + "__struct_id": 340, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Improved Invisibility.", + "id": 88399 + } + } + }, + { + "__struct_id": 341, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Haste.", + "id": 88400 + } + } + }, + { + "__struct_id": 342, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Stoneskin.", + "id": 88401 + } + } + }, + { + "__struct_id": 343, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Spell Mantle.", + "id": 88402 + } + } + }, + { + "__struct_id": 344, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Sanctuary.", + "id": 88403 + } + } + }, + { + "__struct_id": 345, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Restoration.", + "id": 88404 + } + } + }, + { + "__struct_id": 346, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Magic Weapon.", + "id": 88405 + } + } + }, + { + "__struct_id": 347, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Dispelling.", + "id": 88406 + } + } + }, + { + "__struct_id": 348, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Globe of Invulnerability.", + "id": 88407 + } + } + }, + { + "__struct_id": 349, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ghostly Visage.", + "id": 88408 + } + } + }, + { + "__struct_id": 350, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Freedom of Movement.", + "id": 88409 + } + } + }, + { + "__struct_id": 351, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fox's Cunning", + "id": 88410 + } + } + }, + { + "__struct_id": 352, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Find Traps.", + "id": 88411 + } + } + }, + { + "__struct_id": 353, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ethereal Visage.", + "id": 88412 + } + } + }, + { + "__struct_id": 354, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Entropic Shield.", + "id": 88413 + } + } + }, + { + "__struct_id": 355, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Energy Buffer.", + "id": 88414 + } + } + }, + { + "__struct_id": 356, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 357, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 358, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endure Elements.", + "id": 88417 + } + } + }, + { + "__struct_id": 359, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endurance.", + "id": 88418 + } + } + }, + { + "__struct_id": 360, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Elemental Shield.", + "id": 88419 + } + } + }, + { + "__struct_id": 361, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Eagle's Splendour.", + "id": 88420 + } + } + }, + { + "__struct_id": 362, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Power.", + "id": 88421 + } + } + }, + { + "__struct_id": 363, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dispel Magic.", + "id": 88422 + } + } + }, + { + "__struct_id": 364, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Ward.", + "id": 88423 + } + } + }, + { + "__struct_id": 365, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Armor.", + "id": 88424 + } + } + }, + { + "__struct_id": 366, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Continual Flame.", + "id": 88426 + } + } + }, + { + "__struct_id": 367, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Clarity.", + "id": 88427 + } + } + }, + { + "__struct_id": 368, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cat's Grace.", + "id": 88428 + } + } + }, + { + "__struct_id": 369, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bull's Strength.", + "id": 88429 + } + } + }, + { + "__struct_id": 370, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 371, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 372, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 373, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 374, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 375, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 376, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 377, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 378, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bless.", + "id": 88445 + } + } + }, + { + "__struct_id": 379, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Aid.", + "id": 88447 + } + } + }, + { + "__struct_id": 380, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 57 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a healing spell." + } + } + }, + { + "__struct_id": 381, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I've changed my mind.", + "id": 88430 + } + } + }, + { + "__struct_id": 382, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Heal up the whole party.", + "id": 88431 + } + } + }, + { + "__struct_id": 383, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 384, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 385, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 386, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 387, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 388, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 389, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 390, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 391, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 58 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can we talk about your items?" + } + } + }, + { + "__struct_id": 392, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "GiveMagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Give me all the magical items in your inventory.", + "id": 96514 + } + } + }, + { + "__struct_id": 393, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "GiveUnIdentifiedItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Give me all your unidentified items.", + "id": 96514 + } + } + }, + { + "__struct_id": 394, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x0_d1_hen_inven" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to adjust your equipment.", + "id": 96514 + } + } + }, + { + "__struct_id": 395, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x1_hen_identify" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you identify our equipment?", + "id": 88341 + } + } + }, + { + "__struct_id": 396, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Scout" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I would like you to scout the area." + } + } + }, + { + "__struct_id": 397, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets discuss how you deal with objects." + } + } + }, + { + "__struct_id": 398, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Bash" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your bashing tactics.", + "id": 96507 + } + } + }, + { + "__struct_id": 399, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Locks" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your lock picking tactics.", + "id": 96507 + } + } + }, + { + "__struct_id": 400, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Traps" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your trap tactics.", + "id": 96502 + } + } + }, + { + "__struct_id": 401, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Search" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your search tactics.", + "id": 96505 + } + } + }, + { + "__struct_id": 402, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Stealth" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your stealth tactics.", + "id": 96505 + } + } + }, + { + "__struct_id": 403, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's change how you use magic in combat." + } + } + }, + { + "__struct_id": 404, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you use magic items or not.", + "id": 96498 + } + } + }, + { + "__struct_id": 405, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Dispel" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your dispel tactics.", + "id": 96500 + } + } + }, + { + "__struct_id": 406, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stop countering the enemies spells.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 407, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Counter the enemy spells!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 408, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BuffFirst" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change who you cast defensive spells on first.", + "id": 96500 + } + } + }, + { + "__struct_id": 409, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "OffensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Only cast offensive spells for now.", + "id": 96498 + } + } + }, + { + "__struct_id": 410, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Only cast defensive spells for now.", + "id": 96498 + } + } + }, + { + "__struct_id": 411, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "NoMagic" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Don't use any magic until I say otherwise.", + "id": 96497 + } + } + }, + { + "__struct_id": 412, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "UseMagic" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use any magic spells you have.", + "id": 96498 + } + } + }, + { + "__struct_id": 413, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic more in combat." + } + } + }, + { + "__struct_id": 414, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic less in combat." + } + } + }, + { + "__struct_id": 415, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change when you should heal.", + "id": 54985 + } + } + }, + { + "__struct_id": 416, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal out of combat.", + "id": 54990 + } + } + }, + { + "__struct_id": 417, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health an one needs for you to heal out of combat.", + "id": 54989 + } + } + }, + { + "__struct_id": 418, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal during combat.", + "id": 54990 + } + } + }, + { + "__struct_id": 419, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health any one needs for you to heal during combat.", + "id": 54989 + } + } + }, + { + "__struct_id": 420, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealSelf" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal yourself.", + "id": 54989 + } + } + }, + { + "__struct_id": 421, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealAllies" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal any allies.", + "id": 54989 + } + } + }, + { + "__struct_id": 422, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Pickup" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change if you pickup items and gold." + } + } + }, + { + "__struct_id": 423, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowFarther" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow farther away from me.", + "id": 96510 + } + } + }, + { + "__struct_id": 424, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowCloser" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow closer to me.", + "id": 96511 + } + } + }, + { + "__struct_id": 425, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about your tactics in combat." + } + } + }, + { + "__struct_id": 426, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AttackTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you fight every opponent during combat.", + "2": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"", + "3": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"" + } + } + }, + { + "__struct_id": 427, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AtkAssociates" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your tactics against familiars, companions, and summons.", + "id": 62531 + } + } + }, + { + "__struct_id": 428, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Ranged" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your ranged combat tactics.", + "id": 62531 + } + } + }, + { + "__struct_id": 429, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 430, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Taunt" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to taunt the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 431, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "PeaceTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Don't engage in combat.", + "2": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"", + "3": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"" + } + } + }, + { + "__struct_id": 432, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AmbushTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use ambush tactics, hide and then strike.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 433, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use defensive tactics to protect yourself.", + "id": 62532 + } + } + }, + { + "__struct_id": 434, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your best judgement in combat.", + "id": 62531 + } + } + }, + { + "__struct_id": 435, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AmbushTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use ambush tactics, hide and then strike.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 436, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use defensive tactics protect yourself.", + "id": 62532 + } + } + }, + { + "__struct_id": 437, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use basic combat tactics.", + "id": 62531 + } + } + }, + { + "__struct_id": 438, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x1_hen_identify" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you identify my equipment?", + "id": 88341 + } + } + }, + { + "__struct_id": 439, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Scout" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I would like you to scout the area." + } + } + } + ] + }, + "StartingList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_ac_st_01" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 62 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + } + } + ] + } +} diff --git a/_module/dlg/nw_g_fam.dlg.json b/_module/dlg/nw_g_fam.dlg.json new file mode 100644 index 00000000..5be0aaee --- /dev/null +++ b/_module/dlg/nw_g_fam.dlg.json @@ -0,0 +1,23412 @@ +{ + "__data_type": "DLG ", + "DelayEntry": { + "type": "dword", + "value": 0 + }, + "DelayReply": { + "type": "dword", + "value": 0 + }, + "EndConverAbort": { + "type": "resref", + "value": "" + }, + "EndConversation": { + "type": "resref", + "value": "" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 193 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_scout" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 192 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_identify" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 191 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What do you require of me ?", + "id": 58490 + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58491 + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58492 + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58493 + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58494 + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58495 + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58496 + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58497 + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58498 + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58499 + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58500 + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58501 + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st-11" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58502 + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st-11" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58503 + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58506 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58507 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58508 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58509 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "nw_ch_fm_st_12" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58504 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58505 + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 141 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + }, + { + "__struct_id": 7, + "Key": { + "type": "cexostring", + "value": "nClass8" + }, + "Value": { + "type": "cexostring", + "value": "46" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What would you like me to do, my ?", + "id": 58510 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x2_hen_tomishad3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What would you have me summon?" + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 58 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 48 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 38 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What would you like to discuss about my defensive spells?", + "id": 88866 + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 37 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 47 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 46 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 45 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 44 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 43 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 42 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 41 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 40 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 39 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 57 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 54 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 53 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 52 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 51 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 50 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "x2_d1_targetall" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 49 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 140 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 139 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 130 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 129 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 128 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 127 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 126 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 125 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 124 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 123 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 122 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 121 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 120 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 119 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 116 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 115 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 16, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 114 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 17, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 113 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 18, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 112 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 19, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 111 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 20, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 110 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 21, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 109 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 22, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 108 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 23, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 107 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 24, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 106 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 25, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 105 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 26, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 104 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 27, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 103 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 28, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 102 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 29, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 101 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 30, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 100 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 31, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 99 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 32, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 98 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 33, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 97 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 34, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 96 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 35, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 95 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 36, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 94 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 37, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 93 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 38, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 92 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 39, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 91 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 40, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 90 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 41, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 89 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 42, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 88 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 43, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 87 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 44, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 86 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 45, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 85 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 46, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 84 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 47, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 83 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 48, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 82 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 49, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 81 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 50, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 80 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 51, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 79 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 52, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 78 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 53, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 77 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 54, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 76 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 55, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 75 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 56, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 74 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 57, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 73 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 58, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 72 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 59, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 71 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 60, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 70 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 61, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 69 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 62, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 68 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 63, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 67 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 64, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 66 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 65, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 65 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 66, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 64 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 67, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 63 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 68, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 62 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 69, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 70, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 71, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What you want me to cast?", + "id": 87720 + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 118 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 117 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 29, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 138 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 137 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 136 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 135 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 134 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 133 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 132 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 131 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Okay. Who shoulds I cast it on?", + "id": 87722 + } + } + }, + { + "__struct_id": 30, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 150 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 149 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 148 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 147 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 146 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 145 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 144 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 143 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 142 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And who should be the target of my healing?", + "id": 87722 + } + } + }, + { + "__struct_id": 31, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 180 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 179 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 178 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_pickuploot" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 177 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 170 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 159 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 158 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 157 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 153 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What tactic would you like me to change, ?" + } + } + }, + { + "__struct_id": 32, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 156 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 155 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 154 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " My benignant , how can I change my actions?\"" + } + } + }, + { + "__struct_id": 33, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 169 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 168 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 167 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 166 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 165 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 164 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 163 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_cntrspell" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 162 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 161 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 160 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Almighty , how shall I use magic in combat?" + } + } + }, + { + "__struct_id": 34, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 176 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 175 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 174 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 173 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 172 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 171 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Let me know when to heal, all knowning .", + "id": 55427 + } + } + }, + { + "__struct_id": 35, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_defensive" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ambusher" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ranged" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 187 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_peaceful" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 186 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_taunt" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 185 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 184 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 183 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 182 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 181 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "nw_d2_intn" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "nw_d2_intl" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Oh powerful ! How would you like to change my tactics?" + } + } + }, + { + "__struct_id": 36, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 194 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 63861 + } + } + }, + { + "__struct_id": 37, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 195 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 63862 + } + } + }, + { + "__struct_id": 38, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 63863 + } + } + }, + { + "__struct_id": 39, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58520 + } + } + } + ] + }, + "NumWords": { + "type": "dword", + "value": 1302 + }, + "PreventZoomIn": { + "type": "byte", + "value": 1 + }, + "ReplyList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58472 + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58473 + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58474 + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "nw_s0_heal" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58475 + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_04" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_09" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58477 + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_11" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58476 + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58478 + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change how you are doing things.", + "id": 58479 + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58480 + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 58481 + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to summon something if you can." + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IX.", + "id": 88353 + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VIII.", + "id": 88354 + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VII.", + "id": 88355 + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VI.", + "id": 88356 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature V.", + "id": 88358 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IV.", + "id": 88358 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature III.", + "id": 88359 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature II.", + "id": 88360 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature I.", + "id": 88361 + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Create Undead.", + "id": 88425 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Animate Dead.", + "id": 88446 + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_hen_tomishad4" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Shadow." + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Familiar." + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Companion." + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about your defensive spells.", + "id": 89061 + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your defensive spells.", + "id": 89063 + } + } + }, + { + "__struct_id": 29, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 30, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 31, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 32, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 33, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 34, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 35, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 36, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 37, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 38, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your long duration defensive spells.", + "id": 89064 + } + } + }, + { + "__struct_id": 39, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 40, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 41, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 42, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 43, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 44, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 45, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 46, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 47, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 48, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your short duration defensive spells.", + "id": 89065 + } + } + }, + { + "__struct_id": 49, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 50, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 51, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 52, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 53, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 54, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 55, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 56, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 57, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 58, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast long duration spells after resting." + } + } + }, + { + "__struct_id": 59, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a spell.", + "id": 88348 + } + } + }, + { + "__struct_id": 60, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wounding Whispers.", + "id": 88350 + } + } + }, + { + "__struct_id": 61, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ultravision.", + "id": 88351 + } + } + }, + { + "__struct_id": 62, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "True Seeing.", + "id": 88352 + } + } + }, + { + "__struct_id": 63, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stoneskin.", + "id": 88362 + } + } + }, + { + "__struct_id": 64, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Resistance.", + "id": 88363 + } + } + }, + { + "__struct_id": 65, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Mantle.", + "id": 88364 + } + } + }, + { + "__struct_id": 66, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield of Faith.", + "id": 88365 + } + } + }, + { + "__struct_id": 67, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield.", + "id": 88366 + } + } + }, + { + "__struct_id": 68, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shadow Shield.", + "id": 88367 + } + } + }, + { + "__struct_id": 69, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "See Invisibility.", + "id": 88368 + } + } + }, + { + "__struct_id": 70, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sanctuary.", + "id": 88369 + } + } + }, + { + "__struct_id": 71, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Restoration.", + "id": 88370 + } + } + }, + { + "__struct_id": 72, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resistance.", + "id": 88371 + } + } + }, + { + "__struct_id": 73, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resist Elements.", + "id": 88372 + } + } + }, + { + "__struct_id": 74, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Paralysis.", + "id": 88373 + } + } + }, + { + "__struct_id": 75, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Fear.", + "id": 88374 + } + } + }, + { + "__struct_id": 76, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Disease.", + "id": 88375 + } + } + }, + { + "__struct_id": 77, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Curse.", + "id": 88376 + } + } + }, + { + "__struct_id": 78, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Blindness/Deafness.", + "id": 88377 + } + } + }, + { + "__struct_id": 79, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Regenerate.", + "id": 88378 + } + } + }, + { + "__struct_id": 80, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Spells.", + "id": 88379 + } + } + }, + { + "__struct_id": 81, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Evil." + } + } + }, + { + "__struct_id": 82, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Elements.", + "id": 88380 + } + } + }, + { + "__struct_id": 83, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Premonition.", + "id": 88381 + } + } + }, + { + "__struct_id": 84, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Prayer.", + "id": 88382 + } + } + }, + { + "__struct_id": 85, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Owl's Wisdom.", + "id": 88383 + } + } + }, + { + "__struct_id": 86, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Neutralize poison.", + "id": 88384 + } + } + }, + { + "__struct_id": 87, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Monstrous Regeneration.", + "id": 88385 + } + } + }, + { + "__struct_id": 88, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minor Globe of Invulnerability.", + "id": 88386 + } + } + }, + { + "__struct_id": 89, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mind Blank.", + "id": 88387 + } + } + }, + { + "__struct_id": 90, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mass Haste.", + "id": 88388 + } + } + }, + { + "__struct_id": 91, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Magical Vestment.", + "id": 88389 + } + } + }, + { + "__struct_id": 92, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mage Armor.", + "id": 88390 + } + } + }, + { + "__struct_id": 93, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Light.", + "id": 88391 + } + } + }, + { + "__struct_id": 94, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Spell Mantle.", + "id": 88392 + } + } + }, + { + "__struct_id": 95, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Restoration.", + "id": 88393 + } + } + }, + { + "__struct_id": 96, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Mind Blank", + "id": 88394 + } + } + }, + { + "__struct_id": 97, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Dispel.", + "id": 88395 + } + } + }, + { + "__struct_id": 98, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Knock.", + "id": 88396 + } + } + }, + { + "__struct_id": 99, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility Sphere.", + "id": 88397 + } + } + }, + { + "__struct_id": 100, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility", + "id": 88398 + } + } + }, + { + "__struct_id": 101, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Improved Invisibility.", + "id": 88399 + } + } + }, + { + "__struct_id": 102, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Haste.", + "id": 88400 + } + } + }, + { + "__struct_id": 103, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Stoneskin.", + "id": 88401 + } + } + }, + { + "__struct_id": 104, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Spell Mantle.", + "id": 88402 + } + } + }, + { + "__struct_id": 105, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Sanctuary.", + "id": 88403 + } + } + }, + { + "__struct_id": 106, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Restoration.", + "id": 88404 + } + } + }, + { + "__struct_id": 107, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Magic Weapon.", + "id": 88405 + } + } + }, + { + "__struct_id": 108, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Dispelling.", + "id": 88406 + } + } + }, + { + "__struct_id": 109, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Globe of Invulnerability.", + "id": 88407 + } + } + }, + { + "__struct_id": 110, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ghostly Visage.", + "id": 88408 + } + } + }, + { + "__struct_id": 111, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Freedom of Movement.", + "id": 88409 + } + } + }, + { + "__struct_id": 112, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fox's Cunning", + "id": 88410 + } + } + }, + { + "__struct_id": 113, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Find Traps.", + "id": 88411 + } + } + }, + { + "__struct_id": 114, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ethereal Visage.", + "id": 88412 + } + } + }, + { + "__struct_id": 115, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Entropic Shield.", + "id": 88413 + } + } + }, + { + "__struct_id": 116, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Energy Buffer.", + "id": 88414 + } + } + }, + { + "__struct_id": 117, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 118, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 119, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endure Elements.", + "id": 88417 + } + } + }, + { + "__struct_id": 120, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endurance.", + "id": 88418 + } + } + }, + { + "__struct_id": 121, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Elemental Shield.", + "id": 88419 + } + } + }, + { + "__struct_id": 122, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Eagle's Splendour.", + "id": 88420 + } + } + }, + { + "__struct_id": 123, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Power.", + "id": 88421 + } + } + }, + { + "__struct_id": 124, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dispel Magic.", + "id": 88422 + } + } + }, + { + "__struct_id": 125, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Ward.", + "id": 88423 + } + } + }, + { + "__struct_id": 126, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Armor.", + "id": 88424 + } + } + }, + { + "__struct_id": 127, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Continual Flame.", + "id": 88426 + } + } + }, + { + "__struct_id": 128, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Clarity.", + "id": 88427 + } + } + }, + { + "__struct_id": 129, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cat's Grace.", + "id": 88428 + } + } + }, + { + "__struct_id": 130, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bull's Strength.", + "id": 88429 + } + } + }, + { + "__struct_id": 131, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 132, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 133, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 134, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 135, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 136, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 137, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 138, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 139, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bless.", + "id": 88445 + } + } + }, + { + "__struct_id": 140, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Aid.", + "id": 88447 + } + } + }, + { + "__struct_id": 141, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a healing spell." + } + } + }, + { + "__struct_id": 142, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Heal up the whole party.", + "id": 88431 + } + } + }, + { + "__struct_id": 143, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 144, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 145, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 146, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 147, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 148, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 149, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 150, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 151, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to discuss your tactics." + } + } + }, + { + "__struct_id": 152, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about something else." + } + } + }, + { + "__struct_id": 153, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Object" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets discuss how you deal with objects." + } + } + }, + { + "__struct_id": 154, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Bash" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Object" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your bashing tactics.", + "id": 96501 + } + } + }, + { + "__struct_id": 155, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Locks" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Object" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your lock picking tactics.", + "id": 96501 + } + } + }, + { + "__struct_id": 156, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Traps" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Object" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your trap tactics.", + "id": 96502 + } + } + }, + { + "__struct_id": 157, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Search" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your search tactics." + } + } + }, + { + "__struct_id": 158, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Stealth" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your stealth tactics." + } + } + }, + { + "__struct_id": 159, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's change how you use magic in combat." + } + } + }, + { + "__struct_id": 160, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you use magic items or not.", + "id": 96498 + } + } + }, + { + "__struct_id": 161, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Dispel" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your dispel tactics.", + "id": 96500 + } + } + }, + { + "__struct_id": 162, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stop countering the enemies spells.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 163, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 164, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BuffFirst" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change who you cast defensive spells on first.", + "id": 96500 + } + } + }, + { + "__struct_id": 165, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "OffensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast offensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 166, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast defensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 167, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "NoMagic" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change how you use magic spells in combat.", + "id": 96498 + } + } + }, + { + "__struct_id": 168, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic more in combat." + } + } + }, + { + "__struct_id": 169, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic less in combat." + } + } + }, + { + "__struct_id": 170, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change when you decide to heal me.", + "id": 54985 + } + } + }, + { + "__struct_id": 171, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal out of combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 172, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health an one needs for you to heal out of combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 173, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal during combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 174, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health any one needs for you to heal during combat.", + "id": 54991 + } + } + }, + { + "__struct_id": 175, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealSelf" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal yourself.", + "id": 54991 + } + } + }, + { + "__struct_id": 176, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealAllies" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal any allies.", + "id": 54991 + } + } + }, + { + "__struct_id": 177, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Pickup" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change if you retrieve items and gold." + } + } + }, + { + "__struct_id": 178, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowFarther" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow farther away from me.", + "id": 96508 + } + } + }, + { + "__struct_id": 179, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowCloser" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow closer to me.", + "id": 96508 + } + } + }, + { + "__struct_id": 180, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about your tactics in combat." + } + } + }, + { + "__struct_id": 181, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AttackTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you fight every opponent during combat." + } + } + }, + { + "__struct_id": 182, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AtkAssociates" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your tactics against familiars, companions, and summons.", + "id": 62531 + } + } + }, + { + "__struct_id": 183, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Ranged" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your ranged combat tactics.", + "id": 62531 + } + } + }, + { + "__struct_id": 184, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 185, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Taunt" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to taunt the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 186, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "PeaceTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Don't engage in combat.", + "2": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"", + "3": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"" + } + } + }, + { + "__struct_id": 187, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RangedTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use agressive ranged tactics, stay out of melee.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 188, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AmbushTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use ambush tactics, hide and then strike.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 189, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use defensive tactics protect yourself.", + "id": 62532 + } + } + }, + { + "__struct_id": 190, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use basic combat tactics.", + "id": 62531 + } + } + }, + { + "__struct_id": 191, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x1_hen_identify" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you identify my equipment?", + "id": 88341 + } + } + }, + { + "__struct_id": 192, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Scout" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I would like you to scout the area." + } + } + }, + { + "__struct_id": 193, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "id": 63860 + } + } + }, + { + "__struct_id": 194, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 37 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": {} + } + }, + { + "__struct_id": 195, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 38 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": {} + } + } + ] + }, + "StartingList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "nw_ch_fm_st_01" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 39 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + } + } + ] + } +} diff --git a/_module/dlg/oc_ai_henchmen.dlg.json b/_module/dlg/oc_ai_henchmen.dlg.json new file mode 100644 index 00000000..d9ca1b69 --- /dev/null +++ b/_module/dlg/oc_ai_henchmen.dlg.json @@ -0,0 +1,27180 @@ +{ + "__data_type": "DLG ", + "DelayEntry": { + "type": "dword", + "value": 0 + }, + "DelayReply": { + "type": "dword", + "value": 0 + }, + "EndConverAbort": { + "type": "resref", + "value": "" + }, + "EndConversation": { + "type": "resref", + "value": "" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 38 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_scout" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 247 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_identify" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 246 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_open_inven" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 242 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 191 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 109 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 77 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_class" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nClass1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nClass2" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 2, + "Key": { + "type": "cexostring", + "value": "nClass3" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 3, + "Key": { + "type": "cexostring", + "value": "nClass4" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 4, + "Key": { + "type": "cexostring", + "value": "nClass5" + }, + "Value": { + "type": "cexostring", + "value": "10" + } + }, + { + "__struct_id": 5, + "Key": { + "type": "cexostring", + "value": "nClass6" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + }, + { + "__struct_id": 6, + "Key": { + "type": "cexostring", + "value": "nClass7" + }, + "Value": { + "type": "cexostring", + "value": "48" + } + }, + { + "__struct_id": 7, + "Key": { + "type": "cexostring", + "value": "nClass8" + }, + "Value": { + "type": "cexostring", + "value": "46" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 62 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_hen_leave" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_convo" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What would you like to discuss?" + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Are you sure you want to do that?" + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_polymorph" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 61 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "305" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 55 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "304" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 50 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "898" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 44 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "900" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 40 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "901" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 36 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "903" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 32 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "902" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 28 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "1060" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "1061" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "257" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "sTarget" + }, + "Value": { + "type": "cexostring", + "value": "OBJECT_SELF" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "x2_d2_haslayon" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "x2_d1_dmight" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "x2_d1_dshield" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's see what I can do...", + "id": 95904 + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And who should be the target of my healing?", + "id": 87722 + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 31 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 30 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 29 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 35 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 34 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 33 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 39 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 38 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 37 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 43 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 42 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 41 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 49 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_feat" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 48 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 47 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 46 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 45 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 54 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 53 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 52 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 51 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 60 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 59 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 58 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 57 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 56 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Which form should I take?" + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 76 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_assoc" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 75 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x2_hen_tomishad3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 74 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 73 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 72 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 71 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 70 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 69 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 68 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 67 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 66 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 65 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 64 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 63 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What would you have me summon?" + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 108 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 98 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 88 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 78 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What would you like to discuss about my defensive spells?", + "id": 88866 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 87 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 86 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 85 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 84 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 83 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 82 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 81 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 80 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 79 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 97 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 96 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 95 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 94 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 93 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 92 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 91 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 90 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 89 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 107 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 106 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 105 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 104 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 103 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 102 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 101 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 100 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 99 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "0c_listhenchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And what is my target?", + "id": 87722 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 190 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 189 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 180 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 179 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 178 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 177 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 176 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 175 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 174 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 173 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 172 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 171 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 12, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 170 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 13, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 169 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 14, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 166 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 15, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 165 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 16, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 164 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 17, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 163 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 18, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 162 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 19, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 161 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 20, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 160 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 21, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 159 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 22, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 158 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 23, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 157 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 24, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 156 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 25, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 155 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 26, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 154 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 27, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 153 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 28, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 152 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 29, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 151 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 30, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 150 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 31, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 149 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 32, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 148 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 33, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 147 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 34, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 146 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 35, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 145 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 36, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 144 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 37, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 143 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 38, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 142 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 39, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 141 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 40, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 140 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 41, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 139 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 42, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 138 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 43, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 137 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 44, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 136 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 45, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 135 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 46, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 134 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 47, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 133 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 48, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 132 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 49, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 131 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 50, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 130 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 51, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 129 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 52, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 128 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 53, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 127 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 54, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 126 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 55, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 125 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 56, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 124 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 57, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 123 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 58, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 122 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 59, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 121 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 60, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 120 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 61, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 119 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 62, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 118 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 63, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 117 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 64, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 116 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 65, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 115 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 66, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 114 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 67, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 113 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 68, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 112 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 69, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 111 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 70, + "Active": { + "type": "resref", + "value": "0c_if_has_spell" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell1" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 110 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 71, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 192 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What you want me to cast?", + "id": 87720 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 168 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 167 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You sure?", + "id": 87721 + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 188 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 187 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 186 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 185 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 184 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 183 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 182 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 181 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 192 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Okay. Who shoulds I cast it on?", + "id": 87722 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 201 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 200 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "x0_d2_hasfamil" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 199 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "x0_d2_hascompan" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 198 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "x2_d1_hashench1" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 197 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "x2_d1_hashench2" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 196 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "x2_d1_hashench3" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 195 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "x2_d1_hashench4" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 194 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 193 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 192 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "x2_d1_gentags" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "And who should be the target of my healing?", + "id": 87722 + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 231 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 230 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 229 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_if_pickuploot" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 228 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 221 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 210 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 209 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 208 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 204 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What do you have in mind?" + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_skillrank" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSkill" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nRank" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 207 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_skillrank" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSkill" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nRank" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 206 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 205 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Should I do something else?" + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 220 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 219 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_if_a_magic_m" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nMode" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 218 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 217 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 216 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 215 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 214 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "0c_if_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_cntrspell" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 213 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 212 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 211 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " How would you like me to use magic in combat?" + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 227 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 226 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 225 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 224 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 223 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 222 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " When do you think I should heal our allies?", + "id": 55427 + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 241 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_defensive" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 240 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ambusher" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 239 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_ranged" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 238 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "0c_no_com_script" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAIScript" + }, + "Value": { + "type": "cexostring", + "value": "ai_a_peaceful" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 237 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 5, + "Active": { + "type": "resref", + "value": "0c_if_taunt" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 236 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 6, + "Active": { + "type": "resref", + "value": "0c_if_cntrspell" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 235 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 7, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 234 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 8, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 233 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 9, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 232 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 10, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 202 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 11, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " What do you think is the best tactic?" + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 245 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 244 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 243 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 203 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 4, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sure, what would you like me to do?" + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 29 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 249 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 248 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wel-met. I think we should work together, what do you say?" + } + } + } + ] + }, + "NumWords": { + "type": "dword", + "value": 1148 + }, + "PreventZoomIn": { + "type": "byte", + "value": 1 + }, + "ReplyList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "That will be all for now." + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_get_convo" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about something completely different." + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "We should part ways." + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I like having you around." + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_fire_henchmen" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes I'm sure, Perhapse we'll meet again." + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Speaking" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change how much you speak.", + "id": 96511 + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you use a special ability?", + "id": 96382 + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_d2_dshield" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Shield.", + "id": 96383 + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_d2_dmight" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Might.", + "id": 96384 + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lay on Hands.", + "id": 96385 + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I've changed my mind.", + "id": 88430 + } + } + }, + { + "__struct_id": 11, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 12, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 13, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 14, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 15, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 16, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 17, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 18, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 19, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nFeat" + }, + "Value": { + "type": "cexostring", + "value": "257" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_use_feat" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your bard song.", + "id": 88342 + } + } + }, + { + "__struct_id": 20, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your construction shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 21, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "740" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Iron Golem" + } + } + }, + { + "__struct_id": 22, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "739" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Demon Flesh Golem" + } + } + }, + { + "__struct_id": 23, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "738" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stone Golem" + } + } + }, + { + "__struct_id": 24, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your outsider shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 25, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "735" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Slaad" + } + } + }, + { + "__struct_id": 26, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "734" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Rakshasa" + } + } + }, + { + "__struct_id": 27, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "733" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Azer" + } + } + }, + { + "__struct_id": 28, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your humanoid shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 29, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "684" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Kobold Assasin" + } + } + }, + { + "__struct_id": 30, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "683" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lizard folk" + } + } + }, + { + "__struct_id": 31, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "682" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Drow" + } + } + }, + { + "__struct_id": 32, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape V.", + "id": 88342 + } + } + }, + { + "__struct_id": 33, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "691" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mindflayer" + } + } + }, + { + "__struct_id": 34, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "679" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Medusa" + } + } + }, + { + "__struct_id": 35, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "694" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dire Tiger" + } + } + }, + { + "__struct_id": 36, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape III.", + "id": 88342 + } + } + }, + { + "__struct_id": 37, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "674" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Manticore" + } + } + }, + { + "__struct_id": 38, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "673" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Drider" + } + } + }, + { + "__struct_id": 39, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "670" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Basilisk" + } + } + }, + { + "__struct_id": 40, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape II.", + "id": 88342 + } + } + }, + { + "__struct_id": 41, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "680" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minotaur" + } + } + }, + { + "__struct_id": 42, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "678" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Gargoyle" + } + } + }, + { + "__struct_id": 43, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "672" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Harpy" + } + } + }, + { + "__struct_id": 44, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your greater wild shape I.", + "id": 88342 + } + } + }, + { + "__struct_id": 45, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "662" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Green Wyrmling" + } + } + }, + { + "__struct_id": 46, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "661" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "White Wyrmling" + } + } + }, + { + "__struct_id": 47, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "660" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Black Wyrmling" + } + } + }, + { + "__struct_id": 48, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "659" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Blue Wyrmling" + } + } + }, + { + "__struct_id": 49, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "658" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Red Wyrmling" + } + } + }, + { + "__struct_id": 50, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 11 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your elemental shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 51, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "398" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Water" + } + } + }, + { + "__struct_id": 52, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "397" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fire" + } + } + }, + { + "__struct_id": 53, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "399" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Earth" + } + } + }, + { + "__struct_id": 54, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "400" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Air" + } + } + }, + { + "__struct_id": 55, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 12 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your wild shape.", + "id": 88342 + } + } + }, + { + "__struct_id": 56, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "405" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Badger" + } + } + }, + { + "__struct_id": 57, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "404" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Boar" + } + } + }, + { + "__struct_id": 58, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "403" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wolf" + } + } + }, + { + "__struct_id": 59, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "402" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Panther" + } + } + }, + { + "__struct_id": 60, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "401" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_cast_polymorp" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bear" + } + } + }, + { + "__struct_id": 61, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nEffectType" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_remove_effect" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Transform back into your natural form.", + "id": 96384 + } + } + }, + { + "__struct_id": 62, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 13 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to summon something if you can." + } + } + }, + { + "__struct_id": 63, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "178" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IX.", + "id": 88353 + } + } + }, + { + "__struct_id": 64, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "182" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VIII.", + "id": 88354 + } + } + }, + { + "__struct_id": 65, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "181" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VII.", + "id": 88355 + } + } + }, + { + "__struct_id": 66, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "180" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature VI.", + "id": 88356 + } + } + }, + { + "__struct_id": 67, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "179" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature V.", + "id": 88358 + } + } + }, + { + "__struct_id": 68, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "177" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature IV.", + "id": 88358 + } + } + }, + { + "__struct_id": 69, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "176" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature III.", + "id": 88359 + } + } + }, + { + "__struct_id": 70, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "175" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature II.", + "id": 88360 + } + } + }, + { + "__struct_id": 71, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "174" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Creature I.", + "id": 88361 + } + } + }, + { + "__struct_id": 72, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "30" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Create Undead.", + "id": 88425 + } + } + }, + { + "__struct_id": 73, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Animate Dead.", + "id": 88446 + } + } + }, + { + "__struct_id": 74, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x2_hen_tomishad4" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Summon Shadow." + } + } + }, + { + "__struct_id": 75, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Familiar" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Familiar." + } + } + }, + { + "__struct_id": 76, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAssociate" + }, + "Value": { + "type": "cexostring", + "value": "Companion" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_summon_assoc" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Your Companion." + } + } + }, + { + "__struct_id": 77, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let us talk about your defensive spells.", + "id": 89061 + } + } + }, + { + "__struct_id": 78, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 15 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your defensive spells.", + "id": 89063 + } + } + }, + { + "__struct_id": 79, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 80, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 81, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 82, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 83, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 84, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 85, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 86, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 87, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 88, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 16 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your long duration defensive spells.", + "id": 89064 + } + } + }, + { + "__struct_id": 89, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 90, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 91, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 92, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 93, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 94, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 95, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 96, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 97, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 98, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 17 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast all your short duration defensive spells.", + "id": 89065 + } + } + }, + { + "__struct_id": 99, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast on all the party members.", + "id": 88431 + } + } + }, + { + "__struct_id": 100, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 101, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 102, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 103, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 104, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 105, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 106, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 107, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 108, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "RestBuffing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 14 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast long duration spells after resting." + } + } + }, + { + "__struct_id": 109, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 18 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a spell.", + "id": 88348 + } + } + }, + { + "__struct_id": 110, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "441" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Wounding Whispers.", + "id": 88350 + } + } + }, + { + "__struct_id": 111, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "365" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ultravision.", + "id": 88351 + } + } + }, + { + "__struct_id": 112, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "186" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "True Seeing.", + "id": 88352 + } + } + }, + { + "__struct_id": 113, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "172" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stoneskin.", + "id": 88362 + } + } + }, + { + "__struct_id": 114, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "168" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Resistance.", + "id": 88363 + } + } + }, + { + "__struct_id": 115, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "169" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Spell Mantle.", + "id": 88364 + } + } + }, + { + "__struct_id": 116, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "450" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield of Faith.", + "id": 88365 + } + } + }, + { + "__struct_id": 117, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "417" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shield.", + "id": 88366 + } + } + }, + { + "__struct_id": 118, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "159" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Shadow Shield.", + "id": 88367 + } + } + }, + { + "__struct_id": 119, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "157" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "See Invisibility.", + "id": 88368 + } + } + }, + { + "__struct_id": 120, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "154" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Sanctuary.", + "id": 88369 + } + } + }, + { + "__struct_id": 121, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "152" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Restoration.", + "id": 88370 + } + } + }, + { + "__struct_id": 122, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "151" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resistance.", + "id": 88371 + } + } + }, + { + "__struct_id": 123, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "150" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Resist Elements.", + "id": 88372 + } + } + }, + { + "__struct_id": 124, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "149" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Paralysis.", + "id": 88373 + } + } + }, + { + "__struct_id": 125, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "148" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Fear.", + "id": 88374 + } + } + }, + { + "__struct_id": 126, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "147" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Disease.", + "id": 88375 + } + } + }, + { + "__struct_id": 127, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "146" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Curse.", + "id": 88376 + } + } + }, + { + "__struct_id": 128, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "145" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Remove Blindness/Deafness.", + "id": 88377 + } + } + }, + { + "__struct_id": 129, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "374" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Regenerate.", + "id": 88378 + } + } + }, + { + "__struct_id": 130, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "141" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Spells.", + "id": 88379 + } + } + }, + { + "__struct_id": 131, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "321" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Evil." + } + } + }, + { + "__struct_id": 132, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "137" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Protection From Elements.", + "id": 88380 + } + } + }, + { + "__struct_id": 133, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "134" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Premonition.", + "id": 88381 + } + } + }, + { + "__struct_id": 134, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "133" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Prayer.", + "id": 88382 + } + } + }, + { + "__struct_id": 135, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "355" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Owl's Wisdom.", + "id": 88383 + } + } + }, + { + "__struct_id": 136, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "126" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Neutralize poison.", + "id": 88384 + } + } + }, + { + "__struct_id": 137, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "525" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Monstrous Regeneration.", + "id": 88385 + } + } + }, + { + "__struct_id": 138, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "119" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Minor Globe of Invulnerability.", + "id": 88386 + } + } + }, + { + "__struct_id": 139, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "117" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mind Blank.", + "id": 88387 + } + } + }, + { + "__struct_id": 140, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "113" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mass Haste.", + "id": 88388 + } + } + }, + { + "__struct_id": 141, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "108" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Magical Vestment.", + "id": 88389 + } + } + }, + { + "__struct_id": 142, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "102" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Mage Armor.", + "id": 88390 + } + } + }, + { + "__struct_id": 143, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "100" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Light.", + "id": 88391 + } + } + }, + { + "__struct_id": 144, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "99" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Spell Mantle.", + "id": 88392 + } + } + }, + { + "__struct_id": 145, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "97" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Restoration.", + "id": 88393 + } + } + }, + { + "__struct_id": 146, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "95" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Mind Blank", + "id": 88394 + } + } + }, + { + "__struct_id": 147, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "94" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lesser Dispel.", + "id": 88395 + } + } + }, + { + "__struct_id": 148, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "93" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Knock.", + "id": 88396 + } + } + }, + { + "__struct_id": 149, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "92" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility Sphere.", + "id": 88397 + } + } + }, + { + "__struct_id": 150, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "90" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Invisibility", + "id": 88398 + } + } + }, + { + "__struct_id": 151, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "88" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Improved Invisibility.", + "id": 88399 + } + } + }, + { + "__struct_id": 152, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "78" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Haste.", + "id": 88400 + } + } + }, + { + "__struct_id": 153, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "74" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Stoneskin.", + "id": 88401 + } + } + }, + { + "__struct_id": 154, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "73" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Spell Mantle.", + "id": 88402 + } + } + }, + { + "__struct_id": 155, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "443" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Sanctuary.", + "id": 88403 + } + } + }, + { + "__struct_id": 156, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "70" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Restoration.", + "id": 88404 + } + } + }, + { + "__struct_id": 157, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "109" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Magic Weapon.", + "id": 88405 + } + } + }, + { + "__struct_id": 158, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "67" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Greater Dispelling.", + "id": 88406 + } + } + }, + { + "__struct_id": 159, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "65" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Globe of Invulnerability.", + "id": 88407 + } + } + }, + { + "__struct_id": 160, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "120" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ghostly Visage.", + "id": 88408 + } + } + }, + { + "__struct_id": 161, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "62" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Freedom of Movement.", + "id": 88409 + } + } + }, + { + "__struct_id": 162, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "356" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Fox's Cunning", + "id": 88410 + } + } + }, + { + "__struct_id": 163, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "377" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Find Traps.", + "id": 88411 + } + } + }, + { + "__struct_id": 164, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "121" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Ethereal Visage.", + "id": 88412 + } + } + }, + { + "__struct_id": 165, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "418" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Entropic Shield.", + "id": 88413 + } + } + }, + { + "__struct_id": 166, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "369" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Energy Buffer.", + "id": 88414 + } + } + }, + { + "__struct_id": 167, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, I've changed my mind.", + "id": 88415 + } + } + }, + { + "__struct_id": 168, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, go ahead.", + "id": 88416 + } + } + }, + { + "__struct_id": 169, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "50" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endure Elements.", + "id": 88417 + } + } + }, + { + "__struct_id": 170, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "49" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Endurance.", + "id": 88418 + } + } + }, + { + "__struct_id": 171, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "47" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Elemental Shield.", + "id": 88419 + } + } + }, + { + "__struct_id": 172, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "354" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Eagle's Splendour.", + "id": 88420 + } + } + }, + { + "__struct_id": 173, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "42" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Divine Power.", + "id": 88421 + } + } + }, + { + "__struct_id": 174, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "41" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Dispel Magic.", + "id": 88422 + } + } + }, + { + "__struct_id": 175, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "38" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Ward.", + "id": 88423 + } + } + }, + { + "__struct_id": 176, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "519" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 19 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Death Armor.", + "id": 88424 + } + } + }, + { + "__struct_id": 177, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "419" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Continual Flame.", + "id": 88426 + } + } + }, + { + "__struct_id": 178, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "21" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Clarity.", + "id": 88427 + } + } + }, + { + "__struct_id": 179, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "13" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cat's Grace.", + "id": 88428 + } + } + }, + { + "__struct_id": 180, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "9" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bull's Strength.", + "id": 88429 + } + } + }, + { + "__struct_id": 181, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 182, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 183, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 184, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 185, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 186, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 187, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 188, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 189, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Bless.", + "id": 88445 + } + } + }, + { + "__struct_id": 190, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nSpell" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 20 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_h_cast_spell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Aid.", + "id": 88447 + } + } + }, + { + "__struct_id": 191, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 21 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to cast a healing spell." + } + } + }, + { + "__struct_id": 192, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I've changed my mind.", + "id": 88430 + } + } + }, + { + "__struct_id": 193, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "0" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Heal up the whole party.", + "id": 88431 + } + } + }, + { + "__struct_id": 194, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "6" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88437 + } + } + }, + { + "__struct_id": 195, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "5" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88438 + } + } + }, + { + "__struct_id": 196, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88439 + } + } + }, + { + "__struct_id": 197, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "3" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on .", + "id": 88440 + } + } + }, + { + "__struct_id": 198, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "8" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my animal companion.", + "id": 88441 + } + } + }, + { + "__struct_id": 199, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "7" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on my familiar.", + "id": 88442 + } + } + }, + { + "__struct_id": 200, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "1" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on me.", + "id": 88443 + } + } + }, + { + "__struct_id": 201, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "nTarget" + }, + "Value": { + "type": "cexostring", + "value": "2" + } + }, + { + "__struct_id": 1, + "Key": { + "type": "cexostring", + "value": "nBuffType" + }, + "Value": { + "type": "cexostring", + "value": "4" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_henchmenspell" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Cast it on yourself.", + "id": 88444 + } + } + }, + { + "__struct_id": 202, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to discuss how we can work together." + } + } + }, + { + "__struct_id": 203, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about something else." + } + } + }, + { + "__struct_id": 204, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets discuss how you deal with objects." + } + } + }, + { + "__struct_id": 205, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Bash" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your bashing tactics.", + "id": 96507 + } + } + }, + { + "__struct_id": 206, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Locks" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your lock picking tactics.", + "id": 96507 + } + } + }, + { + "__struct_id": 207, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Traps" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Objects" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 23 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your trap tactics.", + "id": 96502 + } + } + }, + { + "__struct_id": 208, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Search" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your search tactics.", + "id": 96505 + } + } + }, + { + "__struct_id": 209, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Stealth" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I need you to change your stealth tactics.", + "id": 96505 + } + } + }, + { + "__struct_id": 210, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Let's change how you use magic in combat." + } + } + }, + { + "__struct_id": 211, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you use magic items or not.", + "id": 96498 + } + } + }, + { + "__struct_id": 212, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Dispel" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your dispel tactics.", + "id": 96500 + } + } + }, + { + "__struct_id": 213, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Stop countering the enemies spells.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 214, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Counter the enemy spells!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 215, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BuffFirst" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change who you cast defensive spells on first.", + "id": 96500 + } + } + }, + { + "__struct_id": 216, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "OffensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast offensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 217, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveCasting" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you cast defensive spells.", + "id": 96498 + } + } + }, + { + "__struct_id": 218, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "NMagic" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change how you use magic spells in combat.", + "id": 96498 + } + } + }, + { + "__struct_id": 219, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic more in combat." + } + } + }, + { + "__struct_id": 220, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "MagicMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Spells" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 24 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your magic less in combat." + } + } + }, + { + "__struct_id": 221, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change when you should heal.", + "id": 54985 + } + } + }, + { + "__struct_id": 222, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal out of combat.", + "id": 54990 + } + } + }, + { + "__struct_id": 223, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealOutMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health an one needs for you to heal out of combat.", + "id": 54989 + } + } + }, + { + "__struct_id": 224, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInPlus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Increase the health an one needs for you to heal during combat.", + "id": 54990 + } + } + }, + { + "__struct_id": 225, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealInMinus" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Reduce the health any one needs for you to heal during combat.", + "id": 54989 + } + } + }, + { + "__struct_id": 226, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealSelf" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal yourself.", + "id": 54989 + } + } + }, + { + "__struct_id": 227, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "HealAllies" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Healing" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 25 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you heal any allies.", + "id": 54989 + } + } + }, + { + "__struct_id": 228, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Pickup" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets change if you pickup items and gold." + } + } + }, + { + "__struct_id": 229, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowFarther" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow farther away from me.", + "id": 96510 + } + } + }, + { + "__struct_id": 230, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "FollowCloser" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "Plans" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 22 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Follow closer to me.", + "id": 96511 + } + } + }, + { + "__struct_id": 231, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Lets talk about your tactics in combat." + } + } + }, + { + "__struct_id": 232, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AttackTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change if you fight every opponent during combat.", + "2": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"", + "3": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"" + } + } + }, + { + "__struct_id": 233, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AtkAssociates" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your tactics against familiars, companions, and summons.", + "id": 62531 + } + } + }, + { + "__struct_id": 234, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Ranged" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Change your ranged combat tactics.", + "id": 62531 + } + } + }, + { + "__struct_id": 235, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "CounterSpell" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to counter spell the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 236, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Taunt" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want you to taunt the enemy!", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 237, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "PeaceTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Don't engage in combat.", + "2": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"", + "3": "\"Je ne veux pas du tout que vous vous engagiez dans un combat à distance rapproché,eloignez vous de l'enemi s'il devient trop proche!\"" + } + } + }, + { + "__struct_id": 238, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "RangedTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use agressive ranged tactics, stay out of melee.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 239, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "AmbushTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use ambush tactics, hide and then strike.", + "2": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"", + "3": "\"Je veux que vous fassiez confiance à votre instinct du moment où il faut changer entre armes de mélée ou à projectiles.\"" + } + } + }, + { + "__struct_id": 240, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "DefensiveTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use defensive tactics to protect yourself.", + "id": 62532 + } + } + }, + { + "__struct_id": 241, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "BasicTactics" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 1 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "CombatTactics" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 26 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Use your best judgement in combat.", + "id": 62531 + } + } + }, + { + "__struct_id": 242, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 27 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can we talk about your items?" + } + } + }, + { + "__struct_id": 243, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "GiveMagicItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Give me all the magical items in your inventory.", + "id": 96514 + } + } + }, + { + "__struct_id": 244, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "GiveUnIdentifiedItems" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Give me all your unidentified items.", + "id": 96514 + } + } + }, + { + "__struct_id": 245, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "x0_d1_hen_inven" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I want to adjust your equipment.", + "id": 96514 + } + } + }, + { + "__struct_id": 246, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Identify" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Can you identify our equipment?", + "id": 88341 + } + } + }, + { + "__struct_id": 247, + "ActionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sAction" + }, + "Value": { + "type": "cexostring", + "value": "Scout" + } + } + ] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_assoc_actions" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I would like you to scout the area." + } + } + }, + { + "__struct_id": 248, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Not right now." + } + } + }, + { + "__struct_id": 249, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 45 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "0c_get_henchman" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yea, thats a good idea." + } + } + } + ] + }, + "StartingList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "0c_if_not_master" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 28 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "0c_if_ass_convo" + }, + "ConditionParams": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Key": { + "type": "cexostring", + "value": "sOption" + }, + "Value": { + "type": "cexostring", + "value": "BaseMode" + } + } + ] + }, + "Index": { + "type": "dword", + "value": 0 + } + } + ] + } +} diff --git a/_module/git/forge001.git.json b/_module/git/forge001.git.json index 2637ed61..cd9c3caa 100644 --- a/_module/git/forge001.git.json +++ b/_module/git/forge001.git.json @@ -138,7 +138,7 @@ }, "ChallengeRating": { "type": "float", - "value": 11.0 + "value": 12.0 }, "ClassList": { "type": "list", @@ -1318,6 +1318,56 @@ "type": "resref", "value": "bulin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -2129,6 +2179,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -2943,6 +3008,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -4686,6 +4766,41 @@ "type": "resref", "value": "ander001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -6079,6 +6194,41 @@ "type": "resref", "value": "bognar001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARBARIAN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -7489,6 +7639,41 @@ "type": "resref", "value": "sander001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_ROGUE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -8833,6 +9018,41 @@ "type": "resref", "value": "vrurk001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARBARIAN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -10911,6 +11131,41 @@ "type": "resref", "value": "dori001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -12494,6 +12749,41 @@ "type": "resref", "value": "kathela001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -14031,6 +14321,41 @@ "type": "resref", "value": "walio001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -16595,6 +16920,51 @@ "type": "int", "value": 1 } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } } ] }, @@ -18246,6 +18616,41 @@ "type": "resref", "value": "drudo001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -20326,6 +20731,41 @@ "type": "resref", "value": "loric001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -22424,6 +22864,41 @@ "type": "resref", "value": "perin001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_ROGUE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 diff --git a/_module/git/valeford.git.json b/_module/git/valeford.git.json index af216d44..eb47b669 100644 --- a/_module/git/valeford.git.json +++ b/_module/git/valeford.git.json @@ -1673,6 +1673,41 @@ "type": "resref", "value": "ander" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -3066,6 +3101,41 @@ "type": "resref", "value": "bognar" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARBARIAN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -4602,6 +4672,41 @@ "type": "resref", "value": "buppi" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -7145,6 +7250,41 @@ "type": "resref", "value": "celurion" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MONK" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -8900,6 +9040,41 @@ "type": "resref", "value": "elolaldor" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_RANGER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -10545,6 +10720,41 @@ "type": "resref", "value": "hagma" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -10750,7 +10960,7 @@ }, "ChallengeRating": { "type": "float", - "value": 0.5 + "value": 1.0 }, "ClassList": { "type": "list", @@ -12786,6 +12996,41 @@ "type": "resref", "value": "hediel" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -14230,6 +14475,41 @@ "type": "resref", "value": "lagnar" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -16364,6 +16644,41 @@ "type": "resref", "value": "legebril" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -18455,6 +18770,41 @@ "type": "resref", "value": "perin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RNG_ROGUE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -19766,6 +20116,41 @@ "type": "resref", "value": "peta" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_DRUID" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -21573,6 +21958,41 @@ "type": "resref", "value": "tagnar" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 0 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -22896,6 +23316,41 @@ "type": "resref", "value": "vilmar" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -24240,6 +24695,41 @@ "type": "resref", "value": "vrurk" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARBARIAN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -25888,6 +26378,41 @@ "type": "resref", "value": "drudo" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -27311,6 +27836,41 @@ "type": "resref", "value": "gustin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -30533,6 +31093,41 @@ "type": "resref", "value": "elenne" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -32321,6 +32916,41 @@ "type": "resref", "value": "bink" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -33992,6 +34622,41 @@ "type": "resref", "value": "frum" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -36114,6 +36779,41 @@ "type": "resref", "value": "tonan" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_BARD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -37651,6 +38351,41 @@ "type": "resref", "value": "walio" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -38835,6 +39570,41 @@ "type": "resref", "value": "bran" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MONK" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -40137,6 +40907,41 @@ "type": "resref", "value": "kell" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_PALADIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -41582,6 +42387,41 @@ "type": "resref", "value": "sander" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_ROGUE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -43444,6 +44284,41 @@ "type": "resref", "value": "jong" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -45533,6 +46408,41 @@ "type": "resref", "value": "loric" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -47611,6 +48521,41 @@ "type": "resref", "value": "dori" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_MAGE" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -49300,6 +50245,41 @@ "type": "resref", "value": "merago" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -51058,6 +52038,41 @@ "type": "resref", "value": "ramin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_FIGHTER" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -52676,6 +53691,41 @@ "type": "resref", "value": "kathela" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "RND_CLERIC" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -53487,6 +54537,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -54301,6 +55366,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -55115,6 +56195,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -55929,6 +57024,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -56743,6 +57853,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -58371,6 +59496,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -59185,6 +60325,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -59999,6 +61154,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -67806,6 +68976,41 @@ "type": "resref", "value": "gnomeairshipc001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "TITLE" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "Skycaptain" + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 diff --git a/_module/git/valefordblacksmi.git.json b/_module/git/valefordblacksmi.git.json index c8be2454..567a5116 100644 --- a/_module/git/valefordblacksmi.git.json +++ b/_module/git/valefordblacksmi.git.json @@ -1273,6 +1273,51 @@ "type": "int", "value": 1 } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } } ] }, @@ -2087,6 +2132,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, diff --git a/_module/git/valefordgenerals.git.json b/_module/git/valefordgenerals.git.json index 04c061af..02fbf253 100644 --- a/_module/git/valefordgenerals.git.json +++ b/_module/git/valefordgenerals.git.json @@ -1200,6 +1200,56 @@ "type": "resref", "value": "tomantheprovisio" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -2011,6 +2061,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } } ] }, diff --git a/_module/git/valefordtavernan.git.json b/_module/git/valefordtavernan.git.json index 4f18c089..7c18b451 100644 --- a/_module/git/valefordtavernan.git.json +++ b/_module/git/valefordtavernan.git.json @@ -983,6 +983,51 @@ "type": "cexostring", "value": "006d006p025" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } } ] }, @@ -1797,6 +1842,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, @@ -2611,6 +2671,21 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } } ] }, diff --git a/_module/git/valefordtemple.git.json b/_module/git/valefordtemple.git.json index 65185357..ed7617bc 100644 --- a/_module/git/valefordtemple.git.json +++ b/_module/git/valefordtemple.git.json @@ -50,7 +50,7 @@ "__struct_id": 4, "Appearance_Head": { "type": "byte", - "value": 2 + "value": 22 }, "Appearance_Type": { "type": "word", @@ -1973,6 +1973,56 @@ "type": "resref", "value": "fathernathal" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPHEAD" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPSKIN" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "MMD_KEEPPHENO" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 1 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -1991,7 +2041,7 @@ }, "xAppearance_Head": { "type": "word", - "value": 2 + "value": 22 }, "xArmorPart_RFoot": { "type": "word", @@ -3016,6 +3066,36 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "TITLE" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "Brother" + } } ] }, @@ -4062,6 +4142,36 @@ "type": "cexostring", "value": "002d004p000" } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "RANDOM" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "TITLE" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "Sister" + } } ] }, diff --git a/_module/ifo/module.ifo.json b/_module/ifo/module.ifo.json index 5507a72b..f53119e5 100644 --- a/_module/ifo/module.ifo.json +++ b/_module/ifo/module.ifo.json @@ -543,7 +543,7 @@ "Mod_Description": { "type": "cexolocstring", "value": { - "0": "Mordenkainen's Magnificent Dungeon [PRC8-CEP3]\n\nBy: Mordenkainen / PRC'd By: Jaysyn\n\nThe most comprehensive random dungeon generator ever.\n\n" + "0": "Mordenkainen's Magnificent Dungeon [PRC8-PEPS-CEP3]\n\nBy: Mordenkainen / PRC'd By: Jaysyn\n\nThe most comprehensive random dungeon generator ever.\n\n" } }, "Mod_DuskHour": { @@ -585,6 +585,13 @@ "Mod_HakList": { "type": "list", "value": [ + { + "__struct_id": 8, + "Mod_Hak": { + "type": "cexostring", + "value": "peps_prc8" + } + }, { "__struct_id": 8, "Mod_Hak": { @@ -809,7 +816,7 @@ "Mod_Name": { "type": "cexolocstring", "value": { - "0": "Mordenkainen's Magnificent Dungeon [PRC8-CEP3]" + "0": "Mordenkainen's Magnificent Dungeon [PRC8-PEPS-CEP3]" } }, "Mod_OnAcquirItem": { diff --git a/_module/jrl/module.jrl.json b/_module/jrl/module.jrl.json index 94fa7183..79f280ad 100644 --- a/_module/jrl/module.jrl.json +++ b/_module/jrl/module.jrl.json @@ -34,7 +34,7 @@ "Name": { "type": "cexolocstring", "value": { - "0": "D&D XP Chart" + "0": "| D&D XP Chart |" } }, "Picture": { @@ -56,6 +56,57 @@ }, { "__struct_id": 1, + "Comment": { + "type": "cexostring", + "value": "" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "End": { + "type": "word", + "value": 0 + }, + "ID": { + "type": "dword", + "value": 1 + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Make sure to drink and eat before each rest.\n\nDon't forget to fill your canteens and water bottles." + } + } + } + ] + }, + "Name": { + "type": "cexolocstring", + "value": { + "0": "| Food & Water |" + } + }, + "Picture": { + "type": "word", + "value": 65535 + }, + "Priority": { + "type": "dword", + "value": 4 + }, + "Tag": { + "type": "cexostring", + "value": "JRNL_FOODWTR" + }, + "XP": { + "type": "dword", + "value": 0 + } + }, + { + "__struct_id": 2, "Comment": { "type": "cexostring", "value": "Level Adjustment Buy-off Table" @@ -85,7 +136,7 @@ "Name": { "type": "cexolocstring", "value": { - "0": "LA Buy-off Table" + "0": "| LA Buy-off Table |" } }, "Picture": { @@ -104,6 +155,57 @@ "type": "dword", "value": 0 } + }, + { + "__struct_id": 3, + "Comment": { + "type": "cexostring", + "value": "" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "End": { + "type": "word", + "value": 0 + }, + "ID": { + "type": "dword", + "value": 1 + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Visit the PRC8 Discord for ruleset information, as well as other PW servers & dozens of single player PRC8 modules.\n\nhttps://discord.gg/FW9V9RKy5U" + } + } + } + ] + }, + "Name": { + "type": "cexolocstring", + "value": { + "0": "| PRC8 Discord |" + } + }, + "Picture": { + "type": "word", + "value": 65535 + }, + "Priority": { + "type": "dword", + "value": 4 + }, + "Tag": { + "type": "cexostring", + "value": "JRNL_PRC8" + }, + "XP": { + "type": "dword", + "value": 0 + } } ] } diff --git a/_module/ncs/0c_assoc_actions.ncs b/_module/ncs/0c_assoc_actions.ncs new file mode 100644 index 0000000000000000000000000000000000000000..38d5507cc974328fbf524ce04147b8a2c77a6709 GIT binary patch literal 24402 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 Pv3qSbD@gjuIB);Ihx~Hg literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_cast_polymorp.ncs b/_module/ncs/0c_cast_polymorp.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9f1916e47c37c0c371081b74509c8d9f69cd9ac4 GIT binary patch literal 239 zcmeZs4ps;=)H85mU|@JJ2P7Cc6c||8Knx~k7FGtfyx@Y=oE%mL<}OB728I`mjEw*P z|Np_jBFzA#|1d*&tPD(!j4aGRU5p|MKy7@Ep7DPELB5VY@oqp0tn32=P=di6WU4@7 zW_)6NL4HnUZhlcgMrsO345-D~-`B}8BtFKXLrfE!CE0K$#wJDHP6Az}PByuQCur<+|Y*yI{5hz8l^x`Kl zev2mk3LZRo^WYco;LU>vV@T6O4@7+PW(HxE3zjVspq1&mo(K0t?={D0Tpvc)3ScJh~aD^E{JQc0F z%wm>l^SK4^S1f)o4DJXf1@u>E(HgmbbMKKE(FF4@1g@XE6kOec{ zb*Fw*?$o?=EO{I2V+RTet=GF5r{Xo7w-vW_a@r6c@Iu1=78#B+uC!xByxSawP^OHkTJ}2O(K_FujVS?=RV*l0t++x#}qEE=&+$Lldz#P z4ffCn8oyk17D{z&6bD9hTDDodOm)c8-SbFaBaT1?1n@i7hNWnq%Lrsix1}2 zjLy+A&G3|A0VAPiW65xWdmEo*!9CLdO=FtW@q7?>LYeQ}nx|SmQ+T{Z+}gC$_Ug@= zH&)gXxuJF~FdlK3lyN6yQxTBG#VA)F|PN#L}D+po|cj zOhtjA76VwPfHs3P!~g&Pe*jHj0~y7{#>&9(j)9R8B*?%5mi)sE<-urH2F6?_CT139 zpaw>u`b0*s%pV38h!D4eD#$E96j3IqXb_4hGgLGTMU(|98YK%dCl73@EZ9w7U~U4- qgn(squ*g_}W%RJfD1c?Ou*k3>`4(so*hRoF0Qz<*6Ikkt0s{aeKyVuX literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_h_cast_spell.ncs b/_module/ncs/0c_h_cast_spell.ncs new file mode 100644 index 0000000000000000000000000000000000000000..4a5f698cd4aa378bc014cfb53a406f77b67a4f3f GIT binary patch literal 73 zcmeZs4ps;=)H85mU|{f+0}>1z3Jff)3~YJ91*thXtPIRujI0a{FBpMh{08yC0j@qi W@ge^4&W^z$ENme4Kv{EU1qJ}a#0%8` literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_henchmenspell.ncs b/_module/ncs/0c_henchmenspell.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3e0cb1654217e84f568b640a0b8ccdf7b2d1a314 GIT binary patch literal 49533 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 X5-RX6#G?uJ5xqZ)Ec+8Ni~Rop%3Xn3 literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_a_magic_m.ncs b/_module/ncs/0c_if_a_magic_m.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c6db42b48a85d331f751f0931295eb5ed14842d6 GIT binary patch literal 336 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 F{{gfh!F&J! literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_assoc_mode.ncs b/_module/ncs/0c_if_assoc_mode.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3a539b8caf358d218ff9d3f61aac452788c18fec GIT binary patch literal 674 zcmZuvJxjw-6urrNDWMjW4h}8Whhwc`b#Sh=gF@{PaShQ_5j1x2>o@c#IQrv?gM&kc z41svweGR;p1oCdeJ?GqWPjWR3)J^~J=#0qyc14G9`HG}R+sQ|G7d_9S$A=`0Z^L+c zAH6-jqSIXKe9rn^T5>y%QxwH7$u^tSzr<6I#N6?SejKJ`B}Hg~ zoTL<}#fI9|ym@a6r;od_qu=+W!0F(WM9laj$>zTlF{5V?teq~kGv>YW^o}7;Y7J)TnaN<^E04HV> z1|pGis;^ej?6iAea8Qp@={Y_PRO{fZ=*kClK*9MO5yMMJfiY?Cnf$|m`95Yi=Gl6my8x*P^8P%T~ zm(qnWp{t9wZLuL8i{00J;KcHDTEh~~{hay_&oNSFIv^ksoPQyfU;LA3gY>5K_qq!} f*l_}yk_O#@g@I)#(Gwq68jrMS@*Z%bnTXfuH69|{aitU#Td#g3lA$wiq3C9Dk0U5sG0 zKVWLXDg+!otGc3TC)_clUmO-pf1fpQ-b`-tHj)pK@;#@LN$Jd=q%As;UnV68MY> z4{umYZJC!x-l4NiS(p^>jWd&9f>;NG;}Vl31pPFb=q!(mQJN6r90cjyBj}YiK~55Z z5QL<)W0fgy_C-G5FfNX)5XC;lrH!pOLZG+W%c@1#RRJ0FGo5F8=&ZS&EN&AA8ny^x z4{98x;ou#IaXVql-z&qypIK|4%IgsbyG-ft4ZBY@*@y1;{~!dm0%=}YU}=u=v^E^+ z@jw-K*IEryovS1*)Ky$uT$11tfs>lRK^JRr6}X)$xm|*6bdp#WI5rYkL{MydJH(@m cjGJ~ympB?|WNPQ+&!+w)@}o&SzWG1XCqnNC+5i9m literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_has_assoc.ncs b/_module/ncs/0c_if_has_assoc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ffdfb4f3b63fbc12719d0a6a3896942aa80f01ca GIT binary patch literal 363 zcmeZs4ps;=)H85mU|`H-M3n6X-v)N!q16{`H ioS$2en3tKKN7!i$$BA@n5>^K0E=ESi|NsC0U|^AE z0MdV$n1S-Fd2XqR5Ls3Rh8NhBuq65A<5t1O3^Mcs0}IeFZht2)SLcxUU{@bEZe@9p zI}}*hKoqLYvLK->T?Qnr4BX0K-X8`Qus#tO53E)e%zFd2gfqZ7xF9t#JGF>gnOy;_ zSRUx~ci8NJI1cDzurg;BW{|~Tvw&hSGg%oJWto+j!A^Vu4V*V%YpWpv1!lA1(F}7d z7MF`LF@t5lFtC8*MT=bli$y{Zi@@Xu1&9lQApvyR5=K0R3xnl=USVZmy37bQ8E6xd Mvw4tA{-eME000!UZvX%Q literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_has_spell.ncs b/_module/ncs/0c_if_has_spell.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d98b20120be541eadc60cda503c1a338911c162c GIT binary patch literal 335 zcmeZs4ps;=)H85mU|{rTVwPh70uBWREe0rCf|2q6|NmbYSfm+%^dD^o1qK#2kRldl zAi>DQ%*4tJRRIzYf?m2C%vpP<3x)K_)MNxCG2*gXsind;u{O?o^nyU>YdO%D`C3gk&~E dIjY$%$Y!fBgM2Ov^0yLB*9bv$fXNRE3;<)2Yv=#~ literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_hen_leave.ncs b/_module/ncs/0c_if_hen_leave.ncs new file mode 100644 index 0000000000000000000000000000000000000000..58b270f4e93a46a28ceacad2364b422252110549 GIT binary patch literal 139 zcmeZs4ps;=)H85mU|{HGVwM9^3>*p!EUXM-dFAoRiMa)dndy1)DM|4uscDI&IVC_D zAvBqa0z)kZs9rfn#{d8SzhPjJW&qNEv>Cwk51@(6Afv&uKVY)5AR!)zN(BZ0Z9*)D literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_identify.ncs b/_module/ncs/0c_if_identify.ncs new file mode 100644 index 0000000000000000000000000000000000000000..f1e13f6edf887a072076fe6edaa6158b31c69eef GIT binary patch literal 634 zcmeZs4ps;=)H85mU|_0ZVwPh70uBWR7FGtayz=-O#v*U15ph&5hx2WNfxAMHpFx=n~jMX$yA^^Fpr&;fzg^7tn~-XF(?W@ zfc(g4&xlhs*ik^eFq%&R#cLnHmJ2}~0w%vG00RN0nw5ben-SG|uoTeOU>iBO6<~a@ zUqxU%u(4t=W58-TxfR%nSItF|YFUtKjL-%K4pL|bBZoHFMUZ%ecorOx4Be1OV26eh OssYHM^ao;?0s{b#4aMOA literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_not_master.ncs b/_module/ncs/0c_if_not_master.ncs new file mode 100644 index 0000000000000000000000000000000000000000..4af03a6f0e95ad77f2be84978c152f5c770b1a26 GIT binary patch literal 69 zcmeZs4ps;=)H85mU|?`%VwM9^3>*p!ENmbKD+8lFBP#=g7NZg~Bjf-7|9>#BNHYNG NKe8Zc9tc~30RVir56u7o literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_open_inven.ncs b/_module/ncs/0c_if_open_inven.ncs new file mode 100644 index 0000000000000000000000000000000000000000..89a2fb55de43cf243fcaca59e006012536d74e3c GIT binary patch literal 202 zcmeZs4ps;=)H85mU|=}K#4HD-7&sIdSXddv^2+0r6LSj^Gt=|pQbnTXfuH6A3zh?Kt{7NFuh@9VFt1oc@*S9B069m c16bP+m^N9Ej1j~LFq;jc2a75mh$;mJ0GjeT-v9sr literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_pickuploot.ncs b/_module/ncs/0c_if_pickuploot.ncs new file mode 100644 index 0000000000000000000000000000000000000000..b7265983223d8b499875429c3749034b89c015b8 GIT binary patch literal 139 zcmeZs4ps;=)H85mU|{HGVwM9^3>*p!EUXM-dFAoRiMa)dndy1)DM|4uscDI&IVC_D zAvBqa0z)kZs9rfn#{d8SzhPjJW&qNEv>Cwk51@(6K$984vOi$5vLM@dASx9Y0Bv6^ AhX4Qo literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_polymorph.ncs b/_module/ncs/0c_if_polymorph.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2abec1d9ba5f42ccf1561535fd0843c5d02fe9c5 GIT binary patch literal 220 zcmeZs4ps;=)H85mU|_hz#4HD-7&sIdSXddv^2+0r6LSj^Gt=|pQbnTXfuH6A7B&t96jUx{DXWQed67K6bl>3GFAo# qV*p!EUXM-dFAoRiMa)dndy1)DM|4uscDI&IVC_D zAvBqa0z)kZs9rfn#{d8SzhPjJW&qNEv>Cwk51@(6K$984vOi$5vLM@dASx9Y0Bv6^ AhX4Qo literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_if_skillrank.ncs b/_module/ncs/0c_if_skillrank.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0116caa19f0b347dd83b85bc15e83245a2811c73 GIT binary patch literal 221 zcmeZs4ps;=)H85mU|_h*#4HD-7&sIdm{?g@8QAiIvomvYSQ(hR7#SJ=|NsAkfkm1D zNdI95@%}Kd02MKCE6am4>98<^D6qOOP<20KK|-|Cwk51@%`Afs8BfdnHnNX;Jx7I~16F<6WN zEcS(g1sW?}{leqdk$J1d`0flUELt2NLu0*;>X&i=kmjv?{E&Ox35Auxkj z85m5NfC_jLGvgEEOA<@-N>Yn>l-U%(E(F>HahWX04MGstLP!OmUr^l%=5YupfZb~k rw%`ZQDM pI}e6aEz{;NE287Ukv6Q7cC5Lvl(-Kzs~%0vnVkyJvD`ZHi(fBxATCtl_Zwtm4KXy*E&pxCg+tD6&IxD{`V*mmU1qLk!FpEo@L4kpZnT3^sJI^&OEj76$q_QBDm4Ug7 zk(Ghr1tTNl|NsAgFtA870O>!>Al@Ga78W*;DPRNmATmHh1i-RDwLp!bI5YyKA{gaC znwwadK@^gnRZL*c2L={y1+Wqum~~+K3)tXrh$8H^$bw8%) literal 0 HcmV?d00001 diff --git a/_module/ncs/0c_summon_assoc.ncs b/_module/ncs/0c_summon_assoc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8072f01bf5b075454bc48c00a8a98429f45dfb15 GIT binary patch literal 223 zcmeZs4ps;=)H85mU|_f}2P7Cc6c|`o8N~9+{Rkr5=xzyenEheZfv X8w)d-WCM}RAo&j<+ZpAdiWC?COPVYg literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_c2_1_hb.ncs b/_module/ncs/0e_c2_1_hb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2e0448d13a056b3fc12006eb8bb981d6ab873106 GIT binary patch literal 1232 zcmb8uJx{_w7{KudS`5(yi6$;aZDL$BF_iZe4TDQH!QgngwkHswG^IuT2EM!a!Tcx= z4h$rCcTY`-dZaRtlBf6oad5ScTSnVFEF1yo@7us%Sp)P8YE*TwtPMlCHh7yCb~X z@A6#mLk7nhhPK3lB{{xN=B=VvBt8oq=7&nOI9FAoFUin6q9wvSHyB2qt5i!;#jH|& zO{T_MEfZ(xjae{KqGgFJu-Kz)Ae62+<#eMpAp@F>~*i64bjeSB?cVpM6qB{Sn+ml3-^bQb-k POrlu*3&n>P-wpTzULJrl literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_c2_7_ondeath.ncs b/_module/ncs/0e_c2_7_ondeath.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1fc2a8933099a6629cbf979cf91b13d7910eed0f GIT binary patch literal 2419 zcmb7FO>fgc5MA3znn0le1umr!6(q!0MOF34Ve71#75#^Q?`fT&f_G>`SPayAhmv1t%Y~Nz@?C|jL7kFr(E4NW+><4ok zTx2x@N9ck}oelz_6Oo3RD;4`*&H;lJ_X-++avL=do(@4HR-?E2T$j)f7WSRhi1QNz zceXv+4_?fEg=Y%MnO!9Fp$U+jfHm%Ce!+oXyWNKOCVblqh|C+v+T*jLFmLD4;__*x)(mE0C`u{Dh((3`%H8~-AoEy*d5)Hi<#>JLfx#%0Kq95n3r7D>k#k^1dPS543tD|=Zq6* ziuzOMoIuhu1@{<5Q77_woS>z{WArQ?{;!-cGDc3C{{x)=-&k`LC?77tQ=v@Jt+t$= zJ_AnlK@vX@Db>M(r-sqO%8Vy1scv`_@hs#1ebLiNf2gF-1Iv9mF(pYQBA8-0=ESCL zy>FPWW6m9W#k8-zl8krCt<=5W(5Z%{Uu2m6p+lR1(fr%K^0!&Q!ovrn#TVII`ff$4zzMLKIU0;>n)IgQ!v&ndm-O_|5EX z$uABT;4%yc(ceHANO@!=$r48gEK|`N`1!$4eF%C`@Njg}z1yLQ-#2sL#hc~=Sem2A V#Edt5YEptj8K$FUF5yv^{Q=s3uc80| literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_ch_1_hb.ncs b/_module/ncs/0e_ch_1_hb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..dbe91f378cf2177602b321b28ec5135011ed5065 GIT binary patch literal 626 zcmeZs4ps;=)H85mU|=eeV*mmU1qK#Y2C=;I_~gXgg2c@9y!e!)_>|PN#L}D+po|cj zOhtjA76VwPfHs3P!~g&Pe*jHj2AaeOR4w4>8Sn2G9N-x47w;P8>KDSo2C{^efx(;^ z!UStofUtoYI6=l|#3v>j0@ZLZfgOVo1DPw_!ORG>LH-Y9IR>*0aX@YRlNjMC4yB=B%mq@tg4HEs#LJ5 SDFjrdfK^S#q6!jE3Jd_AHoi*$ literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_ch_7_ondeath.ncs b/_module/ncs/0e_ch_7_ondeath.ncs new file mode 100644 index 0000000000000000000000000000000000000000..911eb7a3a814322783e4c613a970569b7dd358be GIT binary patch literal 4544 zcmc&%OK%%h6uvWKI|(*44JJh@ZJmUNlr|M5uwc_Lu}94azvLN*R#Y09B&{sPPDB#5 zOSb$17A#?rO~rygz;7t4N?ou3l0_F43Q~na!*|b_J99l5CxH#A>c^b-cg}b2b-nDB zmTz2te^H3@KV2618!d@UR!sIE1S_51W~Y0$a4Iu zxG0W}j$Xh+PP#I4St0%qh9Mt{3<(dV3)>A^?Wz+romMTdJ+D!=LLC^)n^&aqk7h1o zNhc&a6dC%KJy#;>*YwRG*)x%$_XC-@v2Ia3eBpS?Go@q{rpf#!CrD0UE#vVk9F*DH zbKR?WWL}a=xwkFUa(GFW+2dmQxtY^aSTF`lCXuW_qM}mx&dkztEe@gh8;ZyW54x-O z*S3THPPaItD#!}!fYAV$`0}TDZ5$3q@xMS>OsX8Dqs&dTA+vx_z;q<3T4emB;>e*? z{6r~oJtuh{%?}uaP$FxzwNVc$j_of|CTI*|e`Mli)FiYHN+PaCJTa&l*Pvx?t`KHG zgWD$4u(smQB4=iymqQHSzC});OYVn&4OxCh2Cy=w6&sk(hINOgEzk4y9$b&DY=8j$ z?nZxbq6neAIj%$vrWG2#3&YWSonCjn+xarZ?uUe3CbWA8b|YImz1~KDE5+<#!Yr%j zxw_Ho_B-2at0{&H2}45}#)ybrMkJyPkARsqt&oEWxoRQJP+^=A+f`5L{nwDMM$E`) z11JS$P?)AqK$6Dc3Vqujpx>^MpUH8Y4@r#ClF_YwbXg#XxN8(=sC*deQ$vJ(L4>VS zzUClEDhZP1!tJt4-*~&A64Ie*Q`_bLuO&iZkP}ad6CYay!E-H>WLX;G67D2C%M%vy_V|D0hx^G1TR$;mv)f zwdsbA&;jYld`uxHD9juOQ}tr>k}hcu9w`Oh$9X;yIBSB%++j!bdO0KzawGtw)|(kn zb`qE@+8&Ow7?a?3lOphbnwRVE_r%V@zWqubZS;@NIo43^IaD5K60^)Ps~(+MlF}oJpoQ`j>i2@4tkT4aN*(soZY*p~cWi@?{oKKyiwKMwFvqClM?xL`;4F!T2IM|z9REgpav;0?5{EVZ+H;74cjk1m^8XkT{6c`w!-)h6+|~n^nNeVdlCXzoZufAM3tvZm{N42!0HKS3OyR|3uFbT(5df@X)9M!Zjxg2XA)Cm z1~+;^qxm6@aGu_ByVY{)eqfh<7pHfvQE>sjG*?&)3ED_yc~!8h)mRr>mR3kYm#;{0G|eZtf}^Oar{<2UaMRWZ9TMha zdcp*}n}$C`N+smhbtEvVY9JZV4liGr7obrv@p@jV1Qpk_7pqPsRTs$dJ(nTDMYrs@ z%O@$n7CCO&^;^+m9mwDn>GfQsSZ>r7ZGU+D*k#SBI_WMc(b(mZV^_o5TeAEyz5>6c zm_)5Y-*~DNn)Hsj3sIH#s1YPAo1K~{fjS;)oB>mbKTXaVAbnNoo`R^viF}?0Xyot| zJR^ty7S3ps(n_QK^0(}{1SlkzW49cSo34%JarUv0+8fV7v+A1 z>RV9)=lgc~Q>PL%m+p8j?gX0qh%u3p*L14KGz|XvM`5i!S+BuAAoM3ZzWNhBW%Vas z96R*G?9_GKV>%ijp_K+NKam8f*|+i2qbhf$map8A%t=kIWuGe7YDtxAm8HtHI#cCZ z)v0m~gH*YONUB`Jhvme|THppA#+k`dnk;zRf! D2VQRI literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_do_combat_rnd.ncs b/_module/ncs/0e_do_combat_rnd.ncs new file mode 100644 index 0000000000000000000000000000000000000000..aea68d3e7ac8f20fc873fe98c3a7790317a4ab72 GIT binary patch literal 18993 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 GKKNfbE{W#= literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_gui_events.ncs b/_module/ncs/0e_gui_events.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2064ddc2e1042588f8f3594b4dc74075fbb96f60 GIT binary patch literal 73990 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 WcU5Pz`N(DuVvSxd4*XwAX8#K?k_f;6 literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_nui.ncs b/_module/ncs/0e_nui.ncs new file mode 100644 index 0000000000000000000000000000000000000000..69733f0177052e348ab211e3cc89a9c66b2f3a38 GIT binary patch literal 476627 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 z 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 M=--c=;rsXh0s_zOi2wiq literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_onclientload.ncs b/_module/ncs/0e_onclientload.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2244bcd8f6c302113ac4f80587ff1a9ea16e0eaf GIT binary patch literal 75004 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 I;DgNn1#=90!2kdN literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_player_target.ncs b/_module/ncs/0e_player_target.ncs new file mode 100644 index 0000000000000000000000000000000000000000..55d2976b4ba396f42c583dd2d970022d9305711d GIT binary patch literal 197946 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 E0W6!vM*si- literal 0 HcmV?d00001 diff --git a/_module/ncs/0e_prc_ch_events.ncs b/_module/ncs/0e_prc_ch_events.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7aa1cca263c9510b04f855de7277937baf387ae1 GIT binary patch literal 1002 zcmeZs4ps;=)H85mU|@bF#{dKz3Jff)3}SiZ@yUs~1&NvIdGRSp@hPckiKRIuKp7!4 znTi5KEe5bo0c{3phX4Qn{{Wi61~Q6?nS~ihF|sl+uVQ3m1W7TlfR+4V2J!wdu)t`L zLg5Z>1yzu~ODLk95K%@86w!XDXd;SeH&iqmMYIPhIu%8<3o5!FMYInp`VvKS3PhAi z2t{-vRMZAVv==JsCJPFJ24IkJIOk{N7nOLrfYp5fg)f6KlRU_)8jz3zitrW`CC4Xb z#wX`z#AhS{Rd6tY3}9dbYx=^#0#w5Z3j2)s#AHLTJdz9-NOxXAGO|`CNa&(zHA2_Q z2h&=RT9lkx0JoX(D3bYbn@te%OR>qDq8rZ-H$J1XII*Mzp+6Oyelwi^4H4x4 literal 0 HcmV?d00001 diff --git a/_module/ncs/69_hench_pickup.ncs b/_module/ncs/69_hench_pickup.ncs index 0e841f06bda96d0fcc12c92fdef38414eb30c388..5a62985a40f78df8ba65414ef4be7420bbceae83 100644 GIT binary patch delta 258 zcmX@eyPa3x&pB8j%uvt3iGhJ_yBq@$a40aauri3{mB%M1<`yJorsu_{B*mwsrX`l< zluUFKo0uBPewKw9q;%rNGREVRJs4XVA51>Sm?_qy%fQU||Ns9#AQPCZ80CR#n93*n zGRf$qgC%}|CDa*}m|^NbN*F|7JXsLWVsbl^HRIdKhnadA{Wk|P2QzYm#o55*#P?>C zZ?cFo8clxBqAroHz`)ADsKy93-~$7T5;NF9kI8zhHW2k}le1VCGZszeV-shLnykj= K2NNz~^92Axl|w-Q delta 250 zcmdnadyv=B&pB8j%uvt3iGhLbpd14ba40Y^v9ho-h~<^XCnx3>Bxa`P#iu02r=+GO zmgbZ&GXDSn{|5t$Gy{Bxa`P#iu02r=+GO zmgbZ&GXDSn{|5t$Gy{ delta 29 kcmXTO;`MV5RtPiHGjL*HV91)t8^XyW&G7&K|33;00B<}9xBvhE diff --git a/_module/ncs/BookOfTownPortal.ncs b/_module/ncs/BookOfTownPortal.ncs index df864b58a74f2e5fc5730300c616a9289917fac0..a42be7062bda93ca99d1057ec938289322f5ea62 100644 GIT binary patch delta 90 zcmZqXnaacK=NzmMW~gW2#K6ENI*~VlF>GRpF diff --git a/_module/ncs/_kb_corpse_damg.ncs b/_module/ncs/_kb_corpse_damg.ncs index 6fee11e3bc2d6cf8a8f51e812211a186890c2ab9..b480f4b94767ad82a59825cd56dab4c40e1ec648 100644 GIT binary patch delta 33 ncmaz^;`MV5RtPiHGjL*HU`U$CYs9EF(Lsts7RX~@Q(yo9bs+_Y delta 27 icmYd_;q`M4RtPiHGjL*HV2GK>Ys9E9(LstyfdK$i7X?uO diff --git a/_module/ncs/_kb_corpse_death.ncs b/_module/ncs/_kb_corpse_death.ncs index 5a27f4d2373be317b2283986cb79628ffb1575bd..dce6dddfd0a74dec2994887bcdeeb93c0db7303e 100644 GIT binary patch literal 2808 zcmc&$%}W$v7=P!T*==?6gGi8Kb&)>AQVK~)h-9@eEFnMg&|%qiN8MazmYucO2#QY8 zse2S5{t0yxI(F$;x1d`m4_O^N1onKq@9fMp8ePi6jPpLv^Lu{J=esi#bJ<(xhtB1M zXx;4*@R!O8DvqY5OZWPZQIpFyHIreut7%+%jFOwp{R}4_>sN(7) zEQB?4wi9{5-%&z3$?gJdnX>`On6R=!8v|Za23$Z+$OSyxN^T)vEO@KMnq9z1RPzz7 zeuW>SrkZbh5TTAZ*i6@)yS7tzYmFShu_fRQOQxrKubTxJj`@&+ND)LEbrkkt#2Sgn zO>olc%$J=8wQ3AFh5A#~x|_bBQ^+;6eUcmhFglbs2L&~!t}>Mjn0_?COFK?vzKBHf zZt)HQjDzrdqy@CUW;lrtL^5`ksGZu0gz+BK(#~vQsa&YcH>#nT3rlnq;C>XRuEW#Q zG;4da_OhRb3o=F;u)c`aDfha)Twkm@zS#(x`NskMF`99Aw!E_XyFrV89zI+WSB!KY zbqyDd<|w{sY!xn=`puyC4sqw{|0nLlsUYthzy{ya)Bd=osLA@nNeHBR18?9hQ%x<0 znp8KsOp+oU>UzURp!<3IsP4b*JEhx8WVE$@!wfx%E~=)?P*wLmP}N_uHx3xqjk*GX i4xkO_8Ox}jO8SCS#X2)6d`^NA0ecJP>}_aoWyLT1;>xiA delta 728 zcmbtS&npB`9Dm>U-puaOO02Rb3^rLY?D|nkVG$t?!o`8Ia@tWVp(sZen!foL6uG)P zQAko8l*Ea0pd1`zz4vyPIXEb<=GDyi^ZkB)%=f+MrqDm!J!+0eti~82z8l9M1=Hy) zai${Bj*mQ4z;z-{nRxhlsl1Pzi{fIg5ue>}Cl_M&%yJr{5z^ z*8x#qo(V6PvsQ2mOxy(nFQKhjmEI(n)Pkx9IhQb1cu|E{nthQv*e4EB2fFc=Ha58Q zu?8{3pBPKVV|F5*j7=x!zLhmmIhxL44;x}eJ;7}j4XB|Xg#TF7Ch>_?!w%;2Yv~?K zGz$l`GF;SJU=#PXkZurR?gJmR>M9pE-Kfi#qQwcwlt`XR%)p3VS>BqzP&e>i55pSfdRoB3E>FO6N0H7b6NOM6Vlw5loKh)j3D-UUYOnCt!-(V! z{Kku`UbALT@nu*|`E$JXP<(b_Vm^^Incjmd0k*OMiyb(IjCuEHwIk#ePkE4v-4Q+E XzxGhv^_kF%C%z89i)IwCF6ZnE)$+}H diff --git a/_module/ncs/_kb_corpse_distb.ncs b/_module/ncs/_kb_corpse_distb.ncs index 874e891d42bc005fb46a878060b241770fabc23c..2b30eb5256397f9071e046d91c4d0e8629e9cdcf 100644 GIT binary patch literal 2062 zcmc&#J#Q015Z%2y9}c$6hXev4las}VK{f(e0x1O%j*ub|frNoHNXFocv9NDX_C+Fy zf|`ap&>?;X9R>dYrJ$goNRc8z6e%K^*_qw*`r^cp1{b%!o!PfD@6F8JovV3|u3foW zWh|XL%ix#xn3G~BUOcULgovJrUfB2RVQ0D34*Ds^eld7dtb#o)oi8}9T;M>a4kw0g zX)7-cuH}+Pitz^Ld@vYnGv^G0b;q(})03ph1;i;aFZxkcG*`4AyKW^Qq~Bptg-DyV zP(=GXX2iW-yLGGA70bOzo(qus-+4;RdB4;3C*CeGCwn5HK-c5loM=-mVX`H!JIukP zc&4D=QKFNYXQ{4r!}a7YPs1)y7u@mv@OC$hh8$NC9BVM8_!oTtAth&*Io>esI8tjg zd`H8UQeSV$tL=BCqtXq2C9I9}q=940E#t`{`8mfk@m$NeVohC zhRK3GqynPKqte9S01Vf4<|KGKrR^9R&v?WfGqe4j;H6Sv7Nl`e?Pj%qUGK+~SV&ag%?CR=!;s%q;0&LM%j6;9It7{=uYaW9RPO-FD z@Ry>+FhEj%qsy3PL@5oIe4>^RYf9X2x1Psfl=1<<@E)LfY}J!`5U92)^-82BjuB7~ zliWaB){WZuR;KEU&u2$_iqL^6LeCZ^qQ5oJUzR0*$FTPn{YEH)KDHnx1ceCnS1ixgJe?EWoGEjzj8H&%qFC2)FX#tI%ms?n3vy~R~Umk`r#Of kFZX}r)2zVQQ-ggUHXi;P8wU0RQaQ#(ay}vJ+qy9R0DdG-i~s-t literal 1754 zcmc&!L2DC16rP#gtceL#4~il&Yf!1u1SQ~6F-0g?EEusDAx5)}!DMGiw$NV0zfrw; z^bdIPD0uZ)#DfPB4?VQvp$8$p`DQkmZla zhS8JtnVVt9pFC{#q>LZQK{O1SQE$D|4Tl-VzA-v#qU@BEv+sK9MFIIHMNHhXLR&J7 zxA^$y15Tbfxg>{iUA8xqdv;aO{b5MikY^62$g$(Qf`Agd^8&UU@p?~d^!0B`4hs?Z4M3l zb|1+-EzCA)m0?-A9IVBwQ3x5d1C2KtWL*{2#OLIlZs+mXnFJv4na+qLJ2<50P%Hj@ zVl|3i&>i4vhDmXBZwIvA<9u7u^D&Mr9Gq{BOB8h0Livxl8^G;V6p>@tfz_ZD$#95O z00|lxB3TpY$*(J{0;x<$P;Lf?0{HCene>_Pgo6achKBzoM+g;f4J|D)(w^1AB%)ej zZyYP%R4{Dr5xwV6lQ6t>qhAPQr4p>H+GIAoI`QW3xcMirR|DlUv-VW*IfuHpui=Vn q|29yCH=7=8bN{=-L>cNsL-*k~imd#VBD%YGQ>YN;6+|*p`Rpf#_SCBY diff --git a/_module/ncs/_kb_corpse_phatk.ncs b/_module/ncs/_kb_corpse_phatk.ncs index 6fee11e3bc2d6cf8a8f51e812211a186890c2ab9..b480f4b94767ad82a59825cd56dab4c40e1ec648 100644 GIT binary patch delta 33 ncmaz^;`MV5RtPiHGjL*HU`U$CYs9EF(Lsts7RX~@Q(yo9bs+_Y delta 27 icmYd_;q`M4RtPiHGjL*HV2GK>Ys9E9(LstyfdK$i7X?uO diff --git a/_module/ncs/_kb_corpse_spell.ncs b/_module/ncs/_kb_corpse_spell.ncs index 4395074b9b907013befa4e98cec451ec26e34a40..aafcd3fe0d8efb99649c32932e77612969f00d99 100644 GIT binary patch delta 50 zcmbQixP+0{&pB8j%uvt3iGhJ($wXcwMzx6!Qf#t79s}FND0xPWiB&Qj5Uv6P012E3 A%K!iX delta 37 tcmZ3&ID?Vb&pB8j%uvt3iGhJ(#zbBtMumwEQWF#88I>kB$S^4|005`M2yFlW diff --git a/_module/ncs/_kb_corpse_used.ncs b/_module/ncs/_kb_corpse_used.ncs index 1f89071717826f439bf22038c7a43a2a4b6cc64e..3f580058e7249822ae6e6ac2f2995e30ce10956c 100644 GIT binary patch delta 61 zcmZo?n#{!O=NzmMW~gW2#K6EPJdxLkQEj4w6q_sq5U@>*a$_u*xKN$ZY2ryUK8Tn! M!~g&P|0pm30Ey5JsQ>@~ delta 48 zcmbQt)Xv1~=NzmMW~gW2#K6GFK9SdmQDLHk)Wifg#;l3U)fsIjo;Tx=X88aA{~rYg E03Oi}O8@`> diff --git a/_module/ncs/_kb_corpse_user.ncs b/_module/ncs/_kb_corpse_user.ncs index 66619e81581663eeeddb86119029557cc5ce3b4d..6d13898756870253d40086bbc20d61f950a98980 100644 GIT binary patch delta 34 ocmXS~<@Iw8RtPiHGjL*HV5ptQYs9EF(Lst$7RX~@n;0bv0ENj0y#N3J delta 27 icmb;|=k;?ARtPiHGjL*HU?`u+Ys9E9(Lrirf-C@CJO+*c diff --git a/_module/ncs/_kb_plc_corpse.ncs b/_module/ncs/_kb_plc_corpse.ncs index f088e53ba1429adc2b93dab4d7b802d42689b6de..69e1bd8e02d9ad7ada060af35c3d8fe09a44b81a 100644 GIT binary patch delta 55 zcmcb~c%D((&pB8j%uvt3iGhLPyd02V;80*-VFNKHYKJpMO>Fk#lLhhEq#6GI|NljS F0RTAJ3_Sn< delta 65 zcmX@lc#~1v&pB8j%uvt3iGhLPrW}x9;80*-Vq;+gF&P>E|NsAkfkm1DNdK8A9nKgs NvDl9T%>AOk000_r6dwQp diff --git a/_module/ncs/_kb_plugins.ncs b/_module/ncs/_kb_plugins.ncs index f8afb170d4fe0f657034cf5af4b2c8f4f606065f..6da4be1697d8419501e6af65f3bfb1d61dd86336 100644 GIT binary patch delta 36 qcmZo+>SE&ca}HJrGt@J1Vqjq8n#gOz=rGaCgiV$K2-qgpwE+N!DhECQ delta 29 kcmeBTYGLB_a}HJrGt@J1VqjoonaFFyXf@HxWMWGj0ABY84*&oF diff --git a/_module/ncs/_kb_raise_res.ncs b/_module/ncs/_kb_raise_res.ncs index f3996106521d96a54bc9efdf609568a0d80cb6a9..46e6096384c3f7ae26a4598be9767b940261dc04 100644 GIT binary patch literal 4332 zcmc&%J&YSg6rNeHeZI3vt~j9}a56d~A(119HNGC3UA`x`|PcY)s0<3mXFU8_!Sv(a&De1Hr^DiS9xRD$rJJ$fyX6>($Q#ipSVvFc%Oh$ z`DUXYcz($10S^QB@ zyx`{GNvF|l=d@NqD!cMYORGqAMj0sQ^S70jlLPbqBI6!71?i}`D#B=2w2lx%db%~? zsgno2)1lF;@vz3*vG(SqwnSYLyImn#`vVchiWcm$>!R&5o;$a|KN$=4{2MI%IzQow z+_F-?<~4n!4BUztVbC7O5$reWE|=IscI~A{(mwM@+D}Ps zwD(vC5K{oH{Y6_VxACrvqMxoVB>uf&?XhrW14w{!4{Zgy-Qf2zWE%HYz6XJ-GwUPbzuGc(fbz zLcGOa$TM;Z(k-etM4yLs(RioyGzRE{83BTYm(kXy2nHc%GAKf@hS%yIv6k2KI=lsv z3=v6L{hYGeq%72c5&ow}5~s3~jL^UDA-iS0xI@4wvayJRKXC9YMQ6?_XK(`c8MJ;i zl_E(1*lk(I=$Fz6`uRFRb&~^nlj!>>J=W;DUfq?D+C~I~;SUrw@97+(Ao^XMJ%ChY z#z0Bhr5$I!Lwy5)Cl7VXUEoiQfuJZWLG+^w6XnqF)epJXm01eHDoqL?3D=EJx&LJ+ z$SS78$~s9>gp}2PCfzEEYrGx3J?O^?z2&6E7+;kLFXPQ5YJTU?Ua%O;$5uFnWJvev zc-_P)xS=3uD#_>-BLZ1TT!TaPO3)L-AZ1)>)#zYaK7*Qjf#0z-5w@VpPC9#`roxoY z-mi3yf*CRARo?CK^vyAq)6&eud3l|zEz4sFzcTJm1$_d;%o}h%beK9mD*6Qn=Wsv| zCL&pZp5UKvCP2@c1?G({#vW|Dy93NXvEWQBc_Ll0Fi5CR!z!CE*o(}ZedIzAG^y`w`p!+b<^I4 zrjve~gO63baxfibuOLUKPOIkPBb0(ZzEykinffjTp}I6vQ@WvkBN5T>Opl$ADEd3* w!o#mr!-F?7-k^o^vadXm_y5RGrcJB$5c>9iq)(CQZX_l{Yd%q-Ro*l5FJXt{t^fc4 delta 921 zcmZ`%J!lj`6rP!#-OJwoow{psckym7Bp~s2Nj$U=!Eh&HL`}khMGQoaNSf$cMDVB6 zMjONCfsi7IO$zPAQcDrVLaf9lNvDv)XcPtYGBdk-uA&P&%$xUp-+S}D*{H0PtEU@H z_sp%{R7c5#}0>c`@&^+ zfGRu^E7tl%YG)B~;2wVdn$f?aMce~>aVgK#vq60>2xgj>g87Kb00#+#*oJ#piT@(J z#D!8)k4j9**4!i>;1zqIL<&m0J^6ckjTB1Jsepe&RM2}hH{*)#-od(5hE?L=QTRd{ z1p#{>!c`iaN_l$%{gK;= zHc52RM1Wh3?{atWEm)`ByIUf&A;5#UPZDju0#mLN_1Ry}ILaiGd@RGVd`!CFAzst| zS525u77ZcHERYdy;zyZHjE}>Z?m$NM;E=jMj&7))B1}T?OD)1$*N!;xlfj0v3G7PN zgNL2ybGAbYv^43W=D~d}A$?%cv|j0m){{zWdYZJVchshgUV$Ek5z~RQh7Suyjm?Tj zZ&{?9QPhCj@y>xarl07JTWR{3<-<*Duu7!pf|x&HW=Qlxg+1&+i=1giqhEj*)&cuS v%DU%ROe7CsZkLxD?^ZnCM5bTj;>qJ@`&k&zdG@*gNWp_#%~}%hnB<~uhh_B0 diff --git a/_module/ncs/addkeen.ncs b/_module/ncs/addkeen.ncs index d0cec49a0acabbf286d2d95cc503a67b89c6807b..24db944d983b4f37367fea3d53df7acb76004dbd 100644 GIT binary patch literal 1475 zcmbtUJxe4(5UuX%85b605fQ;#Z#MFRT|a)o!I_De2p3$Ycdpza1{atK{sRAif5ps1 zFx0?6#K1sM#K2&K<<{4)y1kiUS#G%rs<*qUU%h%&y&J2W`PY@jk8BZ#W{-+={nsOOCT#@p9JZlf6OP~kSZ#&~exiki3rl}g_+w%gG@#9SuiS`Qjt zg5(>|d8 z(+oydApNMchAz&!{cb#aqi;fwy1Id&f$CWyepj7fSkL1z>(_ihVAV79A<8Abzx8}V z`}aHE;oxzDru+kxAICCOD?)Kaa{#$*3(9Bun{L%%r=mj>e-eLsIyNfb*uqUl7Rdfr zIBtS^7lnx1cWGJw$hs97bqDDV3poGTg*GQq#lTpx^d8mPQ8C6>@ll^CA95LTs-SN_ Gs{95`aqF=F delta 406 zcmX@ieUOXS&pB8j%uvt3iGhLDaU<_OMqeow=Knyz$Ot5UFtA870O>!>Al?H878Yg( zAmCPz2T>tl(HjgbU>>r*4={a`RhU%SFUf*bM@$Z25@&RnoWZ0nJRPh<2yFHTux!!f z4NQyV87_m3{KLS)%D|My2<8CIg4#EAav`(4oGQpL39!@~kb{5@`_HYw4slY%_CoxUdW07b2uQu7A#fFLD*5qCmMaJoq*R!aIfprRi)xKb0 tff^bMveyEyy$axfVFU--6R78ZfIa38vPDByvFFeEG#7yuD%gfsvE diff --git a/_module/ncs/ai_a_ambusher.ncs b/_module/ncs/ai_a_ambusher.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a3807bd29fae2cc885d2dfea1be89f41c12a6bf4 GIT binary patch literal 76573 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 CbYf!w literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_atk_warrior.ncs b/_module/ncs/ai_a_atk_warrior.ncs new file mode 100644 index 0000000000000000000000000000000000000000..cdd1fccf95c973bb099b1ca0b27959f6173fd0b8 GIT binary patch literal 149219 zcmeEv37lO;mG`~xz3$G^Nt%$2CGfH#gvAh077^0vbVy6miQOF#MVcmQAexON2skdd zqaq5TIIe)Gh^WZNXvEBzaWb0Gs8NFxHDXl6%z(;Z)Ce*C{p)|uxv%QJ`^zz=N z{a5r|vwR)ij846|ZuP0tBerZgF*+(57#P?C2#pR@E}zR63bXErqI`_O^*L-8_ ze(i}0ti2a?TeTE#EAu&mW+Yn97;w8WQx zK1~bXg0?~)SPCPGgtR80ZEsW%_zG(mX^oe>yisZkwNE;X!#`+v0|?sU6(0$)OWlBi zVM0OfcJNDz_*U9S6UR@^lagCArGZ+|SKPrSJ4B$z{L&K*NgVbkBQZk_3Sv$G;*K&9 z4+@9`kfU^nPwCMsl+tGeiE<-4e^f|2x`S|^!*ks|UYV}ursI2~{q`nxpwe@7H%3t#(uO&4xbcNM6 z%HS^XwO=o**Pd1Hy35MyP0XzKbh_S?9c_fmJO5hp$!wZLj)&@r!_>mV{?-wCK-c8 z0*V!olF_nua=tMX1nL><9>MXA{lazr{?dC#${WsbjO1UTr67T=gwXiL+dVdSIi?yP z5!P4>3KiwVr;G2-61P(}M?K8e({qhRku%+Q4kznSr0)!@;S7iJA3m8apPy@_vg1Nw zc5}da{NCg1hB7OG(hv=4?dWaqY+rD(KrH0Z=jimd@YMY zC%t&a$>;?gXQ8}Cej-a=Z~sXaoLcfq`d6`(_?A6&L#ZGy2eDjUJ6^QE@=7RFd425G z+7vd6UEGkeR&#gd^<#d3q16_S7ps-fAvQ$`B0%s7OD^Lre)s+4jS%vW5yCmtT;aSM zAPZWm2TS?5t6L=EwY`^ZsddBZJmGUaY46J4Aau&#z*FOI{##k?u8exQ@&8d)Z+cJ< zUS?GADN@TFc}u!o?kQ_mZmYxp%-Sj6e%o_v>rj3BOpOYlrrf*V{i1r|#CO9R8=}ME z*NfVE=Pzu#pnXnnPixot?Gp46iW;Km`8mP^F3}D7-Wx`nxRa$Cgd=n?uC5tr9G#YJqZ3s>D!M`7bB}!Z^qs+xh&zhC8?RSK* zh^KDKlK88XedU)SG>@`I;ap0H#p#&*tN&VW1MGYcCBYwZN4+U+fzfJ#;`uF_AcQ9A z9r^r=C$spSPqU50*s7lT(N7Dd{JX2DF*%BJPSc~Tr|9i!?L5EzRH8tbfHj?7$(jm| zvgS$TLPiI$F*bx%jgs=wQ(d34Tls2;MuvFgE!#jkKz2zyW=a*@6W!SA%~qc}K};h@ zOdq4s9*?{EZ;ZsOexQ~6t&~sbOg*(z`YO%cL6yrJn#BK45^WGKgd?~dZ%yAT{X1$T zw=c3@FKRJNg!FmJt1_gwr6I*V6(IF%s<<;((Aa6zN=z(Dq#?CQEFf*KIoS!jCDBD^ zduvyFw}cSU!}D`SG?a2XOk~!qC>lE{gvBZ@u5f&-8V6PvE5e$h|56NOOGFJyWJ@Sd zkN;y%7To~{>r{_36=m9Zng`R3n)6636RU7EG#+8RP&*TiKBT5k#8i4bvZ#r4MKldt zLNuxr7>YwNLQ=Ry5t=JQQbcC8?g|CRcW7fz4bwgi<^XiEhIt_kYzKFQ7H1|SP5d}D z9$O4CCG?2q0hLs*&&=J;(eb3fCV62BE#0s9L<~hHB41~PPnB{QR&Bt`3vya00Wlh} zbzF)jQg67R{1yS$>0#Sp*jN|89MvO7u!fABx2vOSYUInu|2JCT#Zjq2nEIS_+y*0a4u1bqB9uD_xga@ z(#!+`W80%xs_KYxz;IEneE8(39U{)4(i^_X4YM4G+_n_Okc>}pyGL<+;?n9A=RWIG zTpjSD0Pye{fP3l(JjVw-{ekL$<7eszEHg}^ym

H2~jLKVXT<1~{q#xTAi+GQwBD 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 bMUNE1Di{+-$+`(+ik;6nENYrk8P)#)b820} literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_bard.ncs b/_module/ncs/ai_a_bard.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d0e85e3340c35b40c55b4260ad03f47e0402d336 GIT binary patch literal 136056 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_cleric.ncs b/_module/ncs/ai_a_cleric.ncs new file mode 100644 index 0000000000000000000000000000000000000000..00cd7bbdd864ed21d88e3c83890f5f691439b254 GIT binary patch literal 138867 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_cntrspell.ncs b/_module/ncs/ai_a_cntrspell.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0502ceb9d1857d49f7ab8da0d6610b2672a1dbe0 GIT binary patch literal 93630 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

xJGRk*w3O?b5BdV7<(2_K8)H8XN zPdNWATMBGskqE#blh`n79QZ(U{U!SsXihve!+K4(w5UnJ{FgCD9ehH2JDFWYY=BNa zDSFJ>{~v-q!j~sC_h8tWMju!3cR4e`yp7C@sDpgy4owQ*k{uFKS7>O5`jKmB1^6Y{ z$xgZ}^HYm}=JJXvnssTz(LeDAVfJO>-ta;nTugn;O1d;8?1%dq7Z_d13gAii38^=BH(@-X)06~b}lpcdXJA99} zeA;h3T|nzQ%F|~?4{^jspB~}ZFA2HNIGGf1cf@MHZROuZ+jC%C^fY1L$2Dc&yivmO z9Lw&k#BEh`pI6O6=ZHhEO!W9NEsG&#nOa3)QB{9I zH9oZe4tLm(LgT9C9I`-XX64N3&MhI`&6&qxi+m3Ke>=mA-<^u=XE$La$5>d4&mv7} zwRc)6l}=A;*F6iqLXwa#p5R4*1fcrB0Z_$r=QXK{plkbh=l-bT&`rMh{eRcs`R4sM zze7`F)yjM|6=dUiNZXm)Cyxku^yxH(T1Ls=h%a=MgPl;l`8oTSP#yiddI{BpDOJo` z@I1B&zhLmBNaj@npA+rB+{Mz|EN1-2ef;##Yg7LDO3l0~9_LodKE`2j9pH1TfZKAU zG5MkVtg$8I)M${TjQd?0e3Y6@i~rTYSERzo;6(G~WJ?8pWaL2OuB!sypAyZR4ZK+? zfS({a?{Yo$nJf8m&#wZ{{Bi6pVdl70GRHUxZRQD-{iz7-mDx=UT}X-MDR=xQ{VEmh zj8=p5jC#}?zP5iJHSK-%JZenUq4qIdp+x7YM8BTQw=s(v7})xfFjAXj*pD14<`}<` zrIsG7Qw#WSz~Zc$8=6Q48~$}B#+I8T`}^8yIk>n0tXa%E)og*yWsKkd5Ggq^m9T_S zPA5CjHO*R$C>_#^9Vwuy>QHOjju zWhBqrbqvM{{6j|hG-UsK^cA5_yF{mL*H+J^e;~?E`KqZ0NKZHFpB?4QLn4#AB{=|P^ z0nR?RJQ>ZSLSqN-Jr zFDwixO4ZUV5*^{okg0hHw~B^HH8_wQ2e#+0h6)|gDHa@Db2n>#teu_!LW;cG)_-Lw}qYaV)4cyuc>fD zyrcq?S4Y-1fuRFF0;8BFfD1ZZ+s0=DCj4*D1`K_1=&rRVX26?FM?vDw0N!&_=!z6Z z(l6JWw;OV=FG&C2PHUx}u&0SPX|K74)+v2B0vdn0ds$XWvVOX zABF@(CpPZj(c7DG!sz|Y)Q+z(mo3gf2k6rL%8*NAR0yvofSZ;E{#VY;ljt8ud_^yV)fIXB&+g_0b
URp>N( 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_defensive.ncs b/_module/ncs/ai_a_defensive.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0703aed0d0419133b138675b14b5bdd92f9322a5 GIT binary patch literal 146105 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

3=)uSDBKz2Wtv{6Ls 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%0DmB%&X*aZl&x_4vT95pHT+fmLrYH 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_fighter.ncs b/_module/ncs/ai_a_fighter.ncs new file mode 100644 index 0000000000000000000000000000000000000000..65ba6d89b3d805d7b7517ba1677120e5d8420e7d GIT binary patch literal 134424 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 Q!kA*$PaPIDO{t9Pf7#R%?EnA( literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_flanker.ncs b/_module/ncs/ai_a_flanker.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c021687e47d3622db25b334837350fbf535c7ca2 GIT binary patch literal 140981 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

D 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_monk.ncs b/_module/ncs/ai_a_monk.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7eb5970b6b000fa9ccceb6b265fea39d70b0e606 GIT binary patch literal 133895 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 IQ!1nSA7~MU{{R30 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_no_cmb_mode.ncs b/_module/ncs/ai_a_no_cmb_mode.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2aef820edce86447850725791788ba19c087bb41 GIT binary patch literal 140289 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�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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_ranged.ncs b/_module/ncs/ai_a_ranged.ncs new file mode 100644 index 0000000000000000000000000000000000000000..19c592d89a0a2d00e28144427f3cd20bac968823 GIT binary patch literal 149092 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

3=)uSDBKz2Wqv{6LszlOaeqK*9BcL_J7#b2Ls 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 bt#x75852jzK00TL2W2OXuo%*m=~4YZ^eA^| literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_ranger.ncs b/_module/ncs/ai_a_ranger.ncs new file mode 100644 index 0000000000000000000000000000000000000000..be76ad108ad67262c39a6320605584e7584004b9 GIT binary patch literal 139178 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 Z6=78v6G!nzB4diBD=ZdWniBo-{{TqeyPE(2 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_sorcerer.ncs b/_module/ncs/ai_a_sorcerer.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9d3fd6e4ee91cce91cd2d0814c1e84c30b41bf77 GIT binary patch literal 124515 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_taunter.ncs b/_module/ncs/ai_a_taunter.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6686a00da88b9d7c143fbd5e86f676de3560b0a9 GIT binary patch literal 148078 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 Pao@*16+@W{?eYHuXNP`| literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_a_wizard.ncs b/_module/ncs/ai_a_wizard.ncs new file mode 100644 index 0000000000000000000000000000000000000000..af215ee05ee6557a94b7d065bd399d09ce804dfd GIT binary patch literal 124838 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 bc)jPtHqkzlKJ%{N^LZm#Zx8?OY>fUNtqj$4 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_barbarian.ncs b/_module/ncs/ai_barbarian.ncs new file mode 100644 index 0000000000000000000000000000000000000000..29eb43db3d9a703c292ef543f301716c163e8351 GIT binary patch literal 133088 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 z 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_cntrspell.ncs b/_module/ncs/ai_cntrspell.ncs new file mode 100644 index 0000000000000000000000000000000000000000..e8150cb26952d5b8b70e85657a03c1865442854e GIT binary patch literal 93298 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 z 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_coward.ncs b/_module/ncs/ai_coward.ncs new file mode 100644 index 0000000000000000000000000000000000000000..56d92784efb333f78871c9a1f6704928ad09fb3b GIT binary patch literal 144830 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_defensive.ncs b/_module/ncs/ai_defensive.ncs new file mode 100644 index 0000000000000000000000000000000000000000..777e2f92cc0a86686078266e660e5a0acb1985a8 GIT binary patch literal 148639 zcmeFa37lM2l|TMoRdsik&O*q>UfD2&#SoBPNT<^wk!+?rATBgb(m;>dNW$hC6?bG% zQ5;1DWt34s@#Pzu%T?{aXjsF# zSAM+)FTz9IGsA=Sw1ZRVGiW~EtJ|vTwPn`(aaFyeq#gu+6a>Fy>HLoF&ZP?$ELzyz zzG%VXwuSQ+E$oEke;eV?83i_fWyr|&ccg*FTe6Vf@b;>DcS${~EovzhotDTR?1az9 z^|?#LeB+f>kd_Dx*4`VH1jcYGBOV>nd-Er&T8}mge4)Pa@^roEDXrIBXttV0AM82a zuqRY0-@#Obub~qOZz4-UV^}w!z|0JMJGgKCxJQZ5a8*!W&E@T5tLmL6^~AsA-;_pfkDze=q_35GEu@yI1@3oq_C-B^c3oSAaSgyWLaVe16av(`%a1g#^aeAMJ3 zyq~TaInN&+;*qy(18D)-E923V_!Hiif%`ZYac;5tlrH2a9Fg-;A_e~4%fEn9W|4Zmz-)69vMLTTpdVn zPeY2kav=3iEE3l4LP@P3G9FRM>H>CDH^sB zu`Dnk6O=tEunFQAEJI88D?Yg?ijOO*&_1og04c26gqN2Tv~ahW?Xc}*Q#2V4KB110 z((^9#u%WvUY^;M{PMyPtu|`bFcdF6sai(9I>dVLfH(LxQ6zGD#jv84u3drSX`$Z=j z%U{OO&=KVpp{~rf;&$N7$D#a!O16co@d*l{lXxzF>`)diBuY_q1|!98A23^*nZR4v z_869`I-&wFTvlifIVwxA8zj!4(i^&EqN=U1BSkSJ<5S$>Q5>JVyf(#!2YiZa16~{e z9$E)*SL1+Z`+%oCTpMuw$HoEA3jj-6k*mD;6O99w+*qt4o)*=icwXaxm-rN)^y%7w zqo*4O+!+8~SO@T(jRS7?0Z;w!I)E?q0n=lfJTtJLCOH>j$l$Uw+nM>C>Q2&&i zm6S>sZHS`LlC&UBD`qFxtz;*O&K@;kXGg)rcpXbdyd#=CA&w?TPCeQyD%sn7vbP&D zB}E!V&ml7Yr|1MU$jgzm*1OWHf;UD_c5sv-`7tHx$pKY?(!D=~lziQO7o)Q+B3 zMQl|nohhW`y;*bV zu+$7)=-5O8{)rMmzgkMKKPNwy&d@k640sc-27>%7FZT|QPs4O4^( z&WOiJ=N2}v?rZkzL;|RzMJzG{(zY+Af~g{=8=|I*B4fP80kf9lu>1|+veMQG&!#*#$6f(i;DOHW}ki{V4qMrWh810!v9CI z$w{o_WP&M}>Al^{S9dR4z4EG__1$Y%EeGU5g|Z9uC&pv~(Vz8UOsMZV-T7^uUEOW% zE>81}nDN;~R)_ivMaWsu_OkA- zw)q_kySj-FQV7D5+CS)*=B#AmM|4p~#xw&|g>tGki8>-=zC({8dFqHTQigF>M&)SF zxm>#a!Btl>r0Nm#pNL&?*8;#h-<}qGfClQt#?bh9^Y9Rs^U2s+89P(+zS6HywmjFp)-(% z^Et(N9$_0yqk3D43(!Jbzap#)DzK`Ct|0{%dlblQ@)xwN$+e(#e5^sa3fIvQFC^vz zlGx}6^CT7rV|Z~{`AaG7SE=Ah?BiJq>mfWOK02!SUW2@tv>`Jm-O=AA)Y}9aVF$Jv z*vc%vAE2!q`G|0n$A6T;|77Rtm~uqecq?1CsRm&)0%uG)CxW7eMo@5y4&m(LBnNDh z1NO%+v#}&RfzbqM@irRJQ`&bx@R-PMi&egR#kWcuTk|76)0EO}z8z|)D^P+6JPa3= zXaN70+FDOiIY_!rJ@Hc5b)9;G7gkfLXS#I#deiTn6~wP&85rghoEo)!5=&{UC}5

>lzRMO+R)Ulv<QA+xKTJGfro1mfPk=NS`( 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

0&ctj=!sOwA*%1fw{hFnC=`EPbev42 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_dragon.ncs b/_module/ncs/ai_dragon.ncs new file mode 100644 index 0000000000000000000000000000000000000000..5de5e34542548f2d157b736f2a78cd7713cb91ed GIT binary patch literal 104045 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 gm;1RSC^BLRw@G(C57V+dWB>pF literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_druid.ncs b/_module/ncs/ai_druid.ncs new file mode 100644 index 0000000000000000000000000000000000000000..de40f51a723b20cefb37a2be8d969d62c9c82372 GIT binary patch literal 136145 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 Y5LdxFaTG6zF|OElp(CQ^DOFMZ4^EqM%m4rY literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_fighter.ncs b/_module/ncs/ai_fighter.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8d39b5737d2004e5de42e2033459e7e7fd3a4d47 GIT binary patch literal 132815 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 GM)hBj?BF^8 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_flanker.ncs b/_module/ncs/ai_flanker.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d03ab5f08232f2f44fcf11cf32141e2a99442b7b GIT binary patch literal 143110 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_monk.ncs b/_module/ncs/ai_monk.ncs new file mode 100644 index 0000000000000000000000000000000000000000..69db5d8c59d8fa3be55be10b11e86cf51f912012 GIT binary patch literal 131935 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 X852i*OcDAuNu=>-i$#~FOcMDok0$bs literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_paladin.ncs b/_module/ncs/ai_paladin.ncs new file mode 100644 index 0000000000000000000000000000000000000000..593113ac59c274ab32f9c13f693780c7d6ca5282 GIT binary patch literal 137883 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 s;(RZI@zZ7mF}3gO&F2)xM~N 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 D33g15 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_ranged.ncs b/_module/ncs/ai_ranged.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9a9524e2b856ac040efdd140f037c854a7564c0c GIT binary patch literal 148166 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_ranger.ncs b/_module/ncs/ai_ranger.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d35ffce1bd6b631da0f26abedad7ae60bfa49d29 GIT binary patch literal 137628 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_shadow.ncs b/_module/ncs/ai_shadow.ncs new file mode 100644 index 0000000000000000000000000000000000000000..5bbe01a48d629a0f97b01076595ac3a9b7fba888 GIT binary patch literal 122056 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 F?hiTGoCE*> literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_taunter.ncs b/_module/ncs/ai_taunter.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c8f5b71aeb27cb0e4bba990627a150aa86ae4dfb GIT binary patch literal 138987 zcmeEv37B0~mF_wB-m1!+7&0N#4G9>+UUO$|RLoRRK|?D3SsqnMlH9E28Zz zA}R{4sHn8k3Wz+~j+oYTcb=v-V$@(qjTjX*-O$RjqehI>`}e=rI%n^5&mAfQZNG4bunxYA-uJ2viw{lJ2@+(*MF1x&U zS^pJ%*REKPH)AtzZdh~b^oT9ToERMu4GawI1%ze?s!%KxOQl(NM^Q0G`O{I!)oXrJ z?0)TyO02yPbzJS3b@oIhKA)1hE$1JDSJ5Padz5S4>i$N}HCn}U7FDzwF0BZApW?t% z>J^F}eeor?HRo4#pS!@5g<*cdO6Tiih;yM(dBdps0-9Pp;A3`M>;9Edpqh!<3V zI4%c-NHSi!DOU}$}-ty%Y^*)nV@3qB>dT*3^VCeAHj^3^%3)*|T zmn>YksI#|i(Za>8ogIrhyPKluw-NrFR$%i>Lb2blu>$DyJmfcizM@`1>RD}tt3rC+ zCmT~I1@?rR(N1bKe%)>l*V7Ju@k4@zwPDz$qO;slW&SqfJ1sC|&|$EhzI*s%hnUR7 z$$?!8iqnh{&uHLhY_}UI0i=sRgvw~b&McJ$0)j)qrC8IW0qz>V{(Y`Re3!ljQ0K(2 z|2a!9WD6iXR@6MZ&`d64ARYqcws*EKytq`FJwii(Qt^-P4CPEF&O15EZ=D1XYdt?~ zO&TCi5y6OK$>GfzZY;2f|HZGL;>qDDhdPdn&JsH1Z&>@@Qz~kY z)q1KIgUzSP;&;b4AkPmgCWLLah4nl7e(!r2r4Zd6P?o8`cWIWwXpPkO2NYZIg z>VGCymHHbzY1NkWO+CJ(%T6;6c3g0-G1@G&x2v`Dg7#C10_Kmnb9$kQOiGTj5tGTq zS~h^?@d-N_E#+gUIy+%hkD38(RES63vJI>f$S#S;O{szVDA%dJ#p;tTNS}O(?~e6& z+{1sP3%2@!S3GE?d_p(F#alX6E<^0S^YNBHlFO4s8^jCY2rj3ymhYthj+&{(m(%v0 zgvSJs#7e3|dV3a9+*1Wozebu}g_2q%WJqfNmDH9c+JxF8ZLdGs342VUi_Z4euJ&#T zv7(2U7K~^pl;mSR4dwunI?W4dV0*YDv^Z1JN>s;> zQ{(aFD)flvC8$LsHym3G>k*?}QCcKJRtTx4k z`+bUQ16~{e9$p8qc5E7CBxx`iXDFWI1D^g+ZNTxL8mCx>G@`tC`o(nsf3k7F5|s^b zR0nWJBa$f`!YVEvku@p8VB6w1D^J~I)Kmf0gG*To*6`i$WI%d zV!J(M7bi!zc6Tpo>uBw1?_IcPPP=dhKSKn?XvK})_e7;(eoPiuO*$&#o#|8J(Gb=e zA+`9|%^SGBLHrU3`Rj#@s6=Z%9)_f2yhb3*{fghgMlGS=hs|D8*(@55X6HzTICK<3 z8$&5zdaU>a??XP>q&^L{NF$yu7)MJXtxH5M;6wmGf-OitS{E$1n04_&6F=ZU{g+D8 z3GWqoP>#Nq_L-dAV2%HkTpEP`nh0<^*yq4w++>oDIIWnST(__+iOwE1e36prD!UO} zEE)0kXzJuRni@Iv=**3hz11gsn;}zDq)`NtIK3m|viNSmeSr$0cX4}HTYJZa?Gm6; zaR^*BHq-hsgu6|N0bEGzme`_p^t38si&E)KAtUciq8lAn8{BEyaBB*gm^N$eH)wDE zPJnZnyi;HAy!O@wJ<@kol1*_!7b5#Ay4s<1LTp5LZ#0$9n+0v*1VVW*no1};#h2wT z2M~K%8^{M`X!#m*BaCM|3DA^1NwZH#fdp);FvjgHw~>a~zlgnAMpWsrCb09<3nMf3 zN#MR~Jq_1trr}@~C_X>qNTd|{%gKbLX6QoS7e$EhIPyEv>Cr_wF~P+>m~-l#)6w12 z+Sw-kJNSWMYYzj5%W$t;Dz)BSCHWWKLMS9za?(5U#+Fc|DO81n9ENn)7~@rD^#cRX zv>hwSfZ2B#_GF-GTBa9SwqJ1BoQanG%yj;;%B93&#kGfEz>D!g&>}?khM+y_^S8M$ z;0+I3FAUz7>A|5X!5r0;OhIg7zB|T^!J929eG}j9NW&LY8iIp6C^&H>)whY>rh0^5 z&`Y1(X`W5+@N<@$$?X#}Gt_+dj=+n>&UcDixhVG=ID><293T8%s@3PgsOINSFyl;K)+EvQ{c}St`0{!tZnLzYs zeOMjpyH0mOYj;m?YnzMHd?RLjMv>K_{=!5nwr5jR{6$`%1r2!h4VmDGhF5yjF5jb? zzTg?Hn?(_F7Ph{!x2JVMduLBC@j(hfSW^23{nDJ3O#Fy0>d2U8fT~bV)h1C#gv@v7 zF(gkN9Y)G9&dR79?OAu2OI_)$W&R$T2fZ*6|49z%{bha0@i)6X1jOB!oeOcTSZ@|7 z+@$s1lC8(L8y!vHaX{v9O6OWBpIfMlABmc_1;RpDg_^!8;Sf^r~6p#EYx#H=jTWB#Ivx1&M%T1)<_cm_{f*CZw2kNY|iYu`rgkO#!i3RXkTi z`@>4chRhS}vmHdp=Yx{^725+(7fc8kB1pB^%h|#hG{_J)%MG&q1_g)%@%UZjO*jEI z^1H>ETj5`YcbeWibOzFJKC3v-CTxRgRBz320a}RbSA>Pt5Vis=nxsFs6H;)2M}f>H ze^J|-TnkFa#~PHYa2>ti#l*Z{5*znGHHpQ+7+zdf{*vE)Diu75eG*GyJ%oqEM@JRk zZIBm}He}|cJMKG#daFPq?7&t7Tba%GgS3^y9u{t@@gL>zKh?Q9rW_GA-pbakszKO{ zz!_hz5+U^KxT##S28Q`&bx@R-PMja9yT#J5Tt zMpTdZOjAm?`gW+Hu0RPQ@GxAY(E$E0wY8q4a*%YLdg7(9>pJxWFRUi5XS#I#deiTn z6~wP+85rghoEo)!5=&`JSj+*cxJn%&#ofu60c9a{KBW*)pC zpv{zk3YBulGoYrVYh^@%-<}^pZl%(!n~@#ZqV`(~V+&(ZcDLpgJC%zaL@_BQyZ^+% zm$Eeq&~77@;b$tSetNE`ko^6f8PY*+Xk*%glV=#aG{h}EfMVgJh2YnQ*Se_i*Q z{uL|Mp{Ql)ioSL0`q#m*zvfbr_|)NC$Bt!GSK9){s|)4~A_9Wq_xJ=UlTZVhs`iAs z$n0h^yUMwP>-9|_?%jKyF+sRDR7;3=ypPvYUQjFgO+_tHT3E~P&SdEu3^)Y~T+#)a zE8WUe*93cQ(zQnD4irCINpf_#Pt4#%HSBM4;Q9HytmN)?14Pj2lHkroT?;Ynnu`a? z+(Sb@O$|M}w#6ziiJ&W3#8Q~7(@1p9egPKiH}K>FwogfjfB0O;l;u8h;S_M5QBDF@ zse~_0eThMvKtZL5*HDS>#+9p34I<$8Iwp`IXR`nRc3F=GNK{!OL7@UZUcEA=k*@K~ zMB02-LNRb?65=N^=omcqFBYVpm;}Uy8MGYTy;IDR42NJUrD$_)00%Y-7k1-s^Ew8H zBqFSnh!FYl#EAJ)nY&^1REo1Kn%TOygB z7CVE89}G258BWn8LYitGo+u9!;7Qz-9!IC;zGHnd)T(SGjm)C#DNGD6ABU>ZnL#O% zd6vq^h5m#(NJUvHn{j%i<09>dDxP@G#@t|8yOr=w*_$;C->A`gP$YugLPkjHv~gwp z_@yWZa*?|3ReTj|rEe3SRnquP{-7*AftydH2~GormE;1Q7hzVLd~_>C?A}YIxkt_l z|IO)srxr}Lf}%G{FR+8I_Zk`NnWZOV8_+wQt{1t;h3;90kG5T zIq`(aY#y?e=`+}1pK20BpkaGM4N-Ff5~j8#U0rUDP9_dHA6#REXzD#?gF{iGw}V>x7N?KNO_o zUufbc6?b3cWf;Pu1y^Q}CvNjuO#64XDtn!6LJ$q}6zmxkuZOLW8uT;H1y6iONWNRO z2kCh`l%J3mFD}9!a@OyYCIk=kI%xq!XrK%DNq4SUt#z>wy`yHuZ_;svGe*+3Lq*FD zcY4Ubn{Z7>#@j`PkDVRz6iC0ITjnmyP=L0qXB6S-C|dbhPahJBQIk4gh@3vl*M|fF zmT(oKuvrtdeJ}`@*! zHlK2v^ayp|TGlxS)%~qc5~Eop4yceGvni9EYV$)cK33j?drC3n_IPb=J`X(;n&LX^ z9XeI-=j#Cn(>4bj2rje^^k}~o>eWB2&}Rs9jStiN_cNg;3u81G{mgZTffUrUrkxUM z$LY}OQNJ?psdRnhdtq(XgxpxOn4`hZ%f33;$RTF`E>0 zBaPRcL7VIkV%=B!p#zUPFB%(i3yQs%V^ZQ%ZRt}P%k%lQdPXIGLv}efm+XNw9Ej30 z3YoS2&`fO;Ocf*lz{`&<)@*NPUZwp@KapeR=3or@$Nku6)+y$=SEw;+Khq)oOp`3( znANP;e&+GK=n+Mq8lTYtV`<{?l>5NIw|^bhqTDP(#hDX3q2Ofc&FXRsh39)Yv3;tf zMLIu`XT>sPBn=Rev)*?}hMQP#?U?euk2VyM;3vd^Nblo1{r5Sl3jAmrDv5>%u+^L@JUUSTrVVo|3ty<0Ouu&1IQUkc1~SY_QF? zP?rqWgf}IdO-FZ%zlV+EfSI{gAul#$=cf$DFCGmGy zx|PG_dM6Ab*Spl^dM5E4a|&Z=n`MTDwdz;F7-HvPwV6BS7N5BT@6C^y6FOX;n#h~$ zt}4{~iRK2P%$!;<30u{E@5~UIm&YWLOV2_6IuoBYZ@cX3oH0lc*^XWi$S)j&Aa=WP z+?FqfGBMrKo3djN7&_mhEuZ#V9iZ=cPoFtG#8Df4dW2)Y#N^Xh+&*fR-!}bs(e@l5 zl#+|?LD=`ngR*br))K2?*`1ZRt!nOm)f_a6ICOQUZwN%)oJmn6=|-PJ7Dm+Br5U;% zCM`6CmPM3#rj`mUs^~AM#>Wrb;f}}*7HT;M9qw5(D;H1yPUHpS5?Tjm9!D(lIrRVS z3@?6PCbGX`5JqxhqW1ZuDXaEYE2Yw@z#+P4!Bp~M6oGK3A?2F(3cMYE3f8geKxQrN+#4Vk#CjB;^hqRr!eO6{E5_9wEG=*AZ z;%~&4oF4GtkKEpR+kqui(|%Pip_(+Mf>{fmCk?_c7(6MGd1>HtqWy;-dmTeg7Blfv zK7RV=%^Cl^S~IWIvf!i4WLo_9 z20oPvBLhVvJKOxZqY(T%D!}(=MDy1M-mDbBPnDc^neJS!4*rA+@XQ>?-w|exJ(4-b zNoX@qpzO~?G)ZSSF?1m%nx}mF8ODxGv@==_&U5NfZ$9t9JnFa)*7K-w6$k6bwTBX& zrxN{_WWEi0cNy8Y{~?UjCK>i4hl@GJZ(^yX2W!;={u8h`tLBC#lEH?5UC+msn=~b zP*8#(FqpcY58ufjdFR6eQq(9P{%TJ0yhAe$PT(Il+NUA^-(#-{b=odEZMh|t7?Go= zalU@lmup9=v3L1s*wP}@s|FE@9vgx5X~oPa+MJ1g?gSq-f~n?Ly%}pz=EGt4tgVt zUY9o2%}6{=bd7M$t!cwp9kk{|yKRb!tNx=V`)K)Z**BCwHoV=Rymg^%%-kHabTTi! zZ0pu<>2|JUiyG@%njAG!s zjy3I6YvK&_@bCHB@&D~YadL?b%-DtEul582lwBB18SGdq)^F;?kKvd3Xq=vgZ4W!= z#o~=a|0?B%cu7SR^&MT?1cnXx2#jKyz-SFm>Da_ipOTarg1uVO@=5>QvjM|0I}d8l z20)m}*%xO3cU%>^B8B1XhivEEY7`j9&@cLe^#AR&R_YFWns~GJnyVQ&r4L6y<1cqN z%nFJ2Krf(3j28=PYjtSF_^0^Ykbr1r;|?CZb1+UAeP}SX<7>=ii!;yxx->r>a%qgb z>hLO2*t5sNtI{}2A?7)JV&1++Pi84{BsLqJ6DKm^v3g_IO=p8lUSrAe;*S(0hyynk z-Ii6EN5!k9vH`W%=tt2N;&QqTBA$|ZKVCjw1r#}K9)#js2BXSo=%8v38&vI)W+uAg zDICH;#63KJJ4+<)l_VW7MAM%U4Y#0v*stvWJ1>Ap5+wsrDg?OKk5H^0}pzQFz#18LI7<8%cjhwQp!J}MhXX(g&tX^}?F>G*yHmDu< zi>LY`p|$-!jQjC7wBva^Apcc^Bmb3yCI6B^Hi*B`5Wj`i3Vz*D_=;TY@3#b+*}q&Y z-kwDk&kJ)g9T~;`nLq2)5#rIQ2O*;B^kw{7A5)?zzvKBFOA$oaH703-b^{0vd=JO8 z*7kIvYL49T+?QO1a3oEo?D|aUJXu>)$Vaa)qjPj;BJsKf>lc6^QPliiqSD{{L`$UO zUz?T&I46WQ9X^hbDveS6=-WNR&qIEukDMgtOvnd^a%HC-Hi0LDKIOOYiZIG|sPe!Y^j5<%y%j54kc&n%JVc8Q z8!?Ct4g&*&sU3|TRP7U8Z7TD0W8I_#BYWCiYpN#$AU9vB{=eD6c~)t5+0DGFaqw5* z5Hi}o!D~B5U6!rgDBeytNUxaF`fRVYq!MVGQ_nxGAzSI(^&d^fCG^?U)wk-(e*D8f z8y6ZIYda0YQ*5H;Bup^V=iE$*3PoJbKXUqyUZ6+gh3aOm@!ig0D;huK@#U{eq49#W zu@i7k<7>UfZ6Rh|R6(M~Og^V^=&YPe$*JYbQ=D}llR_Kzk7y zq1oM4h`4^I5I@GZ00p?i(tGF>AaDnu8@`E-P+?c}lv8x-7)YFY`EIky2=urvBF0ew zot*fMh9qMT*3T9j^|?vrJ07|tz+wA#?E);oRXm&>d1#YDe>Y2o-{#(h?F-u5tMW=k zLDeG0DyFbQ5kcGpow>g5%1y8m zbJA^E<()PAIWzKr?-!aNmG+X&O*j9BB>;`CQ|G1=ujQ+!=^?{yZu+A3*&4G>N7(uP z6<3gZv=>_;f16mAIJJ{V$)-gFTr$;-vst)!eSxlgMGofO8V5s|FUf&F%Aq0QX|`_Bfi`7PMQhQI+OcR+0ia6u%K* zNaQeg(FNT-9i8**%Jy@WR2Q!cVDb_Vw~PRob33|xLF9{8ww8xvhPk84G>$R$K z9!;#Ivaqcxl?yvM^$1xF1CT950hNU}1R%$oy4t$h+ZT6qUeG&d(IV@ft6FQkB8S$g z0brl~*0zrNv`R-F&>Dw(X(t-3P}1!7i#is}Y42JH!}9c>tE|FVmDI+e{u7(J2=|nR z2GCm0^@OkHz&tjPzzd9A2NP~E$Fr&`K$|LoM&Am69%(@5v@dAA*m)Ojcyk2L1`}7rkmn5NnWr=It`M5CSGoXj!6P;rke|AePj^{z*+Yt z$;8TSN(TB9mx)Xq%bcamT4KQoHm~DD8HoH(nMp@eAr3|JafP8mL~7txW*+#xoCd~wlY?V(WW1!aEY=mpB zentHzY*7~1x>ZdPFlr_zPi1D5AT|raBXAJ}#vKrYClusOmJE=b7qJCOf%GvM@P_F0 z+6kh@SVO6Y5(4VMqj8Z^FLxCu_{D}CU;q4ip`T6g9!+xZW!gckdNPAd$jHlXkAvdK zgv{j#^`L|`cd>0a*kSfZp@g;k%oIjceQ(a%kW3 zUhj$(!h{e#LBp6FUn6)E(}?$yRVizl)8DuLs^PMo$!u=2XoYf-zyJe*O^vmIfX^dd zrP3JnIl=1q9dfG%JHa%3LH~9AD|+Xw?OVR820odQYZ%`-9zO4@B%pR=>*dQ=KuC2l z9!7CAigBcOZBxsA0f)_tS1(_;x)yVCK~KY|E=`$hv1{r?m@RXbuj}ty*Iz@B5+WMK zHR87^uI9%Awwl_mU0V~=3kD^?5#EN+=BootqZTe-wXC=GiYxk;u3x_D${Nf`aBrA7 z@7k`Wy#dORi~HBFU4F&#rG4v{SE$Z<3ybo2x_CSM(O|J&TphGff(#17?@6WE^!5N@ zX>Nbt+6-r}^!!aimvLsE%E%ISn#XvJL>!1fbkY_ZELL^X;TjyAo0fhR(AU(xqQ8Gl z4FX37+CD@C4)YegN^=7Ohc510+qdGzb<5Y)ATrt2LxCJ3B8Pq@)pGF@0g=PztX{c% zRh~`xx*q*ph;rzpl*+=N0xE~LtzLD-wd*Pk-zQQMkV9;cL)LjjUKkQNdj+Dxs{VDg z^xg7YNV4V8l*srC0g+8}`d-(+tcF3#?YoCqiY+I51da&_Y`dy&?aCSij(RR6*z6y8 zTpbWNq_h7@_{(+KE=}?QBtFPrY z*Ibd#%i77Wy^e>4T{QeRB#wy!`}w|4o`^*7dOC9{Xps;PVRs^v>v1J^ASu-(?n zVA)3v41E3{Dw5HlhiVEo`~d>eO4;6u569}bWjRAgZ`U4R-wntE{eebcjv8rx}lJ>iR;nBW51YQQlFD2iRU;Js2=yR zdd5LR@l}2?=y;c z_!MAne6Ae)1 zF}-;{*uAwwB_|iOUFp-!$(B6?05`TLFZ~MR3-^P|26~wr3W55=>Ze3aZowl3SZK{N zGXx4&al_HQO0sWqc)yg!a+1JGKcJ;Q3?Sgtk%Jp= z4ob0ioTU#0rC-$2JA=~mwe-zF>FrvIy}Ow7G8)d)(hGx9Y?39mSwZPsEtT~?gK(FY zCK(F@6Ydvs5F$BTZgsz`rMm;T!?pCgerfzcE!`NDeq2jG9h81jOK%HG@6poN1*N#H zgp@4{N*~bD&Y<)$Ej=?R{h^i~8^L@=fzSaE>UCHWAwg!!W9f%Jk8Ua01cv7C$;3vPdte14U`PW~ z{4No5oi?mcxBh(IC9m)ioaRLN%LoyDk(*{Iy}~0{@LLbd>w!wa)^@hkUOpO5VF;0W zjLz3>0H*jepKp>ej;3VN;rX4y8cmXnU2KRZN>hB|lC%+7(J*$g(Yijn#mj56TddrD zWbBR{1iOX*s$f?()d%dxZ_2QX9)sl7&{yFTwHYYf=wlA_HDWLf%=E!fUq@8xE3%u7 zOkW7pwaJTp`+swW{d4NJ_K&vO&N9P&Ox@PrOt0Qn0^P#zx-))fCKs5td`An0NJnKA zC{uC%BY&GEj?+^4An9JA1(C|E25?NCrPh=z#{r4>840=z=A(g zk-o=%OXSj%w2QnZk4qDfuhQ_Nk9ASfvs8RmKC%ye2-jilN)ZW1d50MWPVqz(g7HNp z9g2Kb*G&PmceXFQxVLl3Lh>WJ)+qp3k!b*?F+%<=e<5L9Sj#3rRqg4*dUP4AEqiS( z8$iN_Q#XDAAu8*3D$}yat&#=Y4UF33!9v%P1?|0f&gqytx1(*z0v+QRFEr@0m0IYC zNOPW!+M>@f&Lp{h5&s>WJ%`?kX=ve8oP6FEEG5gT8R=~GrL)a+!%DXK3%#fxD&pG# z&J6)Y$p`7%w!~=tVBH;s0|P(6<&T;f-KSdEqFQiqD$DRDmktaJysK5~R@q1Rt{cWl zsOqYsr5%a`k|M>K?SP{mpbqwLJ75LTu(e=&X6}~2R|UG7q{-29w zaLAqY1rSDGXi^J3g8<-10iYOw+=j4_SLVQ{X-b=I;y%ex*(BwF`NGM}E>1U`p=gWG z<|34lJkWUzBOih4)`LP84jV7ef_@YkuPNnf(%)B(NCIp;9Tgac2|9feOaev6Yw1p- zortGt=`VxQ=~^02vK^QrI8 z(kU%|JE;`|GT|^&jPK}c;k9LQ2jnK?_7fZ4?W3BRD|&e6xzsojcx?nS8(?m6ptLt}ZxlnGDJaaEBf@ zf{dJwFlg&;oxPxaPMSWa=>+thIp-9nMHnK05eS2j!L3VeZj^&m2qp~8vZ26E*dQH* zte?V6tq3HZ6A)EW!C3!4!hIK;H4I!xz#I6^YFleVhSr%`Lm6b-dl5l%Zx>FS*x4uK zZOT8`0sp7VTBi+y#<}yNMtt<9fcQLcTN7~9HNa6>)|rb*nMy!E-|jLyQ0}BOF+&MI z?r%IxyG{>6Adw-1k{@cbwaEwc9BlcGIXLorB9M^BJ>|DEc)MMt3Qwx=F0^EecSKY9 zZl@PIcd}%gcI<{jlza%>=DLqj_Gag`-6ndNl|!OJL$0*Ez%ppabWrK#2L~$0h)v8n zW*R-1G1JC8C7_pvb71s_Mq~8;g`36tw-3TB>POR>mux;CO{F6((z{(cj&_-fe|PN#>LXO6=3x(O7Jw!=2%pUgooaOAT3X!L6hUut9k`uy~%xQ;Ha6m~IhoMDO7|fT= zCkW-FuM&EaJh7IHdMaxrw!>P&Yh|raf#}(Y6K(kfCX*3%Q%)4+*>)@0Kw*}!$AnMu zxI=_)2qB}Hc<=U z$_`562JsuJj??p$fLPX+l+LW5v6fg!Wi9jVeY#KzLuqJu`U-LalVQ-2=^)sx4yebH z#*>9o))ct8!^eA5F+so>m*kF&McWF0y6_}%7LC3m>#iFe@uf9Ihqw5fjDEA{x2L-ZubGxH+)MRAE9{uS=d!EW*-jWah*IL={He!q7nVbk5WAqiTQc{u@|CG3yTK>~4K^|>7~#nL zrGy1^lnCY|`5O|Wvk5GF%N@X(J;Jr1;R3@N(3&07gMfz3Q8l0q86>n3HK7d?Xp})i z2H;uVhcb@U$c`w}WqOI@Vl@PWByx>l$PRvu7X+n?cvyX4i?jH`I**cMH#v1H2?s(Z z;lXo)C!jd^Lq6)k7vB!y>#VKkU0W3rAiHU$wYrgo(5;uGx8UqD3lZ!1+(FxZZ&Px~ z+B`y)kCcILSpJw9{k_Xp_by$%^76j*y=zx3LuNLlPn2iJ;8~SLCfD%$N+B$jVV+dd?A3WAad{t$W8{=Natu;70JVug$Dnxwc>N5 z6NpI(;>3^t7@A0Dh9?~dtB!OEO(DmqU+U~znR|`^h<=j^F>EXb0P&D{877SNgezZ! z$8tEy-(w7BV%-#v5Uo?#01di}&}A*EurLjKptIo<52{r;sSMEBRU~~s4E(uu7WcPG z72#mFa^M!h&dJ;+?=fN3TF8V12}%HAlhrB+@!SPWOP9U)8(U;-xlzdG65aZ#={R*l}eblDhc(Rn?%n{ zD62H#(H=J7Homki-Ur`R5W9l^vz55$Jpw@_MG7Rmg|%+-YstU)mxr7pOtX5lgAT~< zCz3XbX#Ll)mqfIYzxyuXhP3$WGw#L#89D+sF#$xy_Tto*0skPb-3|==yrX7cJ|Ux^ zUAma@9Io^Z4E&;v4sp5}o=?-jz%R#T9WZo_U_4%L5f`om4}6dGD&~9GRC=7V&QBWw z)Du>LSo&a4imsWZj|8Pis93r=D76y;j|QdK0L!{Nf>J$468$VF#a3I^<;qX&Tby|w zCnsW!u%uf&C3qkGR_wm&`|s9y|4^Ox@2~TIZJqaBb>7dE_g<~c0K3BP_PKRY$M4Na zPvg4T-pcQYA_xjx2P5`w!GMQ1MTaMwAm?1z+S%4Vr+49^3)|iGO-)hsTVxejM$4H% z34lhwOc6xPE8HGjDjE@mfpM#sKL~3fgdo&eOT{}^{RKgYZ=ia6I@s|k^pFr8# zBX9>#gNLVs(<~DdAsj!{;o4WWXP^Uz1DSmJ#SrHxh?93ewYK$iERtg@jH(c$&GG4G z6Mxih*31J0(Gs8d1Z8dD!^@OH2*{@%Q*HzWYDmaFoj!Z2##OaKd7Z0jff81dy{eY3 zC>T+JzkZzL2C;0Fa`B0`l*(nSv2F1r+B)~xW@I0Zxq?Yar>B}@s-SjsVzS^Z3KDBY zc1fkMQ!ReCLO~X4i#pwau}UfZCIKyMV4!PBjwgkXg9#hy2dFLaCWX`gMG>2XJ8Bhg zpo9s80Qct(YopMGwr zj9<4QR5~Uhf|P*hOcjg^YNgh4axpSmxL-LfB-?|*6BD3S*Zk6vp5`SOAP9r#gRl80 z*msj^Uenkd*$1Z*n8u38j4jtE6u(#E1?s`cFo6X|QZW`kmHr!gtbX}7#0B>EE25Gv zSdSmQqibH``e(S90xU(_|YIbQ2dQN+@tq%42<>!b@e8M=<%QwCofqy&8nT9<9H=Y9}4PD z(bBtu(urF7wxD#8maYj(XKU%JD7rWCopfuTiq!*-u|jb;$mf%CW>iM_VP`D<`cG;m zj`C!nf`*@!Nmz3dsjT5unh=+0E^mjzvva))358-8;b~wADM1D)dZziAB}*;e{A6Rp zK7S$%@#S2ZrvPCdnb0nHnhrUUDEwrQAH!e3prQSI)Eb8f(%OUDx#wd{zIfin-5qVM z3s^5dhY&+Hu+_0Zl8WVAV0nR$rF(Jvf&)Vl_M0*ZEvmUCPC8A78_EXWpid;SEf?1O)9d`33S92%dQWnRGNpnT@*5A3hcEVyHEKC|E}>NC&rS<-=lZ~gUi z>1}_O3!472z0JR9d`NfSb^Uhos?kfv^}7guj*ebC%?O(P8xFCqK+8l=iJqw8^>DLh z_F>HkZo2AS9A_)FNlet6(?Nnm(7p7k)vH&ye>HMpdVHZWbGxLB38~0u z1(d92i{in^B${t~EPWu+-&F%*CsRWp>c3(|{|!PZR)8d^VD19%_V?=rrJU&2x0-|7Q0ZfuO1zg*%R4Xb*Q3nZlKWr#*4YSR%BF?W;>pu zihHt8GuT5&*tJFgMY+RIse;qhGI8~Uo4C@mIN@bg7}VI(5FuG|CPSVYAIO9wEekA0 z&T2>*Y{GMnt@S1wHmfN?uQdm$RAjg?UB7}W;c^yA)JBEtTl@L*x~XctyXd#PttmWg7=}ncwMd$XRv?~;p&n& z&$c(Hr)*<;zth@I4|3n3mO&9%1(d7vrkoLXXr`#5dsF=J7J46o;tXtIrZ}cUSGi+C zTi;_wPeEl*T7+pZwG@9*RkokyEz(q5^>7C{?KVft zWW1+KRo?ctrerw~Mkp#HvlgpRs^$-4MP;3TG&-x{cC-FP{ji%f%${RICd4lu27kRY zk5oLN4zgW^>?pXonGPJ1>*Ve42Kg7$7@y!84bzQ3_L6;rtl|S4OTpL(tl|eXCh`|* z0LU#^AJXtE>78h5f0=nxh8ZR=rx72-Mn)k6>P510Khj8g3^j`ZX}m!@`Hj?mN#>XY z0YkN{5XosWWUG2akEKK8+?q=}l5z~hy4UotSkczEZhik+h@oZaioSL0`n~IWa&!Wz zmz>{pJ#(jWd>%r)q@ z1*q>0!m;y)#;=c^tz#mPN+N1Jx#Sm4dLGowocOms7a4c_OX5Pd14;e2WZVM-f9leV zTb2Visr)TOgvm#h<-iBNx4#+pX&W;U-o^)ZA5*0CKt`^cJPp@sGIZ_da^MEJoBcV; zo1Yy*{aVI5NnQ8QEeAqM#CWjs=7Z{2j2+L9c!Lq|z`!5AtNu5On%gh``&{?_`rnLm z2j_n?ma6~B(xODJ=VZkDg#%v5H|IbPnm3NzW?k?96C++5Zq(^V59LOmD)VLA5e4>|JcJ%QVG|Ps*OKGL3(du|w68PBHe#1@Nq}MFV9$TVQ32-{_0{p^bhK z37`&c@9p}x{lByt2O_G^f0+x|m~w-PVWae}Ck=A`>!fi0OC<4}M1zN}q9q(aKi;SX zFdF<1*l2L5a_xbEf7b(YGCx!)3R zV7c~v_aCT_TDYngrJaxdkI%JbOW^6`=l-brpEcU(11ai4RW~Z(WBTo|ixxKz4TvyF)*f z1IeGNki|WoYs+2S+wWurvfe`6Ub2#uCCQ3UKWpbDEPf?2SI-?-san$VCV)HWU##Jf z{M$NDX+5i&vYqiERT$p5Vf>W;t#zvm^QY|7Z_mggt;Y*@U{F+0jhIB09%+Y~0(vH* zzBii6=gmUGJv#_x|1yX{tAr71WuTZz@UcU-idI2jBQpXBx0GnLl{B}Ekv}8wyqmb$ zb)8k0ZBr(23>w14ib1$Z`D3-+r2JS7H+fRlu@2BpKJkU;-DF?@87h>hD{jxb3GxUz z>mC0^^d?7LU)xQNdZ31zJatgqM%|v zbvaM2$jhE9@2x=RUvDFD5^E~Nusan48{xFNiGyO7&H4}{-_9I`t94oKZ`m+rx$!C9 zEo?eW@kVc3uN%u8Qxp0z4M2aF2iqCzo zO`%7h%t)qO6MAz4(ARj-?St4x`{bNWAA!~)HBs7!zjZCF~E704Ps``Rn6=hYLhkG=hCDf zm-8rfIzZ!7wehPlH-+xS-59W7fqa1i5Ksh$;2{wa?o{sZbhC0zf188JJN40Ir#=+d z%*Jp@fX(7MD+kw6sVqxRdX@{mPHPO8oXE)FDt)UGSLq8Lt~Z9bPHzmCY=_I@>dV2^ z?%_Ht#PyQKaETRWa20=7iL3a76j$*xA+DD;hD&CEv$)=wgKMRS>zokR8H#I3RXd~w zqQ|hOv%q1G=3r?_u@oK)v7EVISVn%S5=-F|9u_ZtGIcUODZ|VIiL4XgA{>Vl~?x1GymVk@k!x{?k)))kGSE(L8<48VlmC^<}lNWh+)5(`O3-budkRRc$B{9dD+9Agg1 zev^~rxF}0^B;NGGOl{Q44WyQJhZ@+bcc%bJfGl96()Fa|ogM3uiJ4 zu+aqsO^WaYEO!@j4&&M65*ITkpB4ox&ZnA^Qy;V_`9>l&gHMWz8Dui$ylW<(@wk;; zt>95wt07z?atov=U&1C{41O@5|0nX07=ROG(GOMXWjVEOtV#eb4kw0p`lt&yg~C$# zdZ`HUYT;5u$b*5Svpp$sF1Y>TrJyMpVReR)+Seu`f!ARcF?JZut#1HHw1L9d7>Xp8xP zI&D8!6)&!KuhUk)D3XI0XP4@r|p+3+N#>)&D!=xTYvYB z1xK8sc!fAVOjv+e1wK)lb46@m7C9Hx`p2zuR2y7Si`y$}bjNx`TzYXBzKb|RH&Gg& zCxNhDJ{c0LchxX0tL8xbsgUX6PEka1_}yw--vNHvswuaFx0#%r4&L`|#jp%ryhOO| zN)xbEjpm_NKo4EbI`=o42o6!_zD+uJ!$PrJ@?+GiQvUd$%I1DAPD@x^AKr8*n?}*h z6q5Oxbf^kLW2yj2P8ENAouZS@9MHnvi?Gp#rSJvcKRnL{^l;9uz9QI}Ur+d8Pnb>o zGtE%92A%l|A3xg~U!bi%PPTxhlbaB7We3m0vl5Zn4j7!on%_nBZL8sIhK5gwv{vqG zE`n+f`X9bf#i8Ulh1E7Kszd$Z;RYNkh;6vh?kP7OgKZI6UH8n(wYR4Ms;UufRemI6 zZ`c(J1BcQT_Z**5kOkDClwuWE+;c($uJ{Ju{rrE63FzQedbb_2w8}6a4qav7tV365*bQ9`OVGO+^%~xOt0#V<&sgpBb5EgBqXDbn znfVe!s0KrT)~pX=Tpa!FCj-X;l+Z<37j0My1NW8SIS!y#@7MBGK*y1*G8@X(=jrl)_9F_2J;Rh;SRo%NlmIL_Cd z|8L)!+`nHmhK?m}wN>qf2A|FdLF^EBu3N$8eYYyek^RQp3OdmwAR~s*tzf*su5PuZ zhFcl+uxn@Szxk^SSd*??8E&;<@3a&^W~-Z2y1UGNfIRp6<6si6X3FRRx*9LnfLX#W znJ7$?aPSN!i13?siKl3Xwa_;7NYCqxPCWHnv$dw03{rJ32F27I4xiG-W$q5%S(O4v zjDEk9v^HcT&hP&$^+8F1&!3#ytWwxXe)Bp^;3ih+7D7+vDg(<5q4+*7(;QWN{7;V_ zN*{mfcU7!#IQfAV_%!Xp9-I|EwYR>H7raUTD0jA(@=k|@7CnK}mmyH%XRddHD&M=~ zzo1U@$&adpyiODM<qKYcc^TdBW?>yC==eH9NrSts!yed7w|SIQIrWU(=Yw>&i_`|>ZL-!AXRN6Fn>f8relXPsnbHkWyNB}m4#AIHd8|9sFGWcNSz~a5?e;Th2wQ+31rUqMzIb6-gr&U z_h+|iy1dJAI^?Y$?;=lOvyu|)N0ZqBkUDx{|H{>Cm%pxm9k23Rhoaz$JN!;|lRiz# zWm8HebPVN$64nxKDr+H-NG)<}o`JUf4Jq>p?wg|0#6VQK=N15RCJBzTZ8YJ#29Qh; zaG=DK;`w562{$PMP#s2%J3zD#99NSIMM!KDE{m2Iuv``GUYzkrgJkC>m9aDQ+1tQtdklR zKiQ5A9L0NO0I=5xSGT}#7~p%Vz9j!J2|hPvo|{GLZ+>qD4|qfQ>~J2`)aFawq~lpJ zw3zW}NL< zdKZ<3Uf#E^fBE|Um2$f%N?K;zFvI;%`+zPZLlE;9{Be9)ZZ3`d-9Hbi{x&<7ih=$; z>07LBNnsIoVM1AFK}Dj%QezU`P$5x&`Ye7`M!GFEr90B38@*qp3)3R8Op%JWRNEEh z^+3_V<{|n}mWRw~lkgVD@WN?qCen`%;&bfe#JU7Hw+o>+zr=H9*~;~>DszidU3{JI z%$_nK5yFG(1J1L%kE1HZ%q?s~IjjS>;}dQUU%0g?`9%9X0+dg*BP!tSm>K=O%U1U; zUA^-1zV*FpS1m(IF{Ds-8*qO&`kx~lAjl;KN7iJBhDnsD6wh@UqB9*{7D8+^}1vMp|$ItatR z$_zi2dypX=kP*+*;PyTOHgzNBR(JuFPmXyqs5n=+&#`}M27{+kY1Z5;uF&I5eryZ? z75?l4BDfXm-lj)5Xl4QXXzfGgx?^zSZ25;L>8PhVuJ>he#eYt5q0?x^_>^*hiX6z_ ztjO7q8j|mQVm^K_6PI2jeP4Vh1brBeNOdh)(9VOn?OomTJ9@g|$-jjka|dy4amWAW zQ%({GDV-mTswbUzosWYZ^)ti-g*svUyoZrMVvaZ?L}B8B^p;7igF3>P=6~uNRO4;U zm_~?u9gqfd2=!8qVMZizNBbf-pv%AnNc55;Z%KRaKOSq16itfFR-zk^dzlX&X`FDF@3oIcP4~lu%asH`0z$J~vRzKN2?4V|#3F;j3?onqgbs zD~L(BQJCk-FVbhiPsYB)gZ3h;lB~<)H_L&NeE^#RqaYD*tRPhQ!~AVQEg9rg*4l2h z2nD|g6Q8f(Z>WlvEIG8j#gI>eLs3p}Qgl#+4I4xa$BHTshJ)1Ex6*wj z!2bXxdXU}jh{A6&POBU~EWo~c1EqGWfb;-ANWjIjW}M{}f&xI~6xgKlRekHq>(;DZ zwH{w6Sbgof6*rcb;)4ujjTpOK>~N%&SFb{u2jn&d!q@RBIXSAn3_7axLR;sFnr?Wl1ZR z0tHJ^+bf0qS-K}E-KC{ZS*bAR|K&&=+Z?fV{y$jWno=cPj4y+yQAiN7VHx(JLWYvS z_8G+~E~ITDuw#rRTI}D7+*k$@`2kYE@~3iq_ePpCpHLq;NN+cxUG&QM%9vnz+Qu)&PLiB#tWuC3hMLPqd{lR zfno{7_$AiqT?W8C^m^#zT<9pC=BW*SN|&ZL7EXYx(w-AIDvYLRd~~?o;!FS%UiO3PKZK zp@>8PS8p zQY|WlC9(nG&~P9@Q81P5C(%!fyvk0B!^-8emRxh|XTSC{>rPVXi80K^GK%YMRGZUN zYjr*UpXCD6L3wHuVm`qxuUgH6P=YGQ$xoTps` zD5sB>&VBJxlu>jLAw|RyK@e)>Dp+^xi7YPNO!5H3jd#BHH*__BY+;aiKCSqW2tJX~ z=&q{n)xm~(4)fx330*3k^@nrvKzC4_VJu52%ASh?`Z-*k}ykY!x zA34AqS|Sw3s*4c4)+Hyy(%1%ku^YRN+=VDoLEKKYYB`Rh3fwZh z!m0ySqn$ov${C*yR7f(_q>#S;Pjw)@--nd)O?#HJB*09Xcj|MyNTqqa2RWQ+kZIg% zNkzzsA0%amqb)oOAELJJwfRiTKZ5>dYqPS3QAw1rH=-sM`)aZ^DdpCAtzTzIKAgFJoiX`! zj`iyla_hwM)ePfnNFF_E^IE5z59f;>u0lTV@%z0x(X4zptNc3Am|S{Z9@Hu4))BiG zn#WY3M=}+ugMKp)PV~5kYe@2 z*9i_MSpB9bx-b)6UBCOxCs_djGU)uOePVN;n;u4BjU}OC_dbZZ;V#L%03bI%g9t(9 z8Iu1+BnbT*J(c-l(`QnzjgTR0!9XWCX~MshjY@c34Dk4 ztUD|-WjvJJWT59w7)zWYtSyq}ZTTpi-NjyXX+oRJMOkka>uuJ0*JkVS?IxpsBxfm0 zFSAlUw>pty>5mA|__9Y^ZBQyVLePn4K(0h(EIceadi2MX5#;9y8eSBPNMr@X zB$Nvlln^{{JBoh#SCobLH&7AyR+lgq)(avgkG4+<2rH7hu$8xnD0`gruPrE=1Z}eX z&PHS*#6J7u!-#zFT<-c{H7?^@JubP6%&4Z6;IQ^2YDuSHA%urT1zm~U+6Wh+MhA9% znIPXSponINZ#aQw&*%HWX!a+cpyvF$jsi`Ei-=NJ{&EzCPwOHd{VSH7nLEpy8;HRp z1F<)``z10cK{=$rPwlr+5120$O_5z#8(lp0Bj|(gZ<16k`mSk*r5}(|Oj7s>=litu zr9tWKT6$Gb`hG3_a8UX|E!`TFj@MF2mW;BwQd*FBVWoFUY3YFgLZ6g2UFxLVa+TT; zlq@oEL(7(%EBwvEq%4iTGHbsrd+GmGM${8ZSXE~M*2oLlWN0h()l^@5cjuf zLqHEwR|ltQTOBy}`h0~D$^zlmIuNd?3IQoLX;@GP!qln|qMHT6u-XtxKl33tX_P)2 z@*>hG{c{~SANJt{5R{iv9s4f@_8&k%g72hJIl?b7@uQr6DcXy~uF6rZ9 zU25&cN9sVxn`F^AAQ~yklBY~#=J-o-adj@r!o^GL&@iexgfWCr*i#!qVQX~=l7AKC zmWHZa6ue8sGm=z4Ev%_S!@TM=3=u9)sRJPx1O?i}FwR+2{8ViS@#g9@#H1nqY#j)1 zt_~rZMH;TE17TKm2nC_x_}UPnXRAYqhBz9cC+a|uH9$_YXS9ji#0lY(bs)U11`TCG zs1yIgl}mxf-c|Au_?U-bg#4R-G08|j-m4iPp2K7cC`rND7x-vARps~vBj49!%NW5hM3kHL~Y!$ zSi83R2V~+#6CeGFZb?yy{I|CBtNHp_L2*F+q&9YdzN&y0|YlNzJy1l^xEoAh>4IeLBs7MbwHe@(+}BZ z)647D_pM#OeASiZW&M|5du4g$>Sg`q^{dP4`?2+8;p(-0E6Pi+>R)>Gy2)JiDxN;` zbPzmj#`502rR$fkUbW6ydg%p{dl0%Yc)0G@FO%TW;SiDaZ39tL_>NGJUjxr@U3lv4 zTq4()Vt50ooL10#QcQm`?d;lc8-Y%O2xc+#q^3uyWx$ES67w#iSfxugg%LpLF8g1) z`ue`L%kaZ#ylv6K*{waj-ECbRi+k8g2s^7-7*j&}2a(kId;ZO+lkUO!A-H;2(HWDpMj!}dFp)?~o=s?9-XnYV7g)WP6XM4d`yNE#i!$*c>U|0iK8G+wlOzxQb ziYM~R8y7j;nEWrHC&{^t*p zbr6E7)F!FV9>MLq{&Qx-oM{khsS~wcQW!qPYE$1b9qA$r;Eu2}^ta*Hh-uTNF?ybG z!U?Z7Wl6{?pKRM{5Cm9MD8DA%hnrc$->3T(U{tQ#`0*s#N75M+G~i(QIoOmVXTDT; z6p=0k8ZFKTAJ*)0oJ6L=MCr8?k2hW^z@d6LK|eVnO_@wh3WhSpyESI2khh zK=bFoQoUqHG#v!Y(i!3rf)>^+JMG&SE^h6acQL}@q6KpnT_jWeoEfRQwONoVYnO5= zCS5bE0hJ;TXVFb3WVrZ2pF$J5zmp+)iyjXNKJZ&A%^rcc!W}DY1q*k2|Lb9aP}2^^ z+Zz!aMGL8^I8GVK!5|37XoKJ<7jgt204jXNXG_D#3kd@CoK1ao9e*JP*GbEyi(tx7 zFD>)4xzPmQP&3(^ABT}^mE8eG9dxZf z5;K@{7W<$q8^U5)Dyn|6K=VDz7z6umJkr|J)7mz_eNOMkVGF|rVw?{kwy!$zq49D zA zws>$jNHSH&!Tq0Xl!F{u9Iqr*bX|ccM(G(%iWf6r_8<8-UvRg~UzABxG}yrEiQA<} zRjR-XSml`NRd%XBhc2Ja;N+Hry0F}oPiz+? zNtCcx=T?7(5jc!KOJ{)DptQ1TsIH*mW~Jn;dKEWm#h0<7$IC{2aZY`zv}*CfTx1lP zR*BqbYkr046RmXpkb4ygj36Kcqx35}*_s~t4=VYyNfS+D9sy`Vn*-x@VTUsZ&-8xaWd`8XIu#d@%>11dLTFAoKF}9oVm7wgE6Uq4cytklqOt{&pVa(7D@o){^)n`x#l6=KOz|={F)+{;Dm@wYUN6)* z3JB;_2Ik*r1Mk8%!-qziOg?N@Af`!%Hdq;};}_pyI+Bbei?aaoY3aU5M*O&0R?^;C zR{TxXkii+3NjkBi1#(BHVNVN7Nua)oZ=eU_KaaoQ2O0c@|HNuC5Mmgqo)gd!%~U#a zTjsThUyz|3J0A@1Dp#7HKy{H)j;3K-}lHpCMvd*ScbT0byX=ac0Uc2 zKv(IkQZm&!v25pU+;O>q;sOdglRY9fRGZWW@vy+$No}a!_(K(5N^o}+$)yCvpYj!| z&@kYn!W>KYLcsNd2NC&dmf5U_c`c9?+E# zFLp|Xl7K=&@Qd%l;2}UXc#w=VcqHwE;9+p`g9i+n*zl|pJdpQ!!J`s?W$*~-NPr(De}T9!NY2pTh|I6sJq|6;|bCMgW(g{XuuV{{vNY^2_6!a*u*+#JauC4_MjZm zk08-e>B@{h8FaV8y_fbs#gBaAWrPLh-LF`-N#7*{;Eyk54GCcZoXDS4`aA6;;Jt)3 z2zsIq1oV`WWgE!@AQJ?K3I0$dm(Y(rQkBq|6#*q=#Gh2TPwJMz2m1Yp%)oId7&qtd zrWj~qzI;8sq0Qp~KMqWi(GVz3+2PJci^+9>1sA>K(L@R*vOfFKFDCOaLufqHAiE)R z`&KSrvAl1sAZL9L>>}~~p9h~@MT3Z2a0jf$Bjao7Gr|(1hJ08yu1-oMS>)-TZ-< zZi?uxb)FH5{t>ED=@!(1ym$lxgb&cRG}iHv?-Buk`2VE9xc{CaK-1j2?VJ=?K?es| z+9S09X;jI{XA^KfI$h+USnP`3VH|;WyR+e4YGRmS)|pfmXuUz&Yng1Q>p7i>%(6xywSaAB{Ns4Sxzf|LAJb2-feh^=t3nZnCSi z>E@IWS^^0IbR3u^@he0G{3}--vU@7*a_;U{THBU%b-BBUTHAU$7IpS6Tr@|d4mp6P zq2l}^!jP8BeOd@#It@@@lyESz&%;gkMJ#!Z)MsP}q57h7i>2aNA}m0L2d+oRjeaRk zp9G@!?-dHiIVV3;_WBqd-8(s_63Wec`$9W%MA1KwejS@&bwqYAtQs;4b=97#`AC9}_cdp+k<1AFrNJzz2@ftzLhUJmZs4R_bkHEn z?Hh8a1C=f$en@V`2OD6t{z?*&8FDec<7AQv+)$c!!S!o47bE5h>s!tKQ*zyuk*G)HH56htzR z;}MV}ZvtH0-qqH=m=SMIM|V$aXB(#VWn#S_7v@Pttu=Iw0Kk>>DD~EyBD?f=8$a+qlr>pX$nl3hfDM- zOQg$_tY<(l7y<^RIk!k!U&`w!TVCVINd~!S4J_D(Hkvq_Tip5@;n8K0x#PQM&^&|^ z;&eJJJM8Zw_v045-AmIQyOBXz30mM+A0TiLb>n*JnI^G|SUReV*R;3gbXrCYKxG zGUN$hYw*+*d}p2rjh5(l|D&yP!X+P-!*jn_A_N_^L-6TtdmXm&1ywR1#D>IbF zD}Bk`HgW$bbzo~yTI#PuX;J4jo*{a-!RQ6fkr(!M^mezmcD2px=)8b*!tsF#dnnSG z1W9<{XLvE8nDj1X3S@e9P>dbO+R83W9iO>U^-n*hZKj=-fRoP3X}!+Y2hoObL;nrD zqqrn1k9d^sgpnl);fc(;^wYUQBSLZYq$z?2#POKhqdLBDkYw`AzaC1N6k0u*{4SA3 zeM>mBO#gBFp=3H9)@Rji-Q~63lxcl-&|0#i5cfE* z^_w%T&ktJ5)d4~4==)ylIhoe4sN4EZueD@0qJq5ZC7zW$BpCx^N7zp!L6J!&nFb4~ z3(k6q(im66T9rnz&l!azn`Rh1TlCL#>)Q#*h1SE--{`4?i&{H+Fn&PK)3&H{j!dQr zGiRjTi%h{bJa`d2q!^$)S*e+O{e?^*gth#kzHsEC-pwgT1JAxe0+l~a2X9U>4gW*> zZ#PX>`5&Qer>}oHc0wAyHB3EmYoVxin;NtW3;G56iu}|Pd_qNrN_kJx5CZPpXz0ih zIvj1&azJtAN62YJZ&^G(BXl;IEYd^$f=d6U-N9z1vL7MsD4F8vr5a<{pR|};3v&eWRU!fwJjp*uIb!Gpui~9R;n>Bt{ ze)1G`I8eexL>XyTUoB`@s(1k#sd;`K- z(SE`if7#%KM2&Tzt&uu@FMY>Kz|Sz@tQ%ijtK<%t^p;X|5_-n-R%^^B+_&Zwf)D{w zrnPGybhUcoWc7~4vNoc>^fzu9!wI7J1j{kZv!~vI^ffm>o6JMVJxfo^+{;r-C_+&^ z41xZe^eYC3rGT4u-$ncM2!fW;>>$M-U>k^CoVuozWTM3xoa-@%+eAw=pTDI$gw?C_ z2VEZqmtIVeH~}w835-jcKN=~`gCM0PA?4*HMZDZ6CGC+yN~G@!D2ZN|p#)bdQs@f^ zTlxbZwjcXL=+aMw(Cq}SyjG)F&pr6f0gHlxBA)h2A780#uPhLxyR!alN9> zQlCsiO%jtdWrG!_Dof8-nO##%4@+ajD~)|gBk}z!aj>|+%Wq#~C!hZ8l` zb@TRa=A}nsY692ojv2T&7y4wD!u|O~3-D6b%eMupC-^LBgZ47JEXs#m?cc^}%1@FH zJAVGS(*wkZt1@tDKK?h~R}8f;JR>-eXBLUz!iN3;XfuIe5tYahU!>LeGGL6w z9sb>zR9n#A(bK;0!qx>#+FdAi-<7+rZ^gApnG0W&3!@o+AWV;ze-C#;GbO!w4=8fXAl#7z_4QD#M7y&KelWL(cm_NVPC4!(-OyLOs^Q z*nm{yM>7~9mmD6naz?$U;Mt1;M*CtJc`$QD2~)s4mX)IiAb$9ow^WdrV8RoKS#EJe1`V;ZDLHuILZW~6CCAn~Rn{RPTXP7hCX&__%dcD&P_nE6N-A?9>G}h~1-Z~R z((bmq%5pbn-SEMfMHlrhSvV&hGUc33fK{f9$DdFCoovOHa0u_By&i@!+Bunik_P4EG zw|-&Y4Ja7B&Y9+Q>)fDpDN5l0Iwn;p?`3OrfCh!nU4&M>aj>6VGy_W^v9ewCwLX88 zi6qWptvP-zMiqn$#Fp_@Tliyhx$TKp9Fb@f5ZK0wn%kK53)yYq&k;aQ9@5}5Fm=~B z-4%HM+iQ$SKsU1{v zzvAm)-$#kDTTlsS?2hpoZB&OkfsJ&td!j;_2&(qiHc%3r*hEMi$pQ`j>|5NUj(BhC z5pFGD)GOE{{DZy)gRXS+J6SqccZHe(qNxk(gpb(5=bh4Gj9ldfzC0--rNr)SZo(Db ztG6G$gFGbdjfXU7Y!5)cG5Ho#hN1RulHQwxSb|-K@X@_Q{IEfV&3AZbCI$#rnCAYboMO9lxJ#Bbgw!@-vO3{+}^8;n^1 zbk}F@*9zEH#RrqK6|k1GQ+AyHwY`DlKarM_7BU${b7oU__ZcyK_n<<>GjnH67=_Me zZM3y#W_S=DphZ1*Ux3ah$P7Lr3-NEu;%6!Fd&UZX4(-gTR|X8tE;@(?pdi<)J^o*g z>*i^s3|Js{oiTno01AcSUHyeZVty)U3P6PJK)6_jdww$4hsXsIXvKP{FEMLe*)9@k zdb3h}dkV|xY}OAQ^~K-U4LolV4;+SLHRw{{FX}&jq|EbNYxe-#!3jM%;}_{g;20$< zA&?(!C{O#q$=YZ&JggmR9~PQwzi_!67|p@H15#4wBwWL79(J4J+bW!&|DaB|%n4-W z^Snh{D9=M539-_O-r@~(8^OL)vCpiF9sH0F!+vfKb_q+6H*4NgNA9mOd5a7)IufY| zTFJyJsj)$^ZS?gLy_v8*9Z>IL$0#N3czPlA=u~pyTS5X)ECo-Vg`pE->1HbxPi70~ zoA0*UJL8t6fak#h?JUL9qv#Q(s8M;IZ5WK=nsyw@D~w`^WDF9i3wbx1GrT(q#H*4h zmWc3bV?-lE7elfMvNM`jGZSfUSbY~#1MlvgFe^b~#kR0-tj4jrR7m!L# zId2H;GL-X9qu=n8D&Wtt4cMAz8^PCk(*DDiU>SM5#bOBB8V?NoVGGeA@bJ0Mwi@ym z%+%9{}tA5?Ur?HOZ!=(D)(1x*_joQG4m@<0ex?6%dGx ziX%<tA5QR``aYEz@Mla!qyvSf(jz73 zdz9d9O|)@vbD&Xb00~aUOQJYq%%d;S&Tt8JrrXefk5>1~bU|mGTyxh?w&Mafu8WVS zx?3hmtYH&bZ1ZIiyr1k@2x#E1G7_7kF!SaKO>_k?HH8-a-|DV4#;&V6pL^$yALFq- z8INaz>x}KBaS|YqCq#j?o_NM~8r$RA4pBp@iEA5s!Z#TX~;~aK;LzzD5_73V6jceMw+YP`FtT}cV&r}6 zCq_5%wlKyon>tgUP}1a~X;T%=&afBNz_%MD&R!+iImPE?CYZ(8m{hbxt~~NRp6Z;G zI0l=<%N~-b9}-VX|`Ok4Khg2@pjf(W0J$sQXVaQV(@DR&T}RH|yju%o%WT z6Y_I6-@k7ZGr%ZVzRV%3saAH?MkjY~-@kSL)Kmn=AV+3uQNaScphC~u>B&Re_fBJJ zQKUMVJYU(lF{TP!O`e0y*#5aawQzsjXYjaK1dUrC9J_O z*GS)IH`bgE)^LlZ8*A3k{r9sdnknnS%DyWJb@?L8R}@I;g?cAvl=T=jibKuqN(pRM$Nus&g%e%e^>| zk+}OdRXyi~4|C^q-JN*t+HrdAzM*l*E2a4zD-of-N7a*gyB>;Q3Axw8iTHn z<`7>dh`(0GHgX9SIhkq~zdY?Do6vKV3npQ;4s6oYIw&X4Q+*TO62a>Km=o*|M6mxU z6YRpA4xUd0;06>B^p8dnbkdrKQB@=lIM&dr0sN7BzoZIw4p;kfPC%SS+IGy#wP@kE zfQIF{)qLJzrRQa0zNRPFXgIuAxNAEcLfDh9=48kH#Uwi~lxh+V>UEiHEz3@=z{VWm zcM9PfxUC{HrE%cF(w3L7@R;H$%KD)-POtUIq#RI@1L0fF%m?H0ivouo#U<7HP_7pz zDBv{Q-OhKA0ZsKX0CtTN?@Sh95X?h1e zLlskor_25Z=;e)#zFTZ;BM0EA)F<&AW|AcpNGR@qx56vr z4D*_)MfL4;a_RGg-)Aw3f$AO0EMn}XZ!chNf`68Wd6#~|l(JK^0OthQMe#-DIMK+{2S2 zb&t3lC=!$d{8J@*PQQS>bvaPjlfxxCZ1jpuG8qv(*C405k7&Xn=s%unR2_qexG6%M z$bFuS`lugXR3A0Su(sUcLOHNPbU2-W?LaMa<+0~P&{UwbKUK-=OuQpYi8mxPj$580 zZQN?0Sc82zf~or+1I3O22c2UlS+Sm*px-iOu_D<)=l-#QVx=`fzhIzPz3rg$_yvJ- zhO5>H`q!o`IyDYDpRbD3ve>;#(EX;YO#k+L+CUd_*`DVNw4b31ZZyyp0{u$^UCGei z+YMBvpnLz`K+%16ob|qJpqDdrVcJ_KTdWr7-(4|v`vvmS}pMkCy=o$mvAkb|3(Dj}s1Zt&tP@qJ13k#lAsbnT1bWz%{fI!nZlE7!=*7bZdRU;-2713h&l~868TyvLFwiN6E?Z)t z`vv+nmx+GoZC($+HEK?OR~M&KZ42tJ6m^-}Rl1HU<=#G)R$J6pUTxH4QK`M7$l@g= zB?@#WxUqxkY;+rB+GT0@e}yH=&Dt!{JCbGcvchBNLUh)O@BvlV+$8iR`4_#VsviDs zRIazkMu;kMRkzNmO4j*aREmoq=GHkN#oMWph58LSd=!_UPj zJKw5y|(DypIt z6TjI><%dz74O|n|S(T(R{G%wPB~M2wRmu)$qi$-{o5}U0jF8**em}h&t>sFu{y*@~h=&D|HXS8WwB7^re{tjh4YDl&E42j|EYi$$fc=&iz_MsZOUbKV(K z#R}Yto?muaK7XL*EmG?KYLwE#DwI^|0ZQ+WQtIg}rH0(E7_bvgXzZl+8h;*@2{XbS zr4-G7E9O_B6!*O@ITSIVy#-Y$#eJ{qwy5^zRH3BJTbo%nu8R5-Q3i3gLHp+IJcDzi z49=^MI~WcVz9Y(Bk+|4Uu>wXADZAq*%-RO>Q|Mf_Sf zx3>-pm)(o^#4ZuRT|NZeNZ$JaGN1Kp*0?`=7J9xl8W&u@7(JoI_uJrVbXI{+f zR#~l~%gwn4b8lM%L}Zmp%Y3~0FptQ?U$VcbW7l)Th>l&9AA6;*yzOek*({;wktKb>buz3 zkSdolWjU(1)(oa0%8-M~QpnZJC7pF%l?Ca^QgV!cvfkb50PVP|qvnC1vCU(f{s;?B zkI6{^$oVdrKK(CX=x&btlp%_j&!uNdfVf3+Yp+G}$Up!I3G5OV(%3Z%E+e6Clc*`h z`1D`^BZo0g9`htpwGLcHzo^-ZD%cn?*4WXJcOc>JcicX52X50|J3hW~bo|cEN(-z> zwn;UX3hPv^Cb;`Dca$d|#>|R{;DqgfQ?JV-F3tO)+7>U5pzlD2-K_#UGhQ_wXcH|C z$-tsS#=%qR>N@?fRQ}{eA;txr*~q5?1&JHzL%-!9RDavO?Pfga%cQap`hNNk#30%1 z2OlGtyWu>dJrvBe$DV8{g*!C7U&pAWXsN z4s*|;63phTeZqW$#heTY<_PZ#{fqNLy!ZGja}>I8iIuON+SSb|Ec*TCGIYtXGSg1i zfgA-aQz9G@85TcSLP1`udK4B}3dxe@6#AAor%*qW*HRsu1B{kFDHL)R?t8ri^IsJ( zZ?%|{lg)YWzpI48m3ay^T*2-0o?OwK!V>j^uesS0M8ug?R$~*!%6;$gHb_a^!51@{$uI#9d6vBZ%j8 z5!QKv@gP@Pp^tr-V4S`zT^T>I**u(FA6-ZEt#L!LoJDcR)~#dcQjDyn>*_a+kB$** zkQGwS$DS+XKOR3>D*pJ1hU3~WQw{FNqtS3Fz4l+!g8)j_hz6SK0FC9fHQ7DwH_vJv z?qix=5V9AHxWt}eiyudY5Z8nsNPz!P9UsMVS?|yFSsuqGq(C8TG!*m zRk{Vul2`E>jaxRJJlR*w6sJTHXURln7f7}@@IQ<>CEF> zRpg?awddugw zfDv#@)k_a;2{lL@ne|R&t&I&mRQva|R{nc%B~i&V0=7M?>K1qC zqF6J}ftG;WVL#y5es>oU;K`qKQiW8Y-EKa#$@gx~@9=K+10p5ntUVmd@8CLR3j&$9qGc^=hX6ReFy z@hw-I>^Q~Z)8{-=0=Zdv`@qf|Y#-PVGVjlE;8EeG6xF?!jVbd4!0eGnskCj`7^iQ* z^gJz-?TM|DY)`Gy?94yB=Z((x+-&L`4G-@>W}L?Dbk^MNjj$xQKP$Pt;cb;n6AT&4 zxl+R&izC?_H3)xfJ}Bt#$xzJSP3+eG#IVl239y68`B{B7cN)H~ZMukPkk9qg(f@KC zHAezfSWXq71{CdQ^pKCLSm(Yxb5xKvWN;bnqUL*VIIf^Fs)u;eZx>ewUrr;#Z>7K! z$fPRO%x&p;r70;Mub z-yk@!k`&i7v{KG1Q&sb17ip&UVhs`hBX$^|r@C+eci1&i!EevZMe_usr*=xBhtP!` zHejAcb@R;5&OFxv^PD1v#XR#K@!Zs!IcJ`tgC_2RlorNAlCil(aIM?O%3SNl%*?+0 zZxr-prm`!sQ(-p5dFe76<7OYOmSc; z3$9i=8vo1}O@K?Tr_R`FN8`(RQ%FbSzUQ5%DYif^rgT~`q||D8cbO_8vAbyxJ;9d2D=XN4n5Ock zDKi`J%6oiXxDR59P{ZziBm!s>xnT zztd>+eMNb$UE%d8R#0U$1*q2F+>iZgy{%Vs?jLDIafk8Etpv~Uqv8wTQwckLe{fG4 zJW+*}wZX|1gb_*x#+mx#ty+-E*-5VzExCG4mZgdXX_!OE*c4!dOhH_Q+sX?tL?fok zdzW`Wm8k?ym9@JsK$W~+uWbIXzQd1H(ik;DUEQIVJ|>RptNp4vF{iG8fIO6Y;hSDa zCZ6)y6%^%Za{?63lyFe@K@kl*<}a?6w$UZW%BN8yH@|^INCg^akd^*NW?j0HiKYkh zX;;wS;Ddo2mFlBNptg|T`vW08sLKRKS~=_L96v5WeoBbq+XeZaPXycm&&Yl}Cl?!T zV5~<}xlLny=VzWG826ej9=|`!b9=$zM%Q#pfnNW#?_xxhy~BK_eg)mZYpxCT=8*=d z`jzSVna;_$BsA-jA#-W@6M^z33exNR=2AV@&`i%4$#QIPrlPY%G9;CF;RaD_9WB(# zTbY|jh>wootbRfgUZLi%Q#--w_+Otkt)kBnT(TfHWNSJGWM70Vxl;V{n&5@?ko=4= z=k9vot3;sx95y==?<37p{q#61zp=6&SmMcDeC7yi{QT>$U8pA~yhJw;VAf5{ODGsW hYerB`1$4o>^E;)uO2))Vw}qDN1mZw~g>bJNegJb{z literal 0 HcmV?d00001 diff --git a/_module/ncs/ai_wizard.ncs b/_module/ncs/ai_wizard.ncs new file mode 100644 index 0000000000000000000000000000000000000000..404c2f884159578419214abd2f01fffa368f57ce GIT binary patch literal 123288 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/at_enter_pc_room.ncs b/_module/ncs/at_enter_pc_room.ncs index fa6dfe401163829b6b2abf1849d20decded97a7a..0f783782915f5b1b0c3287b1a3634f915d4330ea 100644 GIT binary patch delta 40 ucmaFE`iYg-&pB8j%uvt3iGhLX(?(tgCPuf(eoU6^d9n;Zz&5#qDFp!AiwThc delta 34 pcmeyw`i7O)&pB8j%uvt3iGhLX%|>1aCPs(JeoU5(8I${%QUIy(30wdG diff --git a/_module/ncs/bleeding_ondying.ncs b/_module/ncs/bleeding_ondying.ncs index d11be2ee9ed0e7f8f3df2abbf4d4629fbf4718ab..74c9494835b77a97b9fbc55595031c2d2e164d20 100644 GIT binary patch delta 202 zcmbQvvz3R}&pB8j%uvt3iGhL5bR+K-Mhhio#{d8Se_&u?gwoOsK>ijINK}-P!c_7ImGFg~uHsjLC>zQWAK7}X-8}x*M1)`1*td1#Ua~!h=lRQKP k4#OD2Chupp*8KHX0jSyG0N6TqCWsaY33k&9h|3fh09o-Y5dZ)H delta 132 zcmdnWGo6Rm&pB8j%uvt3iGhJld?W7_MsXQt#{d8Se_&u?gwoOsK>nY}{}?5inEyJ)^i6LO}MOJIs-~0+dB@PD| S7+4t?*qOkly?~ghzyJV(RxAJj diff --git a/_module/ncs/c_con_riddler.ncs b/_module/ncs/c_con_riddler.ncs index 5c18a3369ae113092bd681ba5af1268bf7a688ea..13bf2bb3c61947b559e33bb2653e87f532eedb5d 100644 GIT binary patch delta 85 zcmZo>{m&xp=NzmMW~gW2#K6E*FUJ4`91099Y#_!)ZF@$>t&_7ES4h>%f&|!D85j;T burU7z0&WF)kdXFdbtXA>cZl?4Hzr#E&8850 delta 89 zcmey*(#)#u=NzmMW~gW2#K6GREXM!@9109fY%FXbCL`nj|Nnn5ut+li=|3B#?HL)@ lPmX3>AyUlBz;Kv>g&8RPpIbp5q*isZER!6g<76i$TL1yo7zh9W diff --git a/_module/ncs/calcmodvalue1.ncs b/_module/ncs/calcmodvalue1.ncs index 54181ba0941e59dc63268ce9b8fba7f6a107efcc..c321292d6e19578ee2d719f6055bf2bb24e4c5ca 100644 GIT binary patch delta 421 zcmYjNO)ErU7=6#Z@7z0c=TbB>(+zjBAR)s-G{(&M{+wbW3uIxz#>$SYlnteml5ALu zlxE=g(p7CUL3K?lfn>JJZa>dxt3W^9LKEG29V~A)`>88wGq59t3`22L!U&7 z^ZGo#c%>(C!%uw->x_DnXyT4{0jUjoY<@eL!$1K&8ZeDMupkM%|jV_Y=C zMZRHae@RXZORp|vW5!t3+|Ys%e=9z?nTRf`3@3n^6x3x3<(zlCflRuL#~u3eDN s{w~MgFfF^}?>gt}obG-;%T!kwX1`feej;r)qmA2UIPg!ED`{=<3meFR;Q#;t delta 432 zcmY+A%PT}-7{T6_xrocU1%z zyjN{lV}(A14$kQ#c;%@+h7Fb(38Xk~G$X)OqZb)wjCO3X#5I5)pUsHv*lz_IoQ>Ja{9dCl6wD6=oXqxAK-os8Bp0k&)NtDh7dy(gUwugY05#5* A)&Kwi diff --git a/_module/ncs/calcmodvalue1a.ncs b/_module/ncs/calcmodvalue1a.ncs index 4437a0fa9353cbac1393bb7f21495324baea697e..eedc0bba0d26710ee1ac8bcb281fbcb09acbc447 100644 GIT binary patch delta 421 zcmYk2JxD@P7>3V#@45HtRii>ElhkOaq5p>d!!)$A68Z(9p}?W3_KJpR4dNYxh?chg z#)#%HnhGHZqNbKW9HPOp+qIzSJ?G<`m+yJbefK`kWOO<-*WS_=5yE}H>$yP9*>w#5 zkW_^b0E)%phmd|@Wuev@37z#y0s~x82JyvXWeAtdDPgR!T^&Ok*VPHUFr!X_^vNWm zT$bH1c_=%PWmfiLj}=-H2`*|gc(=|~yw$?kXPF*Fic@+A8n~^;@x)ubABQxJam;ew zn8znij0i56H%76_en$k&+;k-H%o|4!j;J|@kY?N&Lx4NZG2HRNIgA|!%t0i%Ulno+uN~vqW4;!}C?~Wg1h}d7;e}6H8}^y!972qf&T)M6 z!WqFi)6Ra(G2)7#g6pn9yzFPfC|&uhQ(&A0h1$ukEZGZG9Kk5@kl=idkuq9GHPzJNfyS_lsZO Cb%ovl diff --git a/_module/ncs/calcmodvalue2.ncs b/_module/ncs/calcmodvalue2.ncs index 221b46c94cddddadc2b0a19e5452d899163f1799..398b0a2d447b8490e6934eb1684c13c6a01aafbd 100644 GIT binary patch delta 60 zcmZo+dBx1@=NzmMW~gW2#K6G#Y9j9;9u{T>Ab^k)e+M!~P4;D!WOSIE&S=6W3zA}+ IJex5S0FbE+b^rhX delta 85 zcmaFG+`_`^=NzmMW~gW2#K6GBGLiR?4ihsAGXoGXGXDSn{|5t$Gy{D~8BHcPGG+n*8rmBw diff --git a/_module/ncs/cannotafford.ncs b/_module/ncs/cannotafford.ncs index 7000cbdd138efb10ea5b1f86db7baa92f87afe5f..51b8097aafbed172402a30784e407acc5aaf8d3f 100644 GIT binary patch delta 88 zcmeBSn!&{D=NzmMW~gW2#K6EPF_AZpv14LRzO92a!~g&P|A5IKvJ60=q07L+3}P@c U0%blhuz=;hfaQdcRVy$60NX_$_W%F@ delta 53 zcmbQi)WgK<=NzmMW~gW2#K6GFGm$rrv1wvXKCg*1!~g&Pf5VHWoG@i(#Te4FGa024?^O delta 47 zcmZ3(xQCI~&pB8j%uvt3iGhJ(&qQ8XF(x(^HXxgUk@5fk|34U5q#1zppNR%F02Ejb AjsO4v diff --git a/_module/ncs/chk_has10gp.ncs b/_module/ncs/chk_has10gp.ncs index 532b0611d6efe7d58a081c4e5ed0341c30ebf71b..96c15401b852fa92a62875777c77bbe829bf6632 100644 GIT binary patch delta 80 zcmZo>oXW`S=NzmMW~gW2#K6EXbt12&x(*97kjcQv`2YX^FAOZw3_$vaEJ(-#%>Dyr QvrSBto diff --git a/_module/ncs/chk_has500gp.ncs b/_module/ncs/chk_has500gp.ncs index ec54f1353b0aa6400b15d29b4282f1e0bffd16b4..12a8c93dca23e4b334152c046e7b8e195f094404 100644 GIT binary patch delta 80 zcmZo>oXW`S=NzmMW~gW2#K6EXbt12&x(*97kjcQv`2YX^FAOZw3_$vaEJ(-#%>Dyr QvrSBto diff --git a/_module/ncs/chk_has5gp.ncs b/_module/ncs/chk_has5gp.ncs index a8220e16f15425486fce699f071bb78e34b22b62..1657780468a64ee67ced1642e4977bdd5b5ef19d 100644 GIT binary patch delta 80 zcmZo>oXW`S=NzmMW~gW2#K6EXbt12&x(*97kjcQv`2YX^FAOZw3_$vaEJ(-#%>Dyr QvrSBto diff --git a/_module/ncs/chk_has_bluff.ncs b/_module/ncs/chk_has_bluff.ncs index faa366000916e2ec6ff6d3241edd07c793548cfc..caf52f2c98a9885ee66fef2ef8634c58fd6cba10 100644 GIT binary patch delta 73 zcmXSFVdV954ps;=)H85mU|?vO$g9VwGtov;-$@V8G!T;S&)zgnEeOL QW}8?j$u9&EfRG9d0HpjIZ~y=R delta 62 zcmZ3=IGK^x&pB8j%uvt3iGhJ(@@V8G!T;S&)$0#9B#C K9Dyr QvrWvEP^~I1SwIvV8MeyYnsMtZA0lr@Z{a2 z9z0n*2znDdDP9x=kD@34f>h`shiIIAgIXS7N_dW6#R5u!G1|-60fb!E-+%u1A76ZnkD;=4YCX^R4+g*p=7E zi=CuWx`!ZLUS_sUrIEcSzSuGiPgY|;J>t|^F;e~|BTCIzdH5m)mj&{r)8tZqZDhQR z*&jsd4v^J&x`HcyR8F3J&B7`{RQmV8x&IA(f&!%rH=e)xrT4~)+X^Hxbq#ah$XqZn z`!viMBXiuujOH1C$H=@iF$Xowb0f28VyYVEhLL%bF(supr!>rj%uvQ>t9E&z(TZ2P z%bVS`&ZVt(uh+fVZY^A2YC{k5F@yO7>+g?E+N|(}PNyrF59dGx=cdEnPa4|WmiLwB zlk>?cyv>VH=2Ntpid?fGk1!&-Lq%%ENc9s&M)KvjpDoB+jEL_-$;5qFjD$Umlr))K zv>?wgB3fO|#4ARsA21>sT|wBpVkEqSkuYBlyJtbxFd}9}&1BkwtYc&>p9%e8L7rly zqCs9*kY$XhH%gct+OZ%VjHvf>fgH0SD;S~qa-44#q>B-zK^|L>TNnv6NNhn?G2&~G vz=GVx$euhxK3b3sjO^7Q4=l(wMrs=5oQ$M@Ao!2>s-_=^{O@ZZ0weMpPXpZQ literal 2222 zcma*o&2G~`5CGuuuAQ{BF^vI1g#wmPIZ)Ap=nJ$d0znl}Beha5Q3d&<(9#I;0_7Rt zg2bOV!V}OQIdSIaB@l;#f)o_ivzT~hCzMK`DGt`417%2ajgfwuT7F*EIyqii}A|C$Zvl#?U$03 z6%zmP!1%M6$@WAujbne^82kXjYPC{Zm|vQ&lrPto7O{ref!WR_m1*b%He@zpx0W=N ze`X7$B)Ka53cxGr17L&fWX+IOg}HQ?y$MpyX+nbmJrc(0(o}M{&ScwyPlLeGFwXxg zbn*W~pR&-*wvW2^E4P(4hPF~GsHOE=>Ps% z)1vqw&ZSrQq`YG>#-@LwZZiG;3tWRVWpWkWHO-Rgw_`wIOMp)}v`>=4Sr-;RaCpdV zRsRs+9*6dRl8SoQg;9sYyioCx0AF)xM~+s!?!w}G4(-5E7`ZUI$6@5Qs=f$tlS4bF zq@sE*!228)go;f8zT|LJfHMMYa7bVHIIG@w0X8|LXO4yM1lZzGxvhFT0&H`r1$a$> zcQ_0MSQOv}hdCF*X8~?;I4;2K`Db1#Nt$Sz!@~k>2o+y(I4QvM__ndf^M>%ez@F?q Idq~Id8+s@@^8f$< diff --git a/_module/ncs/chk_isgoodor_nue.ncs b/_module/ncs/chk_isgoodor_nue.ncs index b21e2f78af33e5f45cd0ef935d7ec74d9770e727..5a6e2028a0b8720872997b50367fc751328241f4 100644 GIT binary patch delta 72 zcmYc-=k;?ARtPiHGjL*HU?`u+tH`J`QD0KuNSfjQ|Nnnvfr1QdEX+WXk&zK7@`Hf| LNrnf)R$u@C$0`@V8G!T;S&)zgnEeOL QW}8?j$u9&EfRG9d0HpjIZ~y=R delta 62 zcmZ3=IGK^x&pB8j%uvt3iGhJ(@@V8G!T;S&)$0#9B#C K9GO)2Q14%|kMxe+S S1{Sc)53r07L=}WoU;qG<_8T++ delta 62 zcmbQo*u%){=NzmMW~gW2#K6GNGm+PcQDI_$q_P?dGmy{7$oT*N|1S(I(hNZQhb&Nt Lfd|a~qrd|PR~ diff --git a/_module/ncs/chk_percy.ncs b/_module/ncs/chk_percy.ncs index 405aecfeb4116e25181d89a08433df5a776b8123..441cbe0e8559885bb823b601ae1458450d8588ae 100644 GIT binary patch delta 58 zcmXSHX5{sA4ps;=)H85mU|?vT$g9h!GtpX7*hre;|NsAgWPySVY%I(`l5wJ=FeeX0 HSb+fmpArv1 delta 34 ocmZo>Eadfb4ps;=)H85mU|=Ym$g9h!Fwt5PNF+)!vnenD0E2)A#Q*>R diff --git a/_module/ncs/chk_pointyears.ncs b/_module/ncs/chk_pointyears.ncs index 4a4e6c27b39e09df7192bbd459e4c762f2cf1b3c..3a219d50a3b7832e7c7143afcc36cf5256171ffe 100644 GIT binary patch literal 2792 zcmbW(O=uHA6ae72GrOClwX0bx8cK8(ycKCtsyAs<5u`-vf&~u-f6_GeM-9b`;K{p3 zJ$SNs5EQ(5QoJY#9tBU{J&083A%|$3opIfnw=+9p4oN1v@7p(T-%HYL#L>m+V^ebg zBVP$U2<%agfcPH3cW|8HaM%ZT0@&+-P(o?)$qu;5iO!^YoF5y2>(b=lXmlvSCdG=M zx&24lsV7Ii36;P1l~~sr`_dRot+AWNSYnMmCCBoei5jUp3&mOdxgUY+K@i8y*4*sE zY_oBuwJ^_j%j(LCe4I#SI>5`s%9~xL(#YO}FD{veC#$ia9yoPcjFf-Lh*IlIEPRP@ zmj?1J)8tZqWn{dJ*&9UZ6?j(T>5AX!!*cTQISZ=78-M zZ3U8;x`w%DWX_tHJsReukvVE&M)QonZDd}UnEe{&nUPsCF;xw7)yTZgn3B?)Cp652 z%n-_Et9D_r(TZ2P%bVSe&iOm-Uaxz--CDeIt<8IojTxUmZvFj|OPiJ7(3y0_=fl|- z@pIE*?}6aX(p*Hy9E3 zLdnE^P>h50rdsWOBrUtYC!X5$B5q>0*RxkVh8e z21Wu65?hc}jQAQPupl=vvMZ0k2Mcl=BfB-oeG9UMk(vfMEhFh42=?W@s_6%i|9uTa HU6ae6JXYNgmZLa33Xp!iE)P=>W*gw#wqG*ZIKnreyXkM+h8pJeh^BI%(J6QxHZF*J{=J!u-;FwQ{Atv}kka9n#x%S!5P` z!Y){El-oM9;QULMASI?%{2f71mSbQOt>m^QtHO>YS@uzXzjB-D1npWI2xn-Sp>v2{9YqiOH2Q_;^e8&P&>ckI zkD|vJx`pWKC|Y9ZHAJ_EG>@udj-f>%b>&XoTCUVbCyhWsoMd2XQWK*^>&6DI1&qiF&5`!`HSC(jiSNxvwXSs^66XhHVBur_h}w zh8KKT`b^!!Yq-@_@p` zpQ`xAzzqsrouZ856$2kqSY$G`82E<50t06m*rX6&__kJqpA2kK82A~3j|^;6C>XfK zzz&6yf!7(hMq$jr5(C#M%=r+$GH{c^Nd{)$KYgi~VUkA_9%5jV$@rGSDF&Xmw~c$A P*O~JI_pM9(zzENNR0LWq}@c;k- delta 93 zcmdnTG>?hb&pB8j%uvt3iGhJpZX)ki1yu$hkYZ;1|Ns9N1{N62t-!7z50X)s_(4)x cjfEM+W&|mE!oVWU0Hj~Yf`oX$>^BMw0HJss3jhEB diff --git a/_module/ncs/con_a_townportal.ncs b/_module/ncs/con_a_townportal.ncs index 740adb34dfe94b0475cb81684aa07d5777f38001..d426cf4708661ccf0ae9ce215752dc30d1453336 100644 GIT binary patch delta 123 zcmdnYvYdt2&pB8j%uvt3iGhJheIjo?qus<_BQ{wEAYhxgUz3f6nSnuBW8yz?bsc8L z|NsC0VPIipV2EJ^b6$Wrj66&#%pe(A1|WH2vKM0_C$9H5eKH|NsAkfkm1D zNdI95@%}Kdfaxy`ECLGh3_xHtnTJtI3MQ$-4AKJ8APdsAYqAkzB4g|1DU8mHj+1XN MT62IU-zYEu0Nlzm5&!@I diff --git a/_module/ncs/con_c_townport0.ncs b/_module/ncs/con_c_townport0.ncs index 833e42d0f6bd611437b6b89847e6205b28392b2f..30a6cdd477eaaf44ed2ad872810dbd72749f3595 100644 GIT binary patch delta 29 kcmeYY;PrD3RtPiHGjL*HUhs;&pB8j%uvt3iGhLP;Y8k}{6f+U|NsC0117&HFaQAPMh=_+ delta 31 ncmaFJc$<;e&pB8j%uvt3iGhLP_C(&JoIKJD|NsC0qQC$EmM;o+ diff --git a/_module/ncs/cook_meat.ncs b/_module/ncs/cook_meat.ncs index abd196f7ee58472606a2091289e85d792c6fe382..688d8ca50545ba2fd8e576ad7f37e3ebcbacaab1 100644 GIT binary patch delta 115 zcmX@YdW==t&pB8j%uvt3iGhLXm>dHTa40aauz?s8wYM=gPIh1to%lV0O%^1=HgSzM ow=lN?n}R%u+X<4KyofOaNmc|d+X0lV;e+UtX88aA{~HAc01mbnHvj+t delta 95 zcmX@cdW2Qm&pB8j%uvt3iGhLXh#UhDa40Y^v9Yj$n2e17|NsBNz#`26r2kBm-o{ux o@lxqzUq(~L=E=>BwLq3Ow+Ocan}R$@dDCPYrWy{g;x`Hm0K=Rck^lez diff --git a/_module/ncs/create_gemstore.ncs b/_module/ncs/create_gemstore.ncs index b8cea63dc90ca759bb89e9fb7dfa3551dbe0477a..dea4c14d3084cb0fdd0065560bef34c4401fca11 100644 GIT binary patch delta 113 zcmZo+T*YYQ=NzmMW~gW2#K6F?N)AXca40Y^39+z&n5+y8R~Z=@|NsC0gMmew0Z9L0 oVwd178lZfa3- m22lJ26Eoxg|Ns9muz-~^ax2M$l$lM;GvJVB0LuJOU;qFm{S);7 diff --git a/_module/ncs/cv_inn_door.ncs b/_module/ncs/cv_inn_door.ncs index b81e03917d3881294d141cef19c2d31c30954ed9..06b157b01da7927bac01e36ec99a6097866597a8 100644 GIT binary patch literal 118 zcmeZs4ps;=)H85mU|=Yd0}>1z3JgqatPG5942+Eb|NsBNz#`26r2jC3cz+mJSQ!{@ mGAc34gVahuq+~&CeK5(!!VF|Hf=RGiu(l6i<{79-3Jd_YeI6hH delta 65 zcmXR*u=aBfRtPiHGjL*HU`UVy5)2#)46F={ZVb$f|NsC0!@$DIz;KgMiCG>bCnU`P N5|jn8H75qD0sz1v4#ofg diff --git a/_module/ncs/death_dummy.ncs b/_module/ncs/death_dummy.ncs index b8f07b4f9d18be9e12bb4c3dc6a5db5f5061cdda..5b7167da54d11d6671b24c06a5b7c1e3e48c3721 100644 GIT binary patch delta 51 zcmeBXn#jcK=NzmMW~gW2#K6EPIFWawlspRy0}wDX{{R2~2LlT$1H(rqS&#_Z#7mX{ DBToyj delta 45 zcmbQp)Xl`}=NzmMW~gW2#K6GFJ&|{#h$IUO0}wDX{{R2~2LlT$1H(tAi8m|(JRtAQvjEs!`|NsBNz#`26r2jB6v#>I7 zJG%zN`@}o?diwjpRT?v)s$>S~`@_J(!VEHsTR|Q~Nq|lHAq!&Xf=M=@c?=LWU>zTT xI#?Ol$}*EnGIPP=j6emSS)tam!R%vQK6U^A literal 175 zcmeZs4ps;=)H85mU|?7;2P7Cc6c||8Knzv}hO3M$tPI@Ft^x5r@s7Tp{(f*7V8>}15hn116x^Ua!F<`Sey~4;4>>& c%O9A@j8TkWIU}&19}GY(jGatiHD44M0QqYrvj6}9 diff --git a/_module/ncs/disarm_trap.ncs b/_module/ncs/disarm_trap.ncs index 020fc9cdade89b01f213615487cf743952fcb24f..912d497e287b192a14113f65b3b1458189f4d12f 100644 GIT binary patch literal 202 zcmeZs4ps;=)H85mU|={U2P7Cc6d0J;SQ!|j85kM=|NsAkfkm1DNdIACW?=)#vobJ= zGoni|gOq+@U}0roScX%Qg&Cw>OaZ1?Q~}i(u=oeCAvYPpiW#{T1z3Jk0ajL{4%Y#<&h1Cux-GvojN|9>#Bure?#gL7Dz vLDFIhFiBAe>jPNXO-8UZBe#M)$P{U?qCX5QVEPS631cUdGy~As4+;zbYPEwuymOY%I(m=Ej9C zjEvJJKV#HqOq(pmq;F`Z%fQSCRR4p4g@u)YF_l|c9;8kl#3^Tl${5Kvc E0C9UcsQ>@~ delta 204 zcmX@eyOWpK&pB8j%uvt3iGhJ_=R{s}ULk3Q|NsC0k!1i1MxV`1Om>VMOy9xgznOfF`8cEUsdFtAOw zVU%YKn;gUFVa3D_5rUA+jQ{`t|G~fl*2KuGAP-c{SPd5a0u^Nt0E;qgo_vXMnXCqq pK9~wdZitFGllz(ad25i(pDfQT%IEC!tCKd`$=3+Ed_hn}M|Ns97 z1{M}p2A=T5lGGvvr~HzVoK$XQd7v@|h-$`(Kb-U!AA{BY0ICIj<0}>1z3JgqaENmbqD+6ONBO~Mg|Nnn5ut+li=|9XM-X8`Q eumVPIC3%oKSr!%$1=Gavkx3TBXM<=_U;qFJO%*5r delta 65 zcmYfGSMYNVRtPiHGjL*HVDOg%5)2#)3@mIQ1}g(&Fyll6Q7Lg277!mM%J7j%n&JQd I|9=!102s&$J^%m! diff --git a/_module/ncs/flavortext.ncs b/_module/ncs/flavortext.ncs index c938f8cb434280eade0a7d1a69d27ba9a6e3e96e..dec6f25ff4e79a140aeac36f2cad68dab09abb6c 100644 GIT binary patch delta 58 zcmdnWbdZVH&pB8j%uvt3iGhL9aU!odv*|9?PY|50E7 E0NdOV-2eap delta 46 zcmX@ew3Uh1&pB8j%uvt3iGhL9bRw@g_$X88aA{|7MnM}YwVN}>^M diff --git a/_module/ncs/flintandtinder.ncs b/_module/ncs/flintandtinder.ncs index 2fd2a4e7b6beb0ce906c454b817a36b4af6b16c7..7f72a6ca57f33d9449b34dbdad3275b7986f1cd3 100644 GIT binary patch delta 38 scmcb}e4Uxs&pB8j%uvt3iGhLf`b1tGM%Rf}7VH_a3_!rPu{e$q0KQ=e=Kufz delta 32 ncmcc4e36;g&pB8j%uvt3iGhLf;zV8@M*E3Y7K}+7E8`dekl_fj diff --git a/_module/ncs/food.ncs b/_module/ncs/food.ncs index ec06043412900a9c814be53e9aac0ad9a8f97b8c..fde17a01de6b030ba4d1c36a44af95d7a39d7128 100644 GIT binary patch delta 69 zcmaFN^pc6!&pB8j%uvt3iGhJJb0Y6u$r@b-X2$>j|NmiNVPR$figGK+11W}-iSxuK TOEEg~$%1%n(hNW~UlbSsdXN$M delta 63 zcmaFK^q7g)&pB8j%uvt3iGhJJc_Qy!$ueCAX2$>j|NmiNVPR$figGK+11W~MiSxuK QOEEffNHYLszbG&O038z*}+ SF6EO2G1;UUfC|1SFaQ8-`4S8O delta 61 zcmeyz{DYa-&pB8j%uvt3iGhLf$3|XNM#;mv49txG|NsBPz{0}J02Jm{kOxu>t0#Li OF6EGB07`vPU;qFXRT0qu diff --git a/_module/ncs/food_poison.ncs b/_module/ncs/food_poison.ncs index e5bebed58bf53f3fa4cb837e75e456721f46aeed..72ba3423be64a7b34fb135a281769ec47978a023 100644 GIT binary patch delta 67 zcmeyt{EwN}&pB8j%uvt3iGhLf-$q_lM#+=949txG|NsBPz{0}J02Jm{kOxu>8z*}+ SF6EO2G1;UUfC|1SFaQ8-`4S8O delta 61 zcmeyz{DYa-&pB8j%uvt3iGhLf$3|XNM#;mv49txG|NsBPz{0}J02Jm{kOxu>t0#Li OF6EGB07`vPU;qFXRT0qu diff --git a/_module/ncs/get_is_not_hired.ncs b/_module/ncs/get_is_not_hired.ncs index 2a74aab7fab430fad1dc8540dde31506177e6c32..34a8e40f01c2631549f43a60d7c0d4faae965977 100644 GIT binary patch delta 99 zcmaFN_?wZ}&pB8j%uvt3iGhLP_e9=I&M+lrc_5oXXJWmiu8}mu|NsC0$btmeSeQW+ aBO_4c2LlU|3=f1oakDxCj?NQiCXQFTr>h=2kE0O4a65dZ)H diff --git a/_module/ncs/give_root.ncs b/_module/ncs/give_root.ncs index 0e1adf54c9fdf6e03edf5cff0838cf1521028d69..64f5b46af4fa81b15c98af5ed89ec574bb65da82 100644 GIT binary patch delta 99 zcmZo=Ude3h=NzmMW~gW2#K6F~QjP%#I20IIm_ZCM$p|Kyz@(cN16YNCHiI<7|Ns9# hOq36kl4oH7DQ0E_3jAPTVP#9109t3}67LYhIVHWoG@i(#Te4FGa024?^O delta 47 zcmZ3(xQCI~&pB8j%uvt3iGhJ(&qQ8XF(x(^HXxgUk@5fk|34U5q#1zppNR%F02Ejb AjsO4v diff --git a/_module/ncs/hench_level.ncs b/_module/ncs/hench_level.ncs index 9112c4638571b9428dc9ec8500f06d4b9fe050ef..0c67cb69b61fc1b98358ff4f0a2c644330b35f16 100644 GIT binary patch delta 1117 zcmZ`&OGuPa6u#%)|1r;!RIH}aaVAQ}*JMnYlNrir)TGsHqD9a$L~7fn7Og~gEy|>ZFq5Y9pF4xjV4Hh?&f`1Z{l4>0?_3J_2m8{Yk$r8k zULpKTIsfrmX_-PS34lVOup*3rpnENMKI-2V6hhb&&MBz_9Frd5Tu! zZP{e^IZ?Tc&tyV+G89hO?>KY=BkC|LaN$kWWG9^{{J^Iwvg_jp9y4Gl=P6a82D-!~ zE~@6bPh3Fn=G+#)&UN9K(P}?*fP{sojktZ5K>??Xp}l`O{<2kY?;7=*!jtXDj89y> zc==Y=8)5wWsLW&V08?h%9xEbEnkT@<4`v!(W7tYV2JcvdP=)WUA(+Kldla&G&5pNs zunT$JrO(~U@h3>`tjuwCMLQJ|QsG^1U=O{4bdEw;8$-01Mooz%!vyh{U0=Ojw>lBy zyN1U`S3g8C>#Fb3fug_pqB7(m49jwt8JQM-WFoqiHWHOW*X9 iAH`{3azM|g?J3t&ck+B%CC(AYQa3U1>2E&sA@L6kb7%Ab delta 813 zcmYjPO=}ZT6uo!mOzlNeiXME?cyS_!AUGS`|bg zy&xj)L~*6KD2Rd!aib`@C|JaWNT~{?bdg2Sze4dPY0sY-g<&xGIfMosBo za(_T+D~-!EZcXA1x^9(lmR?)OF-EPC85Ve&zw`7gQo%OTdJ11rRafyGJ<+90#dcuX z^{{KN>AwVPc5vWI%XZph7-dlf~}9yC$eUf3&m&1M~hm$r)}&2U^;~>Hz8* zEk}=HFTIO)^@k-zID3w>M%Yat&kpkUQ-5qiC)GI z>Jt+9N|)oi2iW5O#Y$ui6#9R`4^aPxgh|TB^En}~C`sB0!h&%jIoCn81QQNZA)ceh z@x4)*0Y(h^67Ru<75e~k%uec5Ad-fh1l@9?UUQKa+#@>3Z}>9PycChd)j}SxC?fZI2L1p8N)d1X diff --git a/_module/ncs/hire_henchman.ncs b/_module/ncs/hire_henchman.ncs index aa2c3d54929816d94bc93eef2e4f89db1d331b76..b5589782d69a22f5bcbe19edfcf5e8c8d521b9f3 100644 GIT binary patch delta 926 zcmZ`&OK1~O6n!@{nU~)rRhnp8lZ>fFNt-qb!I)_MgjS)LP$G(M(rD`kOsGLo)QxUL z3jKIjE?fx(b)g`LyGpT3siF&4wHtSeMYD(?jc@Lo@dG-G`{vzu&Yg45ee)ptCfZ-f zmyDy^`%(uO3yegWcw7ckoh($lTs~E)PE^jFsg=i0mdD0VS1z5uIJ-YIJANZ|wUf14 ztse$cz+6oNOF&$SnFZEIMBsHZGEG%P1T-K4X&icnoFDzp~$??3IajfEqvKz_*m*X!fb3tT+_)*ykE2yhEK4@m)D;CwR zO>arsDoL9IlA*O3B=9CqsXZIs5unLbI`ixDEQ_zzB%d)0F%8$$G(SQ`0kh5`U!(jZ zoN>lr5}!B^!8Cq%rulIT->(e=$7@;%p5l^-W$fYwXu~=$!V6sB$KWh>xYDs5y=nSR{ql(`(51heRx+NggAcCL)#>fx)gr^ qi4@bY!D0wL`Ht)S_rrBdq!=DG#jF-j;46OtAN!pFO`<6_4E7Tk)(WEl delta 713 zcmZ9KO-vI(7>4KD-*&exinfTrcB^fOKq(4Uw182AAyErS5igRaQ1B;(7~{`DJ$TTI zM#a~wMk6%wgdV(TVvH9PqX$g5crx+tVj_peRBcjcXCYDcFgx?ieDC+}yR%?Dvi79+ zW$cly?Hzj=tJz{P{&;LAsfx-%)916}xv5jR6UU~r`LS$%VlsEOaE7Q_t(KY6!1%i& zsWXXC;D0vLe|cB8yKOVsIbLC0kG0SyIqY=sHSs||Ey;?^C$y^iXA89=LMd9rD0R>* zZqQA=$0?D&Au9Eejd3ZZKNn;YbJA|QhcBG$bcpmB&2kTgk(X2YGeIU$`|~6OGC| zs*)RA6HmAN7DJw1E#|Zg_62KJi6d(?&;TwN?d!#%(sJ)5S03|59c{xUqYb}|42|KCnQ+!-owiY=gqO4d zFU&q34TpN85c!S;Gl=cJ7o)>*Fl$|vw!F@kx2|8jZRF^W(i gL>f8+59sglk90uspWc>n+a diff --git a/_module/ncs/isamtrefund.ncs b/_module/ncs/isamtrefund.ncs index b50a78dba20bcf5455a0379aa28f97ad0472df0e..beb641c83c07a1043b6e438c6f129886a2ac43a4 100644 GIT binary patch delta 29 kcmeYZ;q`M4RtPiHGjL*HUp^10lg8Y`EBy?HDE5g&?w)F6)5}zys5U@!z{Qv*|hXMlt DSx^p~ delta 46 zcmbQwG?R(f&pB8j%uvt3iGhJpaw4xk^DZWViG?B)>)F6)5{ERy|NsAgC@=s37-kM< diff --git a/_module/ncs/map_reveal_trig.ncs b/_module/ncs/map_reveal_trig.ncs index 7b519a8ea2c8ce7c962878b6626025229c12ebaf..f947684ca467ae822c72dbfeec1260dcc6ea59d3 100644 GIT binary patch delta 71 zcmd0-*Ya}?RtPiHGjL*HV5pY^5)2#)3`}gS3=EPCjEw*P|Np_jBFzA#|4fvU5|)54 OWkKqUz$Dv5M-2dTjS{E; delta 49 zcmb==l=5>9RtPiHGjL*HV91mM5)2#)46F%MKmVX=O&UVFI(`^XL3n@BuKI6?32|3A zS^zV-Z7^U}&ynQ7@xjDU|HU?QqY-$qyj3dyqVLiwe5UJC1*A;@I|sP$-EmJx0Wj;^N*0s z+ln-D$swhpi3E#Tej;)x4Vz#hKvzm%bZvx4p~oV{lhMxhiovPyw?fi z)D1~kI3K4Nv@hlI6S+ll(cDk+5Pd6Rb#rm=A#?G>qsfKA%sXK_>*NAfBNvTfuj}Wb zwdFtL;WNStFhYHcpOAlAg&NL|E=2A>H#h_{Cb$|jcvgmndkU;qm|ImQ%K&H2hm~_^ zw$`{6)}Y41&ZNT5y`r&>Y<``dU>nreZJRIxMfg{Qwc>t_)hzoC_Y5BDKS(l&Q0$Jd zLNe>TtZDF(bz35&_A3Z_A)8GWim7BtwYQSY=5wmU;p)p#uOv@<=}h3ua$aWgo-h5e zK;3&e85E28Vi)N|*w6sS-KZ+VS==|nxD&^Q4;>jyCi=OHQ`}*f6*eq!*p#jAx$3=8 zr-72ubMT;+Q`IAOxyp9uvfGA;{9JSJR80uE1#&~P4b-bo6#=HXE z9PxK*L02cQM1#B}bK84}6a4gp8JXak2>?{mdEUt4B`d73OU?n~<5%Wf(|R3&)6ud4wun{u%%_-q%S z;QrMxN!L!_lj)Mo<;zqdfxlS}cxMAy8Y>1eT~>SPoGgz9GCz)*N&C1dNke8vyvloH}t&)ZA3w=ky(p&L%9xB+{x^e*63joRCwIG{kOEgT8bxibo>eivai zJ60;okwAK>a(X;~B}G^YT2=ih^ND=%Y;B3pW7p1*UDfk&!MM*qJFbOWW_BDnesHn* z(WD&-GlR-X9#l4AskTWl?l8*64ASVz)pXqj$5lSeE9ZleudvWWbDqdrYt5l%qrt-S z^ORENG_cC8szJ^yRVmFg?=RZXxJq?Ls~k_H1i^>J^TslCsPGUYh>wS-$eumh!Twyx zxhlv*%?}tFD=BPMJ7AY;1tLzkm|}ED77vT*`1!t?07dI;q7$|fbiE6g=q<%*+Cp6W zV3V_r+W}e2N8STB-i{sjDH(4M%i-8#ueqb6Lk{#O5u?k3j%$ED~ab7>(f*(DPk3K`tt1XHrtaQNuAQZI0R zg_L`S-}vC03%B%3mlZt*LobrACNG`Mjw)K8#Hjh;A}OmRp;8V=0UwaoZ>9bLogR!r z;x>;$tf(h~Vxit{|5~Y8A`3%{vpEk7YJ9(4l5je@uRDb`^2SURJVV%_yH5ecrwtmL zq8amP03MK`xKd-bedSqVaVNZIvr$iCZ8(=($5DxZ)Cl4YLpb#QE<#su(uP@ zFy5OhMPZ^2=iF#cV?;ti7~TL9wai$zvPS0!v49~r`TNF#L7gk8p?loRj6J-hD$F6X zl|Gvcc_W#iFP|C9=CBs}MiWk%?w1ZS=JS^gC(b7V(nR21v0lbyEfd8KzM2?9$()f9 z--D=b!o0+xFrvywwD559x6TSaJJ3FLUh|cx0xtq`jQk@iBml9#R`Ws3+PdO^AVxv8 zR)3xEBmiwyIC2N!nzqt2NR09Onzj~JgH*ptU)6z7lj-jQzXoQi8blzbqOB+3m{KRhX4Qo literal 0 HcmV?d00001 diff --git a/_module/ncs/mmd_onnui.ncs b/_module/ncs/mmd_onnui.ncs index c2415deaa28b788846b0abeeda81c7a5bfae1ac6..09714b55351eff002827d7c946ab924c8035df52 100644 GIT binary patch delta 3750 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 delta 2943 zcmai0Yiv|S6uxusKG`i>+P(YezV7aJyJeR`OThv)Bo;|AKoLq6gQi5<1`4(fkLZsg z#z&M8(0VX25FqFe18M@PXd)y^Voc;AHp)ve0pv%a4VG9HZEHPq=1yCnVw>E1XXecJ zedjf^AJm;&Tvao#)_9_9YH5|C6rGDI_~$Sbi-vDzRkZIJeJb>sQD{9ktAv!{;o&<5 zp9ZC4afNGS!y(qOU$?utp_=VDQ83YeKEkmEN)(G#IR;Y#VX(3TP;1FkEl1%bTNXYn zC^W_~xs`T9RW%w8LRX=l+fS3Hn8%1Al+q0KYE`l06p0uVc8aA?-_3*rOTj8#t~VVp05#scZ<|u+*}HotG^SvA_mY z^&S)Gs4!4Ff6@GT%Z&__*~%BBX_0aLC{@rBp<8S)6qEP`DK^FBBth&8})9@oJUza!P0khtVDDlntKE=X!THR)DUN#vpk7Q}C z+g894M~Hn0XB_Fe!$O-xx-W6fg8#qP|2Z%An-LIE*#sp{f56?(#dw;80fyZc#Y!0J zgO4W!I$w1@#`MHpSsJ7)*`RwuB#AI(#tORf<_?bEVmNc-NJ* zQTlvv)}@CGQM?4(Z6=>!*&1-Ur?Yi1*WK{=cQP0lcEz2f`YSX;)hj}%d_ovF66(>? znOxhldi~~xMq@N@+(Bg<*mB}AtQ>C=%~-KFN%**zCbY?wTf9kFo->2F;mw?C)c$i$ zXwg`yvQ9+=DlnFaGlfuaiAXY{z`Vw|A=~SUjtK)ZVBf@G_A?nn^sID1XBuVgfi)k+9n$20TGsVMAr-Tx&yv&Sj*Ao0Z7P0`>;AkkfPwp z^Rp#To>zq>(w;ZXUQ9VZ43m8M{J_bNK~G)_eeHPCMy{X}s+IHDf0W92BxzrbxpIkC zBqP3QwUqQ?Yu%NjJJ6Nmg-zaP*`sj5I}LT@=#|d5Y~nCXz*0S=H%N~;li4>jV2553 zNzjVK9O)Xfp>OChmI0?PgdSvlVYVBt7UaW9pNBmU>wIx6*B!oqstiG=@9FAm{E!&9 zNPrk5muOExfT0~Hw=HCQf7v7_VTMI2a*Pzegl57{e^3|qz(_4{k!l-!<$s3Vfka@I zPt|FYs0)PUf`0uJ+S1u+9_~5bFK5Ie$CneX3OYx`aotZ9-wcC+)9S6A=wuLn2{x;@ zoUo*zdMg6_!BPGcb%+Sb@&Mr}I+*xNR=j_k)8Ku8GyTSDQ0eHS6i3dhdkc&>$TBvdr<_G!_CW-IoD zO4QpO5YP2NY1mpGHm@DzrONV-G4AE(J$5`^a`>;Qer{puhkfC|q|3tIx;vp!%naxX z2SS#EBm^a*M(gVJts5InH{OAQ$XvDOb668u5VH#s)lb$~A@nvOEw^DH5@b6&^=OQ# zHv=6V`RpPri>25VcqwME%WyCjW7nYzpWX0REXjHyWyDw?EH;MJ?m2LEau6Eh4XhMS z#xwADJcNx9PEP+kB%t zF#G!-B!A>=kz2;d|EM?_-}OK8x5KsK8{_D_fm;9Hazm@r)swx8@b9yEIe{Fzm3czF0*LG6~FeErAvvNz#Q zwpdKA@)QF&M|w5jGXKWx!Dby|9_h4)mObhpqFw?Kn>?!rkq0x=&X z=K9q=?JL)Iv^H}7f>RM%5+=TY=5bE%%JXEQHUxXttmBhdC48w4v3Fsa#-(~e)Iguw z4fknwn4WP7k_ASX2sc2c*2z}EhhyEaN9E$88fgK6U!Qd zK6GShlWFpKH(Ka>50SnpsFhI?PWU~<$IjKoah9+wHXZJ*GQ&NwkFiHlU=z%Z`zgB_ zK8)L~*{u;&yJ5g!hBI;TY%)A-49F(kH((5?*$SvL`oT9=ul+=#6k+`m2h1EhSvOW@ ze$&`K<5sUqHQSMzJJ4N)~a|2-;vfn-40@7WO_YGv}}`q1|N5yL^>6DK
J2&P7mcbs^U}1Fl=Q8OOr&yWU> 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 delta 6919 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 delta 770 zcmY*XOK4L;6rDS7-g|lGy?ol{+opNO*0!-}ji!lU7d3&XL@Fpq{6G~K;vb|NL$%aW zaM4=A^|Po8mF@&VLvi6s)Q!+xkqWw0qumrK*o6>h<|&fR<<6bC=bU@yPGx3xS)+xc z_ObN9&O9LzwQ9}Kw#(JKY2AzwLe!q>!#E~_Egl6LjmB@nx_Ol(F%JEjOk+3(9nNEh zcpDOM5T8Q6HANMw$fga#I(ZMw|j&1)pdm zVB&Wz1scZmB99mJGUV`$-pli!`T-vIxnhvQF_*0`iJ93ooOMNWa=NfYUw1gkdAF@Q ztSdqT@ygpx!c+oxsFbsWYpy|<#C9VJ1DYU1lGF-bKdIxY0PesbY Mk4VnYoCcfx0W2oh?EnA( diff --git a/_module/ncs/modifyitem.ncs b/_module/ncs/modifyitem.ncs index 1a3d870cd2b185ed797d2cc41a364fe7126a55dd..b794feff6e775d39bdb39ec9852b6f7e4599c7a0 100644 GIT binary patch delta 529 zcmZuuJxE(o7`^Ac``*jDNlMY+-y==Z3YMZ`OricYY9junrh}!npo{3_;O4H29f~DA zpo61Rp@=SmUD{0%=~C+C(5)&8sdUI7#+MfZ4&LQ(zwdnK&6?Lx&H}#=CGMYmLJV_IQ(u7 z;TJ8d2df;gUSWheYXbjxYNfErX5R>AxZq16#$8_qziHT=SZA-@kM~@(2T{d+dlY-D zRs&e#JC#J5YwAfu#1LA}^>vS}pUSbS%0_vnW=$^v!C8MZE?7`qJoHB}%yWNT$csBv z3DJwCjw+Bq6O#d_yPT6JRS3JuU0+tH_uT2EbSG{4_D=i|c#0No2V$W+D*3WjRNMd{ Cr>F)1 delta 472 zcmY+Bu}fP)9LMi_@7~LMc~7UBkfdtT*0vy4V-^)nO=8vBsuYVwK?jSV{sAuP;HDsA z_~KehU2Lh~;^b85Ac$DUlnxFKh1%lKA+$og_gV*U`Q07g@0a_2Zasb)s~RedBuCSa zTJl18r^Tv|My5&dv8;(C3{)zWvQWXi5XuzD%i_;2JYiZ!Ql^lvQ7`nm9VjmUD}M`B zr!Sp%oWZ#jSB5??=SDa$d(g;znZ-H($Q(Yf)9A)5my7|_@xU0w7e>?&mN~74k>;Li zLz%x+2A_Gy?7%7~%we>1$9#!1y^k_xbz_a=RssEdW3{4&CsrSh7z=e`gQKD6C~zzE z3P1Qal*cx+_ESu9#m*zaL;D$y8FkvR$rnxzBc#&{k6)bud}2em2aB8wXVJy?;k#B$ zw=D|4_bvEXz6q5OdY;w#06g06v@MOGYoOwSdk-bPb;s&E0y^J?Qie8E+~hT_2HzUz teJ_I)$Gt>zkXWwubFFJp0Qlxt=qUY~Dal>$As(>grK$tx#Xo;iTmiM)mn;AP diff --git a/_module/ncs/modifyitema.ncs b/_module/ncs/modifyitema.ncs index 2d64f109dd030aad7c2c2d5ec0284f43a2a6009c..a8d8385110257d8dbf2f0175ea0dd7050cc84af7 100644 GIT binary patch delta 510 zcmYk3KS/{E_LbRAl;=9 zo`Rs@&<;}Q&`D7gH*psnL=at6PzWO8U`@Z=8S1yZy#L?l_nlSDS4M`C!`{1>FB%g< zL@Kk9->+KZLPtKIzY$XE%I3pfwNS6dk6sJu+nkVwKthWZQfBtJ9cey=7kg6d_3fpQ zRVr_91!bJTS=5ud3IT;3YFbnjcHQMaXlbo@iZI=X3oHruj)vp^?k_AdV>I z5XfPfL6SdZ3moptX6&-WXu|??#$$doTGTZQ##>w|e-w-CGm{wStl5M*ZkoL~pk=+r z4|ZDv7-7~L#b2IU39PX`)Q`{n5=tP>)leFTH0)L^vD5CtB){4{sN%Mr!VXKFZhYgI z(}4`II<{9 delta 487 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 delta 448 zcmZ3!jp-Y&p`UZGLYSeRffEA*+c!A|AmC77U}9xqWf03Nk55j_ElA8v&x=nI+s+JRoHMz9rZ1!4h($ diff --git a/_module/ncs/nui_f_storage.ncs b/_module/ncs/nui_f_storage.ncs index 3e3dcaf1b7183b09ff6ef39c24671d76ec67e29b..065e4c908635789b152201b8ab2075d669e6e1bd 100644 GIT binary patch literal 54768 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 literal 40276 zcmc(I3wT{uaqc-sNAg4RBk?ni9dFw*k{nyuj`OnfkZj40K$eUoCj>iHW$D-!$dZtb zV+TS>Y5IV2OQ5$jZJ~r$Ar$($&_bG~+?KX!2qZufoW?*fCUKtR;RL6#eeOU1tl4|* zea?{$^!u*!Mf>c%X3fl+H8X40thM&;*wh_dyQXpV##HL#Jr|_#Z*q{zR^XbhOjUd@ z&7Ud$T#;h=%nMWJrwWC_3BXmRYC5*J^={tYv8ku6vjbosNLQp$crukm;nbGg?!n>Q z=8>^|)yozO@^gvez#{oQxGLqrPTn{;JdlLEXc8f>jzP}2rf+y)C*I2IL$V{kP?0?S2wP0T#Fy)j^@V32gmck&^w+V8SC4V6W*qL5M}3V z%Z+JK&>a=c_>l@jz|Q-c{I0%_zYodpW$XC+e*Rv~-(TnNdj9@0;qT$^&u6p$d`pTP zF8D(9d*N?pvzz`}pD+AK^nAhZfcrb#^G{~8AkVrB{|T(>ug3&C+NXajQ!_`$M)r*5 z#>ac}BO^ok!BL@m!KSc$vX%4sqv7-E_Pn=$WN2iJrBBP>#TP{UocF4Ao0Ke^;c;}K zakThT_%)?F*EiO`x3RI2D8557X%tkAvw-M#@@W$x9#KZ*cQ9WN?8*=K_74G=k5=PR z`mOxg8nT>#d4E_iXOmP6lvL0^Hke1J_ObRKWwRS=RCMPz0O?er6Y;e8KZHkRUf>sh zAMm3Jzu>iyK%!PKJuF$Mbpw#x7Ysp@f?YSoIhX|sv)Tu5%o%^V;l5o%xdF2GHu<~g zi;=|V-wMsR%`xzaNZt$n5ojjw85?Z_p>fvTMkdnod&!5CA^!eLKvGwhe2e!_%HKuT zcr*gPR~KCFQQ3~VH6o$|gZaG!V|@pt?gi4rldtoi{7oo;V(1scvUyeqO&`kj=W_#; z6WPDubs!BoM)XMpuzO@IFyehfLVoeZ=#zW3N$2HIYo^a&Z{HB17M(&#MYG;qFf-(# zB=7}W!}4=O9)ZYXZzs?#3EAtrv2Solx-BT??*h@Wb;{rTe?v72KiGy})xzmOZggaP zFwb6iD;`d2@gD3687YFjGb}onc&|Lb3h?k}JDgt@F z><#kwf}@6f!7KPRrFq}T{^7iHR_E7-^k(D_=6gxAj}TIK;Zntndew=d^M2pej5ki} z`i+~U_B?M%|b%J&Tm9f%;wI&BIL77m4gX(X2&pl!^8Yq^w3AO z7w3w9qLDb2q5#OLI1*o37u*$cP`bj;6AaAq)ZdrKyw61R=lr42nt!MKU2=rKKQ2ul z8qbHWZpq`3#?IHC%RZs}$nS;wtlIhW`IKtA@H!7- z+^hNF==rj*SP3Tim9 zRdC3QhQPWR+|El4UElz=J zcgCu1Eke7?0yf_RWyDg`?=xs|h*5v*$0 z$k;%RVMFHG66KTohepQ5bxZRy_mzN{g79hZT_MQlN`W9q8tNMz*I_$zs{$bR4;)ht>4`@G#+w0=|+h~M}`S;B_S%-uQ41`_K)YrdI$RQeJo$Z z^6dI|zsCTk<|GadA=0lqh#fZ=#N_e)yD&y+jF5h;2!q6fy9b9<=hFYk^33{oJ7G>5 z$nEaiKg0&4|D1)DARp47EU2Zr@RxoM0n+QGa;B1xzR14=S`hN&>tcF~S1VHa7|5T* z>sRIn^N!@yWMxMBQMn2|ZIq`Cjr8{o^?E{2-RohX>b;Q43e%~-juXuc(h;X_Pr@H} z@bA?E2*EU%S67_=m>{jVLbcqcQ3eSup33P|XV=!YmP{2Hm<1!cyu!=^H!r2qGQ&EN z%IZT-c&Y*f|9DyuOId0pm6xTnmmvtcSLSp7nPFXU~UAg7qK z(TuG40t#jZ?kZ_)XK49*+d8^iyLy7Qj-Jk7c>iE8?Ioy}%SuF6n8*(1VWSPfwax9@ zTf2k$CM|mV_{ea5ll*OH2s%50O`RQ^+uJtvXw`&#Xrx}~uo453~v~F(eXp`K5D%+`Akh!RgveC1r zYsvIg`Pg@o2k)c=`Ewi4Ui=lAe)jO>F*6)NGha< zBGoq-k%`LV2-;|Fui})IOPv}fK+-aNr>GFSEM=QZqJkpcm7+(V@P4 z&ZRiM=OH{-8r##lbz3`BtM|ILmY!=I)P>d-A+%%74bFDrM*lvSQo&Pz&50qqwz;dV zd1HHPNqlQd<6GDhQyOpV8`_^Mhw6>7wxrL{ko2Tg=yK0^kLpm6 zc}-PR`!w^BGJRU>bPs|Oji@?EjliAOHX)+6Q=!z&-m}X7k$t;Hs>8u%xtQ=G0vuyc zOd1&#uZ1Mpq;P^ypoJb#RlaZ6uD&sWq0QHjlixBry!&IdzGZTg?un}{m}_!AF7lj3 z-mbnI{R_V+jtbe9e0}6pR|a(?25qFn-%_{IIY)LB9P8$;&aIwXzV4dVu2z|L?}Hnq zV{8bDpKU-4Qsh<(h1YA07#J_-R#kjeO=Q5}VNlNNmhh`Du*Z&LBrY1qF3ONkXl2V+zv$1~XffWrq zchq0Kq;bX0M%?V&(EuKVnTp3U`14Sj+!VzFI;3PaEe+kSrhTndODn2W#p)fwcH)T* zCh1db+d`OCg$6aEbD7%6oWSU8Vni>9d}^JIuks#NHja&q>o|o;bMa8_&i1OX1$UN6f1K=SZ?@4u5g)2 zZdt4zHL9-zN$R&8^>a{nlHlDna?pw4G7s%ch#?wBb~F{ypsZIrkEimiY3$!SI5dDc zOF8&8G5BeXVdF|vh>xu&wo}&T-%gNxjdm^n>axOgMh9&jo4Pn6=z#vpB&c-R;GhD6 zNK~U7;8R3@QcFoVJ_>3;a?*<;7(`dAj)nuNl0W`?B#-Di7Jr+tjhF-80pLqRD`1tF zmZ!pC$OaE@2mz!j;YrW_#Xx^PccNB60yAYCMF`r{)!E+LbNx0K#J_z1MBV@+;WYSYIUZ0h1^-GU{Of-3lYvRifKwSPTzfgF!-t(s){Z&V_+Qw*Jj!@%& zXhaL4-5|E_tF8(6wdbM2KVemlA%y|@p9EG<`AecjE)M0Q+Fj@ zq)^e!(4=q)rBHa`1QEn@LX&PB93N!L2LRtM0WjIzp78L(R|t_^A7xRp`I|K5cL$syxLOEMt=~*ZY-jC7@7v{-o<#KMz;Q zFiy}v|AP|6zV1AKcL~+-b?5m%D*@mq=|JQlLCPlS0C8;*M5tcRL$4qcO`%Z;=yLMD z#Hp9sa>^N#SWk*7vQDbO=x|}Cs!(|D`6Mo9O3ytk^D=>lidy&DRfwH>Q2T*@Ijxna zuYD3#Y}TQZ1yb&gEZyh$xuXD|6s|JBbpFj~u(HlVk{YeP1(9^*TVhBh;+i=y$ONvp zUV61Na++5M~)U3GapnY*oBa_}S^GrWqehFzFQG29`-g z;Zpn4HLeJg;H=364dNzs6UR4zZH4|(aqA#5@s z&b>*T0IAxwKcAP}IwpP(Te%AR)rUg9{c(xDf~19nwky&^LG<+PWE$Noch9}3Xd~pN zb9QB&M}f?DG|%0|3ZZGex>=~X3B6}po8s+$dZFO)OzOEYV}_N&nUOb4lZHVFGf#aV zNJ^T}b8em$(~=UN#&#IP&+t_i746(uYsmoZ?AAG|V9WcLu zrSZ`{^q$Am|0_G7q*F6#^syr$KjePuc>fqyaFF@HS{sW0Rf{>Q(=^$;r*irjZZgDX zyi2tcpZCY#m*3;-LP8^)zC0yf$ZO9te_I;v6ab~g!*CIjeyG6ODPRuW&aai)fT<6ek_ z3DAv5Y@p=|01>q65{(DvMhya7s1aD2> z^ZrNLSr{M9rb_*2LVTp&!K}TwaW$Ca@D+}DM`G*Wh!Q0oD0F}PqH3VkNQ@;v{;n2B z171dIy^5@ODL>%`Rwm{fHfL) z_7dKiDZ>Yjk#q;4ho-syQ7ogXbo_dZNlVnbAy%(?-^h)FIV>68l*4Kc!$DFlS9|d) znSCg=IC5vhHlR8W`1l;ZGmq#BSG1lSOA{Pl1=P+1^^K2Wr>Ds6h_nBg->dB3o9lmv z6u)qhN!<@$Uiy1`3Y5aJzavF9tefOH+^*&wG(&)0wmck~2(g~%;=v6UAh&gOMjIb~ zcsuGx*+XEv_qw*8Yl2;U zy(4#%EN3Z!j+Vsw)~}wAG=hzyvH15>8v0U~ne4>~GS=6huNV5dLW*^{+B&Sh5$=lk z8r(`1MDePdwZ>naE3*>!qxYFULAsS}xIMs3@e>tlSx3LjQo$E1Io`9Bc#1{fDBZ&&| zwNs^%Eh>M;Xm^CE=TSH}x=rI*Uj&YZA-WcVe_~3tLIT<_<+vYI$ z?zZW~HMzvf@h_mmhwo7>JtFzea>;k}D@)IMla9_$WKf)kie(O~q_?_R5sW}Rq;;xw zC;I7|X${ZQ^P@Zhi=mn*cFVc=DW`nCrN?*FdAeg7ZXgM07EDV&`X?MLfWV^)^$;Y^ z;a+7N*tK*kvQ?se;*2t@sYKne@l08&xs)SWxU6~BD0K)wPI!o@R#I^~S|J99@_paN zfox^E*594L)!g2`v9Z3J>gnFy1_X2YEp6RBSe)z$ep%n2aQStzd9Dsy`3GV?KWKgH zrq*pe*f_?G6EZwdbBovrOTw|n4M4fR{=H`&fMj5j4W8f%>+MWDMFiZd5{KV*YY(pRhXzF-ot+tnR%kNQ*W|bXh&uL&|v>N)Ltq>3qV2aJdCra zdQS?NwWaWitq| zh%jWeOJhDNLFyQ%k3SoZS9BFXRyu0!atm;|r{uKDMqKBiHQwboU~Yia9&{aZZ^Zk< z={Y(ca;yg8UyqZGb2(E}Bj-|?4@p}lw>pxhfnbnz?pH=Hx`9U0v~s2ZsBHghyE%zij{xpOuss0IDIXEv=nfTd}7kl2XMJ6+$_C zeM}{$61j+!Con?sqBHc1sO?~KoG*2WwBoIM?Y1Z zj0Pd*BuaLSvmtOJLS47PiQ^k}(OLRp7fji~%y~6+@oE%}*(EDLZx*zUjg5@04?2g3 zZVFlk_YCI81Du&1IglHGFzEpFgl7B@V@Y)MZ;y*$(l-Eg=t0gJ0V=5sy-_&sa@=qt zOD0j%5qt0kUV|b$pvu5!941|m@MIewp*O(XF|7l!yJ+BI7OI8p6!U&iA*|CNWkO)6 zM&T($BA8L=5)@Q}MQ&tW`liU!r?$piT6SbKH|(6sxny=WHMlMYg;;WA+&2DmL-ysH zi1H}rgt0IboV=<*Gvq{&lX&!VeFV<+5t%bLMJHVGx}LMZ!?4zgc=RoZUeiYqYzXz= z`Upa_N7;-%f+#(5M^g(q?0zw&GqHQwP7UVK49IXA9P;+{>2fbx6CHJ63Vnw$zk>2EWQr)7R3ud5Ts zC|3G&I&M|x9I8pd8yZ#y{I`Gq-~g;7$^s%`KR8gXGNF-2Yr#Yg2Z1<=i!!XD1L^yi zshI5;mp2FWN-dm6((GH4P5Ow-HHnCnm9~zK)~?`9oq%^O!&xMSWxEv1bP7Ra!iR~h z%iM;btF>o)R|kR!9xCUVLgwx$Y;=wAn%QllhcK&}NQ6&lRTal1Bn(GS7MT6uioQK5 z0F#_VV-<RTS09<#=p^iB`2qew;W>*S!In8T&Y%&{XByL zF^Z11w`_0iZENv4Ozp5aj2aouDcl}|me-)BZ2oO-gEFutttoYhT6$=(@rndgr}wCe zbfII74S|RI0xN`TwZ^tb;o{InW6yP0pLkyx|{3sBi!SNK!6ff9goAi>R@U7K2aJ2$=wr&SPA z<9rnx>eM8)g8G)O4kqf1Gs^VzwVqHQq7pK_D3mGn{8y7ExVKg$uaL##5}ZmH)Y;Vr z@in*ib~JC*W~)&j3V8vbMX_W{C&N@9o7ZcVt8_l8SsSEXP%%8fFTd@*CHP$;ziCX0 zX;jP09m-88NDK*mi3h@%z`2W>2RT12hyJkI^0aXCyY*~hNC`lEZqSSsnUMp-xv^kN zd*{ZWiNC!FfTo6s0pff>B=iFfPw<#+0WqMlWJfe!$+`T1$R*+$tEcOi7XUOkI`Y76 zAqWlFBdfx8fr{Szpn|Fi%IYWFQ1g&97rWqkLGfaaf%0Mre-P{5zE$au=llBKf%ETR zVstRqpBvXPiwyxFNy(4;-zXC26Tte;G2Y*${Xg zk}pXi(Mt`%FGDPeq#>|ArwWdjq%3l(H!VPH_RA1X;PAAHgcmSAqmi|@Ztl_OOqd;K zOr`6LwKOV=%rQKQ$D90`Sn3HqK@7VU&*4^9F2(Qk3RZehd}``Sx3;)~G%K5g0E^Wb zxC4vui1cn5cen|=N>Mp0DoEgODB*K%#M8`r#Z{#~E{2Sw*0pY`Vn{0-(yOHMiuFWY z**}0~3D*6(!@YnUmcmLf9YZv#OV9A4I`yod)}jB9c{O#`tQiAy6QgHS5-KlGJ8QWmrVUp!O3Lby%BD8z&1BoP+@ z->X8L^_N5pS*d`gF~OYv-N?shvsd4O72V~8gAUAlLs%nw_3quf-2ok(zyyYZ9yEF6 zQze3#Uvs@Iw6a$>VJ%mW_PCk_t_41l*l$SvsI?=}w3!v`2 ze%T3`H!5B(J||vMSH6y#$4;S;4MujuZxa@g5UggWTFo?dzky~O_@)ddJc{0+SCS0% zOt;v72>B;Bc_`H=C?zr6ZJJY=YUtTJI38et%J*Ua`dF~HZ#>vPJT$lu2CVNyBUjkL z2RTi^R1s<>^ibyv8AfA;e8H+zpQeZLoJMy}`=IgSm!|&{p)xf%!fF(X7N&?W$(2#z z6}>qlq_Z4&Q}gY)axpWQ6yo<6tjeP{dY<(N!!!SdRbb&u)v!;xgh3E**tDbCuxd1n z4S(HDf#?@;D(Q0$9`)6`5HIc+VNRAQ8{Rk2&8NWF$HMdvT^~6HDQROI4Nm_kR8DR+Z3K zWCT|dp>v-S-XBcsaQmgby?IB`x1Q9cl7afE)exV5WIlgMt7(-Kt@uhjdInFTE z2)?Nmu|`W!kXK5?4GmQH;s(vHCU(T2IiUSmIMpR1v6>d>=<6!fB;30Y;*C1tjhze< zT!f@A%F&7sW2$IJp5nFdO4P1&wJ)LZRV-f;X5hf$BUt^00?jEQ+OY(lDu<`t6EzlQ zg+b&q=x1g_1Z7{J6z6jGDt!~Ms_R>vFabmChusyvK?%%;N9VB1V)$ucJNsW`+cf{A zDxArjhv)nqJL*XwzF4i|LvF|+K{5{@vqSfs)?f%!=#TWxi)wRF8&5-k*+k=fcZWCC zR{i*{dRD!0Q|(YNR+|pi9WvqZyuWbb0S|;hb#~h-wgf^V7sW?Z;=5Gg-%K{kA-&># zdpc;VmX}b7e=z>g6&sLSRX}6Nt|;6Xj+WYfXNcRazTZARgKhB&NzB%v-CBw(5t1DU zSjA1DeA3XJy%1=VWE(*UTPyF&)V>URL0nblpzP8iftYJJ%Wk)d;t^H`P1ZJ$lE~5J zV?u(~4qq(V?WjM;4Pm2WgTwjV`rfd5V&6wwf&enAjl1sC-Lnz4qO}Z z3D<4${xyc}>URCr14lZ^zR~6tx(A{Yc|EwF<)Urj4m`>~>z=-eSj@M=LlSl;hl}4} znYz12)NUX%KBQVy{5hB2Q#(DlhfBeIT;bMvaBdS(9N#Atu7=cIYMcspf;AyPc9FiT zhuQtp_p=22Lkez5p?HT{(O3=tMZC|Fk`8@}RmN(D;6~A|=--X5>vRB0VW!MNYlC;C zqe`66qDI|m?6UjeM$DejLE(w1m}Prd$$}Z8TDJ51I>eUtti7eiN%)W10UK%?q99!I z28H4kJ;l`F0H#%niHU;lRYS8$0wkwls$e3a=EWhv%ydA| zQ^eb7K37MN8;K*NYIhJ=vpNwJMOi`?1A*HLhF>ZP=lVD{prUgVaZ0Ky+H|DFosWX# zIUeZy&=HVXo7AI6o=n2|S57E7nTD~v)?cuJH+-A*u_^~~fdW+AB4k|$SFOKArpU5s zU9l3Ht|tA?Ow!Y__x_rH?{v|HB4#SdEo+A_VuDHCqG!4xK2K5gjN0B90!3>SH< z06*A!r>1}6c-}xpuw_VE7WaoNQG<|e)M|Lr(CLVxn>TH0?e303XkZn&KG8uOXuHR2 zxWE>l#gRcQ#Zy`w&2iS~H>vPTC&V((F-dq=5WC zr*H8BTZEula8G?zKoS!=;Pi2@%H2ghon6gaT6^2uwzl;Uk<+-J9G*y5jAYDH*Ty{t z(mb+D2>3i(S2n*R>Rz;)#_Ms&4M|Ka;%~v?!+P1_9}Qg2dsnWFl48ZLUbm*$l?WrQ zQ|aHi!)>j>3qm}TroABge;5_K4Mv)Uv$uj9Qo9m4wd+bX_+Pj(G0|SU{X*L2XwO=i zomOC()p3nlDF#ZBMb%4hyGqs$J4W|ZSrhFF3T~q`%*bt13Te#@6?C~oWjfx$`dAs3 z7LIqiVhqw0T4)-C6Q@niOJXy1N8J$HB~I_4KkgT3iC4(pM~sJMIF$R!4v(JD!I97K zg9@e8AoFbo!IfMCi`1>;tLjM#!Ixdx7oafNeL%sKI1D0%qYM^M0h1(9>Q(fH*RD}t zqutimEJS}${_2Inl9fiO%jCBM45?j-oMx+`qiiA3Xai!C0qOY}MvBO7k{+!d2WVEg zrD?1yyO~F+b={&(NQJ@=S}CTq=Ely`BOqK{lVu`VA=BmE$So^;Vuw(n@WU3eZ4xWD z=0yF$OYLM?=B(G845_7J%B(q|KSY49{smb)t2L)oaoGQ99nEUAYw2ihC@T*9PeySp z;Nkibp=|j&P)} z4)!~0zf5f`3WR}H`pbLfn(o6|#91b|jk}?ECjuZp#>6ln_60wysZI;6- zX#Cut{5opOp7X8EZ|&XE*{)WBCW&S~cBBLXe{OKHH~}Afg$8&dIrZys7%_Z_+^Tac z&@r$SMw_rDs+zw6cwFwsYdo{yNg&y^CxHySi8-!l=Q5p@nT@qe;K$!S^4ehgw_D{X}m6 zi1^#YRuXp`qIWA8SB9^nclEjc&%L8aTahE%jAHjm6b-Sr)+gEU-(XKpkgG;3PN5qa=^0<-?alW;OnXWnzGv zp%N@}OJ%yZ7#l8ad$K-YaFI}nY>;20k;Mv)EUbz|C;7FyB`WM5cj7jIV{wpQ>nP{f zBx(d#i57zE?In<1f%hup@s7z{J_t8%6=UFTE!pSi1wAh2aWPS1e{{%hQ3&*KvuOc1 z!e(dE<|Cb(eLUK%s1ID~@y#Y?bvL|2N5LvSotdpuPQa_1Wg*nEHo2PnS5~rA`yVh2 zRW$*2*y$^@VUF{A7UZW}gj@Hf2_k_~Q>d%>`HF;xyHW)eN+DPkG;zBVt1Q)SJ_{8w zBIo)0?jo$#v6m_GG9485E4Kc&bZ)J02sqmg)<|wWuJD;TCRb7Q?|n2ra^IuILZa?m3~svP*d5~AxV@*RvxAhJ zy?*Z>6nf$<$A~%LEmyBud(pa!FS+!x%Z+_+ga@-l12n>n$eUn1-Jt7%XBW4PTDHhJ z4`?dMx|w0>VC?Rb?ihztI*JKhuR@`FY$80I3{~1+KfBcvZM=@UR9z*s+`9&kXs!tX z4TC|(5+x)U2C@d2yrSYpjWANvCd~L4=XQ<7YG@J3g>&$USczVWkh&K+NB4?^LgB$> zkal?Y%v%5MM^DJ9^ceH#3x(!W=rd=+kBG+q@gdP@e%%B=N^C2M$b9|wh)gP#9c2VO zkDcMrBR6}iJI)zZ`|i9@)s-tqKq!Cv2ne>gX{l_i)BU&O?;L__>D||d53-J#gU8#J zudKtTDTZ=&+#gMF`f)tMy9i9ug7<;%THArY3hovl_Jk1yZ)^xxJxt#X*z@s1ww(d;LgKV&PQFysx&>R1h2hdntW3D;GuK$b8qu!l;0!EjGv(W4gzPQP z%i?WaZCjhWt`FYadVNu-+Yq|w&_lWI#l3Xzw_f&~tZJ4zGB_{U$0~cPdfIy0{fR;J zjvoNn?%8_N0~(;s}7_5Pi?t#Q|u`c9)!))=)cM` zv;=Ip47~+~+&Yn-MN}FYbF5FDl9b4Ty76Ee-{rNc8}H8=+&$QD-y?PdS`1B!-yTjC zp;-hpoA&m}tDSOVXNT#1DqJ;ZaP5u-ZBRbL$K-M<(0A)sk{wqusirPLOU}gymEFgd z4YpYR?v0b)!kEe(^<@IsxvjOMx2@w^d?2XPo!)lCXb0->jAg)u!Z0I1)X;KWvyJzppPZ0|%L(%WPrT7Z6~JhO zl2@|-Nj{~OVLo1P!=`Qsz*Cmeb}D|TD}bSku!=Dd-jtw8TAHY)I4oxoHz7ZkIAark z+RmN=kKz|d7y{!JeT5lpiKGAFDxQSw1-ge>tf52G!|o)y-;X+HlBL)$FZXF?|9V`77y{~XENl>2F z4-ViXdWa-)0}XhMtV)kQzfkzbX(EIRgSGq!=P7wh(WX*Ux+uc88cl%ckpvl;%bXc~ z)P1%znwN+uraT(gZ%`|h9fb>&F8!CkV>n$LGP-oA#LZ_&l)B<5sC5q{YIRA}VNIge z>v<>3lWG!H(}s-CS6y|Lyb#mMP1bfFCM@iMPg2o%G-oGLNkXkCi}WwAdr8wnDw4;( z2a%Os&^pZS6H zFVtlm6XnTVz6u3jX&oII$LC&$_XIK_S|WNo{Wf~mqx7|((oqyOik;*`G*v81@Hh}@ zqUS*EMgOHo5E%9QXUudQC74AIxF%NR=UX}HrsQ}G?NL|wovl3akaEbsvT(!q)UhUd zTc|zob>2ZX+Tv)J*>bcnaR>)f8%O0%kxc3H&$MM=*HI^lojmGs!04o*b2pFH04rC0 zzxorflQtQyIEMBHrDaw+C2;p|Pb9s_2B;qq zKaBR}k+m7#03G(v2B3dYWs-x9IJ3{wf-{s)ZgSO&0e*2OG+~1@ zN&(5NG>7EO_Wvj@DjmQ8nYp4rVhcHT-iQN$d_xRq_Qnbv;<4N|n8sizz?XI!i%^AEM!l)4OJx`!YXhC*9BZ`g8+fnMN})0k7)*X6=;TWM&mpIOHya< zX7V0fMQ=yt6J^@%p+79cX>#N?^oGE#a>o0~I>8H(BAJDv=K%>FY>YGOd&8dSI>!tc zqf!)a>cV0jtBS?RJawBJV&v-vQw9g~y?9Ss-#cO^&#gDv>t%e%&UGV{Rey70q*TR4 zTZw!y47t9+d)@tqrobltAVb&mSrZp5Xh0{8=o;MgtLu8NSH4@9@@6=eH+e-rlt?|> zhSTS`Ru7JjjrQUj4MRgZZ;WXoC#w}7U}dtB$(3?{?=n}2RG7WPQ(6r%Z5l@3jc_ZIMO}apYVdck~7hrqsh$v1WiCi+DiyBwq z4pv4_Ow%jep}q!^wH7%Yh-;Ca?-h>%`LyW!v7NXQO&}VmnUQ19&375H+hR|L-P3o) zo-T4vKN5So&po|4_H@)e)dQfA1gR}`Pk$o@+v%R_=D~Z=kQ!0g@qI)42FLsLgaI@! zX^)I+ZZqh8g9B%V-eu7FzO%r+E`;7Yd}iD(=CPK+>fH*pDnELSA~3&$1_7j5*22@h z?l8$3s~m%*PL+1~f>i3qW&vXTVekxXe1TI)_f{5!mk0sSA2gjq&Yft$-bu@FN6rYR zb}_M96}yz^coz{Oq$Dz7R#rCB)l2Ci!az*3jP7Y28Z=ctsI2cbvzn0ACAPUyt$Gz$E6p|4%7pTU)`dao&r+DO%59J(!LJ-Km%2B!SxYUAlcu z1L2FUCsRi+FtTLr}*%%>V%s15j0| z*a=odN*0@WSK;c((9=R9Zs+M?N0(z&Y~pnceOyX;NgujTO5#VI3EBN}bXwwQ1^5W_ z(cYU#Q!lX&#P7ef)&qCxw@!X(9XSuT%$N{()$Ustbsv*$H7Y~RilI|I1n4|!D0Gq< zT0GsK;FODem zYk3IY~KG4j@hyPG5JH_Hq*TqI;%v$aV&jRx1?oqJ>b3Z>8P0 zZhjyS*m@fQOh#ZAfEb#@mFNu@VkWsSE1~e)g6dIBngKak-et3U&~1it0{-fk0Ki)D zV$fjC60RIPT4&f5piYU|Lr@WxK%-gzai<)5*kUE+k7LW=y1;T&(q}YMe{X>p;vC`v sL*Qtg%Zx;C{n1Th6TY@bv|@ajaRe;CSQKb~Eh6aWAK diff --git a/_module/ncs/nw_c2_default1.ncs b/_module/ncs/nw_c2_default1.ncs index 5aebc39bac7d34ac94d33dea01deb557341918a0..8a75e8f2b391c31a3de3ac57540d382c830d46e8 100644 GIT binary patch literal 192886 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 P)H#f>1JD#dqTT-oq$XP% literal 86342 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 Yc4|_C&r>8yxbxJcLu-kNe=#-r|G*LADgXcg diff --git a/_module/ncs/nw_c2_default3.ncs b/_module/ncs/nw_c2_default3.ncs index c54384cc1f549d162fc2c802022b20acb38af81d..3c27f3606ef0d75c4ed3ec8623fe6365343b45ba 100644 GIT binary patch literal 20590 zcmeHPdyHJwdB6A0?D(KDp3-(6lm*22+qONbLYf94m1d`qx$;=bC* z@S(}!@dFdJ(YtD+V|NeVd+;cFmZf^`pWL=7Am-9v2rdii_4<3DP%xzQvn5zOIWj8%96of{@X;2G5=FUuE(mTRYV`c&2EN0zvC~9 ztG};%kYvuzs6;C7?!;n5d0Q>_PmblzarEa!IddE}T%aly!^x+P1>+d+XzAq`o9RSi zKHD=z_zN6yhm0$p7=#9M$2c)RL5|@mYID4}d#Te~%;GC^E^Y;*c3o%LK~(ECw6{z5@?G7OE1AM~kaLpoDZZ zko=ACT1r%e7f|;!@l15xL8{?*ge?c>+mRicU7t|@I_tHrmDaH6wXV_Dg9y|C)?cQD9%7$lm2ZR{IcoiK z+bBkc;=Zn4>)7+0nnS$tdtwepu|o6PlBs;)$6d2?EV10)l;zeUA%AeI0}yj4?sr*+ zV|@hoV`!{MQb)CaPhWR!aHv!rvI>DJngxjJPB??hBHdf5B{2Tn^VnRJGvOILM@Yyo zy{WW=&{|RSA;=1Xgx|;oIZ{lo)?IZc`;gn@LDri z?kRT-6$gi^w+>Z$%U4~w@yL~%i&st@zVFJbp`LexmLT_3llcirbe`baSjgJ1ks`=rZ9%eJ;cyh zW}+r{NV8i@up9#nbk%zLyKXOc*WfC*mBm?Poa-Z~M043zXm4ilu+5eWg{VMo!Jrv@ z-uHbUkfi^hBuuqtp+XFJ1{u8~D&+IG90#-NiH1(c)iSBHb`->Git^j1F2Y%A0?`&v zz@*-8dkMRezrcruok!}?YRAY-2hm$`o+X*}0zfo)G&nrp5`=4W9XaK1qXMw5v7@kp zahQavjc^;DiCUoIrAYt}c2z3_Vh%6|OZ-w3zeL}H;c*mr_YF^twsl(J$fNwi7yw!X zpyAr&*zm~M-S-}B>r^iPf(RmEDOA5f@RO_EZKCRH3~z#e_}~MF4o^+qGd7x`_=8(8 zM_W-1g>^NLpCXK(-_@puMFKD|8-E(BY%|7L%yGsietrDN_+1CbGDayl`ZLuUl+)Tt zc{kzjHsWj9oP{lBF(c;(tnmC6x1TRDC^3AC1e7zN8f?>uMZu5@Ol5vgZFpoGSW*0G zVw%h&3Q@f1T~8stFRsaojog-b@uZ#MzdJB~w%gFAa2o*lwr}m6k>d4pp_sUwp+>&k z*#l!InhXCc`5X0)WCtoc+?kp+BV)}qh=S7KV1HL_pj_=L4{#OHUBP75*Ci_niHPf( zMMNI94O-WetNZ3eP;@mXg2jBkbllW+vLeV=?&xpXO*McEhxgQ+2h}d2 z+f+(JWv)79#Ux?9J=V_*s{olxuXV;Kh<-Ra6z=r6qnm|y)3vY65SSYlMDk}MdXP-` zs(UgUl|qnf8>p6VEe&5{h%C2_P&hXK7c)aK2%`KPbHKBVrMZTz znRGH)YKdB+WfbKZ5_~hIQdK}`N)m)8#C1Noz!MK4iPPw&6l{Yvf(Hx!sJ_zL80)Ps zvGqwWp5KW~8kl#Wu`66JcC?}7&mor);c=zKunjvRNzsMhZKQ_8K@P#X*qk6|6d&J9 znNC{X^XIW8@CGEn6CTzp5T7d1y1ppCd`M?5J*lIBiehwdbkHHr8qwq&PBJq$QYdaWX-7Aa$?KWSIgdROaEP*s6zT|ixXgU7%vU)7|78q#mpL1j( zo>4dsf>m;9YQZ9tAz*=ctZ}Z~Xtly`Ox^%{0!j3i<3X@wy_WfRvGYk~MQBNi36{~W z&xytP_sayH3*Tm!qb^!{jtX2H8>AO&ZJB+}V8Y2Tx@87>A;;86LmEO~LNl4s(ll=r z-|%S8oG3p-As<(bK=+uTJN(SLnjohj7?rsc%47@Nm65YrJre3P9(l=B!N%%Nu{3Bd zixt9Rwz9WrB+vk#L=bbqcu}b23M#SuY6&RY(P*b?A&29Ykb$ibTw2Bc?x!%~OUz#| zQp&wKBa=Qzhaty%$<^n77t&0W|Mkgn%B!Lyuwb3b-dPQCu`GU0#)N0D~=_=2N?#Z-aK zd{?mt3_zwk!}d;m7p_*-q?JQZGY3f~FZJ~7uUR_mgEdpZBqoayIRVSMJ$DJi`5E>- zqvO*Ue#(X~V7z(oR5M=YFzM_&?^R%!z$AxqUXh8IPQHu&kPLj+)8PwbASUF0$sh=+p~a#>g|}*f^`1>7ACJEvdNygyW$FG`=6vr;-TGtO8G3S8*I2 zvo5_2l=zLwXJwJxjjk$coWtQ8Gn-ewODR8l5&uxCh&P(Q@JVjDH*V5C$~a5!w5uMF zWkiR{Bkb#>68xex_+G?4l~ATl#3xe+m51ajC}{I5CiG}(IA##ABa6>w^G_NWi_`3x zHVwGY048;k6Z&b$6v@OZGXWElPWU%MGNWOgj?Gnex4SnP!x_ZxSVGSn4Sw{?c&Ne4Hd_Q+!Nt7QM#==c@J}Q!U1mu}1;*`)3qi zqPn!Me@ZnTt&+kC6Pr3d&>hD&aIW_a^zSQIIgCdRbr!(P3P;B*m#XDK*(4Xh9a07w zOK13oM+}7lL(%f~ddwTJ9o`I_lOCJ1#^}Tl#C?>>%H0&xgF~|+EGfWx7k|xPDx0V~ z*=iF31mN*Mz*|>0pe8ZLIs(q__ zaQ#TUGfHAB^^E&RmP@u?p{=LA)~mGjU%l2%+Irq=-Keead#wwkH5C0@DYt9uVh>ht z#Dr2ITG*QvcEp1{tgSq43?HTp;y~6lx#<`_CZ=uLe`J>a!CCsZ&(gnq=KkP6rJu6F z5n-;kpey)Nq&Jmhn>|Cc-~~YyCnApQ7>QYVQQ=CGRxOv2t6@Az#a4Lcdo8o4M;PXbPs625U}nmU|{H)%kF zeRlmP*T7t*oVQAGeIVGDB5CCo&1u>0o;X=Gh=o4wTFAp4T`83T=a}HyP&25H?(!$+ zs?%l~)tgg-I{VG3&yiV~v8c;HFZh6f@MqO+%|IKwerH3M(`xvrBh?2wErBqxZ_4mm zAG_*cpGaZv@UUf8_OaU??B7aZ@AR-`r_sX>{?5VfPGNs~R_rGoY$+nd1esT$ep6h8 zs)bb%C~t9ZB@n%eJNn!;y9VV$xlR!mH8L1akiu;d&YDeTvGt;a6I>s2_snOoaxN2& zCo!-N3yxFk^`6wvLBW*GQiUc9X2_=tFd0M-r!3!+5&%SHoUunM!P8*VWFXB$R#m1Z z3ELU24IWAu4ALqGCYX!qt67H>z?EI))($;LxQ5ukA??%Z{b!j+o^ov~nMFQXYMvt| z*w+v2P`<^3L<}yWGv|=W{xk*w2bDP2rzYdj4mS9Qi z&YfVl9VRRd4V8HPX<+yM!Ae)DhZ2fEH!=*12m?@F^HHE59pz>~aS>=o85}70e6%5a z6E7#blFg2V@kI=t$Wo`Mw?%if;ttoko)`FVuI?q_UN8xlLGTh}n&BdwsP2ZGjAXC? zZ-S+-zuH^s!P#_GF0%>XcAR?~KW}zZFmKMBaAlhA-EXBep%MJrhaxQA?8$Cjc&1}; zS+jkLc;K82OlUgzY?3CB-bzipQsl&nAzK|_0v=`cCS1lk6z>%?&pOcslQNW57Rc%q zVT|D=cj45gClP;tgNw+pS;@WrJCe8PX+D`o4`TG{=|9f+`Bw{hJc$gI-}zt==(Pmv zi;^!-2OHLh!G>U|<|{jnmvG1d7!~G4e&{pYh7Uh00Z4Q7>(sag`5P8jIg&Avk|jUs zgzzxPHQP{26V?kSHZ{w=6u^yzaNw#qODZ;bHN5G{Is~M`^o9z zJ>ozykX6r$@k4ENv4-JvA=e>Js^F{DB_KG7zCjLL*E`8}xE?uy|MOdvTc~m7R&Rh? z>0jstzt=^J)_WPW@t*B@Gau1E%;v+KuE%5*lM;7sNmiKS6&T1vPJQpEh;TdE>eg#; z#pbux^yU%7CMKc}MD1~HS!KkQFU z&;G2|Nmy%T#!7Tfm)%R!mnUR4vA{*fjc;1SRLZoZZ)0((xiY5{wrpaYQvb>#hVW5h z&_<$ts|d+iC)2q~LW9GCIPLW%FL-1Dep=kvD9!E?a{g@GW)&+no-%-?hAnaM21XlT zCHaETjJA-ehfq>pM6xj@zL$<_N@&9j-?FP2n)}1e((oC>ot#xPxikVrtI7qI`{lEz zVFx&?SWi=Jey)**Y<~UPzWdX}G566=^{K03<2^p(i|8H}a zm3^MzxMgGXWx7^!GT?MK1f$azt1yj8yER{(IIJ~UTsRP67h{qwxt|z$!}wMcp0r3y zd`~BC8EC+g%d{???gkin#^J)qDURDRl*Tdv(p$O%_oREwt5Jtvb7NM{8l8TJ`^dbye2bukjMl$;y{YXD;+*_;Q8EC26wY$=HTcSaMFdjTqt(ZqV z{k7c{eQryoCqq;Q@sxCLWw3(Fcn$&jnu)0%yrtA9yH0nU>%=;PV4{IRliB&+ERAO@ zTN$YBE)AOhhTLIE*8~>&E4{sY`kHm(fDhN7)09o<0JB=|-qV#_sDf`VkQ-b`ouL8KV1&Go4DH^ zE}<8g%9i^Zsauj8*$eLYE#(QXL7oT#b90YkzbfUr1qJPMk*?yu8B;el!0q~QpX^QG z*vod2hE%5*NQ~kE>M(;)QF6}~KTL$`qwa=>T{q!PRB18*<3<-83bq1kt8z4g9%(p# ze-34WQGr=@{8^~{A4nO*vEAR?ld?++bQaqMtDUh6V$(RHWIqh?M#ksxEn@Q1JYl$E zzVE>#gVaS;f5j?3)8Z@GEB<&aRMij9#s_Erx6@FwaAk^x`u$YH@9BPdGe5MKLN(sL zckbh7>|U!Ts`8Z9IkK*F*JQGl_crpNeTAh={$O2(5gY-HF(N(Q;aGIg^oz(&DluMa z^Vf%d6Irjn^Z5VPn@IYSJhBkR{fCYis-_Pe?E}Qg8J{`+YJ6=KX~tx!f4SdUfI}6L z<5JHY>-GPb7e8~f&lEr0Bgd@Tpg*gVa=*6PZA zpGh+Ax%YGt`80p0NxiLGYrTVAkp1Y`6mpb#7mlr2Q$G-*Nw8$&ZI9A>+q&UmW{`a4 z=muPN_6dq+MPyCf(4QztUI&Kj!6d7zbWta!)lE$pRj5!Q4h{ZBeA8Ro?JsIXP87r) z;uD2ulM^bl9q&{o;zMp_g4}Iv^7D5nR8tl>bYC{z)EF`+TDp(%{uL19~A%_sDwJ@j}P=H}|2o^sY}Q)_%Z$%6_VPdtw_FxUM**+33{kt|>(%5O22 zZngQeJ9U<^py1x;diF=Mf})%^+JTo}Gj<1KNYSa|KyVnc4Ney~zA=S;2+OnadB5W5 zDLyijI!7KS6y}*dF4EIt{mgbh4A`emn)m;&Bl=t{_ab4yF>}X@D2E=9eQh~)mTp#( zs91j_)05-8kO#@J@v}~{Clj*4)&-KC$l+;~l$)M~Bbk!2mP-|mexS*tFp~sWZ`w;A znyRf#UrWpMHS(r1wR~VDkdVogM&$El0@)d4YWe*JnJhn_N%JGmXe>VyACe!Cor#|% zEHj4PT@}Oij^*6cYhf#%6vCukijK5B2&>U!~@{Q{=AZSjOsD zylfq-jULwjg;;HBVie=gx75TMB28m-{YFD>%96go8)&XC@E1O_1Ka16L44Zxi4U?tcKQL@h#sf(##ES_& z7G$$(Gk_yK7T~*|0{GQk>jnn91_rv8A3L~q)rsqRmUpcdI&De1lfydpY=Es=JGiWS zWnX`HShuG`(Y3n2yKBXX5nUg!M!to6{9RuH+|$TN@()?9?y6I8_qLROT0dR!6hOYA zHmM^`hlYk;PU=$bryj?@Ib1SEgt)JA=J*@q z;C8+rqL`G>ENDXMg<>L(gY?wg4@Nm7cy$Ghpbz})NX>rNSgqEqsLg41>4TnTuk&FeGUntFGU;=C)V?MN)Fj#+E43R%ifu_Y zS|a*>TD_Z8u!-~8owBSA?la|t`Gf1$b}#SgT5W??SI^+O<^4Tt2MkqmXp?Z}+^>B$ zW5L(iDJOY17S10;aO{~kcyxDfcYn|F!JgiM{^M470djGzLE9Wgr&q8u*mrEs(SnRr zmw?(Zn_xgKG@ZQ*@lVCM6k?+|rx4{X9@MdFE3jBXJkbELZ&u4#x92-30QK4_96FLz zW$)oke~%V2nrTpQn5TZEBn~^DZ%f8QlBSv!Ju6q{B3LALEZ#I%hi@e~H5=j3&RiT? z6j_u8*GPkqLkS$mWi{7$&ZfY;qz?kIKx!OR=OPd3+>`>kR}gf5fxo7U$q{(8STmjG zS1Mc;+2LOz+(zwz*J{pVUaR{X2Rx)Bp9sZAOcIId=79KT;&_Ra&leRJe9bvm{^lnl zB&_;$$~lDsra=K_$9~2((A9r*ci|(j==ze&Y{+mpHa{SI%O^Z|f+wouqR7uGXdE7O zf=E%spRfYGK*i@XL!d(P^9PJfLWo^F+91*F_=warmj--NdQ7>6P5of@a);38@Pp3T z@N-nbRk}pRck0?_2znJclcDQG@*IcSl8KOM*Sd9m2s;DanmiFD8iC{ONT0$!>?M@F zK8D=*QI$h{Xg^4)+LGNoy|3s)jyKRZxU6g4s@wq=Hi?Rey?cuaMI4f28G|&zY%_Z+ z`WCOr?kEN(h+uxCv?3Cr^5BL_@VjRdeldT@S&jv3W0Z_n(65eE6rAR~`nMAkMqZ3k z`0!J~PE;g^vp-K$dwwOYqR0i+R$MMPl8H>Zuuyy2O{t}Mdd4b*E4B7xO=ff4`1-P_ z*vf_}01cY7XUF#hNvFOnoun0DVD_y?WXJl6$d`2Lv|oJ}*PO-TA~v2opc!>q`DSw*u!ez~YKv2z%o3~Divf9e1lm5%Uq zh3+LcMGk7?Zrn^}P_<_rNAj7d?K^?iZV%zD7hrBExPfa}f4}Kygv@x+ zb!o%!eSvt4pC2~RJOojbgF=bFXp_ASzEijH7VCmoy;pJhd)3x?QXSsU7?qRvm=Ug+?W zH<*wnZ|RwSY$nm0GC1h9kq|3H>)gvZ(5S)%=rH152yCn!lRN5uUMv`cPR4+jd`R-A8)Rk zywfm>tRf0?d^?mJ;kP%4)EqWS7Wm1Hk97~@3`YCWl#a30;sGQyjxo5u=jc@ftGaqu zM~KWLf>-yl~BOE0r7l+KQvjoVs}j4jX?IkvGymKzVzIElfCy2vzs zOf@#xCZ8fPo~?3|de$pPZSN;X^TeLnB9DLp9%LWl57rt+Fd(u5DyiaXMU!~QX6Qhp zhe}QaB#}k>vkn{PJ3w_>Y`PuVrN>mrvewEl$j<#2X+IJtN@BqL+{;aR{wVn;1Xk(- zolr|6(FC#}h~}D0h(q!bsp^oNad<^-WDiLbaB9PrMU?kur_%IJD)#zl(9Fh$zB}3c zgl4#}I>*T^C9}7a%pWB4$}_H*QR}qF)p%mwc3J*?%n^UX#Hq<)>3 zla@XkltO$CL-J@)dXScWGbqJGlCXCLr3QHQ9`dA~x@gl<4)lp^_=d4h(*60gBZ1P?k?ku}OQYXt7~@J=Jgk((!vhxmjMu`m zuqYYt*4AtZ1evqUGG+8Ne(6kpkjB8lM*9*>LyXT!KC)0uQd21!4eUn$O)hvP2at&Q zrN39U9|+%>uS^M8Tavsz<)2~{;9=K}ad~j0vL&n-`@pP$-RIq;C}XeBdsriCchiEp zgWqwilgKap;U&+SqT?nTU#t!F+1^W(N<3Uu_Kqa2M7HSiw_4Ym9lIX_Eu7? z$73fOQLj7S3_dv>B6`W1(3B`3M3%a=`LYoub_M;=@14rh`$T4JNheNc@>oKur}&DB zJUp@d2e66iE6DRoCnhK8PcFhBhk zF5a41%P@Hr#Wo!SFHdhI7gQLa4m<~$+uF*E_>4xqomuNLtdHii1L6$n`opswIMI`h z$Mqj<6tF8V9uo%<>pz3hkdj_0ux=cV#6 zV0_R)?MHK^{B*xuDS2W};h0Uz$oXrS1Hwi5?jSOvD?=qAe_?P5OUaG+^xRw%WNo_I z3y7kj+RINqsss93>jvFIw^&1l2;o{YZDJDhLZD+Lml!0jG!|HA@#F(+ zAwi@H&5!+BkZBNom7*8v+Nbz7iIHUl-33HZqp-3=_CaT?f+b` zy(8I|12Os8TfigBU*YR$=_8g~4% z(c5KN@*=Y^6rB-Sk6`xz=4BedmZ{D8n<21H#*L$N7$_VnbWLB@VU5Tdu{<|OQEG62 zE|+c^vipGHH)`!0@;anO z`C4W!^T9=A=-|@9UMYqRWSVH(eldN2J!?M~C!V=lY|fu@$yUUV^W{?q_mc~5Os?&MI?ph1^I7`}ToyLHF z4-9=0S;6|g$-g0A8i-#Bf*(vtbv{bAw03b2z+Ue^rO-*UhSGF}br~i9&4D;*ZFr zILlokJ$uwIfySfo#lTM_+=+Vw?#w*KtBnl_>!j4M9gF70b;ki6KNQOxQGVJFB*uOp0eXsP$ zNSDJ1Hc}>l<~og9f5kLo-_j@5P`Hw98VXmkF_zKDHw74Ql7gk-O17<=i@TUT*qU{o zFp~$}YfyX8!{KzsT=%5toUV{HrPEQS7~d{JA=N%)tT%BDnR$yrNZ{V05rqwOnYU#; zAr(Xc=>8pwO!Kt!J%)4ZQYNv5!-n{F(Y5W>fLYs71Vb#xw}Tq_a}6N=X|^0QA)Spn z3qQYb3olq{C`+(dUz!P9{TK2~_+HV1@!F=3S?z=4urn#9qfAZ7<03>61x`>DsTd+P z&G=brOD3@EVC(fRq@@C9-2{Qjx~z*ohl}z~HiyrVrFq6JQCn6fdq{|cE>C$}j;5{A zgb7**V5blRVEHXQI<$F@{Nyt1t0b4tv-icMNqj#H5%@)7>OSdL)zt#GOut;_mg$$u z+%o-&mIiK_-lwIZTdvVk3DX^(?sD_;Jek+l8H4 z8g3W9QA?Kw82Ys|+%81R+d9Hv zBxp;LN|ex#SsrD-yYWJl&`9YZVI(1~%KANWmL#4?)I%_pXz1ceDi3+dQSYjx9r;^(okUMesr7ihRY5FoaTXsR&9o(YF_BgP zWklEyai?NMmJTDwv8+lL4t`kZ0lU6|5O(7)45?7@5H^HW27XLIs>iNLuJrdb)eAID zp>34ogdT>A^Bu%FOXnJ5mm$?v0fd-F2qC99p7$&}Fsr0Eg`no;($`571wQbbjZ|om zWla3JIw3mc+D*RR^RqJeufmAik}-Iw4a>6KYr>}|B7?yWw8OdI_v3Q%hDYhJ0G=DQ zI>#QRrHjH+vl3G{@lBFZEn5|o&eGEJgHjzWv$qDNdaNnJ09SMdn1vYh$X0|w^Qs7g zPQrZv)9G*RV*xClRv@*%3`!C4S$b+vI#EkQ z44Ti>LLSBnY<+rwLGzCKsGxKgg+0W1WBnY;Tzt{uq`$+R`=19Fc$H$9YSV^O&vbw~?p!Vu9OG#xcFJbRgw=9@Q$!3QQ2eOf zk^Zx)5$FsNq$ql`4pUD#;~XdZNfJCQ!4u;YX@%w%9S)L_+~G;(i7jbaW;SB}q3oqB z&|WIL6=fKtEW{vXA%^DqkDzn4zE|^}V04Sfaa^@U`lvIkd$_6DMbI8xzCJ9A%-&3mr*dpAfvxVr^1SA-$9BpEnN1O5V5In$NA$dGrWd;B<^$MBW}^= z`~2Ij7-5VaDr$8NNoqw4L$dMhKbyPvDAyvp52WVpLE$8?vi5LXe?#$r&BfsI*j zK$uFAr0yyubLgMWBY`WKq$eG6L9kSI#|a3N(?Am%p9cb5@lmcA3(&{m%Ay?l6=j<< z*;;o?`M0~}W?C)JJ2y(-h(Wdpc+<{p`QqL(R)Hv6Pl`LhS{q1B0_cT!bUE^+2p6() zC<3(RM~89>1c8Z?I}AtGgb`CF92WkO?r4}4veu`4;ywx24x=ALW8`~j zhU(ChKbKR^dBqrs=EVmgXiwmwfpr6YYnS8xub$qcr5&`U=LL}dDTn^*ZrE1{i>dB7 zBEtz8+=p>=&vNz~X62aZ99t?#^p`D#4cD@7<;w2fb=_=>Zm-&n(lIqLtB>Y|x%WSi%O^N*I9}%5M*y>PJ3fj& z@&Uu#Fi!}4dE|!)H?k!6kZdOxw%{`kvY+bGuZDKfk2J}hnc@4b#X)H5;$UNJSY7TQ zbV(2zAVYb4<&Q5Db>^DsKBM2AeA3IXE z6KrYc8B%ihaFkARooq=LmLR+%&L0=uzhFuvK=sNW=A2Ok3%!)V)bM%17XCx*m_=$R z(;35&iyKTbm?_kLBceZQvalcIP$e^q+W!{#B`b#s|1k$YH1yVU#I^g2`t-1=He z=W}@9qpNu(HXPthUKRc?eROzyBtHoG|KQIXd@96$O9=noYllha)Us>SzVv2}n)wK6 z8e`TOARZyV2p%|jB3pxcV7o)}QXtU8dSrV(5HY4qvGLacc508qQUl0@)*ySd2AS9z zWcSt}V_JhuYYj5WfjCX4XWIY@k?A=WJggC_#RI_vE?CQ?#-Km@9v@0uB0SO=Q>I4n z7lU&ySRPN~vyg=;*zwL)V8dl+{y|Nqr$a+ed{QR|%-+bMEf~lF1Dtq15dTiA>idX& zTH+L`M2S==aYWyVxU56(%3j{ryP{{nrXLU_Tw+0HmOWaWB23M_9SM83NWRt1c!w`n z89qeK=g*)KtN8_wZMggke;6{z2$hP5q||s;8+UxV;U#frD;o}7KH2aAwlL|@1CG^5 z<>JvSr~msu?O)DW@Z!!T6+vsWDvax&$s0W+vx($59Bz66a%2l4K?{gux8_J>czjyA zX2YX(5ly)^vov2m@y#a;CH6E7f<5Uwy78`PAPDkR5~AoRJbX0$J)t=GNjM6NaMb z`h*VIr-{xN&D7FoO}JEr?&(C=5$LW^5t|9C`+?E5|V-A`L~E0D>O(QY9!(v?N! zsgyd`VAEYfJKdXANRr4uf51e^97dCIHq!=$T!J~fB7Y6r9&72#IQSxP{f&|c$!fXjH!jPi;-2@QGh8w$&l z3M|`6FFg;#eh1zZQe}B?>}L8lO2mp6im1LfHAwU^k?1|Y^lIczH$2XkJ*8|B-DX-? zr!Mi5F|?-sw$Qa@Zs5-f&_~wGEtfLr(2-uFzcVBAg;?B%z`VhM{vNyl2A4&z z>RHik;P!|ZBr5)Ez2>)RMGpM~#&&a3i7}FL%yjnjrAHc)5cmYdizI~0@)Qn6>vXz2 z%RQUL5|O-UkvNbJ-RNK&-0R$`jRWZ@t{^GsoxsudfApC?Y@{eJ1%zC)@^8|4RbZ98 z7Wp}q#Xdx%|>c3yC_&!Tp& zbSqHKOll{WG=ad-gJ|*-1|cxoZWo=*BONp%Doapgb6O%PWFWTYxf|fsLLaBM?h0>R z(|3ILVAuMt6WxoLy4S27SSMVAn`Ubw6kbgSpwm4y@tT=?4}ybssLJG|AULOk8q<MOCxOe|8azZBi#atLK<82HUmsh7-%2{rSei73IYm{5eP+CQxaB<1q#z&(OLv0HY(p9dAhHxwun|Rr>5%F|I9DvO< z36Kw`rkl9@kqs#a5`d?N92g4euBHI%v@0&<>~LcHd}qVZ4@+QMSS+{+hJN!yiE)Pz z3`Xn_eda!*7Q+tVqKKr*5lhL(8h9S=<5{-KDGciI%7aT$>L$K4(Xv19&QjG08o0JILhn1Y&?I&S2F*`@Kkl5iALNqX_sDT z@^P~e>eSX-xz?nM^7bIO6SC8)SU2nr4(jY6?=T%IUk5ey0Wg{r>jBCnoH*i|=T2bP zr~kxbg@DCnSy9-AiK96sgmIUkDs0wL3)(4ojJHIsExYU<-fRZIeu^XNd%`vq3w!Z9 z>I`f1M$kY>Bjpm;#f7eCLNVal241sBJ zpE8B$Z@od7jRw57I8aXtlXM~>5nRqE=4Rv|(hcMYW$_Ugi2#JT2_4BVtGI}W{oF|G zCwjMmzjC<11@O;K@katLzChE!AB+Qm5cFC|iQ8d~M*a?1gBx=jKiN50rG1lknFn}R z+8a_y9wZ0^kF8`slQ!ccW0N%{7yF!gaJskBQ}Q!n8*R zFOD+1Bc3_5Fq0k!O?gyRk)&r4z`ZfYfJkc!TT6xsP)vb;nnfTnJ4+lppS+|6)Ef!4 zKG@MHb2wjLU_cV>a4bPgaQct(j>5eX*ZFA9v`10RuD{#13&fFylfsdU%<+T(7iHw( zO5ViksP8_&o67)XnG5798h*O0p@%trpbTJN5e;<;M{vK=uK=(JCZd7*&4txF&AfVv zG?ai?zf@1feuJfL{2b|h>MV>U4c?!N(JTuNm0xPv!#20@a|hzB{WHf3XBT3;h*7Rz zUywbz29_kUi6hspA~y(Xm`DDnYjx{`WZfLjPKZ<$FyrV4*TV29TwHZ)D2!2U3gLzUG5;H zKaS{%cfBsUKv6+Az0Sp+^pudU`rhlI>rhnDoywT^Um@K@g2L;e>rhnCO+HJy=h}Rq z)}<3I4J4#4*@(El1_Lga#;56rhJODI=TXJ~; ze(-C;hW?FT=wu#pzHh^N^%i-t@Ym_QSspbLRM(_BZe7;czYm=ma)1RgoevvXn>AK4 z>5qGsO6ba@$j96ntaUqyetK%dk`M=Mtl8!ZfU@l-L!5-Fd9LZFeuf0EzVtHOCW0p> z{1v@wnM7+Xen@{_VU)IYyE4SKkjEYsz%y`?GT48wzYo3C9o!$XK?w;_pCRPs! zmT@*+lQ%G<>uiN@ow|I3zY*ghlIS@S-$Vjr*@MB+E77zks;_*2qJrXtDUzUN+c~W2 zzKp5vOV(wBnhZ7mC#==a6@)c!rU2;*aua5#RB|dBkoT0NU-yb4`N$A)sD@04P(qH* z@nm<@v`I2HlFEEwKW%6r(pt~W<)9vUwOI33+499Ng3waD@h4UaDvU0EE8UBLS(#OyFEV*zptz15I4qf|}@XcOGV3(_j zYsX7hLP-}hGcII*CN!B`6fWK+67Oo`w2j#wSAE<5hS5ZxpMf4JXzBM>Pmq@~ohPUS z>`P18G1Sm5!uLtTLj8#twY=Flx2cG0d23@bEYu&5QGdLWYb;?WN&U`Yq5fEm`eT)- zd8KIm7^0p-?Vx|uYo;qPxuZt?fHp%twE`s0J}FR#oGisof;$~Fub_Fhouh% zu*r>KwWpjdLJAdJv5n5-1$`T$Q_3Uh7%GochlPL&z0QKc|) zM%G|DN?~-5!6-thW$z|`O;&!PGbF^$9g zC^Fl@Hp0sznlEjp03`o}_(`6?75l3nk9{>KQUB zwiPleu~A-=v9$xebdk_LflZh5NFCl_--3^yUQ!2HigQo~`GUTfy(zD8TdhSdN1CuC zC|B=qL>EZf6}8Og()mOn)}dQ^IisG6;fX+pgM`j108NF+ww84qR^WDh0|;5(H~Vm^ z;M8_!oa0xsJvkEq5v8XH7o?|a3c?8(_YI(W040g0f-4(DU;8fG zfJzV!I2W~@-69nyEX9VKN<*vD+zB0k1C-twhj#2Vt`jj)P~vig5OQRxAed*%@bV~} z*s+cAvi$LFn%rA7?ilj;WJU>cTx$~S4wWH?I)qnGlduUFobK3FEM62yA%u)IXIWfN z=2Gr1&(}3T+4-O0h}f`)1wkHW&4pzZMH+O~|N*c&5KH_!dKOj}yxi_cw3`2NE69t$t`@ zq1Znu-NTlbwrF`>Ny{#_T+yQCn@U<<$d;p9v=o&^iIj{;^fIJWz|9GHC`VWBDBOB% zR37+=!t6~9?S$_myd{hI3J=GAJ=nG}bRI!+%l{=3W^A{Pu0X;b%N$MuEezVzkKF(i z)zK@wP)IE9sYcHV%yV2n{y4uuvKGr^!d4c`q^6i+G0ANvUFr7C&$X8C&EF-C(T=a1 ze_bJ(D*4`g1(7hA-Te6qBn|S-69n2#DBrw}vV$f_B;WmGDdHjrK32Uc8scR49Or|O zb`k(%V8s|D5_V%y6TQ8B@ea_N+Wt*q%enu@>+9A#@;%9E=cYG?+9U+CEhOHmol`^W z50LCiB<-z{_nq~NARoRjt9lolK$ zmGT`atPw}T@j06-w)%ECe|;{c_vK_C8J~=^P^Q4tmbFp#4<&f3Fiy_MtS?ZuD<5-u z*fLP5{h-Z7XKifPBYh=QxcL2zzokGJGe0$DxFp89Y#= zOr(_(r2OFyoQS+&!w?RKgiA*n5L4WO!xlThIcahmJ%1CN`5Czim%QOD&m_c5?pHJU zCS&|F{QSGd2}C(jOdB+|RS>;C-zagRo{|lToS}?vp>;1=x9@LKg z6R}G~d8k=L@w5(U3N6MQoj^2u`P{olG&8^WQHt4~!Wc#QJjb$*1h0G$+p9lC3&Efv z+#t~EIndl~4FH3t&f$SdxHWrZTRdQDpqyEU0SW_cbe1Zt-?c?OuHUU}kEPVg`es+0 zqnqR&m&aDN$EE$1^?1Q{Wj$V9P+5;Fcq{918E<7hPH9)x;{^qk^|%nXvc9+iekr4m zEN?#)Si-}_(t+;i@qF0q2k^@;dnDS-W+g@DLP9b1C>!;&zSLO#4*ml1*s`9nsYOEzV@eKUyUY)O?@AxEJ_<2XiUVy#@~jSZ-Abe@3oh` z9`q+vpl9BC?aXrYEDc#ziMiAzVAE2|cd!(;>zVVI*^CqmwFxTSJRv=urT!91E^fx? z8D7Lw3sy{6Ni;GJQ}#7t691H(F2I!FA;_>reNi>-Ia@jQ))bI$+uAv7UF;{olIw4JtI(5YhW92w{yljXsu}yAE)- zQc6#yQtqklRI;%}eJiDOwP=4~i~3edZK1T}b1m>++oJvwSN~^MTKcX^rG2mk)7Q7C z$Av#Tu2b}F|Cpz<$TQvcv7N!r=DC@t8xr655W@|u)`rBAVFjxc#5tZV{v~W-VJjaL z(;sBJ$UOiKe52Sz$6x|+|KZ`x)1u207&}Rw3_X=B<=RS>*5%R zQfLQ?)9|SCQVcP>$p~3=zF_6)!~uR#ju|8SnvAPYz|_M@`=khS&e&7|ej#bki+0B& zlF1WtY085pVhZ}-KBenx(=w!PblPOz^LlTzKdrzF#b z8L3RuVGsROAvl8wUi4_gjjWpPFGG)f3Ll{wi573sc2-nYFFdj48zA*=xuryw4!=QE zVK>W$_s4@Hb|=MXP8uefj|6CLiP79LOf*LaXeJeCWHnEoJgw{$MQ`J>CRT}EQR}ok z-)Z^u$3>p?VLX>4QYPNb^qhG+84>o%hN~behSIomgJfsW}$MF2ZPvqXb(q8{-b zcOi^{b)qE6&qx4^QMEf`ll;V7SUz`%i zwQWL4$Ttb%$n?En^lz%=n?6?|L57)2?)(41LbJF22_=~QU6lkcIlo$h$vqVkWSDu+IV~iZ zGzl}=P5y|G_)7*smD*G^#RKK!Astyv-Gw^vNtz8wmdwU zT<(qLAc!{4N!BFi5mCe?QoTU8@;qV%A7y6|hc05s1_kyOk)Mi;vj*k>2q|UTwPujx@4yPqJtaqV9U}R(_exT>pLE0O_+rt##9Fv*{ zQkr-`I0VHvKwBjq2IU6M*H*iTpp(mUqhT7kl+!~dx3}f@$_Cspo0FVF`r>j9;Jvp* z!?NkmxlMX+vDq4VQK@g`dUC@SvM)zAJ;mfhT5Y}sLAm3p_OZh-ePOum{O0h99#A(HQJ^k1gK89g7#5euq3N{!0 zKxfVLBUPfGSM{|%ls(w;e0qPLW4w+f{&sdQ81WscZx##59|KjMysFafD~t?`RxVHO zTL_c#mQ7+{rM@q2v1szv7WH@vN9;bWWfM%E@X*SKjKr!nihWzVBK>Ukj5Sc6q%n7l zc#=dvIT@L!R1y{_+qd&`u_kMr6uOwGRNGk_o`uV?upcxtd#(mr7t}@onDin35=0R+ z(UAe?Z_0o>uS+*Hq1m@{{J*$H=!l?bUdCMGifLHmub8@LOegAu6FkKsLRP2Fm-AK- zztAKfbjN%tE6E>LvFil#9uk_W12li2qx2;Iq=cZm0k`KZz0KXxF7wpdS&%{W@XFB8 z5AP7U$hqdUw<4oqkUZ~J_A7TRG6DYJ7s1q1iYg-vK-d}*rB~sjBElGyQ`pPLG|36s z^W1x*sb|a*`R7se5`Od&rfRbFoKppAxPHwOj3q^8W%HGaGvy?+cByE)M97y~4 z3TcmV)XtsPO4{<2f84deH0GF&wo}@_+p=xazS!tNp@ji7k@oKwiA4Chzw7h*JK0{W zJX-uClr5%;2g&nwUtwJMFr?mm1C$y0IX`J3(T0p1hUeJ&{Z2w$14>6zR{ZUiz%*?2 zR}9FFLaiP}ry!nk?qQEFZPtOr6}8U5?=H!}iPNG+{$!A;EWep@+jI1!n%mMmy`OEM zYAVH~73ArZ*04hB+5d-FfUS9G-KX)1OzXz4I}(Q zH-vIby!ibl0Re1zJ|BhOm?bYDNR@=&-`b&Fu_vIU5MtCd8Dy;hALQqE?Ju(gVW!Ju3hU)W>Y zB)Sc2)j;mvL)DmEs>PmhP_@M-n>lo0Zs`SU>N3B(TwhZB!3yK$*!B*&HUQ#p5*+fe z&66a>a{&3bWZ56v0<9;qjV9~vG8eFzUHX{2$whkRXry~VY4TQ++DUFp)fL*gIAKD7 z9b2nqtj+_vKXtLAym2MMIMK{@2$uJlUv|P;lWBq)R(_Wx&j6la3klNcaDpQl-M^J| zV-dSSN~$;aceql2Se8h?%ds?B9l9f#W$Z7 zbkwt@G{O3#%R31Z?NFPMM-~DXrP?f}%eV@!FWj_eQP{?O4t`cKNde$wFsvq=!R=$VK z5R{*;MBjHWR<(Ce+h;}RzVi2prr(t({oo3^=J{)jW41n!2f-@R@pXd+yW{v;-Jv3<6T*^`A1H!x5BO@$#)GJiG!+dw9{daO||SC=Z83;kkGa{%@~ z%GyqrgEfZP&)R~>mFdA1kuJ=mV%MPX50f~<1Kyo3txco+R&P0ZjcG;WlOBj+X^UNo z?V&gL9~Jb*?D+l-o>f5)XAp-WPt(!alpE}w-^}t0XQdIWuG08he@;#eTT_h(yTXAj z#A{IG13`fC*t$tZ1i3gUY*Hero2q1Y3S5z!*3N|xiu=D^^XzTbk1&${=}OHa(Ua0$ z4U2U9Xx`<=#4tn~Vy1_+O7XsD9tRwCz&hFY|V5{_3mTxvQqlF>?wg+_jbgR8gxHOQv?qLXwbwicmSR6 z)2=Pdg?q|7Wqy{+##=;|w5HNL_i4_Q_o5)n@?7rK7OzQ-%{2KBnkgB4!RDTJd90J@ z*Q5KdtV@(Ln|)RDN_g-#y$@M#W@RhAnbmL;ZAUR=g6UN5E<1FYTeD!jJ&^(goLTgW zEs50xL!2y~>NMShiUwK=(w%m#y5!oz!mRC0VZ--0XtxeILw7KrfHqE#_%f+b;t}1- z{B@a_7u(ASIx{QUQ;0hICx}GeSpaExKgABo&|eXDTG>d!A-%7%hdYF?jnxY-Z;-V* zn3BS(6y zyZz)B>7+mD^O~30panEEn<|FSHcuc4uX|In1azquPyl9M2t zMT{6(-FtP%pD=%L{i>e+)oZ)^mv{FLkO+sThQocVvdj~+ar@0M5^fi6$`^u!8|gRv zowQ}K?+o_4Tl>8U5mWDr!h5=j`enED?FIBQBz|W@^wQblLBWz61FxG?60$6%5c$ed z05(0XxxNE{#Agw4fsJOS>T@dx;tFw=y^{>VcJ=pQ;gH(xqa>)Ybt5fC2_+y9-K zN`BI=2Jz{hg-)zQSa3#4Tyn0@QR4O*7vjb{-iZruUTDUl2cjHyc(xZ(SSgHAE@6%4 zdtQB|x`cuahVIv8ye)U`BPL&`frA$2wmiHnk<$AuWc7NoIwJXE9w+w~QA3=7U3rf(THTKfn3uM(#!Yoj`6PO?>ZV+9}F(*@9r8{W!-4-_V{Wv zSv>3=N6k!h((hf^jIlT{hr@X`*6xG*KoDqQFzg#TK=hvyd3q+3XHtZN#Nj~0=vwf` zYn!ghZlFA44@~|E*6qSB!Vj@a4ARr%ZYm?Eu**If{c?ZSNa&s(-D^}RWlbXKy$Bv* zrP+qKkFH}b@B#`WJKnG!0PI3RGb-2qg;^aLaampMA3_4=k#M1JMYM~mY;?Ya-K@2N z%o!79z-9r)p!KK|%p?tIV>Htb?F=gprS;BkTuR1zx{nBeHxXvvvwjE+g>a(o?Oe=X zpAdOUeE~Jv9@O9jc(l9*cbX4nzJ`QP4WDma*y(p?T*pn2DiCO+LX$ z;_#*CH?WD-alA2d7qTRI#v#tp<~@OF%w^EEd)5|-6~83~nCw!7-H;-z9>j~h*Y@@F z;t7E6ft6j$dwS(P!(xXELW4RqfBDiJ4mlmd3K2_#sqXQ_(OC!1?x%angoG(w@-J!B zc6z`TfE>$Pzo9MB{Q89Ad#@8|h7P(;j=FQe^2ngZgAb|?(VgC75QMVyBKD0 z-SYmPwF6+{Mfdo?p>iw%yoE6wt&?`Sazo!b==EWgW`gYEH3zt^l=8CMpOF``|FrnC z3pn5@9_m`_`@N!q`UCX0_`~(}ksm zexxxO_wB4-JGlI~e)H925$=@)g&KP}hZN3m| z!a4xH>d-_BUx-@|*B5&K$1D$ct zV-+6C)>al%p`w*N!T*z5Om3Ij)wt!vhf-MQ8;X(nB^0EEWz`A#dlc; z`AzVG{%cp}eChC=Jtw1JyfVXc4o}7DR?HF)E)+-E*#N0@v#O5l)DkB^?bCVUw zQo6&CHo`s7q;QZ5ndO^1{^wI6v`Lau+GO1*9XMSau!Bc(9!R>DJ2qQ`D^in56=`n$ zYsQ2#)y%>3V4xB@PeJKE(YShcDEO|)TJP}OZ0`p zi#nau#f$X3&PweQER`ezJIw_IAeX|0+NK_GB|0%M@VCOCE)#YNzo?Z|-%;BknG$IQ zhMu12tkA2?@!)C4de8ZDqNx{_mK8H`nG(WFTycm)*TR2f(zkD4DO;!`RZ1=vLIMN7 zMU6K!nHikG65umf<^?A)?zLf-G5Y}OcEQP8(^F(Vp!n5YMaN{Y&0yx5N QR(LrwEVIU^1-c{oe^5J3AOHXW diff --git a/_module/ncs/nw_c2_default4.ncs b/_module/ncs/nw_c2_default4.ncs index b8de03c1c30e2ab9cd214cc62897af925fdf213b..ddb3945e8faa84a10c467022a27fb079f11f696b 100644 GIT binary patch literal 114667 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 diff --git a/_module/ncs/nw_c2_default5.ncs b/_module/ncs/nw_c2_default5.ncs index 1502fbc379c7bbd7f8f422bd5f7d25716bf9d84e..3c848e63f2f68a5d2aa03fff1a186c843ac6085a 100644 GIT binary patch literal 18916 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 U5frIYl>&b&C(TzS?sLKa0pipPO#lD@ literal 64914 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 Qg_pyyvN-gJKsU4h2Z{(Bpa1{> diff --git a/_module/ncs/nw_c2_default6.ncs b/_module/ncs/nw_c2_default6.ncs index 1727698b411618955e1aa9fc724390aa02e731b8..b71e606a49f9516b145b4e03d937d40cd3bc6e96 100644 GIT binary patch literal 32072 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 literal 66143 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

    KT?4KYKc^3hs;r$f*B}0Ew z*lA}YC5QCBmOb1rd~I*N;BvC8)xpffbP{!lt%_SkR>uiu=LB~QS87WkH@rU+XWuo5 zLCN|&b``;&;Y9mstFvt8!Z>o|XSmx>ewI&PNEUpQE5u5nSu=te^>pkp%Fc;8wx_ki zdP%Leo$;a?EG{*5=O_AIS!&cD4bDEABVu%4y?o??^DiB_a@)n{U+N#h3dadA37wcg z0A%)qF+G#7M1W*@Up5yY2&*kaIW;Kt5M0Z8a8lN@U3jwl8EynR`N=SbCxVM2_`PaT z_cMX`F+abA70+~$>vfd4nO(pw#z6vi+chEC^R=-2rsCKJ5zrV+d`farF~%?E^G;UzU+I1Z##us6kh|P- zS+^CADTGyWqMW^jjnAo?Aq{r z3EZ}i=velwC`KgMhV`UbGjU`ecH+pEsW?=r%jK0XvY-_yHM^4Vc*hno%I7hT?~_g| z%>wD_Z^~bzqsRWCDgAJBH>M;fL3W84F|xWhbxt{Z`N-A{{aZF}?%T4qZ(x{2I6O5R z?qii@o|sD6Z-$Y0yKsk}XbCscZ}>ZD%VOU}?028`dj}$>-WP@UbQARxZs|J+=v7F< z&c^7av*m+=6*mUHb4f+WvXnyPD@y^`^t9&sT4bl6cl(CMXq=}fI}cYsGgLOg8$cWNsBq+Jc-(>)8FSc$OUjFhktZ2qq8kpnZyqIM7!M!mGv@jU< z4ILo*cZ)m&lku4p;UIB1&=|TFz46+ntFjv?&)5S~c!G7Gu#50x>=J|Y^thYK$SLfq zPewoQ&l(Bc)1!xukEN_hB)u2GBd#>t5ckn_%;SQ9!pM#{tVaL`QP7OawSQ$+M@F0y z=Ix3Jm`B2ezLL-`tBMJJ3AiN*0B<5JzG3|k7?;`>U(vmtYxwK;B2TF=p$@=GJ%7=9=guJJc_EbfntMf*fbwG5 zIserFs!Ia;HYwPRDg>9>{oh!mCZA{|arp8p8ra0@c$STSlq^Y}alF&<72O~w;ID!{>ZyxL)z!Ly{!|Qw3_7BK=hQ$t#iw)`o|MI0J9CGTy z3K2_#x$g1A2}K=e_wz$#Lc)|T``0{aJ3nFzK#t`-U(}Xpep5#Az1oSiKnGp@Avd$^ zqM{T09|Hb|Mus-_^=-zh$VUd;#V{j7Yq#`o9tIP?agPt2AjcBGTO7mDI_s7zH}tK8 zK_A9zCde+{aJ1`6B`*{IjJ%NjhsB@kF26Vsk$-FN#xq9N4i2pAAMPIv&a)%tTX)*r z?(fWCp%dfQ{^7M7M%Hc_92)Ay_(9ZW8AB$`(i&o0)wqW{ZMJS6S$pOd^M?$tOLvN@ zq1cywG@rg0W%}5DmA;aPa5VI51Kx`E#^WI=dUif@*oE`0zClr_Mv%rcIDg{QR*<4CH z{<}nzW{On5lb?iUZw@X5G;@U$16OF$Ztr{{)r55be04w*ZG0hZJyu^B_>=oW_O9ka zY!l?N=T@qAjJ}YHgo6^U{`G=&Ihd{zWzTTNy^K}xC5;P=``)SP5C@6$;YCshHioR##-^2yucJ*9d>BuFZ>0puQ_BcwZ4aqU7(;7GJ^1Oa zo3atHV)WC9a^R;Ot2vgm%avtDcjib>jEh@F9fAbe%_$K3yBZ&`7coN<<@}Z4lL+p2 z%wB388iJJ1|e!@z!H2Z!eeY80$0wD91upR z>5GXC@vxcBAq-(mCrm4>J7|#~8?|2%pI_y=O3{rlAG6-Vz(~x+e`0BAbdj!kcVcUBMQSo#Ak960 zO;5a7%^aLI4Av-PYsg$Ts82Osh^8N1=6^NP(@L?#Y-q&cPr<61_KGkXRFCbI^NN({)iHZqo)pIubd~peCVl%3m9m>UQl)sY5E2;p zEo!{ENlGpc?@x*sV*O!FB0y)S=#z-qax00%Agsd>SqfDJ=84vHgh!-|qvRZ70UY6X QDZCtpmBpcl1-hR7KT?a~i2wiq diff --git a/_module/ncs/nw_c2_default8.ncs b/_module/ncs/nw_c2_default8.ncs index 2df2091a162f053039fb9a983939a16ed1eeb17a..631a522690534e5a665de666540cf44901c2b291 100644 GIT binary patch delta 196 zcmccekohoEsGoDNLYSeRffEA*qq7_X5O63ku&^?S<(0=LC*~F;W~S%GrzFLvq^2d7 z=9BB*=wxp0&4^K}3*A1qJ}_h&NdP literal 61652 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 diff --git a/_module/ncs/nw_c2_defaultb.ncs b/_module/ncs/nw_c2_defaultb.ncs index 146034f3e05650e87a8265b660127c83dea86748..1afa53b70e02a53675f0f4b82dd22f220f70075d 100644 GIT binary patch literal 67993 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 z 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 V`8yXo;U18&TCN4iTsIzB`~M&REsFpE diff --git a/_module/ncs/nw_c2_defaulte.ncs b/_module/ncs/nw_c2_defaulte.ncs index 1eb987341283c86e154bf1f0117fdd19cca653a2..db0e0b52c64cf249a909de8f0c312815a398d1dc 100644 GIT binary patch literal 52335 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ⅆM=-`fo}?_RAZ?)$q{;5;;czNyvv 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 diff --git a/_module/ncs/nw_ch_ac1.ncs b/_module/ncs/nw_ch_ac1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..aab4daea2dce09da6f18e755003e3dbada1224ad GIT binary patch literal 200181 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¥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 K-hDex}1LbjEq-TsXGz%(0DU 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/nw_ch_ac5.ncs b/_module/ncs/nw_ch_ac5.ncs new file mode 100644 index 0000000000000000000000000000000000000000..4e6b5a8cece74c4a74f478c25d3bd3eaaa82a17c GIT binary patch literal 46470 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 Wjol>?2%WCZ7fE^gG|)=iYPf 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/nw_ch_aca.ncs b/_module/ncs/nw_ch_aca.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d5ad0b42ee790fb03e227dc936e00a70965a8f5d GIT binary patch literal 90584 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

    ;Gn8e5qMjJ8Zs^Hmk!rxqh_E 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 M^3^7&c=!DO0%+;75&!@I literal 0 HcmV?d00001 diff --git a/_module/ncs/nw_ch_ace.ncs b/_module/ncs/nw_ch_ace.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7ed9d641214f53efc453989d3384e95d682dd651 GIT binary patch literal 105218 zcmeIb3!Gh5bw7U2y)%=?OdjOPGu$K)-k1l^fRM>#LPnBFoSA?qI1b4qj3k+uOhBww zR9bDtN?R*Fuu?@!E&fWa{c9_2sin$aqee^Hw2gv_5;ZC+BE`V`zx%t^I%n^5&$;)` zB-s8wf92zx+Y&(qz}Te)hDIHbvSBjDx-PaS~=N)`4mf^ikj?+hCe9r)w>nilTni+q4akKfNzi0 zw}<3y)7x7F;MpWEW?gOB^nXa*Qztnnd)(isrBo&v5$h?8OTH$Mj)Z9kjgKqBJ3qnkHCbIT(Xv_EMt$b$3-g-y~E)Y9>>^3dPZbos4OgrYA9U{5g7sim{0LsS#-|27gii@0NFCzGy#i8i(0 z!L}1TzN6Q%>W*^+5{woi?u^Oy;=mpt5)uaSI*9-8rzpI`Z2qF4`DbENsEFKEpZGbE zn@GG8rB31AM!z7!vxQ)K2>AC9e8u}W%#?(X*3#sRLkZ2d3OlOCxOsszfuj*og|$j* zS8D0eqYKIzRUB)GNZ8D_tg6EIP3}F32VN5V44IxG#QT3MLLcaXF8@Ou(}) zAj%9)-s{r8@O6&7+CpT&GOfM0cYQ}!dtYb&y7j9%ds8G4Y}ExQNPMz|3r3@W6;bq3 zfh)Qc?dH_-vAfvV9JRG~^>=o6uDhncd*iwQb$#Mfbvsijzlj>0;YcWNS3;VjnLx0i zqkrxCjw?G?_4l>+T+!L*;klp$Ip3~k4SH%H-i%Km`O)KsOu};QnY775P0&?pDb?l1#4xtMT22E6Vjqf zOU-yU9UAFaziwrFUw>~$PuB)f2b)FbmqJdB3pATFFx0x!%GB`#PCDKb6TH*VyRdP+wzQuk4enO>2o8`ctZ#J}Am<=j~x^G=r6XFGpKuk@}L8I`c zCz3=i=!xQ|eJN^mps?f1vptd1=85nEM&AAnojo0$8~VD|clWRA>g{Xq?&zc_#3Rlt z@`xrVC~BQgs%~xwpvbBrfEDBfcO&l%@>Q`&`HSEsDp|dL?b`KM`+*gH1q->Lh;Ek; z$E^!Ux5O;am50cLz^9n)ok@o@O&Isp0Z*d}o+O1^eRZVX5M5o8Y{mNaxAL8Iv?8E6 zk|2uGLZE(!{gfb(F@g(e8+&>>yZidvJE%(6mrB?~z?@W)e|oG;5)V8K-w}eyVX58a zb!{7ZI#;*%bzJG}0ly~?>_kZ0HLzpTAVTZs$`J4OGB$-;(?Eo3qo=+53Na$nxnZ6) zpQ46sk^CBY2sF&03&_tJFoC(CRIN*Jk*CX2xz>LOmlX^)no5m1#(gxfM(x-|;#`uN zOU~RRFQ;r(v^T*Za#nNX&{L4&XJpV3~7(TU$b`q0rjs0Ii>4>3cMT z79*Dd-Gr^xuj2V(?;HkJ86Lb#VNvn%f|A6omUmY}i|!N`1?ghStn!$)$8$P;toa!~ zxJS`6SOXH42ZL4*fqjZ(nuN)U{0eJIyh!rF7kRC~RvP5MNdV#Nu6 zA{qXD8AiiJ9i-S4J4nAf^WYvAO2(7;UXf4v$y3VE_}!EeWDeuLR($30tT^%R7=$6o z=n=izSFY_`Wp*`7GPOGh;lgC#g*FqdO>WiY2p)U^UR+u-?Vr%ZMLR(wxnyq33o|We z{~3AxWI*<(p?4qNn$GsMeQOHf(LzKM2t#5^p7jBiXI~Gf#e#0B1Ic~6OcE>rA0{3+ ztHjbw7B53O)J4PFIizECgkI|JRQ>{VKGCD0+MNiZEAEDn=4*z2Jzu^@D+w%}GnzrY z-Y**GzaL=bM(94t&2Nd6?xz5!CJI^Cxwcb!pU0x6Jf#~kpqvy_B2{4s?^2j)kCugb zk=RB6vv#0-1(|%8N(8b;7q=jctTKMz55_3W=@2FxndEIg4dQebIrAqi=Bt;BrU7$C zA`oVHT~`%)0u^wHO=*p(DXD@;_yoP07hPoK6fMd;gG`uG2em4_Vj7nGDS zuM1fY+XLCt&cy#JRDZ?&bJjv4I+%m#Ey*D284=;cgP6j4FpB1$3X^z3!pno!kT@*n z#trr{_o!3=CEH&(UdvDE+|+xt9tZ*I`#7Ci{`WBCO#CW20STTUt^2sm6Twu9z#`x2 zd;XhQ5Pj4ANhZ1kPni5AW=N#PiR@AR`tz$XJ4ewqX%;C>x@A4sjSu+ON9 zy;DpbV-CI0Wzx7-j7_4N>)xsPdO_(bP3 zr$XvB&#kDR!{DnUTadm>DqlZ|e^VxjcaneV63k%a&0O9=KU?-Ew zUD=u$kf~MXR!l*9?q6M#5e>7=m`VLA2x&D#w25P~jyY?}D(T!P#=FNT{F7=6KZuuE zLMi(KFUi)WoO1jxTaS`Yf}|I7vlT;tb>yA^Y*g(3PO&&k&NKhF(N;CDze^=vnk$JD zIyN3u~b|xX`s_|j%@_MkQmSv zjkdiBZD{S$=IVLjv6wVk98j?B9Sm0fOwqdprkf>|5Mb8DUlXUxAn$UPS|9+!{0%#X zKVMZ+;U#9BI>YFvtRcxbq-1dYHuA}M#>g=Ah%CDDQMkTV+8~W20GFm4Dm2}gnJ)35 zzKrWB@n4a@$ZPYlB+KTj<6A4IA`^=aT3eQ$B&BhZakKP9Eu9?Hou?3<3QCXF(r*N% z$7$)qLFoxv`iY=)p_bkilw$l&dVf18#W^U8sCjMsp0QtGx;dg<=;c(6C^U zgd|gj7x{MKksH?X%}>?}4#Nv%12>^%F zm0WUUj&x9l8F8}?i)Gw`+E$BzpoI8Jb2d=uak)%~3)v=EbkAv`y*@bL8q7IV_<6(y z0QwfR@$K{3oIu>oYI_Vr!4TI7C}iQ}+44jr8Uvamc9f<{f8odMfb{6o z(o~Fy42GdZJopdl5U{Jx`<^=Qm&$vumQZ04LiP=0b_Aq@26)vwGLE0<87m@J4-V`c z-qCl<&OtcDr0WNE4-SnCZr^RoBL{UCjLK@*YueT`uw(1sW&u#Mv2MEZ1#QHO2rm=n zM9@{@4(rbF#UcN$Aow77VLclE$y`4DyR^B0ad5YZU2F80#t@3ONNq!x&L}$IEe%X& zqa_KsD4B3xVrFMgY)C4_*&M`+QbIS@u`>&X$s8d}nD1=*;Sd}9LV41J;@d#9Bm>g; z7Rl+TQ8W~qmuTpvzJ`Lfo99S=A${`FSR<%OQJVYorTte~^B`$jKM#7n_+Tna>#hMn z=(AU*2KE-d-I;?ktBddOxOzU_Va3)L=U8pny2oq%V5ar*pmk1C5zq2kzd6(T@}RX$ zbO*SjfAd~U3*jGWJI+v|ci?9!<^&e!LyL{bBWRbrd=^SE9@B<0z+LL+eVU&flAz5i;Mb3Qp z9YR|UCBA+Skt(;rB}rPL;7bdF5{Nq!$-Qw&$;gliBx&AxImn&mrY`#W+PNid!pD+A?bO|;on1L?$MDUkodH4q6xn)O|1b4HJBaTF~t!^RKiX|pAFhb#q`p>J}FuA>?h*Bfq% z;x*#}EdFHRDSdOI9QqSE%B00*YzN9ozzz*auS^3K0&IJMUkINVv*e2dL_ig$IiWJa zKBg&$Xs4huVF9d8IRHn{y$GciAcg&F1gR$`vG2U@W%PH%Bq+rYOtlR&e&_}mY;xhh znn~j$h>_g6t^0D!Yb0VHh)$UwN2f&7HDVf`AmovP#CU{%$TMDoKVe)%CG92l`d!h! z!0;YXoahuJLTZ=vR)8y-QO*L^eZ$r{$UMis6fo2xtJ#c@|Ef0hu=Y=|u`1FZ)Y1FJ zT6b>>jB5BYZ2j>z~vW>N2qU}L1ExVFJmF(Bb5DOdK8=b=Et%9Po zm;%2)I)&D9K&-|8%MR-qwt-;4t9DrUAqG~(T~>Y?{}aWq!;<|#rk-QfB)~X@7m>wy4G7xS{KXV7Q2AGxpO9In*r782tWMYj3?hnKj+F-t?xVmUn^gKH2#HybWMh@M2GIgI?dolT^N3v?5HohYrcINx|ExYBAX=(k zW&=r8YeJw6gjUs+;0r)Cbs=33Ye|ArlBqGVy{uQ0Lvu4cWm-RWyUL5g@MDfTS*$DA zHI+sNsmt}9`eE3soHty^LM>j{%hoJh*vqY$yRcVXlNNHKZhw)EIkYL0DqKjVdKv^5 ztiolXauv?47gg`0$W|p!1q*h$b#oT%vh@lV?6MV$7VL8C z*68SSZZS81LCrJEYVXT6t#oP3dtK#>-n&GE*_PB>@%YFitzdZL)rdRjlPoDe;rNZ$ zRFxzf)sXE=oefoWd4=yhAhWwG6R z?@^!o-s2_ry~kPZdymiD_a4`|?>!mhzV{@O``(j}yr+)W^>_96V!gLxO;`67sg$LL zv*5m-E_bwRegB%SRkh169zN)LY3%gN00JJsdQ)}CMZQs84I*E0non8=8MWBo9 z9EfJyIn8!$=wH*`>;B*8qa|GDSa{#HZr#T2qL*0V#{T~-Wam0)+0(gdV@JB95Vk!@ z7FQ8EIYg6*x`X2P71z_$7(6425Q5d_3>HVH98fg#?}VzqvVeq%9EY*=a5xkp;TQw> z!-&#NZkIpbAnRlvzJx4d2W zBe7wMAo=$yPvb58w~Q@xf|HgBSl$~yW0$F>bea!>FoD#23Pt?u&gCqcnBxS9_+;#T z1m?Mf{pQ=*{3X_Qd#qXcKt25I(I3y&sza4a07hR+k-k?=xQHs-=?rUjD*F1vFFav; zOe_@T{yJKFoD*&3Xhk^A`lmAu3WYm^zhD8$F-#s5j-M5~;#-KGa>H`7YZG6qlMSMh z8^!GKBXlx0nb^QGn}Ns5cLQfetoF_AJ(&w#;h`@qis1AHuyY$Sp#{a}>s(Hi6oc zrJwbv6&M_6OW!0yz#OB5uBLu$*Wq{B3oIb$Q!FR()GaV|<-)RFz_ z+r&n~((T9i_Q`+C8ZA2a=BVjfM_TLR{&l?_!+Um&4DOc?jp6h0vYJ|A&9Xu<-bi{_AuDvaLf0w zB0l#K{A>}pU7Ykgd{w*2tZ+-fVHvluAxI{D66nD?OHHD9Ynb^2rF=dh!K`$Qh={=w zK@?n{ZIK*%*}v%C#vjv2Z7}hK=6@wxlF<%?PNG9CAu5koOM3~fw#ZM)iagzoAi0E5 zh4@8qd#T)$Wjq?GSzdLtG!<>F($wjmratezeT?LU+R6q7r|MrmLGyl0B9Ti~*$^h= zVpxmxPE19cesst*lY4abtAagyaRO@oj{-Ki(I9hLc7xLRu);E^iq+D#H#9lm*x_JIgfO=-^uGJpd;ikc1xGa;k_vON+!#YfXEkwjrfKiU(ckK ztTibRuDQiUP250`LJ+DH0>B9~G;kiP8U1^oJ!Q!}P|*KZhNaTn9Lh-zf}(`X21Z8v zv@TE6(`J7v+!GSs0?Ah;_7+LO^*V-k47K59W2g;h7(;ECbiLZnkm6|?`b}cCQQ;TA zA{oFf5DKPam{i`^ppah>K}49VNz@p6Qr2dvX{%!0EkXxaI3NxJTNh(yRagz5UUWg# z?2E zjjLDVy1Q=7%=eg}vm=(U-&~C5$8=xae+BklLQSw0*Oo%1FwwfH?2eUA#w>|;AeZT` zK~yk>xeg}krlcToPo7J?f6H{W=rye6@4;~6Xm*3?>;!0>%&z&0UBi2J;@22*2FBgf zJchCh+%$m}PSCgox{bYNsr^@A31maRu{djC*k>zwFeMPwO7i*!c5NMWSEx2hU%Xi7 zOFo?1KJmc^ok%Ch{2n@2vLQQ;fRS|&AYeX=OI0@}o~t_zB-cbxv+8{A*BtFh)#d`0 zLLWKW<85utcB25ua2R#m7H#BiV7DT~#b}vI$BmsUE0LoNXq{0II{E;6I<_Xmx#3@d z4K)9r_7{p}sY<3HEaK}~EOP%`h~@MU%d)Xxk!gkumPw=4yfl3_#B$zPut*ThVtH>4 zmTN;S=Z^(Tq7Pp$la^IuDL)-zxnL|I}L1HdHUL^Bdt2v2o%pft3A1{(q z^7>*~$UxujFK|cKFq$WMG<^*n5vLfFYnV@DUwRT>T1o~NM4vIKgkHUA#e;euv-G*F z2Snr)y%|%5q7ziM{E|c$tQuPq^jJoDGYA`c0y@u2qPB$^o^FiM*+r z{jPry%Th<4^D95=Ax#D6IzF4CdyUr(0z7}oxn2W}p759CAq4$FAGAn6r`9cgEfXkf zPtd$q<_HyaX_}V$mlEG78!?a73uBA9Rk4cpJW#s?6kobjutw5?+M)4c(H`nNqK9^ov5gQ|q?aq=fB>-ye4!n->ux z9OGy9#1>y6OcBy#T`Yd5QEnZE{iY;j%wkb{zXO{$W|0w^RXafJdM)l=cd$?S{*KB8 zaD<*$9xZt?q}=j|cpg-BTC9LraL^?a9Q1E=MPk znw8PT*;6M{X5fm7ZRE zSSfj&p8hh=I96+FVdenp3e6#e;;)3uw!DMr>)oV8dI5j?6>e(bS9}eB4HpbN7pyv4 z8GR}3^)D!N_#vMZ1MSs{S;^cJy0mHz#4k2w)_QFuK7qBYw%H3b%T`-*o!Szj9H;iX zUS(x7+*%wOrf=8^H3%2*EE4nt4*f>s^#yWh*jUxglO|E4UX}9nF)Evni_4NSP!G;V zWX?WxE;M5mJf}%yu!tI}!qAv1K$26%&;Lu&i30;l=&FQ`HY|msc@E?|Frd?c53)Yg zUSAP(;G2!TAU^5GY>0Dj;K18_{A_D{fwuZM*#h#(fn4p>hw}P6+;DON9b#V%XEQW> zLZr3&J980KbNYB{Mu9_3BrvOOT2zO6YIXw-6{H@%94UKTUcu*5=T;fVYA7HZeS~5? zWe&1qtKoU**07uq`6X>0kE-?wQxW8vA6aAl(X~H0+Ac-0?!X z;*)R9D98e;tkM>^;*-DIfGfVicR&B%Vgj15O7FHmzjqU#%uQEeXoO=erRBxFg3ql6EzqD zv}Sz}NGAvR?}! z`_6QT@-67se%|pyI@1rAXY8pVXZqob>pN3f&d2EVLy!>x>Zc!{(29~>x_G^pM6NFJWx0w z1#V)6WFYipej>2U5Q^{PG7DMY<3H(tA$|ONR~1-cEBS#I0`0;coE3iWn)*Io+U{%C z|2O4qxobKkwCD+(z6^m9KXbhsw&r_x{J*HveB$})PBZ>NW+lT+#-0T!si?xl1EyIY zamT6Ri7zXn|2sO(ylm4rg9{ca9>JIX7 zEz5txwFS#+WE%4S*FDcSZ_9C>L*sKEQAL6Ce6#P@&Qt6>Pu%-LI?tmYEa-Wr)^eUl zKcpI~O>6)K@*5)?zg zAIKQ$83!}|A#UO&z4G&rUCfJ~MTEtd=*a9@kkpByOn8}o>FfXfKk8cj#$e%yC``wG z#Yx@c>*!kVuQ8ji3$V};S%G-nvUll^`3sgt0G54No~GHyfsO{eWUcQR{=ZW%86DmK zlcVS*tBm&C8A0O(IW+6RupGzneVI6MbfyIV%QjiR#)xWYN{~|jpBblof`q~z8Z_x& z_2ix{-{>?%snWp79oVbmrZm5yn*^*jzk^9l{1s)QVzQsJ~kU z&O`I(Nv)Q@@Lj>JPN9PwrO0IlPaU!4og|eOVwf^-9n64)WQw>AsS_xPf4EHvZWR~ZSP(3tHsLe#vqdpwRMAM&Un7~J1#$`+&yt5t?P1pO#l?l1dJz%0~WgRAt_u)7u z%HPT`f$z|ag9%9E`}LS8f51l`n3EjPR!x-OP@9Qzusx7WoRnb#7mAF7iP6zNo>GsA z(*7(H5Te|{8)%~R>Do+`{JZnH6`_Q$=LSB3drrp1#0S>YWkNst;be!izp`?EEPW!m zpN3uL&uTLff6*6)gBJf`h6#LHX-Tg;Wxdzr8`1<$uT7*245{TL zM)X!+LgWmmf^vA1+6C8VmvX-faxTHhk!S1t1dJ~t?+SQwU>fEE41NfGX{HU4)c-O} z*w`dPdT=hCZy_9lE>hZIJ;VsgMI0i^_?1Q_2pPi-9gz$_Vc=|^^TdT2vt`7vMRIRJ z%jy`9@`+W7q9=pOYH33T_nYjTR^wBu^!!fSW1 znmMv^nNVg@a*=}6Jz|3s{sIuGVZZo%NM#67VSZzAvYo=lgjCEw#R;f!&o&xI?F+8?&J# zesH;|GQ0z2UNdk2l+Ts;IzCq}V~Q%Ckfm#qd%Pc4Ux&GqwZG8wtdJtz>f|tPz3o?YF0W7+KrOTzuP}pI3(*}c*3VT) zVRQp#CPkL(PiF*Kt-6*q6nEmx6Q?`nb(a?UE3x zuT_%_$U!e%x`~ira}dkQydw*sMh0`*v)^T?`4o9xUg8grWs1CIRz>eU6Zn@w_ml!! ziQ3tW5zVLs4DXdgUXMz*lt21%(J?E_%{ng(OZc4XQDUhUmBNwJCsY7$s=9#Irx`F<4a+z$R1hFhp0VOPfUc)^J z6gjuMTR0CUX%T+3m(~0ICQ@NcO~kZnHi4I1rr`&a(?^>webFYAQFO2`imoWpK`yA) zlU{@Yd{*Xyq4)13WRv?x=r|gVVb*~=hv67xK#)fij*)W!L?#@IXvQ3lh4LUA<3P&q zi}QIA1*auSP%iFp%L!oOpLsXCEh}X|u%j0cBZ@XPb&Z@7%{?^)C^{1S4kzV{+Q5B- zq{;XpulWkN84C|{pICAPhVLM2-HY@!{)Sob$#B&)B;6hgJ#YZ-Rk=~FhKP#&o!$rSmm=hIS5IziqI0+wh3H z&Li{PM>1a}OVpdN__d4O|MZNxpF%(n#AAAaoY5K}wP7&L^v>_jRleG@C7I*B+Y zrqZd+$~iN*SF$s(DLs2o19u0p<`|d5q97Ay5Mv zLi?C#!?3jmv}S=uc~vM!>F5$|i!Jf*ojM>k1y87{;3*C=;r1JTJ|CpJ+%BCE1nwD? zsnYho)+0zFK4KHmeBaQ(WxgSHguv>7cL@rT#9nuuVb_k$gRjM})}fudcKSCQGLfTI zqk2{2Nzx0hy=hzRwg`4!Ti7;fdqB-get~Y5T5kZc^0%3&^oRFKfB1jeJw^O^IAs}a z(3y!pqyp!M)QeIH8FcU$Xpb+^VUSMN^;iWy3kelq{3{=32#EanT^^C596)l)nXr^_ z(c!V}`AYDg@t5doZy>V6v=WUk4+pPMu}Y0oQ#EcH-aP^f_?)EVltt2BhH@kYWr)Li z!5>7AA77UNAoL=-bIi2t&d7S9lDjWSuEBP@PanKK+V#U(9d;wHcm`#0z~9EhV{ z?2vnX!WQq&;6N1jT1=;c!WRAwIu3{3l_6ABa#}3S;IK<9q{WJy7Ez{!-5en;Zmn(+ z**byA%I=F`i&&y&z(;gf28Z1e!4{>w7O&2F#fw%r5Yv9rLjDgS5AhyvTs9V-i9ltT5ii`L%A5eP0#r(_{Xa%u1tdg`iZ#CscH|DXgd1gE$ z@1N8djWLVn=Y_MSeIkP~fAnP-$%EMw z9dFE1Ev?94%pW~Aim?Hy#+JL7RP#r_jbdy-sl<`haXQKHaa92vIS7dv~CTAoH%@Enqo${0gBa)=@p7> zyT^1ga$`*->gkvYLEGyKV3meDhh}tZQa26YdPyF*0m!`G_`kad(1Zcp6p`$(LRVOI z4e)s?cl61CIkor3p>5lG24BsBF|;rAZhrIysKuMJpbiY~6&4U7~(tQX!z zQf6`nhTT5=Mw*gCNJ(hbsd^s?tX3#=b{W4UMd-HmB~uAdJb+)A$-4;L9QZ;7{!K&4 zr=tyt>Z-w;hBgg$U>0TFfSVzkw%eKJO}mHiS*CDqMWMWtt&vt36h0p#wBp87B!>9= zz+frlNiG?Ewa*`ABBR-`)+)c2ax;_l~A1w9%pLQ^6DL5o}8%}Kr%Vv2@)#7s%& zzx<5%pkcWVn3`rdqSz2tkbOdaCpRUWPA8{l7y$q?eeq!b=HdQL!`rVP80p`&V>2L6 zELFf{yhwJ?K)z=+Q@zQ9bE<3Rs3FvOp7c z8$S}oiHW)oFHCRWF|-{YzUvs?zH?xQ`{a=0#WPi0>Ui6@Of|W*44QC@-B(Wybw$!( zwmz#R^+vv<21}2MI#7`jX`!cL@Wo$Gs^oPPbgEPdDWI3z%&#uEZ(ZY4 zdn?=f`g=Qix;FHg++e=v%bYUoL4=*qE#Fw!G<@^GuFd+D%+Gj)x8o8F{)8J5)rMr> zH0&N|@VW86lxYdPx7riE<_2$7X1ADfO6wE< zUiAH}8n8PMFXmN-c2@>>Y#!RNwSo_7?AVMAhTAsn*~YJ4?dHZod=YmiB`$k?VQpa-c*R{t44_o&(U(cu~|I)D+!-fi=UM1Q^h zZ|oPCnY!cV{!L3wR!hjXM{OpA8?9pZa&vS%A7Hq|lKq~#h*2*{fhBl02uT|Z!Za5N zr*rT%Ky(>s39@dFbtdONjj7U~U>_N($Zj&}iDcPJ)NK2HJ{YW`^S(px^ zsSr>Pg?Log|Bksdd11a|K6O4N>nB6dJB^KdktST{8MO48E?_jZ?~Ee(271c`KRI_E zv+aT~Z1_gn^bPw(kJO!9<-av!W$E7{uHPb=%p0V@MCZW&;_q3Om@v96{5$urtlvJO z-37p6b2Y2V_~C$Z$`32G?9S!X0mgKRQB7%ujy8wyU;>1Ui4gI%`0RkE4`g}zfX~y@ z-!~2tXK9QlfUUt(b8wM=K+h|(^t>XV$M)Q&0irQ_0JauA(|j3wvDVp?le8_-zK;Qp zDC6xJO5^Q5r9Z!ae3EluYf#!WScg($~ zFmV)S(kq|Hn1etU7jaqDSY0IODx;+$6XB6A6u$T8W}ac)syPqWzrA@gT?rwPY3eEb zh3>_kuFlG9*`9-BI863)>R@ChqLF+UyuGLI8jNn**LE5Nv`FUpyzIApmc#%I;A8*; z**at^{#oZ=?j-=qHoiP>3eJUbf75N30s{2}^m@vl8&RWk1Q|i19U@v5B&WJQZWS!$ zB?zIK1BB8Z0mQ%aG}{7=VGdGq%AEt5tZeV??B9^er2l0bh(WT+Wf+A=-_5Yr)U@JO zbWNOuv^fbvhgFNp4FXl)EDH$n`-4*C5RUTrObLx_51d|mXMoN<+H?WpS+++hpD-mp z={ETvAjwK!Lm0oFejSJUIk+iFEc`VBO{9f!t((2+>c6_P zeZ%_h{#EVkaEy%@0Fka8n!X_yCysHX!YVtTyiTrzlS?+u1l_dVm6_=eZD!oy>8LM% znLM3mNcc37l;&3Sqa}$%ga_lq2mv~tN0`vPXZtG5&x4K3K?Lx1Fr%83AZtEp)zDzy zaL@2Iw|})h0AhEB;Ji-#Gm@;`ybe$00Q`Ddcyl_c6F1U@w#$s8>~l^<>Ln5h;n@~H z53fO(V=_!y*qcH-08fyYO{9vj*$9SA+pzUQIc`$jFJYq7>QlD%gFKwvS~(R0i#{5Z zVhNn3$(|P0#WFQZWqjuXl#?}~Roj=})mTOj^XKOtyR<{Zuqv`2K5k-hZOb`#-4jepj9MJ$2qMmG@pPSzLm3Nf}Kd zGd-p51W$Eg;hHb!thtz!7^UOj0+zHj4JM30=}Xw9-X_pH^tv&*IcP`Yww{3WOBrNBQG+c?OWrFF8DH^Y;5a!LoZ zxfs2Eb8am+g1xvSKoRk~xLh zWKn$J+pz|Bs1lf3vSaOKB5S;xvi!XBmY=tD`LZR;mz}?y#bPO-(Zz_@-~tDD`=U65 zZAIpHBeWAvZNkpUfR%YSwfEz`uC!!eh_tJ9)f(8pr?-zF_e79_@2*|naV5UTP0_*V z(mN37zh*Qv7TE{`O(d%@zGp*RM8Ijr*0WP&QA@&-j6`qG{N9u3qPgz|ES$(sq82;R zBfc+kt139Sx@l-&+x$w`NM+X`4tDMu++7*4;>wMKw^T-kE5kbncVL;tgG5If9o;!2 zlpt6R%|l2$KOt$_^7AfSzHIUG^Oh|?fBCWt#6aXjI|_369~30pxH+<{T%kRcE6vzV zlQ}1p?kbSmB)K|5uCI}9T8z=+0UV9G2q$MxM7j)!6D4-gSVl*e4#*U3({Br56euDR ze@%iZUcx;vO#{+6N&=5pA&fd{ltci-caz=9Mw0XT3!+3t@kG%zAI#Kqnf*jJMqS^% zvDb*AwS^V=3Vf5CS?SHC`Y*hZ{U;?o^a`-~oe{zpz(HjkKOc zvLY8DF1l3RQ8H35)=1TvGBO1XU$CfDP*dh;lCGK(0QHGNDosZV(*;7llbOc9r5E@i zP%Ip{9fR8}>?DpWjHMy4af$jNus{lF2o$gq0#Vs@NwfYlbYO!)e#9jAYb4@*`z;?z zBTPOlyGCSM)4&Xet#$PTQP0R1uZjgt z=s;pK^wL1a%|ZT?_5!lkHT^g-?fG!62o?ts?3@ou1S`+g$YasVk@NnNGtHlN=z#xz zjbf5SA~-l>x%%x4mZ#$#C+sYwxOXr2KZ=Dd>v?sq)2ug<^DIV=9EXO_f+l||*2nd+ zACeB~F2zV;bQBbWeEGT5NZm$2YimzO??1>&OfihVsSo2pf7fFk9eaEj8Ls8tt)!O# zyQh{k92xhX6Ndbqs-uMB=bPOmYaD5s7jykQDs8qoAFVg09ERvEle*$N7X)e>tBVA8VV+daago64hTRIqy_(EEu5<0+IzL3Ew zJtTfhZ3l}6cjMTrziUQ%ix8B* zGAzRs#5)3F+$%jPlj~ul4F0rd$CzTSU_onPC2$MOTzS2y44wkln*1qW0O_@0&|-Ev ziGbl5hM;&%HC@6d5V>^Y)F~1^TV!_zI0MzwIKR_81^>?X6uMyEY#353lFS+ENwQih zi$kJ6*-8d1)VbR`D`U1Y&a8?}8zWwYoKY0?%L+D%0z?@*#ZR-`rLg&=+kiE3QyCu@ zJ2@kE;n+!9drp2OTzy*?BDHA?P%}rUf*VDd1X2cMQ zg7hpmFNMkH=B0smw*(6biLj4lpJ{f8<@%i)o?$vS)rJm3%btDsR%vGak#(f2mU-zmI z6nX;ob;oPJt0r;M!_I<(8g2)EIhr1coHQ)X!+raj9)3!s=>BSWAgn05_-A}WYH#(V zj5q(0v?(cEYx57un~9k>AHkLs8Pub$iNnRg*^zYa+q@Kzoru$x3QN2}DuzkjT$kxXxnT?|M0Z>`G2KBjE>-Sl7i| zoWHsFV*eJw{Y-6nX5buNM11q$j*-gH4$K?fFuZMZW&7~v!OFmvk-=S+-GhVfIKe=L zChYDW9v%JDdqmV!`~giS4mo1tKNl|l@8KtQSoeXT^cXGuXi#dq9+F!)DLd>JCxq7pb#0Hu=AaZ8Cb4dJPYMMb><9eXQvwJS--J+Rex_EHZ)SS z4DlFHd%M9%@VajlT&E}bx*y2fa-R|g-{0DKnt+Y&hJJxh| zT-o2#-mUxX_A&12!5n}TCIp7AIPMiQnEhiD2~94XlhQRxo#B62Tl}4jr=!c10=FF9 zUy}ke%EP8U@M0aA(Xo~IQ<%u^kGKP3UXsGX9h6WZ|KCP#P#cYdW$4wCZ{k( z!GV0_ZV^aSPD;1U*DaE6U*F_P#|?v;o)5#MN6wGn(#+z?~((< zYBF9;Po{l6L~ZcQfo=sms9z*`itnLcJ|QDH+@{|R0fmH_vD~1|{!AMropsxwPJjn^ z^V(ql6Z|-WVAH?EjaWfjmD#XQD)o^Nt`BrJ)XKj3&S{i831WazYp z@<^A}-l)j6H#R%YVSniDvGZo5vTkXrxlhTR3k%Ef&c;RN#7ev z2GtG%Wfn=*mcoi=&)P7yala7cikygnqv_+wS4pw@13bgp?5p+L?a=>Z$*c@+3v z_AFH@GzWUJd<`)Kjn0ptWh9_u6p@Ye79=37<+CA6wuiw+v#`xpZY}eikmcLgSy(NDo`1O4~vWpmzXL+v%sDP9SHTafX~_ zhOC(Fl`H4iSDipTi%OO2(%I|Gr(_OmtU@SovU>OLlW+VI!IK=oK?fLo8%pLRbl*0s za`r+(EgOLz2XNB2Gx1c0BmikMh>?0&h}fy3d4i|?7SNC%xPb}c$%&Z>7YR?0pF#2e7-$dQ;V8&#W#Y5nr1~nRXmdBZJ8&1B+ z(Flp>SE8!Uy5z+^=@^5p6p60a_t{Z_YA>KDEqM;H&(VHajkElUy6D4xnYmlgO$d?I z{W9jpC||h`NqS{a&j97l1i1MWge(V8GCPXIGU4*Y7hK?Y_2)~l!~KMsO2~Nh$u@lD ztxOKl7Z8X}FRK+Wytpl%ZhIqtXpa${oTaL?P`{ff7L%idYKN1gWZ`0hr{k3O6sIM2 zbKH8X4jgXQ^@`5EeqLMWX1Sp8mDjL>M4;v2t}*eJiAriBjAI#6u|;bIBme;+LP?r*VOtSQ59v5zYC0b1E8*r0&#dw>REM8nS-7`A+^JG;8 zDZy&Dz&!=ma1D+0Z^g3U;>AnkBD45<^(;)?xTGtBYr6z8o~q@-#C4e&U@=irEHd~> zx()AiD()n{gg5iKpZU^C1V{$7M9EV3_eG?hU?0KQ8%v!Rz?)J}+ou@=-b~|C=dQt# zT|^kNL|?q)i|~Q-^dgR&^Kl+!S5>d1y&e z`dIE=1zPX*J7UQ0emR)<$_(`~mH{PJpU(sO8&5Y#oVi2=!IxQ9oqpqEbl3?EL#6uR zyz5nw*i5nR7A!*Fgth45UHI4T%9cIb+>tBWBh51ndv;PWo{EED>eK=k{<=hlyCF;+ zFp(CB@{1ZqO|3AjBUy>E=ylneDaw@B zr#9w#eL|y~z_ystAOcAh@73pJWcqrYT9#2FlP7%Ya4Ba9E`o`;?~$y-q3bKwuU*x@ zG;MDSqwp~g`{{b!NVswKDaUo&zoqqB?bd&U2HMMX-F9o#Na#^&+V07xX4#QYvnHix zvVHZysF|Iirb0wU&76E{&N~8XTD|Fm$@bL;qvrSwH7k5-THlsW&G|<{jd!kMQugq* zeL~JOb*oR!nf%A8rY6}}KTJ03LfL2!tD2g;EuR|s0*>?}y1d`86;Jl| z6-~6So)|UVnQIR+0~87Yu1Jf=Rudhds3iSUX;?qKKcDuCjzE%=`cg?w_|G)tlOAle zAx6{dbYHKN7UWYSQ^ezwe3BOUm>XF3l3G-4`oA1f6x@8Qk zUN9zBhsIR<%B*1gQ|d@_t}hVGk#r#~&8c9T-kuT6)-ed?)nj7y+%eTYdrY;@$%;`A zrf5KIKA}L2N7CCgc^jq5t1@EL4`4>>*|!Gf-gJ8bIY$!Un_iS^we;5+a*op=DdfaD zW>e{upDQ5eNMd%`J6BO!lp*JYfE?THY~<`HAm>PecKMi8Ix#-;tI4LJ{7s@%W#Ofp zf6{lQM+?X~lH8#5W{;eSRpk76K#trtVB~BlAm>QZxcFx&IngbS9M`q32#hxV_X5OA zD6R2zNAc?fajFiCBtDy$`@2*{zWcYX{bjh91)J8c?(Di^O&_t#)WkAbTb?|pqTl@V zXK*nhA}-lh8mu)db^^h0KWF3t>^fSKiAWiA$RKN-&h9A`DJ=RrO#nsYi*YUn(+0&% zk5A-WIh-6&P7ZQRRx}wL*77HVW&GwQgWZ=wdVAM*bhY<&icHt7U)3pldS&uQkMtnT zoa~=36d6J1p4}|<{_XFR4Qu5ea3r#-L7z(0WuBOKmJ7f7ZrRz`onaIp^hT={LlCOr zNTig5JKKjV!&@elG6W23`Qm#<_|%jg7&sMT=m=t}ZoHNNiYhF)Zd%IADq)mV{E|JenLvMmDs0ec} ztY}7W&sh~#jnoN7tlXYjz8DC&myP8%Zv;nl^L^#}g$RllACS(iyIe=%nOA%{5krzRws#59@|SPmi?EW+lrIV~k;T(3Q#j?jh2O#$2$x{? zX)VspO)i-6eZ;S1Grl7qApl_5m^aVcDEB*o>aOP5j zMxZA67@u7LEN1>6wjT`suyYgHM;l?;39cM`It9VIIcmYIRbRV&0Yl)|_?(vdO1Vk< z12({lVdyj_5GuiTgPsOllkn9!`Gy%AK)5Ms(G!{BC(heZzKhUs;uif(UrxKf$h6bL z#nGu~H(~dl?b~r?B&V5uH5YN6bmF_WL`OO|4{smZF)*T^{R-*4JcG~fqdtvniwJe! zbl9*3L9HBIOP{=FQ>c)X*tPQaS}C81HGGSe)%;84QNbFtE#SYb%Q~6A5cK&3QW(*_ zajWgglrbp+m4jbCh?fzNL~aqAazjH;O)cKF@ZF?HHfQAX(xL~-?iJcefDuYj{qNz0 zv^gn+K7qa*!njy=G|Cw`>0cpTiU&<79vJ}m@kMq(VF*XisBiL@Pl`p{h+3K}5zTE2 zaY9<*jps+7fAm$v0n-o_7$oGW|KfI39DDu9j{Z&CH}`MdgKymR5AN86wbTJzyv&NG za*&7y&%tXQhFb#+-*~<@hPj5p9p-KbK`>J^`usOOP#eKgCD-RAru)YePj6o z$xqGVD*>mP?tEib!36p zNf7l3k8z#gvok}arMacKQ1Ijpof~=)%U7=L#II&|?tV9$LH&Hf@!VJ|J}%STom9>3 zZy*rZes1pvNyDVRDtkr5py8#4t zYdU*6D{kXQ<;9g1?sU}Q{rl{x(sv_;)&H|vX$eaQsAu^yr-zcJ#U_=too`w?E>yUb0?X!4*8~dut zUlLD2O32qTcjHGynU!&y5?tyrVdI8Xn9~w*Lq8O3bEUVl&!i2@W#NfV#G40329B=O zp-f8MLH4A6FxlhKfKEJd2zQ6To%9gUJ38w|w)aKbOycl`d&SgY5;`&oPk(@D;*|a- zxOJ021Z&==lF{Gw3bbx<2i>#*ktTzq3*=ylt)`I0?ENArEKPgJqHmaFa~NpIbLwGn*|f zF&TnE+c;%#aW@GmH|@)|4ZzjoT!m2Mz#BZVx#W5muBjbtltma4S$u8`q=b&S!DH~1 zI(Rdv&u5_47F+-~(j^AZIw3a3vqNUyseL4tF9ziT-g7dVu(f?>1iHn=t^H7*?4SWE83M_Si*cJ+0xyQ+QdMmN5hG=!<&n+CS+8O%gTQ0`GwwNysH zw;GRb8vHAVsR`dO5}`W5P3!mI;be63pE`j#L*ft*l5^(}@T~JP4#94L=uyoP6W;`D zIw?u?NsILK5CawGAFFvlMRNulO{frh!m_BW=r87;oJwI(?oWeG82720->ZfQWR9^v zlHC}e(zkGA=l@eLA^oeNb-%|Gl*tf|@7|*=zCaehmnUUxQpE+nv_BGCtNrhW?Fk!_ zOI`Gl0Q4J^#jJp#C|cD_())7|OLmFS6A*q35r5L4S0mnMuYC8@hy~>2thqroM1SuK zdUW)g=a5<~L=Z2;&*$AD)K#aGHdvSlwVJkv>=kKyMMmEKu-@2ymw=vvuRg)7Yp@;4 z8w<3FW86ixWWVjD5`jHHXJd}xw<{y>ag4Nn(lerDnobN!R#zsTn~~TZ!dB;3Oh%Mz zGH?e;Yvbx`C0Y3?6*@?896GJ4=12#YKn2?7{W(-~WPBT8rG8BEGLj z6P^r!LSc}9gWt6~6f^}O^58(Y@L8H&$@K7&{QvI$JmW!E} zbE9GT>AHdEHZj#n@1bPiFCwp?U7qJ!JDE#{6MAySFVc&^F?GIai7t?*ec)srv}z4& zhuVh~q}nfCFNgI=b%=dGq{JwnS+T(UE%Dr;`1T6tmtC(})2c$AAJ!Ji^Tcf-R$9?* z-XNe6><0wwxSTebi^ z4-RN&DV`ohf2+D|RG!NXgHc@5jzf8cQ7n;+LCWFXXwLBNBoOaNqF4|QMn`Wy#pxmL z_G4TWHGPxXX(Y3{P3*OKCncopr2X-0C`GC=H z_(>J;=hy~p&9jY`w9l~5IQb=#45N?E8wUO2VWLCe;q$Oge@RCSbG5LQaW{Dn(@5V_ zZHF`=c5gTWkiUeT30dX8A%mguLx6Qd-mRkc@-6!P@G1zzM#YgPxf(_I14rp#O|Gg2 zscDf+xZSSeWv*57&bXO)iQzt#8SrOJM5F_SW~6gDr6H8yZB4ZCSA7i=p(k!KCgY`$ zF)!#O)mtUhnQlV^o|oSRUHE9t12x%>3*5N0>}@Y~_f?Qs!zQxW=gT5^Ki{(ubc6g= zfw7*X=dL3Wn&=8(Y6>m#ugJj{`I1`XSVDA}uM&~8 zP)|z^tR@)s3ssy?BJO91JNHy6#Af0VQRHskov)>dVp-R2W0r5$EMl3kaYzk1*kvrt zcnmzLwTf2w52q{qke$0I%WlW&->|;7x3jmmYrVuYK!TnwD2c@5&ypn&Vg5k#eauSv zdrR=qTxf?>+&_JJChj z(zNWFtr{Ba8}7k=iUJsOWZozX1$se)$sN0fM*42RZM-7|&2vd`W{knDYrJM?WZj-^ zjkZqa&u|@WdnIxLa@S&QbaQ_F8+tn6F*-)30dG*2_o|sbB;DRI=jdkEGtDrYnpWHz zMYHFJ)Jk~rgB0td6Q;+X$q;KGh|pp>5V8CLLAZEGhXd!Z6y!)?0e~xIO~{-=CSm_n zjo&J|i%7B+3CZxl5{X~dB!D$p%(<5J&}Z`rG{jt*TbU(#-DjT4_xlU$0fO(NtPQLN zb=IO#biyCsLR|KQx~9pgkJZDQ_Uv9=Y&I0FV=4ZUp^}>|vjL_M(XoOED`oBj%0sUk za5q9Xf-zb{j9^$qRV1k3ZALtWRL$(fWg=q~LG(~6f)x-+!y-5_MRvquXsRg&dz%qM zl>^DNZfFt5i#WQr@7y(v>v3FA7}_+jtr1nl6Db*3HJ=Bt1w^bG{}O90RK$W*HtTO1 z+;#H}gWIr=bL&{JN4FVvVkzsIO9i3nbQrFi`h3dhpd`B0t<4K<+bUYDcr3St+d9^? z;#IltbjYGh{fGou+}JF+N)oKiaPUf&`kRwG>ru2tY9nV8VX?N0&2HGyqDxD+r!Z^- zKq6hfdb~>dNigGkfaf#S4qA8!L9D$;`2KFJ<{gNxd9I4isIzN2{)J5sJLdDLbFvQl z$!SA7ckS%oJg^;GA2-=?03g;yb0F|&Gu}|DmX*&N-jfi-Pe%#*R6L3?&9Ug4NW$4i z)6xu+IA6x7zP28djfk-PNCx^@3SH8{8X|<^j5!qo*c2f-vdh1b0lZKFf4&~s=zCaY zZz5g%%acB$3E!h$ZuBwjKqob|gL?WtkvHMiVXX9_3}Y`*#*+E}7slvd`6LfUMTg)I z^CHNkF$-f;1P^Fv?)+K!j{ym3TdKMEA2SS2RtCr7^STu(-!C9xeIH6bYp|Mm1wJ1y z%usi!Qa5II$b%mJa|XIywX>DtuHg=5bt!KR^UhwtZWw`j8E9XmY@H{471fmZfmfDf zYJ?(Viia5W^Y%DBJ6WfZ0E!&pIZLJ$K)C*kjw6P`g^IbEEKWhdXe8avCdm38Y74VJ zEr-p*03WPQto1!45Vj+skT0;^?aY>M6X|NJ2h}aC5*vZ1IZ_>_<%JM)8@@O2d_JIH z=E&j%{A!l`3*5{xcL}Z5@l!oOyoZ1;l2wR%UFuEvhczV+r;5(yJ2VOE$OO-O0AAM^ zY&EQ@mj)n{F!$j-)TEmL*fZR$0~~$D!x-*M@lkZjci0kp?pRTBTCgS&AsY=y4b&m( z(zjqYjTJg=cc1NLXA2K4CYy*zhExLT)+ATWfU0IHl1&O@q!oPT)0&FKm3N>%H!UCq7D*54y-507odJ1*pxjXB4u8~A@ z;>~poRLOM=i@hEiYA!?7Ch6S5_b?M41&Kd;xCgikf@o$#fk2ID%HDBOm~r?1!G=V?p0LrE^v z(vJoZ&X>|-ZU{=TtK7joCgg3ol+FlwyF^PvD?t+IAj}MTd$E>=yj?D(vqHUfO6lxv z0cESTRCZFDMO~q#D}uUfv^1SQblFqCmWEusUQ0tRZkEzHivqZB(9+ihrLWV{F9)T& zrF3rSStD9{Q&9I7E&W1J`WsSu?7X1#CN13+lG3mz(qS$A zyo*F9oaJQzu2XaJJEwX&HS9tCy^StXyGBddD6?Kxx7pO`^_#8oNHlEcR+D%VxkQEL zD7sOWz1F(xkjF~Wyss-sjLp_9agF47U99j3Iue;R!hDXXV>bzXQg&&wuBhjIqmZxT zbUW~P_!_@<_K!~Bdwo5RJ~Y-Dc04!f?r#;Kioj};O)_whmk$K!JIzFCY( zFaOFB#keqis~D4BetMKJjn}rnT}a@Z;XVx9!2>1LhkSTXO(@$hAs#>iK( z*-riMLc#xJJOtLj^v*&|KRwErPA$arv+-b(2sqZ^Nz&_9$Mq?<6%iPXE831PY(~o{ zj6Ab#`*sn5^PU=y1TDmj(QL=(j!E89E%>(9LcV_fE9A@cRZU>)s|yKy`bY@O!4wr@ z`o(xKjnherMKM_qhUSFMXU0RIMW!*@phetj2~N_>&vOX;@9_|L)Fn9Sq(T)x`zs`H zd|sS%s$eWjvTn=sB2PQHW{s(Z$sC zlR`}8@n9;JUej9(F=0mdXzHn{F#etF?l2m&MHJg!`L7CjY8?-zV(FE;3Nf{e2a|Pg zV~n!JqA1;4NFYw*k6q|TpFsU~cut&{I35DW*}WC3INnku!FkWsBXEt!RT#(u1^dUJ zFpJ?D&DcWNV_$};F(+aNqdcN?8D`$|^*G5{PpO4zsmRQeob1$v5TuOD`Tl(+!NDkZ z&i&87rDq%p?<$Et{1aE_*b@EaTTs~Aal95*$U84Xzy6LzI$UY{@J>7VAsg*{!KRw>W$!7 zztb(iCgmDuxRfUl?qvP3oBpqq_4I~i?TN7QBWqCy#LSP@uj%TrjqH^uinxExoZ^@wxfo#zmC^3ht@UTkS0hjzji7wLvl zYk}{8csMdwoeGb-cON@)8ri##E9Kmo0>~uYyPuH2SFlH6NKwm|d{D>Ua>KIjg$`sN z{gzU1AWp0aLO1n>AXa8T*gkOCCShW+t=M5(+0H70$lK2P{4dOSz((O;INMr_g?cfYv8T$TDNC8`cJy+%LSE( z5bx!(OO}a;gJjpHX(G$=a>md66sMC0#@ToU*=SWZd^9}+~Bky36wPM88qT6rXEz8oCqYbe*alSuu?`>)~NMt^fQHQ4tnm8z} zanKr7j98b6-_@PDWF_2LV|(z?ik9|sy>m=H)9Kk5iHKq3SC%we0zaPXEYnmc+e8j( zXPcz_IvW3Y4OM&|=>`COD>Oa-!Q-;6y$%7jsRm0oimqKfoY}e!;vwlrOB$B0681;{ zQXhMw%43p2Ipx(30nC`}?&U<|goLqM&8NCgBoo*NQ&Jhu4ri{4yTAekVS;f!k=g}M z;AF7;vL316=Q5&Cd!hqNY=Ng!{aM}o1vbFwEO+HYUtfF2m7S~lH>|m)x2vOF4w(s? z%S9@N9GZerpDIBM+=#_$dbaB9>9E*|`2VrQeg^SCacDDr@nHYv;eLGC=K6t={#`pZ z1I)xy#Tm__SZJktv@swK$h-1rRefT zldF3D>>8|i1aI{Io%l^1;H?!>9|H2JM=D~}m=igjln&t?(FVdcTInHXM0a) zZ=cl#{_WQD69aspO;1&DP+^|IoI<-ocR(T=#&INdrUuyWMsAa(zBZ z;wARItN0^q>h&E^#6CDXtl^rR6cjp4g&Dss{WoqO$E9qhO&5_$*HR$>Ew%J5glE(O zRo3y08Zp0C(Mkos?#R6%!e*qLvv7bRzKBm1@fQhz(0nq90fOTb?}{~lN}H#7aRmfn z5PkGDA6^Kg_;mA4rCws(J}q>N6bs4rX}&Pr@i}%PMIV_bI_i99Tr0wR2H>~ zz>}jf6cU(LA@n=46e(2;jt50Q_Kh&BQmm_gb z<@iWY&%lnY?kb8F&%#5yBYejp?7mmO$a1!XAXbDydIJBkXDff_MF})s=QX}t%`t5J z39s?3VdJ%FFA z5?VsYryH(beyclQO$-(S#Z)~PuZ+7dI-sJWF_*M+Oa)fL^`ilE$gUi7rPEmoLDTtP z-9WMcw_)9L8%h?e_Bms!eRj>%f)pBHFUvHEoch%j3WjsYgWqe>v_$J3LY`V_%{aR_%iX>lb-Me75O%gsbq|MRG4~|Pm6~|#s&}oUHLh_5zMNNA4#5? zr;d!Ef*DXigrC-)0Yx1bvJM@GnmN;{=?o+)nz)W&2Go35(w^V+1p?AjY!(mk)cHIU~1%JV@IfCIK*?0ZbYJO*zHH$Otl+fdy>AA7&8m56GPiMU1FYOaiP7 zOkWvL1@Wk7VF6hQaSK@42L=|fy-YyE@33Gz(Sm12D1VK E0AFs3%m4rY literal 0 HcmV?d00001 diff --git a/_module/ncs/nw_o2_boss.ncs b/_module/ncs/nw_o2_boss.ncs index 57cdce63406defa3008fa138c277326f65226dcc..cbfe29291afad3883a6cf76fcfd03dd7b9c09613 100644 GIT binary patch delta 7230 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 Q)?~5iLZMB1wJy!@Kc@QP$N&HU diff --git a/_module/ncs/nw_o2_classweap.ncs b/_module/ncs/nw_o2_classweap.ncs index 354ca56cf2e5b7dd3a18342b26ce6c1f7887a7f5..100d8c1fed76a6bfc6f9019dbd67e68fb6b1c272 100644 GIT binary patch literal 76297 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 Bl05(b literal 71157 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 nh6&KUa#>u94|7`rB#jolQDCdyv*MzLTt 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 Ijn1z5AEn*yAOHXW delta 11403 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 delta 8997 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 w8FCXe{NGI2|EL^z94|7`rB#jolQDCdyv*MzLTt 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 Ijn1z5AEn*yAOHXW delta 11403 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 literal 8316 zcmb_h+ix6K8K2pkz4qFPs8L!~A(L1oF%&nI3Kgv?Vy`!jTgMK&8PCK4K1zdPim3Yqor7YU<#7)lzGRm9vS@Rl1G7LF+unRIZpVPDm%%_KdDMw+*lDAps#J&i% zFVHAn_gHUm^w2*?(lOE}<65Ru-4J#e|1J!fEzx*(b~dnA`R=T)pAAsk#3U<>R;`0_ zSclx-qS{KY1i&QJhr%e6H#<>MU53tG83Lw*b&P^H!eIqFb5!^CNbc(0d4!w<>rhf- z@N1oY6TBwql?<4+tIY(_zjHjD5MHX37K4ttN_?+!mQVbGwDy&uH3$qvdz_4}CrRxc zK8tZHdZ?&V4ldj6T*)|T$_LBq!C15Zmhd_jf*7vK-fT zJ*(jv`3=kUrlw(|E4oljIVVO2P-IsVWN+ORXB8d6`5~4lP2vztPq5 z!W52i=0u@bFue0E>xsjjxmLFh8*?iQ1pdS^ns_`SDkstld^86mu*fhRfnf#)_(oFU zVDN4IP*Uil7qN7IzF3$m7mV`U{BprqI&Q42mW{&MrBb5GO$72rVY&RKpEK)Q1L?v&BrtqN+-{S`Ip$3NI|dgd)_O!9gu7(`SH=q2 z>^9O|bg*nIg@cLQ+Lq@v8x?!gT*t1`ZomK6es&{F2mp=AWC^>bhy_OIAwUTC4N))C z+jh;{_`v9y4a;8N@a_&DRtD$M>V{pfIaVWN6HNPolysWg!WMV_5Gd6n*n>`12_oow z*7N8DY>$Y9n+G&TAh~Hiub=}4(a_;D6%GsNVmG&NpHR0O17nEuosdSin@(-pF&g#k0}j7Jx9|O(`}&@Q}ew{ z%-JbXHq5%c-WY@euLN9>)1-c@0r1H8Pu~vu?+T(<8Nd#BqAvX>Q>n zs@?wYROl4U)$Otf_qUSJ$4`er>N6t6S7r_IW%*YieQb;+iuy6P>NM;1HPdki@liJG zTMI$=GEP4J6&i#K(UoU=KdC~1upw~Y;2Qx}sSmVD#6GlXX(*Xvt3|rHVO5_IUix=~ zvgq!doT}qEO4vt95Z)egC}96Rk!wrV98nsi1@`Y3d8rM8Gc!ixFT`PO~|TlZA?^3mrt6 zOJf#?TKj^i@PpvtTaeGfLUps{#%%~u$x%OrI91#y3_~8y2l%+>m<_lTTm3+NuMx(O zk$IJXC(LTqYI$zOZnU-rGEf!bO3$6(njr%5l7Gy@fVKmD;BkS=7z3XlWO`KqVIZBG zMMjT3?{d~M<(R`-)JaOkzMCDiqP?fIKqiRjJ2ml zvkE)ROihQ44>-vT^f8dkE=HM!^anM-rB)C@cxF}jxVTPuEeU_Vg9@$vLwwMXbU`Yh z`+Afv36IzbpaBp-t6H$jDzg+=ev{3E_>FI&(|tkx+ah-r%x{}ROX7s zxpTyr@vpOcV0cjDuP?L;Nz@Zu?(l#MXIjKFpVMNYkfWgGe~eLN)H5J=g8|jY5e1;0 z0U*VbcAYLt^&MFFy1wrqmZ|dioxQ?S&rbZOslPHF68AdTOo@<;iwR>1=ONc9c}>Tv z1=n_6A8r+G^^EXf4^0}Fq;qihmyB3@K|7XbkB=F?=U1%MlUS0ouW{30h(P$TtabU- z(<|j8ADiKuxbSsdyM6Pk!5xrX0dG;sZhjP0JMMxgl@72@#G51a#RMf#ju+?{1V54_ zJG{bD(f=;VmRZD?>BkIN!m*!-60Us)eiY^hXSyzke559Z5KcVI-|Y*IK6`W neBuLwoGm6#X4H`40dw8_{awOCf>;?C^Vy^s{{R2~MS%eT&H5MC delta 44 zcmX@Ya-Esi&pB8j%uvt3iGhLf`b6H}j0uxD8KWl8V^p5p!|2H&&G7&K|1Sy*04Qk= AmH+?% diff --git a/_module/ncs/on_pc_respawn.ncs b/_module/ncs/on_pc_respawn.ncs index 4975dbf707b498ec12b2e15d3e238ff2ece713db..e0f6ed31d1af01010966238dd2ebde4376fc01f8 100644 GIT binary patch delta 39 tcmX>ic1n!b&pB8j%uvt3iGhLJYa_2W7i03|NUm@;Sq30ro4kQ*3IM?a2^IhV delta 32 ocmX>lc0`QV&pB8j%uvt3iGhLJWh1XQ7h~+?NUre7+qk9x0FAo{=Kufz diff --git a/_module/ncs/on_pcdie.ncs b/_module/ncs/on_pcdie.ncs index 556d12fee5a553926439838aef81588208a79f1a..b753e7457bbd1d4511f70e16790a4f826232417e 100644 GIT binary patch delta 115 zcmZo*nZ&~D=NzmMW~gW2#K6ELG?DivW8h?8MtdGcRt6?+W?2RxV4JMNr~nprRfh;L qGyebo{|^HT3o}rf8K{zn3C!dYP>=`d02?6!l7JZ@%>dG&zyJVu{u8SJ delta 97 zcmbQl(!j#&=NzmMW~gW2#K6GBFp>8rqxa4c|NsBPz{0}J0F(v_ k@i2jzTmlO6KoJJ8S~idbH}m9qj0#}Qt{l<~AZ-c^0Jvck(f|Me diff --git a/_module/ncs/onrest.ncs b/_module/ncs/onrest.ncs index 00c36a19909be77cd96c3c32e458a37e3b34f0ff..c65e05b0f8d843d4bbf4b96fe171a3eb02718847 100644 GIT binary patch literal 6216 zcmc(jU1%It6vyv;>~22S%{FRch~BnDLATLTX;GBYBvsLxmIe%pxK2B>*)f~lb~4Et zgg)tm3W`tq;FCc?&`0q_i!X|Th+sv<2n7{<2v}{wSkuNc=gf5H-klGv3GTzp&Y5$6 z_kYhl_iHA{r}!hgNADP8Y~X<#8T>jpQ?nVSTx5!}v9Ynn^dScKbyZU}&9hu!y62dG zNqi4Q)|sxs8>O4yHG`~kOox|mDR6nb%>!O(&AD<=Y5z_MktMpG zg~~jR-kfWm0MgHzr*;{7Mz(^GstBi2(Y zctYUEhrR1isQ3!jJ)&}=L7<>~R;9?IcNYJzdjES%yI3olYB$H4p^O(*)*n1!u^y~M z%c1U`^Qs2iLR-&)u`kM4j52PMj6wUcrjCA&jfRK?X#q{i9hojae0bs@)bl$?XM0pJ zGJ)hB8a81!K0|*5XuSX8KcB_m^ym~8$RS7r!?nwub@(F zhjJ|sbI)LjeU#u3>5xx|D|mrS^y*6NpX&nI=sVEOb4k4^dKdnccfaS2;T^-ejz_ic z%A1H*Ma7$1EJsp~_m_$B#t2|cVe;7M<|AGfe;`;dlT~?0uwL@5X9epzS=B|s`WIQX zF2Q=yw=N6TKgp`!BUsmb>sNyH53**S^rDmbPAy;rRl33;Jsp$jFbEuJrqOk;;Yk0~ zPxT9a4yoY2qC4y_!nY(diQ^u#vpT8*1F$ZIs}+^*o1Wj5-!xEwUbNn|ey z5*3W6w|jU_np6MD#Ce0KqiQVrA+pTW2(ccjp02^9AKY~iB%wB3Y_rSgRofS~YIE-Kr-*!U}mQ8&2(iA0mMTeY2eH+Df$ zUlDqU1bRud$pUfJlLWR#Wr|2;H9{n8gEw2`%@I*FVF58|s!LOOUxZ3n@HboKy{Hm8 z*j)0aiAIH!uo8~RxpgtN;49!p@?MeXr0o#UI)!*p(mg>+mFLxSOoRXzsAr)j^a`a z?ccPDb>@@L9%8|Xt1bAtR4^3%{`TnSK8|g%C4fSh;RwvBSj_!#m_h_*Uo2)M4%6L^ z$)1bFyc>tPJ_7T0EM__m(-(m`7K{0?g~D2%}q;NX#?jWQ8+1)(annu&y;cb1jGKML!y!{@JNmgGLDB zlhRCtJdpx*c#NZ;o&q^rF-`k55SX&FL&At(t>Pc#ii#Ke&yxdCMzkv zDMKjLMJ1VJNZ%(igc4nVXdfj*igPlg*xnrNnG{G}hR|3MmF!J{z~@CV*?QZRsK2E^ z-jE@k5s-IMAQc%xU+skEs52>$85u&KEJVnT6i8Ku(C$@$C_kh?Y#Bn|a7D;#DUhdR zNWML=%2WzuR)%CFAo&zXLx%LUL)d32kdrdxnh40VDUf9uG8h5bABF@Q2$;NQBl3Y2 J$vJ%G>~Gi&ko^Dv delta 450 zcmX?MutJ*G&pB8j%uvt3iGhK4#YA4&iC#jCmJ?%@7{5$xn8sKMSVoos2&7q< zK@>CN|Ns9VOwM4GF_&flGT(qCdCYVfSQ!}qFo4xCaVvmT0lBImEqq{6W_AU6kW%i+ z=NXqVYELd>Qsrl2W?^MuPAo}$8iUGx>IALOwIgNq*<8ZzMmnM*(#pMbl zH*i@1$%%aOlR3B#gZUDZpKz-KSv)*2{rx}>cJZhI#Wuplw0L!Z{BT~FnhU(nK)whc X#7v3FMSOBV{zN`i4sgK#QD6W7QE7?q diff --git a/_module/ncs/open_gemstore.ncs b/_module/ncs/open_gemstore.ncs index cba0012c322f35084cc47928109790cab6b9b73e..456fae7d26350b9ccae2607f0122cec073e3d85b 100644 GIT binary patch delta 386 zcmcc4zm=cY&pB8j%uvt3iGhKA>qOoOLM+S-3=E85k_k*QPrRSS{7Y0}@_cqNK8P&8 zf;>5iHBd zHo1nyhOuSxP8K^sSExxppeEg!+{L2I!@|nI#0#;UZL%S&r?djtg>sA_%Yc?jGk}~2 z@xkPNR#A{VP~;I-`JJrAP;X9lVl!fNnOw?d!pJ{)6_C6&`96?bI$4C>gt1_=I5`rd*0m&k^R81=ssiK1jA{N2lAjL&oMRattz0sjRp*Z+2 z#7XSpBqALh96A)^%S#Xoy4=Ct_uY5j-M!m)o&D{@=xDiI*#fZpZRbV^$(!gc2}u$F z1Y(+|L!c0J9u-wNUTybUIN$(d3^H!HK*2cbzbZRonlG_##aa*6_z`P(%1V6U36rdb zwGzl|i4P!?2SAh2e1@In3Wf5y1njDSJFyw7{Iju(7QjrvA` z)Ar2dm!HY8;bG1;y@!0(0x1v)7JZPO!=ccAz!T_7;uC2*?~%-@!a%IG5dEDt}BKBlrf!3XQS= diff --git a/_module/ncs/open_shop.ncs b/_module/ncs/open_shop.ncs index cbbb3a2b610bf2be645160b94db09f9af1881793..7706c3448149c5f2dbce00792d680ef58064d674 100644 GIT binary patch delta 446 zcmey#f1RJ#&pB8j%uvt3iGhLr`b6GMLM+S-3=E85k_k*QPiADyV*VwnF!><67#~EM zUqK$Iia}xGK@lNY5Q_~g&Hy1NUt$aq0V@z;X8iyE{~rbxup-mRI!tDa<&%?{{xKF! zPGUB-wb5k&tM~xa2~zojfrT4lv=W&AfPsY(B>shgMVbL*62vkvd1vxD=3K_S$u=y; zj8>BiSj1)V>X|%`#fGtE@@*D7L071)KcKeWnY@NYS%ig^fr%I5P&TmTKuafIV3wM^ zjY)iR537K*0@!zQUO{s1U>|WKw|v08>JS;s5{u delta 518 zcmZutJxc>Y5S`iGyHhk=3cYCjIucH?IFsllg2W5N%0>{u${(OX1hMx&9MkI$uoD{# z|ACDt+Ng+?WeSS~#B*==G#uE>vNP|!dGns^zMb3J*l~AjOVu`j)sJ$QZN>!$07Q)A zxCdeiHB+FNNsU$!9@~Q-w{?6)(^=mQ7EtgjMQd1CMEe zed8g`^Ex(Yk55|DJn`~Ic|Oh`eW03Al*Db^CsV9c0w2`;6NFj^Bko+Hma;&o#d4}I zp(D}6Q@Rl0S}SGBE0w}Ch?MK;478q_-D>r+Fo5L*EgG9Gech~*@BYdUtVql6wzeXX z$uEnf8{@=DbCq#Rz+c+bFqbi;12e#3I+OK*?qxlvAuGTRty@8h Qw#lu63XE)%mk9;~0AO~T-T(jq delta 462 zcmbQQ`cs+L&pB8j%uvt3iGe}z=SJQmtUMgHIsyz35HdNRTYEAG+b%}m&4<}iS!0=4 zSy&m^JVO24U4s}I|NsC0gMmew0Z9LW$b@)!1_g&;kzsdp4Doaib;TmZ;ppQW;veGZ zGr6Bfc5@QXA4W#r$?<&3Y^oqfC{K3emzcbcj~AKy9F?oUk0h&#q)^zHTY+7H8RXDE z3@k|IokrFnA#9FAnXLel!4kr}IFzkNQ8xJn3RhSXhps3=6vHKOC_96qj9USuOdb?6 U(vt;*L?>$tDKNg7>?0Hm0OUDsJ^%m! diff --git a/_module/ncs/pc_room_onexit.ncs b/_module/ncs/pc_room_onexit.ncs index c567d0c2bf0bcda9e99a2240e80fd7617d999efe..26adf172942ed99b48dc87ca30e74ce61aa1702f 100644 GIT binary patch delta 41 wcmdnTc!ZJH&pB8j%uvt3iGhLP$VA@BjEWN%it@<?!DZ8XlzODbY{-SZ_fFh zGgEpyGV1Jsef!&mc>1rM0zb7%v-`-oSe7>YJ!M2Q z{cd+RN#7?NZOh@XwVyh*gyWA`90_54E(~^(O_>=1-C=+km-US`Z1cKI0M~YdO9v>I z&gL>5gJ=4)Bt1(253T@k>-!{lPYc@9b|8{C9Bm=Kh+(ayt@|2M?WZipaU`KRUl?OO z2mTAQ4(+8JX48YGT!scon0>`2F(fo77D#nSOeZ%s5iE6>jR7#E>L*5WmHf1KVQOrw z^7sIA8g$KFh92}8fEJ<`!Vm}w9EIrBXhK8`TasPfyj3rQ-UBBl@4OvDIo{o%mFtlB zzTWQh__!vDIB1(B673+=bll``J|0a-D^AnIZ_gG;=$|d5(Htjh5THt(lS&ABqwZ@uUYKd~q|O@?3aP3XZ@8t({4H-hBxaM5aGq7XHfaHz;g5gZ0yr#D~nFeWP# zUa^SG%Wt&itcB07afN{MP{0n55vJG%^;YM2DPJhRooWih;7F3F<{5e4q>L&VIzlrX z2Pii8c%|{l!ZojwAvjp787bx~6)%7+N#!huLsl)nad5|DSoLbRTbdZZ;!S#^FGP`% zw&thCBva~1Mp_T{a-%WGrSD_F;0L@q__$j2%A>2fuwq?&7;)jmAEPIKwNOG>Ryl?p z>!UT|qc+~hz*J%6vR7WshZE;Rd>iqx#rM${2-OC)J5wln<)e$Hx7=XaGUr2g_K+2}^>sWm>oHI$>UY?Kkm{NsfDAv$~Y8s0*G~R{CNdRb%6mYAj!= zDt$*6$`{pmS*4mt15i^rX}s(CVv|z3OQdBz1@GH+)_f?p??Wd0aIXL zP3@SP_!1jQd&Z9iM%*x4nUF|%;AMariDKN$&$F9mP9rc!N0>@Elr3;AV9JPM)o%*9 zHJEDPYiu8h0w@{2@zFNSQoz1vmiPP>DyD&tk4UQ;J& zO!s!GYW||0V>lMQN#!<*Avj1Q7r>2W-VT78Agd&c`arRK!Y>@Ay`z0RxrrMclAl?` zwxb+$;}#pgusg#sddG>Qf&4wc7cVcJz`lCNd z7c-Vwkrn}FBJ3uSe%3#rUA|CExp0KjOqwMhq{sy!TUyK+sAMruHGz;{@*ggHXcLNN z^w|MEFx)`nTA+|zGLm#GQwz(5@=ZUyo^8+lTr)(^)szpfYZxhqda) pq#tYR+PgRz335aMES3=!1k{MiK-`Mp$121Q>C5Iw5RM5_b|fj?HFoZ%(&nZ}-^U zyOVH|f+T+=#$~6HvJ)p%OrjzoDwhbt$cbE*6ZwlMDV34oLL_s? z<@es}p6Q;Q*;|BEuHf>_?eu%E-}ign)1!U;!`=g1Z{E`9IQy5p+rfVwp0ml}zq;Pz zc#hkab<%G*sno*4!UZRDjf4A~o5sWcjXuoc;f1(|7aJa?iQIW7!}qgJ2AFTU_8dHf z88NnOrdS@W%;XOHl?lIIJ=(pV2j`s3b;R*Cni@c}Gx>U9ynB6{M?;et?(8siGZ zH6BG#t_4Zw)0-U)0uoDRilc}9dTZ=tH6l2S(oSHftqBUV(+0#qlMF28kJ0F=J?w}V z1dsndM}IG$ktd7|{{Y3PhL`@T<^zM-LaA7ISXAG2%+0c@yBGl8nRT39F0Nf8^>U8Q zniEjhY0dD<{@XS@lNX&sG^p;|E-oii3`bN#!3U}9lQ%c9u{Df5$KqJyjYg?U4S<81Ks&YfEfRL>jF*SrzmFMCygqB8A| zdSlhfgjXN;y;8AOzj@_)iqVy2#({z{UDsqWM{!UrABG4WZs=g`pR{78gFPcZ?TcTu z&A3^Y-B>?oqR1V5M>>GH=O}r8Geyzv&Jy=meVj*6^XQZ)0~#`v0RqGo5?SA&J$rHo z`a^Qg?P7ZgmDL)gzjydxuJ>SWxPR#00|yQ8ooP_&nJnaL;F@Ht87v5c(`lKSHS0p2 zF#kY3OpAjfRf^;x9wJ5vA-jxIu=6E;O0n36r>UNGoaRO~8F15#Y3KnKXv#E$q&3qj zlUOWYpQdV~XGF4$GJY*pwR;RX!7hWJP{P2IHIi)^l8ff*S#C;8I%t#@4!(%Al5?6$ z%ODYHSw55|D$Ol0Zb%DgFfXwjMi02`@6Xrjo|H1LQudBkrm8i+H0D*RUcT(*Yqd(D zn6LX@z2cE4Q8*!{DjZf)NN(oRw}yRbmduhK+)UPty76gxnChWK+sqRf%(*2lJe13+ zIEpxN3sh6xQe)q-ubvi%16c;p0j&I}5_vWFaM)?dh#hg=Ci=5bG{SK!{4B z0kN1$BWhvs6*^Rr!h%(ws+Li&Dq~|DOiR8l!NgbTeHN^8)JbKhQ1bIt)lGh}wLYc2 z&+aFTtiaA0->0y!GX5foY&I&Vq)2!FF$19o!FX&{on!yJ%@TvvO0`Kz@v}?>Za^7j z*{z00ckqa$O>Wf~m6WJZ&tl#T{Wg3V9)x(i%U!wNmbx`vwXL?X3@x0H&MRn*-~}Z(SD`i4wMlGnf_>6bqh1S9!A(D|`GoB6BHiXBOXmvXzV3iiTU_c68iyGd`sce| z32_%=>!LLcX3+4WRKatMuogc;R8c{amPXRurE9Qrt(KWv4)G$mB6-mbUt}-Z&K1dC z`4~dZ$`VQ>{vT-r)tW<-hQ3ypDusu+UyRdfk#(8?!&EMtV$&asS1gNvn?!)5uEmrr zA*N*val`}OsbSiG%j6}|;q10~UglQzTmK^?3ChY69t2}tQy3pPk}Fqo6P0qU?pMXX zO)qyQ)p7}9w5orGqh2rTT(zfT?;AciFqG@xJJA0D9%e6bZdJ{*XfV8{{!PWE zP_bQ3l2z(CrUSMxjkz*SecBDy+Zbx6EMF>Q-xg!p-wd~=1#>QoxN%pv``8V@@rmXy};~!0b6V>vQ zbJ!xwV&fp|?8@aw3Zwqm;ql@}A1+OlE0d2@YxSw=nIlIZ?d|K|J+SAVz4yNV1NRN? z+kfExq2Ysv9(eGBzxbgoTeofBamz2345eaUT82BKdmCwC0&KZ=2K5() z=!;wFQY6#La-m1oeowN5c*=LN;I3d3PK(bow5{|a+cU}lz!J_GTsjrSCG=_xNg8R+ zB`@?oWQg=$rV5w70wQHDn@G*L6p^%YI3gep>xDM}9na`X_i)q85H@Xt-CLCYXbVBp}>Po3soZviQAnJ&f`fF4yXtco2yC zuDk>OAnZy4k`)ZAWL!hCSUMJxRC3`;CoOD5`~j)?ttVoV*6KqCcK03}FcZ}9KqQB~ zhY}O*s9(|CCC13|M65u`U1x*-6M>RV$ZT*sj4qPd#9DlnEOg$J34UoIkmxXOG!5KSkhp`-RMQrx%dmlmTcOz$r~IP9`3zo;C3k+n3~a2 zz|u+}XLPruOlJ#Q5Di3C$tl|m>oJR6>BDvCz^%dkwAz@^^0794hJOJNvu{t?RTj^> zJa6ZrM?U%V*S@!4BsIy?Oci=5-DO$^ipbpg-U6PnG&(29y2MO>b8J4uIx(uYkfgFs z(Po>q2`mj-dYZe6X4`NaA$qe4)Wk)!-He&oAi+i@=3A6%{5Blq3-zuyVeN_Wi*2E| zoG-&R9Jn_mgV2U#k|gwo^CFV5!h=00W>abfcC}1$mOq98Pz9S|{Tj|*OeNkKBMB@CS0;US^Os4m|<17ubIjeM~9%b0o{EOl- zLu%_@+s>_V*E7f~nfDz({(_qh|HmG@*qhX^N@0BMDO&`!SQ3-4nyfv_AV1KWGVyKd zmlf^ZHf@#x-p>4OlNURkAJb2@gz$lHN0ep^eO+w@N|V^RQDkKRgIo1(^@L6~3?)`< zggR+K1?vjt0~bZ>lm!(uG7%{FxLBBH6u)nrQMZwEO4~sPt*NOu*P*uC+!ZV%Gz-6r zzB<<8(^%vThwVnw42h(|<>)dkti@NJV$Nt`y|D1(S-QUdpWW-lO`Ua`d3FdWBn*Sp z7Hk!=Q(Ma5<6&$k< zszi4w!aW`lj@%v>U4rufh5S^FUt8+77v9c&@Di_B^9Xy~ulj50 zbil&G>;cucLmt?)otxL}J!(r2ktv)k8M2KYKSsBb9DNYn0O`zhu6rs`)Pvw46 zwvYE!u>v_yM5ruRRJIxdb$T0yizUBYk0-G=Lc&udYZAKw(m zWH!R&TZ+j~MVKtTGbXQ%VR8b;eX8Wviox?w#4wl|jW9T`82mzn!QXsm4Biqjh?5dk z-^=6wWt^R$!-8I|RH@hSnir=h@^!D|Px~cY$Fyc&{YDJq&YwpZpS#lLXXb=ql_4K4 zS7yq5fNEjk)y;8C%BvZw0^I(sT+1PZaFEK%S3Vr#EZyvIaIWB05!&O0g*SqxOLX5Y zS$s})^VcI4N7ev{BlIS-IM*o$K%E;o%xM0`_s^0Gn1$o~_c%&?wB1J&LL{ZG+%Zu0 zCyIWJtyizW{Yw=Tkue;K!2uZ^4_+Q7r2{h_y=PS~_}5Yy`BA4K_8d0hjBXfzOMgXm z17}_bmG{<$`8+8ewHHb_cjMQvIik+jQ3sy6PGvKs0Tvc_IeL};Q~le@H9F@Y>!C8Q zlsyq79AS+?bz;O*ajMi+Es$C*q>$qbQkpA0tG>(ZYXs%2g@Ru^8?2_21)C+ZS>FOj zt7O^teg-|K$in#)*_#Zq@Eqp)6nR4SBO-x#NaNMO164y>@)q(SwG+XIgS&^PMuzgE zY(~updWa9FRNbGoC>W||VDUe7v?8>;l3-U0N{E_8#AyLBY8<#rS9x%P1yOs4u(c8e z_a$C=(68qw@`sCs+jUn3BZd%NUU_$AB3~>A!!U+Dtf;FEFStTDoZhi*D}HuO`ucDt zzZd&!7Uie!H0cdVP9ys~l+ot@ga1BFf6wh_#^+QvgELYM=lp0nqkF=n%TRB{Ks_x` zA*@^7j0D4TAlR%s+7E>O&&m4A6*jM>zmg`zvE&oicL8mG>8p^qyWr&m&N=h;TVLyucn z6?)uTvcGS8++2iJ7pl%Z=xf*_nnC55ja{OoRNT1>7XX)*evO1lT#eN*# zbn^s(Q?TK|DC|P}#zTkh8_4Y*=sR>zu77Bt_u!$S0U*6bn76o*t%Pt73Zp&hOAzOG zK&fZLh7C+)h@+^Ijq->x>?a^FHT<<@k-mh9Tzh^KL%{qPK_P8U=&yTtL@ zU3KgPkH{A@nZBOj8lJTQ!Omhe$F2ER^n)+*CsG~v+lJwK--Hkj-+rRVhR54d8% zmP=qp2r?W*q)O<1g@0kPOy=&#@Bxd!V$^`844T=6(eAZeJ>}E^3)i9gIar}iC+^Z9C*IBrq{p=sc;Ck`6saGuA&*SuOBhMQWaP?M*@cftCx5wb#lz>~d z=6ya^S344Lw^_J&zY#Odol1t|o>;O?ME2;^5?C1DZpV9M6JyBJGn?~aa+`aDzaz>`# zYiuSFUd#8;UNBWW??L|B5zp+Sm>g8P^L$EDbLTJHEOHG05p~xH&iPbp%k+av*#h~cM4pbmHlfam`n05L zG=lQcCna>00QHLIGh90x+?*Le!2o2NOdww|x`T=eYHAZqcmZP;u~zpL=2cX~UAz%P z;GCvw=4#uu*y|sG*CT+fkYnzWI7yfE?y;9C`c(4^W zFhQ$Na(X0i!|-iIWA&qxf$2iYB<8cF{D_a!JlF-Ybw=qQXAOQTi4 zYw)3K))Nag8jWrh}9^FyJcnz}Z#(jslN9YlNXjTULE6ns+Jz0^bCd5z<)TZe0= zJXI>0_j+~8kE=b92~8aT6Cop&>Zo5O4&Llb09~O#>(zX@Hi`Fei*#d$a(>y5i-Wg zG!_{;P5^3`N3$2tCNP$u*^6IJfY(x+n!WghCsBpRo>x^?w<^e?jD_Ej<8>)Vb{Re4WY$T!L|}0@A}6Pg(epO@MW>8l zlHj%GoraPyg~c_`jCeLUP=^_BSF1N+i%a<8m`o<>72Oticmn{GbK&oRi<#-rXa^X?d=lj2F@kz8&gv{sy@+><7AkLw3dcE#44$Q6r;u5Sz9M#BA*e?D@3Rr{-eHp z1QiYnTpI!)84LcTv2-Bla7#u)CecVSF`bMD7u9%nLQY0ORItULQyP@7yv&yd^5Mj> zgr1ZGfmWB?7q(CP)%fNSrUP%;I^|5}1`omp3|!E!YNcW{5xSp+H89wr^G72#ToC}B zL8@+!jkZmmbO?~dmyH=0!(aV1#*|n-N-O&$ z@N%}rbmt2qr;?|Ol3GLe`u|j*Mb?bm@0WLiXCHDNXQe^%>X761SM literal 0 HcmV?d00001 diff --git a/_module/ncs/pe_crafting.ncs b/_module/ncs/pe_crafting.ncs new file mode 100644 index 0000000000000000000000000000000000000000..5d741a0d67c6657ce5429996775ea7f86ed1954c GIT binary patch literal 66994 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 z zE3*4qqPx0k6n)je9P~<)bZf6Y%r_Thkbzrb5F*=5SY^aT>VC~B6!&;gN{m)Uku1!{w_27!NLPM4o^%GUE|)4J0I8lxKWtN%#0SIigw+ukkyX*?h-i(?@sM7 zmEjeh+d`KPFnMQkT0r$(J^$gfqf`mF&*+A7+w&OU0DZGLkMWeXtV@adiKoo-7%)21 zp_i^7=Ph#{1MWr!Y>G(EV<=+(JO+pZmphMPQPbP~^B6v)?j2-6QfMScD%_4$G7g13 zB2G>K@Xsr?gh2}(hm)&?>D^Crs-yc?Oa_2k!;yPay|&rlux_#GmUaCD_iUDft#hjr z6SXQ%nGe-ijX88DasdS*f9x>Db4`-I*h(hP#?m_yU7st}yB>) ztM0KL^*UoC1A!wndZ@Xg@F8wmwaeQqlR0f{zKsM*hfiC92<&`YEG`Hl^X*)CJKqL8 ziA3~s*r3L@v85v{9rbv|YF=;O+D#j`NdfO}yby?2BTzD73Ud-1><*C`Fytq+Z5@m@ zIBIMJgA4G6TlzQlZV=z@8mbCak~0c|muYV%3Nd?YxJNu7?k&r7Yl1*V;TSbM>b%?< zpI0cc=R&gquQLIl;*&?6+kixiCD-3=ro{dc9VYdpTiQnmb3})$${qG>Iz%E;%`lN ztL!6QA9r39>JgxsUgTN^USuGmUKB#87uohPFG73Yi;&kMUSttOyeJpmdJ*6gFY-uW zVf24^4gp-$)WN_Z9u;8g5J}`G4#8gEo+gEs(Y%PkI8mK4fv=U94jIIAdcs3Zng}e} z**%ri*Pz4aT}_@ZmgnY8)K8NOn_t6T@i2{Qd&R>|6#*=XA|P}_WI#Dkvlkh+H$;Z& z$_>~K5TZ+$G5i5rBcvj4fHW!JX|{#KWmeDVZCW^7W?SQ}l{Q*;wbgpDJ$Y5wLVF#j zTAIF<@Q4IG0pNAKQoR^}ir$MW%~;_v=aTG${vt|(pAQILe9)b^H0Bn8^+l=E1lDQ^ zX<+)2mp2*FXJCk4el9pJNtbLmu4LQ{xdSfV!Ynu(mr!W}D}Ars1-gpAbjc-1?FGFD zC-73?w^IW@d+t)P=uk1hV)l?iEDxu!v~m^`$&;M6b{5mNPR?Q~huWVu=TL^_9HHo6 zY7U-&#A7D=P@}4ak4_oKM-wx$Zg?(;q9be9lAdLUNWiG1BO~h&LOVCxKGwORz2CV# zWmzXdJFd0}BAr_LB`;T6>fpY6gvYV+1#7)DAB96ecqf){RNQTDeKW10$wOKvzJ(eZrbulL*gpV&KbA z(h0G@D|nRmS+Wk$ZEO`R*B!YHy#wpEtjCVr)^+{s`Uci-+DKmDhu|f?EGo0{$fxP; zARSkLa{m3KeRCNLMrPWLr?O6P@2z3p1;|om2s?zg4-9VZ-7+xPx2b=VcC*Mv2|MO( zXkA8twrSmPz@$s@cEFSrzmR+tj&!@0R+i`x4>a-;lQGg^;lyS*m$GRDJ%wUF2R;)D zXkCNM&X}d1t9jSDsd@q2IU#^YnnIa}@Me?+utp-fh07{>U0OL?|FvYPmgER|FyOFl z0G82snf=D2d}fmLATF=QhFiV@PM4q*Lw#~^qB=T?eb9+IDjXzV<7Mk3w4GUM3pcTo zLrfMmuHGRgr(cTi?*edd3@&j74>8TmeB*FRUr8B0NSZ#yG+7&~@2OElxQ;mWH$EJ~ Y^BEkJSB)rha0wdpT*i-Q_XX(x2eid-ZvX%Q literal 0 HcmV?d00001 diff --git a/_module/ncs/pe_debug.ncs b/_module/ncs/pe_debug.ncs new file mode 100644 index 0000000000000000000000000000000000000000..04366bf6faa222a30569d5169aa675c1da73bf93 GIT binary patch literal 33615 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 YJLxbj45E4jV8xmHw;!`@tL=mSAAY0X5dZ)H literal 0 HcmV?d00001 diff --git a/_module/ncs/pe_henchmen.ncs b/_module/ncs/pe_henchmen.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7275c69944ac63d7f8529121eaa6522808ed8991 GIT binary patch literal 72640 zcmeHw3z%Kib>6*q9-7e%Na%^dz!d^ZfB=mifP{IBMgtl%8p$&w9*LXVtC=fl%)FR~ zgq#O<<2Iy8{77i(*tEqCX-Gn2@&(7H#WikdN*oc(wj9f~?8>$RvO^khd=bW|HUhn


    CPYe`nh@t2bq`7d~@w2LGD!nfivzlF@yI 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/pe_mod_set.ncs b/_module/ncs/pe_mod_set.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ccab4dafee305b508c6e1e2f3517b2dda6343e80 GIT binary patch literal 3936 zcmcIn&u<$=6rR~#yQVS04Q`b}+YE7~7DE%K2t*)i<)o_+;nbDwMhF4R#@^aiY;S5i zf&2j+0I3piL4qq6gakrJ?S*UUfdfcLaLAz`4ngElPy_)b3UA)qwRbm8$N>^*H#;-$ zz3+YR*W~h4Ud)Y+q$U}A;MG$Mej})daVFvFlC8UK|e|p9!q;u1H z!I;fn(p7n4gTV%SQt=GImi>F><0A8zEwHifBv~4^p#zf6pwrV5s1Uj9iuuI;wW9JwuA?9Mp+;lc`$wwT!F43Hc zxhKKF$=%q&a{v&)PWgk_2ff(GQje!nDN(j-B?s1_TN04^Mh`$a8BeMfiX=0-o~wuW zE*c#usi(a(dY}-EO{>+mI_AgGe7J}C=k&Bck=QRz8d1rdr;>r3g7g^MGxCJ8A4`;d zpb(poY9MqukW-ZV=p)n-zM(mg0yw_v{7DPA{SA@t_ZYGXP9yn8ko5q1CO+dd-tF)?NWX>qn21)g!s89Cvziqyz&`m|7CPG$6T&L7SpR}p$7o6UVB z|C&#p()0P5OduQ|DKVk~pAq>y69XmLK*#dX3c)%Et&lUA(ILR~?_ z{AXdry@s{${y7?8e*^~!v_bXH;9>|CH+wDq6htuS98TuF`t^E@Srs}(xgX9~c1B_McG zPU^4dtVaT}My3N)8BBvQsW*#!R?L!US1du`1cDO|zat`VE?Z*7UTQ)&u3N%x$`4UD zS47RWThOK})s`q$%tqOAf}wokNgo<*L_tha(5RLxZKG`)C3D4@Z0J7wJ>Ui0G@umv zZn@+F^rc<{85jar4lfpsx?M6_R@))-D^}NVQ%2_at5FvPzyER5S0BV{dfUE-lrpZtem`Io+0ky@uVan>Ep{0=0`~t7QU< zU1WS28wvZusX=n}-<(>-lo?mSw1<`boJsG2P$Gf=H|?czMPT3%C}6Lf3zn$1Mcr;T zs*SQAGm_-oY&@-boz~%EsbW^r;Bk0nkr>UEi*9z~8+gYz3=qinIVCReVgjEOiPNgQ zlw!i)bOrImx^rR!0SwS-0ziKYx;nr)EUizKkSi~*8GOip0djT$4&G#WbQq;3B&xIM z4XLB+%(jBp8Rb#9<@ogw9UygoGMN;!dOn|?)}IlsX%yq`-3YvlC!khSoFJ310|ho+ zW+Y&x>^J1@`QTERfN|W#oOV-;>J*mHuj6sy z6j2j({K>#XbB$;+h&xe=|A+1>zKPF^3VwK8M#{r+ag?Yd{TG0CWC5gzF%*LkLko3K zb~48`BVF7VB_`L46k|L*ilYCIOWJ?t(taq(C6^qe4BSD=)_2v*J-1%K`NKktU%h_g z}KmJm`dAs&{!u3opOK>phCJ0J9lCa&uRMS1y{&WT7_bP w2F<)8)KVxk2Na>y+E)Z>{DSlE3LwWC)h0%Zu!i2at%f?Dx7BPRb(@0y17>m5I{*Lx literal 0 HcmV?d00001 diff --git a/_module/ncs/pe_test.ncs b/_module/ncs/pe_test.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3fb5d40564b7da26d94d4a36130c75fe56d32014 GIT binary patch literal 6436 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 E1$gO7m;e9( literal 0 HcmV?d00001 diff --git a/_module/ncs/pi_crafting.ncs b/_module/ncs/pi_crafting.ncs new file mode 100644 index 0000000000000000000000000000000000000000..dc5627fe2fbe9d2c695055597be516ef9fd76eed GIT binary patch literal 35203 zcmeHQ3y@u9eLuT<@8+?25ki9R1MyV_kpKb;$Yu#iU_)ZEkz&>B-Mu&2JKWv7-n~nR zqm_o|hLIw5XiYF^kYM`z|Nh^1&i9>r z&bjA;&l$;Z?!D*yU*G@r{lCZg_L{L>;mgl`!3#GA!Q0;S^Z@@Y4uj_f{I>M@K^T;V z<>ugUsT?dD+c|pWL}g-h=jKflLjxyIo;()dcJQLX0r_z}C_N>>=LtSK5tN8JFmmQI zguNAzu>P%g3%r&Pf)2(K$GTE4|f#}z$h^yY@ z%M8LpXy?hnb(X(Kz5O~O;PRazAD;Jl3;I$OQMOf+o!Lrbc2BF)X|i!Btsk8A~Wd#2iHv}Vcso}fhD7pIV4BZ&K|?OMAvSI88988+)gl_`ee~F*?^4Ecbvwf5~XA7LE%B864I|yzC7=gES>?J4OupU6-C? zrOsDx$ZD~pRDpstrCs=pjJ@sud?~CKd6rSNog(d;uQ%&cXnD20x84D@<-2$zoZt;t zf!p4jLV2~&n5xcB)tj;QJYFjB(ijd*0*~$`KHW6Ejo;o&ZwL{xjYC92N0^t!R;riG zv}y}Y=(W*lir&iGTD5vJQrynXz8Ie3(y0F3P2zhaQ>|vJ9TOdspA`0>af=`Mbkmx5 zH9`&n>A8gyYdu8?*ua&{1(m6p$w-{iR-}ihi7%^Blqk`GZb~A!dIu43NhSiyv6Nh< zS~HU^!cp==+SXm4>fP3>j&`@zm54bn)0C#AFeMz$ZE3=qJN6flWN$A?MhqXnu}E4( zGzPx*{NAj#YNz5ExZg%E>9pn|!v>L2xBqDY_HXFbQX4*{jSLxH(N#&*&b8||RG1oO z7aEoMX>>2m`kqcCz|>cK0j#$=l;ZFiLddL^eoHkwyD&3ZNA%$Cvbkn;s?P4Kt^s76 zYV3}5`kG}NE=JzjI>-yf6_LE{C|8>fXKJlaGc69bY$>X=xOs8TQAb@i)2P*)oD-XE z+o9ePZ2nSF39`&K12rs<)Zm$I@>E}d$6+?1o@us?%hT!SnoTI?n5|mzX{MR&%0DZr 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 Md=6j#?3>d61M;aqxBvhE literal 0 HcmV?d00001 diff --git a/_module/ncs/pi_debug.ncs b/_module/ncs/pi_debug.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1d9a0ea808a225436600a1d8469971f852fb0163 GIT binary patch literal 15880 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 M3d{yy#|-)Z0Jpl0Jpcdz literal 0 HcmV?d00001 diff --git a/_module/ncs/pi_forcerest.ncs b/_module/ncs/pi_forcerest.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3beda059f0d87106ffe543de27f67d7ac8dbb09c GIT binary patch literal 90831 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
      hh|$KvK_rp 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 EKL$=PrT_o{ literal 0 HcmV?d00001 diff --git a/_module/ncs/pi_henchmen.ncs b/_module/ncs/pi_henchmen.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ccaa01b1c9908e56c7c0e387cb0eec48522c9758 GIT binary patch literal 22829 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%0AcI{?9r7FtR2WY>Jv z)iM2D5c+EWz+m5jA+LX6XrJe*v|g0hKn*r{{+-_q9%o66%X5euJo6-=XF%}i^OfG6 zJ$nxJ4SMS-*j1ZW-v5DVuzcKX<-quNNu%gS!cjNPAU-9x1@A2;YIytalw%ULU%b-hrn6|0`Q$JKQMGPUwV-JWT>j-}o*z3ZypjrdGt}pC4)FSK_XhS2 zd3|^H4-O4R%ALo0=b68uzPpFC_Sq57(=oq_MK7?V`Gbal6v@b#t(ZC-B8r?3kL^Fu zzqjYWJ>DIC_pF!cq`*L_Rh&$4r~ncdP*&I)U>4 z$SlpVIi@qjs)ONt3bJ7q*+0?Kc|yq?iF_)6t|@BlbxWSlVxA~ z%LKs^Ec@DH3Gi0yuw`ExP^Te?UP>q6#oG3@WeL!hOW3wQKA8aAWZNJAZP>QiUv+J3 z8jxqr6NRRZ&L-zUs7I6BD3+-AlkIm}SH$+p1WCs74Y7)3FYNq?3rI*klppH6j<0!l$F z1tdPNTMBQJ!ppXaU`^@ZBeC;Fr^}IJjDS*_J0LfU0CyQlS*>p=rLM5?CF*%)#hY+=RZb42)!L&lNKW!|i zGfMMR@w`kGARc|7fsU5v=D6E7=WwYO|KtH&2ifusshN}p1HnEAq>x{=s(Db+xd?CI z;#^xlnz0dz0GQ{O`eq1ZoIqexvr?R_hwr%C9Tdqh*>^OPOfv~dAh{J1%v#MbNE^T; z?!ZVeW2!6;50@qz^+I`Kaw=wP_&A{!VcIHTTWF##?-a)E4I!#QZBc1tv^Crdgv&ip zjU$3orTYl>A~TI*9XeN;e1y0H2Tb!q88m%vl9Ma zQz$M!X&=}NcIPeR@GBuU_L*(w^3mp~R<9}ck><-VzE3>#6pAHoBMb?qmgkfb_Q*Mo z%cDde%68)P^xL}orYajS`&=nm~2@VX4(^cgl3Ky_4;1B1oHhvdNj zel(Jb@)pU8gZp>LYTVsu^zf9ac5jGFF8UUE*fJd{Hj2N1m7vZ$d9n{O$8NA9@1RH0 zI#Fk&nbwKwEFRSjCXdKX>LO~kzsq0;WqET>UsUvyg4d*TgTM9hh1}Qu$(^^`mdO+D z;jecDFM)uOrH!yUpJRrt^*nyBqwWN8cM#*zDHxe z*3d$B@<$3o5lxc-)tIaWGO%*H@ivx4X4uQCEc%s%R+zHZ^Ix5b;sr$_s;Qfp{tig+KK_Gai=2>HrjLtuzjjiKgVE~Pbfu# z_v-zG#3&&7?rk&ecX!*J9>TKzq)tYbbQD|)hPH8K zi!!~QJ=l%fk7x_VK2UB9u>r$dw>8haOKG|>yrat=N87R!X1+~d-BvHc*B-S+3cm^f zDzpa9R1n8&JWs!q)1FvyI|OPWR-?o(fLXToO!gWi>S9=kIZpsK3r$}f2=0Fa8@-Kl zhg;UG#6{$CLvcb9%!{=aA`;ggFrN-E0k@IZ&;{4>d$F_HgiAp`?tHXh&h4e~I8Y5r zQbgK>G(+En3h|J zeNeu>kRKewcdzh|ZObC`T$6L52?n^IS8#SWY>4yMJ%u~d%VkGbo z=T4hF=x2PxK)wxL$UIsXXHvtL$Tv)gpi#w!I>G_Ij;i7!wxbA(&ld6_Nu7P!*Z5ya z3-x8s8B5}fuM9?q9lAwP=Qp;y&*!Q=P+L{$A z1kHvZHn*@*o)Fi0CA*6YR^f>@wgpSg957_Xb+LlJs)?IpULPwm=eNdUuOP~q3ZKl4 zb?Z2fa@W>Y9t0H<=2vuPl0qUvWfpiJ#VMs9@U)|8GkP;EY)7+ZROiM|iO2Uao#4Ar zt(4D#ru9Kb_reu&L0_VAFX+QW=g3T@{In}2X5F@>%r{H9lT!Lg#X=d9(!D?_`(iMR tl%|dY$;un8KfcjWJ_ZKNYY85d&kRML|J1p~!jmVmm$pp0xpK}+{V#Zd+7JK$ literal 0 HcmV?d00001 diff --git a/_module/ncs/pi_test.ncs b/_module/ncs/pi_test.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7d3ae06383e2b009b26dea7776f1218ade205e59 GIT binary patch literal 8555 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 delta 218 zcmZ3)dVp2i&pB8j%uvt3iGhLXfE)u5a40Y^F|#m(n2e17|NsBNz#`26r2kBmo~Q$r zVMLX|p?-%WuMk-416hz^eUo_@Ek&h}jQ#>MdU67zsj4?K$hsE{EMWQ#0}Hp3JjfMD mW-vUPe1K6wv>Rw48%TO@|rU?yG`HU=PIWnkRPsKhJ}WHKISVq;}sQej|Z z{Qv*|4+a)#1|a>1iJ66&fk9alRg@X3hLwRqixI3_Wa1=S#_ba?L@>rp)?{=MfvHeo n2Ac8(V%FqJMmff(lV>n4XRMy=z+}T{F}aq>hz}wOAr%+^0^mK0 diff --git a/_module/ncs/plo_townport_usr.ncs b/_module/ncs/plo_townport_usr.ncs index 91e3277efb28ac3173875547ea193331a855d66d..43775d136b6bff6ebd89a20a1439136d162f77e2 100644 GIT binary patch delta 41 wcmbQpIGvH#&pB8j%uvt3iGhJ(`b1tM#?Xllo_w-E9s`>+!~g&P|0pm30LA+Xp8x;= delta 35 rcmbQvIFXUp&pB8j%uvt3iGhJ(;zV8}M*oQpo*dE)|NsC0qrdz0%nS?;j9`)pOmcup z0WhfmCLO?J1Bi5F0Fh2$(gjR{DE1g1z9#8aPmK!ed>;!71iFqaLYSb+fmoS`p4 delta 87 zcmey%G?j_h&pB8j%uvt3iGhJpbRw^uyc#3p|NsAgFtA870O>zk3~~%WV5iLh;ZK~Q e&d4_Lmsq!s2pM+W7KVV+fQlbX5+eqb2NRH> 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 delta 5658 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 Rg#DpcxhxSBJwI%+{{x5=!)pKl diff --git a/_module/ncs/rest_inn.ncs b/_module/ncs/rest_inn.ncs index 3ffda967aaba2689f50cf499963ae52774808d3a..d7062ebb90bda5fe4ec9a8aa152a5304269559f0 100644 GIT binary patch delta 204 zcmbQw@|lI#&pB8j%uvt3iGhKscp|S{eF-Du|NsAgFtA870O>z0%nS?;j9`)pOmcup z0WhfmCLO?J1Bi5F0Fh2$(gjRc(S{i~t*lEQ$aC delta 103 zcmey&GM|Ol&pB8j%uvt3iGhJhej=}&yc#3p|NsAgFtA870O>zk3~~%WV5iLh;ZK~Q q&d4_Ln1RYPW~e$=2BsZMIs!mNEFdfkQZCKHV$T|Ns9B Z15kj$n28a@`N6;<%>bnTY&6umyR#xcIm-Gyebo{|88b L!I){I)1GPo1bYw{ diff --git a/_module/ncs/riddler_g.ncs b/_module/ncs/riddler_g.ncs index 1ed6ffd7b7a0396cbd8fe9f4db69dcce8bd0c6fe..d1bcdca5402ac525f5aa4325fed9eda3ed64874c 100644 GIT binary patch delta 769 zcmZn^-zzTd=NzmMW~gW2#K6G4SB?P)I20II*g%Yl+E?XRm_aNiW)@Z;$;!ma%=rKR z|0@hEAeHPolkFJQMI#tNVm}yIKx%lD&xrR%8;>0*Nq)fOY<1V39@e zZb0;KE3+$r)G(fz{Djelu^+#tJ7}6bCkHb*FtPK3bctZIYVt-VQO1Llk285Nw%|AV z398WyMw6YG)r`OnX2V5-z4Zmz^9(kVYnTlTAR55ZZ-CO^aO8&g^C7Y(Zg7Y(?w&l6 zRdVxt=4p%)5S`Ktz)-yaVl$OOL^e-koyY_Z<;i9oR*Xj{7jpD4>P-H}p%4O5pu!B) z@d=4y`wD0e(1bRa8xTp2!C&7iEGO0FvZUmIoR6WwIBe858@q$&E~6GO8f6 z#F#s*Yj#T*kfduU2I1Veuvy*3X^f0PTR^wEde4dNd5NN#$Gca5}K-9>B zqCg646EH%+`d>gJ<^#xl2A;`PoN`PIzbDV)RAk&dc@L*9qtfJ8oYIW#lZCka7#$`j zatTYif`S;V8R!YH!9SpyCv!zG7EXS{rOv27S%h0dUjb$n*b!fl98m|B`GXQVT9cEx SRVMdxOY=j#`~#w1fdK$Dinb*H diff --git a/_module/ncs/riddler_q.ncs b/_module/ncs/riddler_q.ncs index 765e9305193bfb7dee797f59db7ea632b7f76966..e536be60fb4c2d11175acffa4f6c51f12482c060 100644 GIT binary patch delta 285 zcmdmWpXtkerg}f;V1+P4Jp(5OhV@_M7=VC7fq{h$#9(0t5~rA$nHm58|Nn!5g%!wU zWQ2008GwR+m{@_L+@Zm)E(El=s0nrIHTsom9lKIAeXRBJf_EZf8y7CNk?4oK$gM8z*?O6AX<22K^lQ1PzA*9FJQZ^8Nte;xFO2a OC(AP_Zgyi@w-x|$nm&2} diff --git a/_module/ncs/rnd_addcsc.ncs b/_module/ncs/rnd_addcsc.ncs index 5f7412da9042bdbb5d57647421e5413c6cc1e2a5..732383f6bb14451670087495f0aaa06cc776650d 100644 GIT binary patch delta 50 zcmew++a@RO=NzmMW~gW2#K6GMCdU8-9109f%o9cB`4}1h|NsAkfkm1DNdMVra)=KA DC~6Mz delta 33 ncmZpZ`z9;u=NzmMW~gW2#K6G!O^yKwI20Hripy_wIm8D5iy#Ni diff --git a/_module/ncs/rnd_addcsd.ncs b/_module/ncs/rnd_addcsd.ncs index f570ba9f324ff4656e0330dc6b31d3e3741c8aa7..08d1a3b996d52187186d2bf19a5b1753e68cc3af 100644 GIT binary patch delta 50 zcmew++a@RO=NzmMW~gW2#K6GMCdU8-9109f%o9cB`4}1h|NsAkfkm1DNdMVra)=KA DC~6Mz delta 33 ncmZpZ`z9;u=NzmMW~gW2#K6G!O^yKwI20Hripy_wIm8D5iy#Ni diff --git a/_module/ncs/rnd_addwand.ncs b/_module/ncs/rnd_addwand.ncs index f7c9a3b15e81cdd562610a5fc5ccb19724a93885..4d7b9e03ebdec2d797a42987852f662322efce83 100644 GIT binary patch delta 50 zcmew++a@RO=NzmMW~gW2#K6GMCdU8-9109f%o9cB`4}1h|NsAkfkm1DNdMVra)=KA DC~6Mz delta 33 ncmZpZ`z9;u=NzmMW~gW2#K6G!O^yKwI20Hripy_wIm8D5iy#Ni diff --git a/_module/ncs/rnd_amlt.ncs b/_module/ncs/rnd_amlt.ncs index ef6ca3494debbc9e493487f410a6281d947764f3..f71a1c9cee4d8cff7da893942f96080facce5271 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gTqmz#)ZrHb3$jTw{Qv*|j{*Y#CfOAK delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_Tqmz#)ZyfjX88aA{~rYg0J)A7pa1{> diff --git a/_module/ncs/rnd_arrow.ncs b/_module/ncs/rnd_arrow.ncs index 804339c869f1fe367f3c85e428ba008c70f5429f..ecf7c8001afc3a942dd46a9bcfda093c22d8acb7 100644 GIT binary patch delta 109 zcmcc3{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRVceCn8`WuTAus@5R+kwE(0^; x|NsC0FtD&N1Nki63i2TFnu-3BlNA^RCnj(JDapy}7*+U%z&hBZ89?e47yyNQ8YKV# delta 103 zcmaFJe4Clq&pB8j%uvt3iGhLf_C($^_H0=OATxeqRVX_@n8`fxTAutY5R;)#mw}n_ u|NsAg7+6@CfqWKj1$mHo*+hTI$qI~u6B9Uql;q@fj4GTw(hMM#3Jd`BNg2if diff --git a/_module/ncs/rnd_belt.ncs b/_module/ncs/rnd_belt.ncs index 76384cbe92dbb6c7e02308a2178084d092f78280..3b7c3b9b8a70f35200a9229eb1897325bb3fb2a8 100644 GIT binary patch delta 80 zcmcc5{FIs3&pB8j%uvt3iGhLf=|tW%_EK2}ATx7fRVce8n8`cwS^@ha5R+lrWM4*c b#=43Al9THgBlv~Df^5^2X88aA{~rYg0J;_wr~m)} diff --git a/_module/ncs/rnd_boot.ncs b/_module/ncs/rnd_boot.ncs index 4f89d11fee09cb2b88bd932f0b4b84f2df7fe667..6930a4a41914011cf065e057fc8da8b9bdeeaa2e 100644 GIT binary patch delta 77 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ Y#=6PrjD`F{U=cQHhX4Qn|50E70M_vnIRF3v delta 71 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ V#)`@5jD?&$(hUFq|No=F004C9650R& diff --git a/_module/ncs/rnd_clok.ncs b/_module/ncs/rnd_clok.ncs index 66c81226d578eef61992c664807f152104941cc2..f6dd8ab0af7480c9bd32cf7993bf7509cf80261d 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gTqmz#)ZrHb3$jTw{Qv*|j{*Y#CfOAK delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_Tqmz#)ZyfjX88aA{~rYg0J)A7pa1{> diff --git a/_module/ncs/rnd_exot.ncs b/_module/ncs/rnd_exot.ncs index 51ac2a1d3301dd4bebf09caa15a3aaa7e1e8c389..d227eebbb8bd80f13b114d2411defd2aff8acf48 100644 GIT binary patch delta 96 zcmcc4e3zNm&pB8j%uvt3iGhLf?nK@c_Iz0eATxPlMKHT4n8`WuQl9Jr5R+kwE&~fQ mkY-_I{Qv*|4+a)_kZ9e+KBdX^jQ;#WU`1@w3_!_03Jd@~FBg*l delta 90 zcmcc1e4Uxs&pB8j%uvt3iGhLf`b6Fo_Dop@ATxGiMKC)*n8`fxQl9KA5R;)#mw|;D jNV709{{R2~2Lp>dNVH;NpVH)dMt@EoX$GM19|Z;gzRVXi diff --git a/_module/ncs/rnd_gaun.ncs b/_module/ncs/rnd_gaun.ncs index a51b599a4c3f701d3bfb8672b1d27a6c4d0e02cd..b760a18dc21a2d20f1ca0ca944fd13c75c041c2e 100644 GIT binary patch delta 98 zcmcc3{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRVceCn8`WuTAus@5R+kwE(0^; n|NsC0FtD&N1Nki63i2TFnu-3BlWQ2m_=UjA*rXXiiWC?CebE=1 delta 92 zcmaFJe4Clq&pB8j%uvt3iGhLf_C($^_H0=OATxeqRVX_@n8`fxTAutY5R;)#mw}n_ k|NsAg7+6@CfqWKj1$mHo*+hTI$u*2&oIKJDAZY~#0R8Y6I{*Lx diff --git a/_module/ncs/rnd_gossip.ncs b/_module/ncs/rnd_gossip.ncs index ad48a29f37ea8dcd1388e613f7fa13898cace7a9..c414f8b46141cdf6d6da015dceb57a8c4a762328 100644 GIT binary patch delta 333 zcmZp&on+_j=NzmMW~gW2#K0ggB*y>*9109ftSrp`fq<2P;U^;_Barojfkm1DNdLhj zHBs9{nu(c(8E6J0P-hyN&dCo1jW^C!XCb6!GZSk8VMQA_jR-4J;M>ZK&$`VI1iunc NAev9unqH}|%mDjuagYE2 delta 188 zcmbPa*JP{h=NzmMW~gW2#K0ieB*y>*91099%>RLam4V?WBNB6>w+S~3Gf)L1P$rFW wa)6NW# diff --git a/_module/ncs/rnd_helm.ncs b/_module/ncs/rnd_helm.ncs index 31d0b00104bb46b89c59913c2774d50c94017775..fe6365489c89beaa9618ee71d2169dd48892772c 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gTqmz#)ZrHb3$jTw{Qv*|j{*Y#CfOAK delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_Tqmz#)ZyfjX88aA{~rYg0J)A7pa1{> diff --git a/_module/ncs/rnd_larm.ncs b/_module/ncs/rnd_larm.ncs index 31d0b00104bb46b89c59913c2774d50c94017775..fe6365489c89beaa9618ee71d2169dd48892772c 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gTqmz#)ZrHb3$jTw{Qv*|j{*Y#CfOAK delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_Tqmz#)ZyfjX88aA{~rYg0J)A7pa1{> diff --git a/_module/ncs/rnd_long.ncs b/_module/ncs/rnd_long.ncs index 4fa388bb48d8aadd11d3cfe8856700f897672705..0845a6b3af1c7bc4782a24d9354da8f331b3fc18 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gd?#;VRN)r_3$jTw{Qv*|j{*Y#Cy^Bg delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_d?#;VRN>^2X88aA{~rYg0J;_wr~m)} diff --git a/_module/ncs/rnd_magicitem.ncs b/_module/ncs/rnd_magicitem.ncs index 528599be30127d5c0f4e1d73461cdb3344cbe1b0..35b720b5ffbde53cae4b2dcd2f3058878ef04efb 100644 GIT binary patch delta 94 zcmZ24uv&oE&pB8j%uvt3iGhJbdm`@w4i;7hmh8;Dl#NFr%)Asv#{d8S|6pK|W&qNEHg45m rWwhUXkClay*8w6V%fP_Es5kjNn>eG`W_ET?Mt&i%#1AleLxBMR=NKX8 diff --git a/_module/ncs/rnd_marm.ncs b/_module/ncs/rnd_marm.ncs index 31d0b00104bb46b89c59913c2774d50c94017775..fe6365489c89beaa9618ee71d2169dd48892772c 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gTqmz#)ZrHb3$jTw{Qv*|j{*Y#CfOAK delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_Tqmz#)ZyfjX88aA{~rYg0J)A7pa1{> diff --git a/_module/ncs/rnd_ring.ncs b/_module/ncs/rnd_ring.ncs index 0f76bb932e0d24fb3147da0b9eb0dc237b63a9ad..15bffbf4d43578c9e3a10c0d96ea03576a5da5f4 100644 GIT binary patch delta 80 zcmcc5{FIs3&pB8j%uvt3iGhLf=|tW%_EK2}ATx7fRVce8n8`cwS^@ha5R+lrWM4*c b#=43Al9THgBlv~Df^5$BwR3`6d^2X88aA{~rYg0J;_wr~m)} diff --git a/_module/ncs/rnd_stff.ncs b/_module/ncs/rnd_stff.ncs index a420d472b65c86fb13fc81f5a4930edf64b36068..56f02ba9ad6238e34cbeaba1f2cea35e1f002525 100644 GIT binary patch delta 109 zcmcc3{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRVceCn8`WuTAus@5R+kwE(0^; x|NsC0FtD&N1Nki63i2TFnu-3BlNA^RCnj(JDapy}7*+U%z&hBZ89?e47yyNQ8YKV# delta 103 zcmaFJe4Clq&pB8j%uvt3iGhLf_C($^_H0=OATxeqRVX_@n8`fxTAutY5R;)#mw}n_ u|NsAg7+6@CfqWKj1$mHo*+hTI$qI~u6B9Uql;q@fj4GTw(hMM#3Jd`BNg2if diff --git a/_module/ncs/rnd_swrd.ncs b/_module/ncs/rnd_swrd.ncs index 4fa388bb48d8aadd11d3cfe8856700f897672705..0845a6b3af1c7bc4782a24d9354da8f331b3fc18 100644 GIT binary patch delta 80 zcmaFJ{G6HB&pB8j%uvt3iGhLf`9$6{_HtPUATxVnRXDpOn8`cwMgjXG5R+lrWPe6+ b#=40gd?#;VRN)r_3$jTw{Qv*|j{*Y#Cy^Bg delta 74 zcmaFP{E(T~&pB8j%uvt3iGhLf;Y8jv_Ci?(ATxDhRXDpan8`lzMgjXA5R+lTWPe6+ Y#)^p_d?#;VRN>^2X88aA{~rYg0J;_wr~m)} diff --git a/_module/ncs/scrolloftownport.ncs b/_module/ncs/scrolloftownport.ncs index 0bbb32243dee9a2615d0c6007369bca77b34b3c4..23a3a06f22cc847ead41bc362fa1ab5b54eea08a 100644 GIT binary patch delta 85 zcmcb@{fwK}&pB8j%uvt3iGhLj*+gDL#t9ScGZ@1suCSJpXJKIg0%pel|NnnsU}0ro j_{by+5@Fl;-JO|n%Vc|&wTx_&pR-(Gg9uOF&MFH4?41_D delta 70 zcmaFHeTAFX&pB8j%uvt3iGhLj%0ym6#=4328I0Z&S6GWkvam1!0W;(O|Np-*u&^>P ad}P}A*PWSh-DFpmwUd9aoSuA=RTcousuorN diff --git a/_module/ncs/se_door_death.ncs b/_module/ncs/se_door_death.ncs index 1209164750268ea664a33b51807ec62557a831aa..a71b2a20a4e0ec0ad03873594758e4771b7bb4e6 100644 GIT binary patch delta 356 zcmZ3<^PXGU&pB8j%uvt3iGhLjy&MA&a40aauz?s8wM!WlCN30Fkp=PCbOb;Y5b%Kc zV$6*H|NsBOzyj8EW#VOJVF_slkPujU5k%8uW=3yDm&yK&7Hm*~cE&BDQeeG*pn651 zGG0uEBJv;$L}1cj3H8a1Od9OE5I0Rez$B~B!pguGkdv64nwXT68t+n+UjP*0MTq#7 z=CUw@3<8sklYN+D8H*;bVwPbHoqU|x6Xp^D770d$$%(8YFacYZg^cQx@3Tn51b(rY rvfqRn;>PO6*f6=5HBU!{8R*L&vLL^ffPD;P0|6VD{Q!ymM}YwVQ@>Rv delta 435 zcmaFQy^=@U&pB8j%uvt3iGhJlQ;q=$I20I|*jU&=Oh(54|NsABV3B43(tjpOmoiFC zoG3DJwJhU_i6@nLg}~xpWI;-&P5kf8XgArL(PDBZ;}(7qW{}oD3@l(H`6dT38M3K@ z)M-wh&ZJRai`@n$X0SG(jjRkzj*O_*GqD0i`2unhlT#Cua#G`6it-DvsNhAY@GH$l zQ^3r^4041DR$(;zCJQmgGUiM!V3uL@pWMsrIr$E=gs2qQ0Eo&juz;D&&$5tFaq>nM zX*P)aCpWUlPyWs#ApVgFVk5fIe5`JaeUn33^YmaIR$&H)*B3}Y%YuSC4b1)lCLch= G6&L_PsH6q} diff --git a/_module/ncs/sei_sit.ncs b/_module/ncs/sei_sit.ncs index de30a5f7ee7ea26687b4a698bc07bc6ae8d577a9..794e5f14fb289350e70695c865eca2edd08eeb9e 100644 GIT binary patch delta 64 zcmX@Ycz}`D&pB8j%uvt3iGhLPz(ihs_C^*qAd_KYuo%iB&p$(hUFq|NjFa G6&L`J@)3Uk diff --git a/_module/ncs/sell_root.ncs b/_module/ncs/sell_root.ncs index 54355079cb8e8888956958b82c9372e66320f313..72ef5a3500047b8eaf0279dd58bced3aeb10bceb 100644 GIT binary patch delta 99 zcmaFH)WvM;=NzmMW~gW2#K6GVCC2~+91099%peAsWCW8;VA4&C0jxqmn?ai4|Ns9V hCd!9N$+NJ46f-jd1%5EFure@wWReAmuubf|3jpb35%mB7 delta 63 zcmeBTe#Rv4=NzmMW~gW2#K6FqCdU8-9109t3}67LYhIv`B0MA&pB8j%uvt3iGhLV;Y414X$2N$1_lNZM#lgD|NmfMk!AqWe`J9|3~Un% u-GwE<0#`r+JW^2MqZN!(C)+UwF@D)Rk?{o=8$@_=C66y>B3Ste1qJ}-b|CKn delta 90 zcmaDTd0vv&&pB8j%uvt3iGhLV{6t=VQ7IN?1_lNZM#lgD|NmfMk!AqWe*JbV)`RxtKY_F@cTe7AWn;|s3I-8{aW>0lKn6c_+RfgpeY diff --git a/_module/ncs/spawn_mummy_onds.ncs b/_module/ncs/spawn_mummy_onds.ncs index 9183af824e5cb5200879391fd7c2ad01e75594fb..f17145c1f6d0f7568626258b22455e7fbca0573d 100644 GIT binary patch literal 238 zcmeZs4ps;=)H85mU|@JB2P7Cc6d0J8Sy&m^Q!SyBha}HJrGt@J1Vqjq8pU69bF@NH`WIkC2AYhYb`2YX^2L%QI$bbs& delta 35 rcmeBY>SW^ea}HJrGt@J1Vqjq8oX9(YF>~U)WDaSD|NsAgP+$N6o&E~B diff --git a/_module/ncs/spawn_towners.ncs b/_module/ncs/spawn_towners.ncs index 46266e95ffe9d0a5d81810c5d3d0800f5e1cdc0a..f260452071775b718a23c7025d137c15b47aa38f 100644 GIT binary patch literal 38615 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 delta 488 zcmbOvv`UcI&pB8j%uvt3iGhJ*)kI!b(Nj!pEX)iH43;cxK$1ZYh}pF!rYnnTKqV{? z5^SG<63Q?MJ|u}MK(QbYMFk+)k-lj&zsD{YQh*b*^yP4u?Sg0bn-%06S#g+gk6j;5z082 zdcc-3pjak|q&NYgn2Cvb@@Y1NnE?o84A+sAF;-1ZU`HtPLsI64P^Q4}5gfE%6c~Wv Z0g5U{aFG9i1^HxVj(vEE9&pB8j%uvt3iGhLPn;ei};80*-VrF3mF&P>E|NsAkfkm1DNdK8A?ZMbE NF{O$F%>ALj001xi6s`aO diff --git a/_module/ncs/ss_treasure.ncs b/_module/ncs/ss_treasure.ncs index 1f06c1f274f78d28fa8248b7638745cf55063104..e4c7f94000c5e0dbe6e6c7d3b35ed8130be3b371 100644 GIT binary patch delta 242 zcmaFOJ&~K&&pB8j%uvt3iGhK2;zV8XY>uRoSJ$YEvc~GKx(uXEc&lU~^HCS6AB$$y!orNC-mFtDhA)INc!1+sTeR$(q+w$^2s?8z)|1y*(kYUB-w zGKAv4JYe}7P-CtjWd1l$zQue9<{t)B|4d%QqRr?#`5cQb#2H7R<{v=l|G#oFJ8KsJ Dc8`5@ diff --git a/_module/ncs/ss_treasure_spwn.ncs b/_module/ncs/ss_treasure_spwn.ncs index d51738d21d1987fa2fa3e49347ecbebcc71c14d5..a276d4c415dd06cf0f4e01dcddeec5e38d8399f7 100644 GIT binary patch literal 7261 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 XEw^`M%N>&~as$e_vDf1fzP$ejtO~!z literal 6471 zcmcIo-D@1z6~8mHyOw0TQe(+Y?Alpd{wQi3WILAAv^W{9Ceq;D+3n6KYo~>alQ=X` zBvp258uHM;prj8;>(Unb)V|qJ`q=jn2n0f)p(dE%f*aqEQ3jcgQ(fvz_@Mazv~ z4$I^H)C=MKLectS6#fwFqoD7ToLge4V_7OIF}G%=8LX+aMl*_&pbaIvqmB*}J>RU) zO;4Z1!UX7|#YT@dOoB#iH)j1f(8L>NtmNV4?5sX+mLBCV zdX{MaEs`_QFDLNZwXB$_fntV8Oh{rL?-S!UX2T##bl7M#XTy5X!{vNDKwy<|I~#@e zS%DcjzaAiG$jZ5C;Ca6)m7e{jQbbFBDZjun;KQ9)uIQ_)moHs;ef4q~iRwNv29~Gs zUmY-y<0<8sQ0hysUtQMAOGJ*uE}gr6{df4-;S%aSy>NEOIKDdU1MAGdrK=X>)u|KfdMON#v3|Mr`C`mpIJjT$g{iHC{|1T z;hQKf%K5OS8$MMWrE*V_AeM}NNxVUC><(4)E|Yzr*+%+VPe7Y|QEw8ypPXQmM5nS< z)DoGZbDuZzkXrK|5V;&OtL-WJDg*x>c*jo?zjj_XF6zW@&j$%d1pc|{5$4}p%*Y?& zt6C{PNC`i3AZl;M(J>??y44J$p0wYxv?wpl5f99KRcUM|buG_J+3)GWl2&aS8 z|I`_npo;RBr7(Sp;D&1#IKZLqpnI~LFhwMNZhHJD(T+n|huPFOxHEo-He9&IGyFd|YzoF*>Kc~SETn54LYfC@BymWPW^%q%o3@9+p)|<8SK^yP$I^F$? zGd@WG(%MP40NjYJK&)Y}`SrR^n%Zw;#`KI6|AK0pEbmpLWbO!CUnL#fY|t`D8rSGC z+EG+f`JHU_c2T_^8r5de(}bF#vKD%J2PPz=aoC`pRq>uI9obnWEz&a4VFb}pn4li*-`!EPFTDcXh5KlW zV&4w-JsWV>RIhto3}70XUBibxs*^Y9tG30Hj#(eR0Zx-AnChFG|ND|S4zLvaw8`S$ z_ADtTH%LF+LTcv+oCVTK&!NL#h(9P?ES96-ys`zBOR)IB!GrfHvogAuM=^=IWoHGP z29bMBZGDSoXUD%t{Yb|_^1NRQqj{p2nUYnl&ZP7D2z5Xk*bKwB(OlGsTSXIbj&Yhn zGuGa7`gjlKV1bBSG-Wx#{*EGdEgKiQFvsk7-=ei2LE=83k9AxRf)@IRj&NR0bX;qP ztpw`+ZMxW*bRrrAyC#YEF?L@D^N`CWO(wm0!ay(7J^nT7CIol5zQ_fy85q}iC~_=% zReKcPP!kyorW~8#+2$e#fOWDf+g$QH+*~%;2kFtEV!#cLD$;NIQDTm!^o(gmz;|wQm4~KW4l^eRXQzQTWoW*KzG)p ztcS&Pg*rLBq-{fY+zR0YAX~>lwjOB@rn_bO>#oT-rOI!NPeS^?y!=syZ2A5Pt|pEG z#9CGeA=YP!^<6j5O44yAfYd3+0$J|^=4XL{vfOIMN#3$Spw0@Yfo$6Xq8y&J>e);cF1ld2?j}B`v&7^JKp)>-Xp0yf5OeiQBgiCux9c-cSh)PG-(Yr`mhdjS0377?wLY|NyM|2aIY_tl8O|5 z<3DcXX*!r9A5;oYXG&oJ-&d=J{z!-cz*Ryd?o$i>+z(m{(brxJ>g~Z!yib!;FBXRO z0c)Y(C6t?M_WEj?j5$Y*jPmL1Nt4{uQeU<&RxB2@*G?c^qY@eG-5z>cvcwM}C}`5xC%S zPFfC*@(d5?+^NU8)dw_}5G35pID7G#vR2!{@BEoS!#505|evuj^XpNxPi5|)Y6cx9PBP_<}OnRIr_usMn zpAkQwV%Hd&`SHUoXUk}<)64p!#><@bHs_zW$$(rV^^y$v+ys%S&Vty_(y*=|n;$@e zP5Cr?#9*!@+Y77gHqr&_$t*g^JKr;AncOUu!mCG=TXF3zmuSVQU6Kk;df!&1F|O{9 z=^Iq?&bs-Qb#vZqkw9+*2pqo|aOCCRly)B?Qt2=I=u6TMkVX$x7|bc!!Aj0dh7N98 sMJO`q23kt&ySzqIXg^5-9nt^8(%;Tx#U05CK2;Ds8#2sSzm2N;KUQqSLjV8( diff --git a/_module/ncs/store_cleaner.ncs b/_module/ncs/store_cleaner.ncs index 394d030116d97b97516bf34c077befa4c8d0afc2..98674062ea7d9c36a77937415caa479123180001 100644 GIT binary patch delta 68 zcmdnUJeir-&pB8j%uvt3iGhJ}@gC{|^QhX$BzuhZ)5C!ob49 k29n}Yk_RcdInl37*jblBg&D5o4@kqrlb(#SlZ6=@0EBTLWdHyG diff --git a/_module/ncs/townportal.ncs b/_module/ncs/townportal.ncs index 8f588273de44cc213b0bc237819fe7ebbb685ab0..b28c47996610b1f9a582f813cabf6b894ee69a85 100644 GIT binary patch delta 67 zcmeyu)WFQ^=NzmMW~gW2#K6GVFp<|#SVEfN|NsAgWEp@0mLQUWZK8K9RQL;6;3QOd G>wW-Pf)Y6Z delta 55 zcmZo*{=&rT=NzmMW~gW2#K6E0tNH{ delta 69 zcmZo+TEfKZ=NzmMW~gW2#K6F)GLctShl!bmnE?nG8UO$P|AT==ngK}v!7e({>>L1F CKo&dz diff --git a/_module/ncs/use_altar_evil.ncs b/_module/ncs/use_altar_evil.ncs index d847128b7f5996bced327dc65eacb9fe9000e8cd..b388d6f71cb76759656a92630924c2ad2a7a207f 100644 GIT binary patch delta 1359 zcma)+L2J}N6o6+YlWa2CW|Pfkcbjb5)FL9-qW0ivLF`3J(Sslb>%oIPDZTVoaVZo$ zcyap<3O$GvJTF9BJ$Ujbh^Q5z1?x>gDs<7pn(TOam2Q&5Wcc3q=1nq>S#NG#Jac9G zT6F!~ER#^5_v^no8&lp|scQbqNnh@;+n=ELJ`17vU-)Q%nY7*K!-5=m}*s zO|AFMZkS9*-=-tc+H>~{=*D<2Zx&r{6k zWRlMBBFZII-yy0>S~!iUCaDgH79=(PAgY^@mX{XPt$jhkvJ4J$L|sY!Nkl7>25ae`Z|pG} zp6N{spAW2rW6*JIxTo|)uprNOu=$hk2%lt|F3f2AqQ07K+7K7MiQ2#J8eF|({1)Dm zJZrW@S5*8QX8heWs3_e%C4xv%lZye=i!z$eY6!n4v&RQ t>9_FL{w4JM$YlbW{{psy|9Ut(aXff^+~;*1b)(s!#_a){k5@vU{sk}>@Ol6M delta 812 zcmZ{iKS&!<9LL}9cX#p5%b$z6OJZ_~mlm6Lu>J=@EF~Fi1>2#2LdSM!p_6;TE-i># z`Arh4LqG@JB8Z!tIyx!{8H(6N2$ePkF}=HYIe0_g^gf^O7v6ik-`?Z;T<%%*h4Xs+ z;aG*SV!g=Rr8-Puu)wITSr0l)Rv4Q^3A)`bhf}yC4SB_ZJo9A1-4^G+EicoCt=Qn! z--BPjX0j}~A?S|Zuh9rR$3l(1z~q~lU%3e?lI{$vLVmRG#UwU^Q-|HNp0C8#@xL&TS$s*eJKg2f@a4$MznRJQQ@Cms4drKy$?WB!mVJ ztu4VOxlI#D)>P()kfnH*y%Ma+ZLZ>dO8zUI$aA!m7^fqti@7uzcGbs4rG?pp5Sx+T zn0XoEsCt1`C%`FM*Z!cn5~g{*gQ;8(n`==GFj?<0-H-o5W5UDcQlbJF-wvah$|FI-I(6aVeD>9naq% zAVqK!EVe_Zjv~0KI5^mq6m^3Xq`42u~u6o6TkeNiGV%*MbO#hHac9Nk(WuU`5Cg)7!@nL_dlaTV|s( zZ2EfiMoRtpTUQVzF>K>7H;wsD>xVXeS-*Ii>Qb2x6L?_35~Go?k<`kGTF?{5rCE+j zjLM%mDl@A3990-i)i|m$N_IJ#(gGzKP8(Yi?1d$+Mp;5X<*3GJW|*UCMzbp%)fvrQ za@1hdtZ+1=1zt20>m!G=Otu@aE?7@G0_t28JruG~R)>`T z=UTQ*s2VODNE*Bm|4`=>JKH$xH!VF*HZ&MlzS52_?W|?>CoRmjvt;s%TIcPoIeJXZ z#U!g=S762_u&rIvypn95(d@ezW20)MG0i-RDTiAbz)9vi)whz2(cBeHSCWji{11|_ zg8>lh8zuAcT{s)BYzdRU@kRkQ3rF2I3l&?x%xUY=uim=6cmEd${Nnpg;l81v(!E12 Yyl_6;oq!9`fzG>Eq#D0M4-UM>KbYRHT>t<8 delta 948 zcmZwGziSg=7zgn8y?gKSr1vA2OD<`WUcD3&aIhHbB2@%+Dn$peTK@nCJ9SXeAtm78 zq=aV|bP#kaaaZWly$#}|h(gs2#fn&3hlU&>s;*5SFc{a9xb(I zPhS!u>`#mMfk+raE(lzO;N)MS3?b$;T@Hssdif}4^b<+ZuZaZ1cnmw;cDt_hc$9Jf zj!gT%g(9+|biqwLC9i2yU3@I(mQ`9g{9n!U( zW9pNZCz%#VCuf)zNh=SMTdKa(Jf-46DE#i8#g5s+P5lp4mgy$(vwI=ME5;6#500?c zF^dvPFOMXx)nFHb^CQ^J{({2x2xhHs;6G&8L?^WIo_z>;b0iozKOnb0f?ih5 zjj_PQ4euw|`(uHDv;F~CPsaii-xLO!Gh@CB@PT2Y_o$>~<}SlJ?v=k5>tyM157OV{ smBbgB`S@rWxKdenj!#}!k58JoQ+tbF++=;T=Y&#bZnIsR_+)zj9|W^2Z~y=R diff --git a/_module/ncs/use_archery_targ.ncs b/_module/ncs/use_archery_targ.ncs index d95ce0957d6776e973ad4cc6e23cb9b3bb66cf2d..8756628f5cf2c920883c8c0d881f2d9fbe062207 100644 GIT binary patch literal 855 zcmb7?O-sW-5Qb+r*|reB4#A6PN9xs31y4l;J$WgLqD8z!6HP9OBrWM*@Zc}-4|?#> zqlZGAopk-EJ(v)(Oy+stncdm`$pv2RdEH|G>v{|5X(33ZffxuO%Ch_bdjn{l z%7)$06s2zdq^udL)nF@tS2?G)3_|*sIX$PQV6(dIpo!bMo@=5_9jzN1X3rgL{-18t zqMNnoRxR48MfYmahqdS!;gMAXlm~```UgdweH) zyVSJa!ta`9A5>!LXNj3xb*tInbb*21mV%wjD9(}Ihcv@c9%2y>Bh38dF$}N>{iig^ KJ#LQeCJ3Jt_Vqac delta 173 zcmcc4_MDa1&pB8j%uvt3iGhLX`9$7nX{roBAi>P||Ns9V3@j|nKwcoX0=oiO?!UV=o>gNG$V@DNClC^;-RxW0O?d($;(&7^0CKDdYO z=~vaSs($sa>Z(`!+*7C73&)p_J*jDjyLW2vH^MZdRMhlSnyzncZEb4iJ`L_&vm{fE zQbAg;Yo=L%N4=oi$+*A(jvS?51gtg~d@b4jtzk#+C<0qCbY0%I;#hhg`q178D0 zpkDRy!?N48M=?9}x_pSPru>b$L5Fz%Q8VQb*!Qd~L@QAdJzDz(wf1nNPRfEW{|rSI zwTE8vT0Y}`)ALz_2W&+MmkGDp;BF`^*0#e2TlKwAR6~1BuqLnD)ic3zQ8Ok?W6H!j z-Rk=I`gR*+d%gzke^pe62)T&sh4*;K%E7ilV|r7zbMFxx-~0A4s5kPG{%%Sb}59$PYaj>}Le)crCW#*scX!oeq1o1>-+YqPy>j ziK0G>!1etdpHX-Jm7VK}1XrogI?S5^VzishmTQL{25fD|X$7|D28_EFTb0u-51P47 zth4I)*XdgUe9!Lq_@5hK{6CoByRBPa*lx}9tMMm`Tf7NKZC9`r0Gun=nO3Y=VEM_8 z&jGW~XV>bfr)#K84wI)?6FzIXe8mw`piOU0EXu@qbx`Fl8tDa`TVcH*r-wF(InOC! zdM*L@?KHrbGcB)Rg(R0()4yj2d=SOj7JSunZ>+DH+!E{zthDl^HhD3oh6BBf*D;W2 zJ8ifRL~!cU>;#Xd5){o zWXHPP4_3#nH$oS-pLqf;eUSom*HD0#U(XJ7u^*seqvcw{&l6{nD>!9Xp2Nj>H*G5~ z!|pPee|y1E2z<)bd+AtqnoCHtA)MxowYzXFSb0W~(HalJrH0@TAIVjn=1e-y)L8RC zIL%+PlhNwx~^K;$NYvY6%uU%?>wlf+X_O3Ub(PVUWKE>7I6wJ)>?=Gz6 z(Zuo3Ms&6nAIH-14}(v@6YH9MC>wpetsWjJZ-b+6qjNMU3mpDoAg~QMM=r!CPaw&g zPjN93>II1xduD*>O&KM@BeBXMJjP=v@E&brllL#tv0l0#IPX=@$FOLqZtN9~w71k8 z)ZLix64U|@4l8(uti6m@_#WQ$HZ&$F7R(3e@D6prJG2S!;1$o?FJVcwB|3_X%hIE= zo{306>`d_%cPreb7yT!!%L0~u4Lz!N~i4385tFg(bmk0Ug6lbg&dT zfYX)UMktx7e7s(U{-47{C>13FxBV*fJRmQE|FNLM5tkf#b#_j zl?P6-(({-mXT5^#-wG>J|M~GdC_H?C#`ob$%29Q7D0YQ+=xT7eVkF3y=r<-42hqdf z0Q`5w-xO8o62998HxbtYO1}XPA0m3^6FDw!qs8|BXS>NWv^zp~HsNQ$URXpW5)6

      X< z@A~}Jd(~C1&OP!3d-BxsJr8Tz@%N5v@Ec%STGLlGGb5i;`tI)TpPFf=;6YDo+EoLk zKLW|zlePm1vO}tNhLR3xGR=mt%05>SRvlqZ*y!x*8hQ` z8l)PZDr$<<)K7|Pl4|~?sA*C&V~Uy~HM^{+SyBg96?K5rL03@+Ngc8kb%@m5hN9+3 z&A+6mc~Xb3D(Wz)BOfa22&to=DC#JwV_S+kM(X%YMI9$~GNY&yq)r`G)JamOR}^)M z)R{-;V4RLT8;-tV>zM3k7-nftdj2*!%-RYj(3GnwUtsEA;f1ujFEvw|8}%K~C=^kL?jd@&BOha$wJO_gDOY9JuHR%<%8zrlc-U9C17w(B$)cPv(y(;9Eo z5}m-tUyU%+sjEQlxjuN~#N%|RR zK6vE#LL5q~XG>^J940BTEl@M6K?&gcmwr$@WB&l=9nMl(K!IH2iiPN_QQIlIJ!OT`A-~@4}Ss z6Q=z0{~0D+vnOdyLvM9q8t4B=qQblmsF(+zKsW&4Q)dm$r`3?ojych=* z?f4Ls+$sy$*>N9s%bZ!FR1IQ#C0kT22nD)eS90%?q-7ayFJSNY!Lm|!#sNm_&)$~R zsEcZqg+YcSDd}gsC}HOyWNK7sM{_9S(s$ypqR@7 z*D1qBx>d1ZAKh}jM0bK(p5WniXTPX5%toOE{@4^;di@? zY-=YYVeri$njbwM+B6w7;>;zOA2ls&93ZzEL|1Y{K_3Sv2T&Ij_?v+!HW|eU;P?v6 zs6;LY<-o(1Zlo|aFZan9?9ZLRg9(OqV(7uK7a_$i-MU1)pl@y|7l|5|np$WOySj!L;C~0GOMYeJN-V#GUcw zKP9Fb@p>Z|HDC(mSTt(%P}H$~Ut>`u1)~bEf~H-Gyezk8*&GYy1qpu^pX7{!z>% delta 70 zcmZo;?qcTka}HJrGt@J1VqjqGn#k+QDjG+_z{KU62v9YiL Tg%}tafwDgsSRkqtp6tPz7pdQAZJFfrzq(OrFmus@sPm z#|DvOKZPR74iV+}Ir$-@NIjPWiX)_<9LOU)c@LNLWCeD%$$89Ixge2D)R7q>Jn6>kLIa9+SIsW{m~=sXuk11=SNxTGdG z3g6{o*Tk(tZ1NG2Q!1~Z3YfvE;{`Z-FGI_im`OuwGLu-ZEEB1k{*bEaj`%uE%ata7 Tk~quhiOXj?yfTxuq^<)1Nwd3H delta 909 zcmZ2$*=Q!^=NzmMW~gW2#K0iUD8~Q<910Aq42)h3lNU+~YyMzhVP#-2W@2Xi|NlRP zbCXetSstWNNSXm8C<|mtt)Ey^r^vz#WHJKPr!j)ne_>#O2yrWbH3Ur7X7pf^JT|$S z(U|ex5#@l0a$Z0Y z<%EcG-9-`Qf{5}kO^#<0)m2B4JVxijPtI{_B1z3Jk0a4DT3NSQ)r|{arlWBI7+nTz#1t|NsC010>2| z#sref^vzGnOsjOxFD?PgeF4iEGqErO4PgWeePCcgNHOkV21_L)gqRYTq#1z5eo diff --git a/_module/ncs/vtw_chargecost.ncs b/_module/ncs/vtw_chargecost.ncs index 095dc102f32a27d11c372e73ae999308f802157b..93c61cf42c93c5a874bc3ba5f38a10835f877bad 100644 GIT binary patch delta 38 qcmeBUp2E!Q=NzmMW~gW2#K6EfWg~9|BfpR|!~g&P|A5IC3Jd_xmkojd delta 32 ncmbQj+{eu8=NzmMW~gW2#K6GVw~@Dkk&{Q7;s5{tFBBL6gU$(D diff --git a/_module/ncs/vtw_false.ncs b/_module/ncs/vtw_false.ncs index a6d4bab938637682666519f92afca7c73cb8c44d..16175694e30f9f2e5eec8bd57a09b39924184686 100644 GIT binary patch delta 29 kcmXrEP%8BZMx9 zfCo`#W}i8yX}p^fsh5q&Fa4 zgtUNk1Jb*YZb7;Y=?D;ELHZcd^N@}p{p9u3|0X=dzy9BZ?w5ys0XXbqsK^A; U2GS@0r-3z~fk#l0r+;1KC*Vi(!2kdN literal 1902 zcmc)K%Sr<=6b9gv+f3V31Q#NBX}q+k*m|Q1wx!?=x~MJ`!Idvi^htadpG;i1=%O%9 z(rF>B%#VU}7BhtJ%*mfD&fV36c{;8gT@uBwTx^hia)x*$73uE%b?5f^rSo{xRYad; zUuT@LBuV-tSIK?{T!?h-fBo>Q0m-s!w36yKNvCWvHd(F?vOUVjrsVooq;Tzg65HD+ z>90Gf`S(_pe1$Es8N-U=D7QW0B)KB?K58~O);Okbv!iFX{es(u73sFW-(2XaI~(7( zkH)o`zO%sBfG-0#z&C;SfG+`G0A2uI0lp1<7x*6Vec%#!8F(Hz16~Dw2>b;2DeyY* zbKn=i33wBD5x4^W=6q&mg`?r8nH5(2d3Z#b!y^XabHFw5)_f0N$~=4ngm3>x_#yI_ BCrtnV diff --git a/_module/ncs/vtw_gmta.ncs b/_module/ncs/vtw_gmta.ncs index 2fd43983b174c48cdc29d2f2d1360ef7798874cf..73945c1861c4918f17e61cfa44577b06c277db85 100644 GIT binary patch literal 2416 zcmd7TO-lkn90u_Jylk6oUPOd2bD|Q9d?_)(f*>pKU>%B}Q(qvcFVY9<3w4YR9y|!^ z%zs^Bkj#e&+QaS+``g*)nZxW&@6J3N)teVYnOCW{$R4YP~$=anvVI^4<3z4m)%79bX0Pq!qg5)J1csjNuU3$Lka2k(D0mx zTDebgX8T>vJmNInBtPF*YsAh%+sSvi#3g6DFtfe^iMM3p*uItS@2q}L!_f%FcftB~G@^Z}$br1v15 zfwX{h4blxrA49qY={BT0knTd7Abkeubw~%0esOy4f8%fB-~VrX_sh+`3~ctNP|5TE PQ!)>f+<;0J|GMM^gI(Hp literal 1838 zcmc)K-AV#M6bJA#Uv0KVAR&pB(}!ZBTPYS)5cCCJSQkamRWA_qB)yBT;md>=;(?lh`87$^DJxPOHxtTeYok|y}WjwZo7); zlg#UcGZx43kYtg}cf^HA*6!DyTa8GTZKI7uzerkTYk^L4RR`V=bjkLuNMYN#B&N4Z zGTgEfx%X~^T!kqy8U2dvIJY_CG`S-7F>W?J)+DBDvmefHJAm8z70I?g-&}+8F&Ub1Kt3B2)qfr1-uRX y6!;l%0)7EJ3tRzzw>~$s{L!#zX89Gr9v-FC;c*VaU;c0S_0;eM5We^q;lBZ&-xiMm diff --git a/_module/ncs/vtw_hasgold.ncs b/_module/ncs/vtw_hasgold.ncs index 0d2fcfabb9da5a433febcda1276947e4c69294b4..67fb708908684bcde874b39ea77387c601d65918 100644 GIT binary patch literal 221 zcmeZs4ps;=)H85mU|_h*#4HD-7&sIdnAlhu7~U~3GXDSn{|5t$Gy{QaA*4Fr(~v8I_DRcFf;!D|NjR_ zl);z@!C_p)2C9$NJtM%D(M2XfE8e> L-~p@tqQC$EjQK9z diff --git a/_module/ncs/vtw_m.ncs b/_module/ncs/vtw_m.ncs index 046f723bc35d35bc4785777bce7c6ccdae3219e1..790e0b6bedad92716dc291f1adf86e8a3fc4c3f1 100644 GIT binary patch literal 1683 zcmb8v&q@MO6bA5f|7kV4k#LjMjYw3ovan!qr4_iCS`!077cOQYOn1(m zD-3P?W^rZ?^SkGMtMfMbuwR3lyD?E^CDj?Z=fIMzXhTu*{ycsCo=rbr5<~P$t~^R1 zvMftUpOAZRrBX%DM}N-q0oPi&Dp+m`nV#l03zOL;3;ILr6bCI)*esdIaejqz$AOx&F82*L$w{vMa6mu;{j-#zF+IRZ&!kCn|`Q7o_k2MX>S(1fRs`@vX$d!Xgl}izy`F zzs11v{WH7OZ037;?6tcyB5^l(k%AMKBuui_+l9M2o!!H7Z4x~wC?mt*ocX^0CZVId zl4__69#qDZyh!9oB??N~x>g+0i69b5*gEY=(sMoaGP|+xqT9G7!+T8)&4yplYFIM% z&-1`Dz$Nf9@C)!X@D%VQ@H+4+@CNWE@D^|Zyaqf0oB?-$cYybS4}cGWkAY8s6Ywc; W8@LJlsywnLo^Vb4CcbMTToxbY(MgH` diff --git a/_module/ncs/vtw_mrt.ncs b/_module/ncs/vtw_mrt.ncs index 0b1cda037ac83fd27d1169e7557ef3c376cd3bce..ecfedfd6ff6f36f73ff131dbf86473515f19362f 100644 GIT binary patch literal 2325 zcmd7SO-lk{5C`yiUUpaAx=4A^@`)%cGBr`b3ZXafU>%B}Q(qwH+;_0=)2EUS9Xtr@ z?5ry+f%QKG?cv!S_BX@KbC}!9d-vEnZe9@OH?`R&esYeqZ#@b}cUQxkr|03r^~fWd z5FcHwR1`&1vSs4;OdGR^CG|t18QE%FXd{ib;;6K+Uu0wJzXdM+|FaIpffIFP4JRw< zf-6ZEQ>ouiI+E{Noy0NZF0-zfxa8zfmlJrT-jl-1@zMsRmd>toFQY4v zE85U7Sel=&O=&3x(?|Eq)#B-hI9wgJxKQ< zO^`l=^cti+NWaGV+nWFU<(kjB%$moSy$>w=02(p}=@8QA|K|d$zy+Q{Lk|9W$T_c* Bv=smV literal 1681 zcmciCyGjE=6vpv0J2Tnn#>PSfqZyS14J6)(f)@mDkRn)l;-Z=RmJ57#{_@+rO? zCW+Q6&+{KKG5Quy12Of`xIEPFKQ$kzD{|XUT`lxAjP_Nj@Mqt)>9@Kf*#xCMU+KD8#ka7~OShHHYCMX7LEq%dq5 UJOe-b-^bPpAA17Bp3h>~UpC;>z5oCK diff --git a/_module/ncs/vtw_mt.ncs b/_module/ncs/vtw_mt.ncs index 68430a802d94c50d17d2d1600f5ffcd38cf60a2f..e9ecd9e628ef4f7dde3c10436acacf438d9712e8 100644 GIT binary patch literal 1958 zcmcK4%}N4M6bJBgKgOv>HzIEO@Jb{mS!t+XK~Nb;SPLa+8Q z#u0{G_+K=OJNIyZ=iGBQ=lyx;J{#A!PelHYHfO}&fg_!<9tDGsm;US5xIgL*Jfb=A z($-3aVYniDO#EMKV>Yp*eoM3_TZ#%5lIS#wiW|Em8`;d8??hc$!=aM8d?s~QlF^Ot zkbSjI;u!M1X_t>(ymIr~o;*^sxbU{&q$Me40++rpwt6ZNE5zCsTd0EIFK~zs7QxAXpiuvVE?xVt76%6h zA>LigAc1_RW_a-O`M%^$Z#G=0*~VA=kEEPDi= CxQ2%S diff --git a/_module/ncs/vtw_mta.ncs b/_module/ncs/vtw_mta.ncs index 2c372340a9feff8954b862589b0e9bafd3d637ed..5589c8ec1a1bfb553520d94d2280d2f9a6dcdbe4 100644 GIT binary patch literal 2233 zcmd7S&q@MO6bA5f|BRzeZbXDI^F|aFX{MN9L68=>uogwosuu`a_Yl5My;Qhx;X;_s zoNX@4PPQ5~DkfDWs!9txB^%kyhwqaA>$TtXov2f5__C5I zxRXpVlm5MUBKfY>NgP9-GVKbni%*WaOyH3k$Bmcqk^!Ze304j)mT!vHfmc zz!~#>e?c-!=D*}Z1bcV%$L*FRi?&fF&^bw~auU~3u3qE1V9%ALFe`I6nX~SuMb1jq zt>+bT6{f^w2v;Q6xy%!`$rQ2Cy4g1NCWdPxyq#E^CpqPw-i;mdQ{czIHSjaw-@sGA zkANqDmw;aYzXV_#^N-a01>0o&>Id53T*Kfp diff --git a/_module/ncs/vtw_nonsupported.ncs b/_module/ncs/vtw_nonsupported.ncs index 5c7738da8a01396b91115f7548cdaec10df6d08b..1dd759579fbc9f91d1d12d112ee1de2c0013b788 100644 GIT binary patch literal 4060 zcmd7TO-lkn7zglYc4k*|&B{zDE7#sIQG2JdBC5LvLVbZW0@3KuH|Q9Bg+5k?uH8F$ z@F3W{xS){6{}8N)b!X?tFwg%PcFR{)?`EgCeMvO+Y4K%}zpzJ^Be=X{!ch-|O|i#| z=JP|NQon6A?`lsr(HCc|*Xwmiq)7gEEr<8VHnA!jp43xawGidl3ipR;wR*xIEvZq` zGP7+GYBTITITbYv^{dY@#PKa7^IJt9tgwi*$<;L zGK}HSj2jH2Yl1-{nE@i1gNj^$bQ#juke-F~zS6;H&YByLjd0+USWw!FkWNC{gLDSc z4M@i!JqhUuq&FbF3h6AQHzA#aw1D(Fq$eQFAYFj;7NmC}y$9(7NFPGF1ZjfwDWs#2 zwjte8Iv8Ia2YA_spd!PNb|HNhoB-26fG1Fq=fNp50Tek86`2Z7k$IpQ8r literal 3112 zcmc)KO-lkn90u_J?ChKECcRTxxmk)yT3OLMQQa*N>I0O9AQ~O|2;KS!eZ0JKeWJ_1&;C835eM#hJ4ZcF*%MHk|O&)$@rY(LjEs8%~G+t`; z>*`&z@lbiTh(0)D-EOx{W`e@cj$!lO+9FnFgD9yZHliF$@%}O`cAq!Yx<#hAJu5na z)<5;mec&~{JFj|o@AV!d;O|b56uC39VvQaA*4Fr(~v8I_DRcFf;!D|NjR_ zl);z@!C_p)2zW%*;?eSZj=up+61RX2@0b@FtJpcdz literal 375 zcmeZs4ps;=)H85mU|=j~VwPh70uBWR7FGssUw;=*x5#+U5LaJT28MSGK*EfPiJ6)4 z|Ns9#7+Anc1LQ#()L58-BqJk8<_iOhGy_P5EJ#KVOe*OzfK>pMV5r~$tNx?F05XIjg4CY##aRyDgko>SeBhzfgPVb2LX9*0`j&Xc?@rUAm~k06;N-&JPQDR CZDwWw diff --git a/_module/ncs/vtw_rt.ncs b/_module/ncs/vtw_rt.ncs index d1d301c3875857d57f8d66bbb1f783993515c325..3dd34225272989ceb5d1b7d96dc5c086f2980319 100644 GIT binary patch literal 762 zcmeZs4ps;=)H85mU|{;i#4N`E1RM$sOl&Ny4BWo{E}m|Y@tz^BzN`!k?-+oD851Mp z|NsAgFtA870O>zW%*;?eSZf!U_lJQ+9%PURj3*1?i9ywVVPFBNWt`8h09K{L!VKbq z%>~MV&HVw^VFj@R%+}Cl0ILHk1lo(LP6(n7LINERcM~fEV=u&DxPxI%0vpE0tpMX= zb1+yAs1vM~om+vOc-0&vspck0wJk_BM$mmAGU!m%p#&Z20Vq#G09upeNqbs*5&)wn B@_zsT literal 580 zcmeZs4ps;=)H85mU|@1#VwPh70uBWR7FGssUw;=*x5#+U5LaJT28MSGK*EfPiJ6)4 z|Ns9#7+Anc3&6ZT3@oZ3jS^7VFA!Nqdv*nRkhmHPGmvCt1nC6INi%>zW%*;?eSZj?{Oi-Q0F literal 343 zcmeZs4ps;=)H85mU|pMV5r~$tNx?F05XIO@Lbg##aRyDgko>Sk{7DfgPVb9|3twkUWMrJ`nT78#xb?C6I^x1b!9tul zX#+th{TD*AnB>5h;haAqX{OCr;eYKh#Dw2Nq!W<%h&N868w}5z70u8v1|hROHFo%T zDLo14Gq3-I@ik%?X_pEEk7NpnWEL874$>`1w;??Z=|iux@o?5mMjBDTTOy&f7a(1R zw1xBvq+cOjg7gHW#~{59=~YNqA-w_VO-O4vo`8nqo%XuV(2jW_6`wV(*Dd;!5H5nsfI@jV1_;i8Me zn55IfRLGADnOS5AUnV*K8A$8mR^M;ex6X;84=xtTJdq||kO8UY&1K{I;jwXd)eML} z$qWaau_Q@4Bg6&m7$ggbz4SI4#O}v%+mzK%tbR+J9w|LscE-nm zA6x$w>kG!pu1I73J>0lA+!QE&7I+JI8~7yfJ?r^3ucC51TzLN+2c4S-J`G$0Uk3gJ zd;<6=@DboK@KxYzz}JCq0GGh4z>B~c@EY(<;5)!~f$sx91bzaXfS&>{0S|ybThH(2 SDtIrC5ELH)SHREyBm57~JDC&! diff --git a/_module/ncs/vtw_shgmrt.ncs b/_module/ncs/vtw_shgmrt.ncs index e1fd92dd49da26986f6efa15bd783490f49c4043..e3abe061c9182164c89b893854b92f25029356ad 100644 GIT binary patch literal 3288 zcmd7TNlL>|7{Ku_Q>RqXs$DoW;y^3bd8~?12k4?zPy|+YDTY$J^LlDwss{QMCX6k&NI@V zL}y=!&b_7sbH6LDqsFjI4>gnN(KeIT!Zzk}xhlpfsCva+A#~wUMen!t#Ci%h?uU+2 znaxK0f$5A@R~ozT2ZP6p>0zV~wEhv}q1o{=7f&Gv1h{`}H-ylZ+y zU!<2K&R7&hJ(A0$?|m*rytj{b?XFLcUvbia6Ha!_7Fu&4cEbfVY6(1D^waU_8CyZH6hnTsXfR2a{U?z5rYS zUkCmQd=~g5@Co20;054Yz{|iZz$Ne^@GNi!yb639_#W_m;D^AEfu8{<;1|Giz&+q^ g#?$+AWt=|`A2c5T4}o8%8$Rz0e-4_z`j6&+03sRQSpWb4 diff --git a/_module/ncs/vtw_shgmrw.ncs b/_module/ncs/vtw_shgmrw.ncs index b0cb3b11d4e8b997ff87b24fac7be39462c5569a..6327b27dc9fd6d3dc3dca4ff7eb25a4a825d046b 100644 GIT binary patch literal 3426 zcmd7T%Sr-K7{KvwZr&!NtXy=R=z@mY{U)`s3%JmNB4`x^)h6gk+V>p2L$4D-EnEn8 z&KVVk!1^zOaWQ)EH;4KD>exKG2(H#EYc-MVt?kT;dZYre6RszIn*vC8pAR@)J&#F%S>7g+nCpdvKXhJ>J@dl(1k}8z2DLk>p9%GAG(*y zY&PN#OlPb*)7U*f7(8A?4q+CsXF^eWOD zNN*y&jr1 literal 2600 zcmc)K%SyvQ6b9fkmo%}d;sr&#j@Fh|Y`kC5jh8|ft%4%Ba;0trpTuYJMSK?N!bKN_ zI5SNPsW3k-Bw0)tzRBeLCt+F_x9Wa7+Bzr7SGZUreFchmPI?qJuP+<*hsVaQf4W^%-R{@j9u$4GZ0agY zVal;dbZs_CXVFMx$JH9y6?%!zm|jun<<>14B=?BD_cj}}r61F7Gae4b?zhb9QK*K? zPWc${W8=SKwPCFEiX_(G!%aBDO@rd+fVY6(0G|TBXFR*+t%VuBTsXfR2c260J_B3< zUjhCKd=mI5@I3G`@FMUE@G9_i;1YNV_y}+Yyas#|_zv)0;QPQ2fu8^;;HSU~z&+q^ m#kWSJe4M{qrJ0!R@OTr=$5D<_VHHsoC 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 K{UN^^_+5!B0*J95Zxd} zNNiZaFTfx0C2U#22e4q#MHfM4JmcG3ha@74D7iCp=A5}_u3u@|tQrede01rOv zHxhV@Tk~(($}~1HL=-JaipX4+|0sW!{vrJdrn=C_(#wp0Fbo^dGvUXR(%BX#!ov zMcPl}-=WFipv3RGg%W3X*F;@3YLC3obNs4Ih6f|G;ms`bsH6ejQ;jwTt87SZIOsTA z?Qlm{hu~8zG)-dY`~J9mQ{|@id3c&w;zeBd)p)0l> zT!jX~qX!KX{jZGrhiYg3&2Gp{fLYEc+VQ#KJY=y*F7|`asn>%Yw;BeX z({gKm%k{&cvBy_TWT|929h0qG$;B(j7cLcYi+pxF7vy+l)EXAY`7nOoPM21BfZ!AN z;S9pVmz6Fli;inHfPP!LIjQa9GZ@Ez;yx2OHpWthTU3;>H9l&}JkR=G>br)((CZ3} JdIvol{sNa#oT~r; delta 595 zcmZuuOD{t~6rR_;NN=Tt7FBnOmQ`CTiH2OSSa@uNoivx0NT@C<;xAy)o8za5m5qf+ z{DF#Ae=5 zGE;gm>WC=q$Q_k}K4K}6p@_6N6-miHHaU?`@4TK%csH}!G=pJ0WVJiL*JYr`y zp~@PB+br@H)I~?;e|{M;JRWoq&+HWHpJ*;gw(Zzr5})jb!tO} z+PEseolNVhYRgxvRazvYq{iWm#<2yyXwd?27EAJf7{0>Zs#t|0+l&WMA04`BcxAS2 z>gS39Ql*DF2LqNdH#ib-`W+*<#?EM<*XXQ06^#zTr;#MzS?Duk;UI1p@}|?HeSMC8 E08$R6wg3PC diff --git a/_module/ncs/x0_ch_hen_percep.ncs b/_module/ncs/x0_ch_hen_percep.ncs index 6e7a992f3e85e1047d266cae6e9abb9782d960da..0a4c19dd3564d237499c8080f996426c4c940e63 100644 GIT binary patch delta 2980 zcma)8d2AGA6rVS{J5#y`bnk0+W{;k`U0PsEX{+UI0HsB_6s@&FTSTZ*Q4*sFCME=k zl|B>wLlZ$cf(D2+CWaV=NHp;x%AtQqAn}X{4KxbL%K9BMbZfS?{o|YI_ult=@BO~t zd$VsZKeuXX>%3*!%Gz|zTtP^liwNYeNE6H!!P~o~V@>DACpsVP>FrqiNXOc)?#`z+ zY~C}+yQfQ?Ji}}vo?z8f`mpW6ErA^-$mMc31T%XM31(}I8in;3hiOoYD!b)G*({?NAHbaFff24{5eVDINqUF2Q4-H<)Jwd(X1>ifR&)!WQszazAv5@xWpu zKZ^j(U=f5WVELu6O$@l+%R}V(ZNtaKC6L08#DKj%--_o&Rk86Mw%*VL1Dg^EYtU|r zLl$dI&%(!e#1xX7Sf)Giv?(gD<5l5On_DcNj}CKfT(uF(&CS~cfutpioQ!unN+Qu;|Hvo#3U^^nFrV9 zz4+~GYms!?^C^r|+kLJrL`=1I}?r5@B z@@$7`wwcxXMUXy=(9T(55CwO0Y6|BQ!;f%_K!v~B$(b>o$A2{+A zJ&BT1@Rk)^q(of)5kZ)*>VY>aEks$zm5A|u_(7?!sJ`79bT*2l^;U>XU}S)gV30DW zM>fJ?+#8uW>rQrrj4b9y<_!1a$uZj*-8LGd0aZ0^jH*u62lW_LQ${lT)n(9&C%}Ua zEl5mnXg<(zj^-xwlJcw)5skVhe=+v^0~SCSJS{pA2<) zC0=DD?N983>v%j7FO*mmOUnG1P1wgamY0rgj3%v`tT7%6k5!KU+&B<;XdGiSGa>w2 zV?z}Dgs`ll_6cD>Up996cz7IRG%ykTf%0+Slj9hp>O|nnH0s6XOVqd~L$+kjtkQqY o;ofqMe1cDwzi0?+aA8FcKp!5f^ucQUys}mQ8gQwybyySr1rAd?hX4Qo delta 2545 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 delta 528 zcmZ23^ij~!&pB8j%uvt3iGhLRqZ|Vea40Y^v9ho-h~<^XCnx3>Bxa`P#iu02r=+GO zmgbZ&GXDSn{|5t$Gy{QyL>! zPY~33)|1yVNhvBo+yOS{4K#2d?(l?~<;Wo=+XQ9<0}qQjp2_CS&lq_otFV+a8cv?W zqQ%%X`7Db9W9H;{ENYBilSNt8Mf+G87#A`rFd$sRz{WH=oOKE#+vHEIu0Y*(Y=?j( qJNrf;xu0E)QFrn)_AXvXxcmW!%e2YO9Eyy2lb3R2@IitI78n4D6{*<( diff --git a/_module/ncs/x2_mod_def_load.ncs b/_module/ncs/x2_mod_def_load.ncs index 9723f96826bdbbf7ad75dbf3c66c4d4ba9a0a732..695141f13520627141911c9f41cbd32b5594debb 100644 GIT binary patch delta 3662 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 delta 3127 zcmai0d2E!`7Qgp?%e0+oXS&SNnd!{enQqgW>2#R_f<`t)()UCyxGS0#6s!eNBSsPu zP@}j!%XzMKDKGJl_l(9^^IVWf+=2$=4~R=dL`6ld*qA1e&^n%b?)P<3)cIq+yPo?y zzwUGv5r*G!dy1WA zs+rM#Uz*XGff`z&|yoyDgU$mxJvCTbf1c`GJ>n zBDHDYo1C8N657CzDR=6i0_V2ka1n0_qz0+aurK#{vMy;p-1 zBAsQz086}CHq$ToLInBOaFbODxwHvBZ3*8EmugvfDOw57r@VYEJfSUYDmtZTa2%-9 zBsprVMiO+F@*T#t3;iB>B3mFd;$wxR^jKPp&1D?{8u*sDW;s^LhxA^;TLjNC+ zVLLAP1iWo@^ZyP9%~?FO0onc!SEuL(3w59Kk8>6+x0<2P)xjHK$Q8WwkoCN~4wqI$0WO}MNmVb&Tb00GzLt6;DwTw_`kHf2m}6q@2(I-;EmpA zPW*oU*Y{v~NjhBGE6?|t${6x*3NwaEm^eKAc*#1xC_y?y>eT|0#N=Yfwk~B@cnT<1xWR_kmoM-*Y~9dZSG$`xVY+T!Gz z{+_;DdskWZVml!0QCLv6g?r$GvLy&@z#Hf!o0dw}(~vToRKhb3U`Z=$hIQTu?T;n? z${%GF20WGgV<>o6`d2t4QrN~6Vp!#y%Xh$#FM`0{@-^hAnMA?NpeQDL1QR`)iXC4H zv&wt?s~wbNe$+NURNmFr@66Em7}ITGPT4zZ+Z!b_h|&RpVw+bR~B zgf$EwR#bOJ$u`!{nE`Q5R%Cdms;p!(46T*b)l(=C8KI^$W6Pkwav_rPN@dQ~M9jZP zWSTHo6^DkZevH9j)dTpS^C$V0(Ctt2R@m&9MDFmf=Zm2tki+(QfqCK~6TYlS_p=hfNMh$|76&H7trL{NV6ie)T);i zzEjyfU7VCNidKus@QNXr2)!YGu7jca2z*p+m3So`SkL!yyWY8~spp=XeZQOJ2ehcf_mVRO7l&BJ4#%;%A@UNyN zVK>U|Lsj9NT0pX69yrnT7~cgCr9uu~I8a;(`&0AUUj7@DchJ1TO?e9G=1)%#=kS>} zoW%rXzk=f2E)JA`r|)pxO*F2CK&HzTrd%w67s~^1XXX-WC_*|Hu4F=^cM>((L z%u9&OG4Qoi!!y|!szA2B%UY-e*=lR4Q4gbOe8UATZT{`V-+H!~ym>=D?0y}AM_R6E zR9SG#)C?xu5@1ven}*DNZ_@O1;_@^|C2Ys xvb-h56-39#6=X&Q#untG`DN3e2dETTl_sADQSfyJNS$q+0k8eEBm<)s`wdh?GP?i( diff --git a/_module/ncs/xx_pc_1_hb.ncs b/_module/ncs/xx_pc_1_hb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..21caec30a3147cc0382bcbf03d8926ff3583e248 GIT binary patch literal 119083 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

      -xh%HP)f{L2QZrSMJ3mmA z27}{c2ZPC>tZlV3QWur<9%*V;Zsn&lg3oYWk3O6T(efCODFeSEAt#Q5GWy8~DoL4> z@2GQODw4-ERU+KRj~!1N)(B4jE@v~SjXS7D?T!~m&3PB#fF?P4&W=uw zjpN%yFgP_bvMksZ;K10?vB>}%Lk|a2he$Anh}lZTpp;l(!auTSI0a^sZxR(Dz2o)N ziqV0Cal68!fY$5gLRw2_(Q zC9WHfF0efwQSL`sD?OsYQzB8nifpx2^$6&yGdMD%vkUpWtD^UHas^Nut*_AAVbahO z#M3jHs?NI_m8;W7Ps4Lj>w5cYjfP#1pqY2NFq+lnpxGLssl61bKcUfE-)c1MWi^^b zh0&}j15Mp$1{xhE(!5zBF))p0qbaGn^xc9PEuYClh@5yGFw&bm#d4J~65^G}Y%LEvwRd zKx>^}SOh26gq%FezRb5cSv^RcTn}HS)-OU|*243b62aF*;44o!tjrbxzGY4^S*l zj5$yQV-WG5HO6W$`OhupuQi6E_~dILYL{F>uQ9*~wE8cl-w( zI7=-!z5{1822MFnJJ}e)@lJ+knraTbKuwCUFs?PyN&KH<;FL2q@Lw|ERNHXw+?naK z;8a_1x?|v!GmP{8j^HGw6&%&oZ?u%w`#z>&UbQc+JMy06hGpyzaUe|ar88^MUI5S3 zj^3F~Pxo){>gw&^)v>K}YcDrk?5Y#z&FKy5fZblw21|ILSUP7;Kj^ zgTXw1Q^8=BaM{z-)wXR@ZwK=<)79S5quWLpV09Rat>p!6b20~+8*E%{9N6 z2T%GyCI; zFKK?B+Q{sbMT{b(nQF%mz>aiYmQobBs*MSUUNH;laOl@3DWLJLp7!VCNw=o$ zn;Op&6Av)u_9GIQ8_ZFt)_A3Ka5Fav+@DUraJ#cz+{aZbTF4HB{(Vtev`{%sR#b>O zUlzEjX?JCzr9GG)Om0-7eGVKH9&Q2G+CkKGh~BHBiU;WkiA zLelKjY=1@B1-_l`#DOxd0Cq^N6?R2_N>=m0Xf#yco;{31N!yUAnHhK%H|F;Y=SD`J zn%Fj(J*e)Yw?3ce&my3SUt+pJrBIS9CSJ^TicCKN<*t@>Jj1<_)x~N@eT$lfy3iGO z8@R*z&QK7m7W`nx$m?K*?NLHYWDCSX!bp8yYz;m+$M-z%kPyC1(s>^XL+K5~ucgF~FhUK>ebE;~h8+SqFJmOupc_*C zE+DB-Jg8w!hdLWokYhypIm^Oni%)+5#e|J1zjOP2aGA0PQD+qodL=W9goi=kf8d(r Ay#N3J literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_2_percept.ncs b/_module/ncs/xx_pc_2_percept.ncs new file mode 100644 index 0000000000000000000000000000000000000000..908ca7e189571e2c321737f02adbe99eccdb6d44 GIT binary patch literal 51051 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 V1Bv-)!!qfy_%mVh?%QZF`oC!@`LqB4 literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_3_endround.ncs b/_module/ncs/xx_pc_3_endround.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2acc6c0379bda5ba84d98daffa359b35917cc5dc GIT binary patch literal 15528 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%0ASy+#z3XH;c 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 literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_5_phyatked.ncs b/_module/ncs/xx_pc_5_phyatked.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9136c2be25c568f6d2faecca821fa441d3ad9e2c GIT binary patch literal 16230 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 CdZph0 literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_8_disturb.ncs b/_module/ncs/xx_pc_8_disturb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6ef01265f53b344a6396f6d900440e206630d9c9 GIT binary patch literal 89 zcmeZs4ps;=)H85mU|@)p0}>1z3Jff)3}SiZ@yUs~1&NvIdGRSp@hPckiKRIuKp7!4 anTi5KEe5bo0c{3phX4Qn|4?91U;qHgpBLr; literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_b_castat.ncs b/_module/ncs/xx_pc_b_castat.ncs new file mode 100644 index 0000000000000000000000000000000000000000..b9b510822d2fb0ccb0ae3caef164662c92c2218c GIT binary patch literal 66915 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 O`2;RsZGwt-&;Kvx_jn8d literal 0 HcmV?d00001 diff --git a/_module/ncs/xx_pc_e_blocked.ncs b/_module/ncs/xx_pc_e_blocked.ncs new file mode 100644 index 0000000000000000000000000000000000000000..009f816b42a4d506e855a601b57abe558a6946c6 GIT binary patch literal 105497 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 s=`R!hZ9uoXr+%yDiqNe4rkF_UMmgYt^C3 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 HaqWKqa(WQ} diff --git a/_module/nss/0c_assoc_actions.nss b/_module/nss/0c_assoc_actions.nss new file mode 100644 index 00000000..74975d45 --- /dev/null +++ b/_module/nss/0c_assoc_actions.nss @@ -0,0 +1,172 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_assoc_actions + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Conversation script that sets modes or allows oAssociate to do actions from a + conversation. + Param "sAction" +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oPC = GetPCSpeaker(); + object oAssociate = OBJECT_SELF; + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + object oArea = GetArea(oAssociate); + string sAction = GetScriptParam("sAction"); + // Scout ahead is done int 0e_ch_1_hb (heartbeat script). + if(sAction == "Scout") + { + ai_ClearCreatureActions(); + ai_HaveCreatureSpeak(oAssociate, 4, ":29:35:46:"); + ai_SetAIMode(oAssociate, AI_MODE_SCOUT_AHEAD, TRUE); + ai_ScoutAhead(oAssociate); + } + else if(sAction == "BasicTactics") + { + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, ""); + ai_SetAssociateAIScript(oAssociate, FALSE); + } + else if(sAction == "AmbushTactics") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_ambusher"); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, "ai_a_ambusher"); + } + else if(sAction == "DefensiveTactics") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_defensive"); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, "ai_a_defensive"); + } + else if(sAction == "RangedTactics") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_ranged"); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, "ai_a_ranged"); + } + else if(sAction == "Taunt") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_taunter"); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, "ai_a_taunter"); + } + else if(sAction == "CounterSpell") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_cntrspell"); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, "ai_a_cntrspell"); + } + else if(sAction == "PeaceTactics") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, "ai_a_peaceful"); + } + else if(sAction == "AttackTactics") + { + if(ai_GetAIMode(oAssociate, AI_MODE_CHECK_ATTACK)) + { + ai_SetAIMode(oAssociate, AI_MODE_CHECK_ATTACK, FALSE); + } + else ai_SetAIMode(oAssociate, AI_MODE_CHECK_ATTACK, TRUE); + } + else if(sAction == "FollowCloser") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sAction == "FollowFarther") ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sAction == "Pickup") ai_Loot(oPC, oAssociate, sAssociateType); + else if(sAction == "HealSelf") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 1); + else if(sAction == "HealAllies") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 2); + else if(sAction == "HealOutMinus") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sAction == "HealOutPlus") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sAction == "HealInMinus") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sAction == "HealInPlus") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sAction == "Traps") ai_Traps(oPC, oAssociate, sAssociateType); + else if(sAction == "Locks") ai_Locks(oPC, oAssociate, sAssociateType, 1); + else if(sAction == "Bash") ai_Locks(oPC, oAssociate, sAssociateType, 2); + else if(sAction == "Search") ai_Search(oPC, oAssociate, sAssociateType); + else if(sAction == "Stealth") ai_Stealth(oPC, oAssociate, sAssociateType); + else if(sAction == "NoMagic") ai_UseMagic(oPC, oAssociate, sAssociateType); + else if(sAction == "DefensiveCasting") ai_UseOffensiveMagic(oPC, oAssociate, TRUE, FALSE, sAssociateType); + else if(sAction == "OffensiveCasting") ai_UseOffensiveMagic(oPC, oAssociate, FALSE, TRUE, sAssociateType); + else if(sAction == "MagicMinus") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); + else if(sAction == "MagicPlus") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); + else if(sAction == "Speaking") + { + if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) + { + ai_SetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK, FALSE); + } + else ai_SetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK, TRUE); + } + else if(sAction == "Ranged") + { + if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) + { + ai_SetAIMode(oAssociate, AI_MODE_STOP_RANGED, FALSE); + } + else ai_SetAIMode(oAssociate, AI_MODE_STOP_RANGED, TRUE); + } + else if(sAction == "AtkAssociates") + { + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) + { + ai_SetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES, FALSE); + } + else ai_SetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES, TRUE); + } + else if(sAction == "BuffFirst") + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_MASTER)) + { + ai_SetMagicMode(oAssociate, AI_MAGIC_BUFF_MASTER, FALSE); + } + else ai_SetMagicMode(oAssociate, AI_MAGIC_BUFF_MASTER, TRUE); + } + else if(sAction == "RestBuffing") + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) + { + ai_SetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST, FALSE); + } + else ai_SetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST, TRUE); + } + else if(sAction == "Dispel") + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_STOP_DISPEL)) + { + ai_SetMagicMode(oAssociate, AI_MAGIC_STOP_DISPEL, FALSE); + } + else ai_SetMagicMode(oAssociate, AI_MAGIC_STOP_DISPEL, TRUE); + } + else if(sAction == "MagicItems") + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) + { + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS, FALSE); + } + else ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS, TRUE); + } + else if(sAction == "Identify") + { + ai_IdentifyAllVsKnowledge(oAssociate, oPC, oPC); + return; + } + else if(sAction == "GiveUnIdentifiedItems") + { + ai_ClearCreatureActions(); + object oItem = GetFirstItemInInventory(oAssociate); + while(oItem != OBJECT_INVALID) + { + if(!GetIdentified(oItem)) ActionGiveItem(oItem, oPC); + oItem = GetNextItemInInventory(oAssociate); + } + return; + } + else if(sAction == "GiveMagicItems") + { + ai_ClearCreatureActions(); + itemproperty ipItemProp; + object oItem = GetFirstItemInInventory(oAssociate); + while(oItem != OBJECT_INVALID) + { + ipItemProp = GetFirstItemProperty(oItem); + if(GetIsItemPropertyValid(ipItemProp)) ActionGiveItem(oItem, oPC); + oItem = GetNextItemInInventory(oAssociate); + } + return; + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} diff --git a/_module/nss/0c_cast_polymorp.nss b/_module/nss/0c_cast_polymorp.nss new file mode 100644 index 00000000..b06f1834 --- /dev/null +++ b/_module/nss/0c_cast_polymorp.nss @@ -0,0 +1,18 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + Script Name: 0c_cast_polymorp + Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Conversation script to have a henchman cast a polymorph spell. + int nSpell is the spell to cast. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_items" +void main() +{ + object oHenchman = OBJECT_SELF; + int nSpell = StringToInt (GetScriptParam ("nSpell")); + // Save the original form so we can check when we turn back (Add 1 so we don't save a 0!). + SetLocalInt (oHenchman, AI_NORMAL_FORM, GetAppearanceType (oHenchman) + 1); + SetLocalString (oHenchman, AI_COMBAT_SCRIPT, "ai_a_polymorphed"); + ActionCastSpellAtObject (nSpell, oHenchman, 255, TRUE); +} + diff --git a/_module/nss/0c_fire_henchmen.nss b/_module/nss/0c_fire_henchmen.nss new file mode 100644 index 00000000..5505be97 --- /dev/null +++ b/_module/nss/0c_fire_henchmen.nss @@ -0,0 +1,15 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_fire_henchmen + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Action taken script to fire/remove henchman for higher. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oHenchman = OBJECT_SELF; + ai_ClearCreatureActions(); + ai_FireHenchman (GetPCSpeaker(), oHenchman); + PlayVoiceChat (VOICE_CHAT_GOODBYE, oHenchman); +} + diff --git a/_module/nss/0c_get_convo.nss b/_module/nss/0c_get_convo.nss new file mode 100644 index 00000000..7cdfd409 --- /dev/null +++ b/_module/nss/0c_get_convo.nss @@ -0,0 +1,22 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_get_convo + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Action taken script that leaves the current conversation and starts a new + conversation with oCreature using the linked conversation instead of the + ai_Henchman conversation. + + Allows use of ai_conversation for henchman in other modules. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void BeginOriginalHenchmanConversation(string sDialog, object oPC) +{ + BeginConversation(sDialog, oPC); +} +void main() +{ + ai_ClearCreatureActions(); + // Need to check special dialogs for HOTU henchman. + string sDialog = GetDialogFileToUse(GetLastSpeaker()); + DelayCommand(0.0, BeginOriginalHenchmanConversation(sDialog, GetPCSpeaker())); +} diff --git a/_module/nss/0c_get_henchman.nss b/_module/nss/0c_get_henchman.nss new file mode 100644 index 00000000..e0952d57 --- /dev/null +++ b/_module/nss/0c_get_henchman.nss @@ -0,0 +1,25 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_get_henchman + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Action taken script that adds oCreature to oPC's party as a henchman + while giving a random message. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oPC = GetPCSpeaker(); + AddHenchman(oPC, oCreature); + int nVoice; + switch(d4()) + { + case 1: nVoice = VOICE_CHAT_CANDO; break; + case 2: nVoice = VOICE_CHAT_CHEER; break; + case 3: nVoice = VOICE_CHAT_GOODIDEA; break; + case 4: nVoice = VOICE_CHAT_LAUGH; break; + } + PlayVoiceChat(nVoice, oCreature); +} + + diff --git a/_module/nss/0c_h_cast_spell.nss b/_module/nss/0c_h_cast_spell.nss new file mode 100644 index 00000000..40868d87 --- /dev/null +++ b/_module/nss/0c_h_cast_spell.nss @@ -0,0 +1,12 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_cast_spell + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Action taken script that sets the specified spell to be cast. + Param + nSpell - the spell to cast. +*/////////////////////////////////////////////////////////////////////////////// +void main() +{ + SetLocalInt (OBJECT_SELF, "0_SPELL_TO_CAST", StringToInt (GetScriptParam ("nSpell"))); +} diff --git a/_module/nss/0c_henchmenspell.nss b/_module/nss/0c_henchmenspell.nss new file mode 100644 index 00000000..5e64cbac --- /dev/null +++ b/_module/nss/0c_henchmenspell.nss @@ -0,0 +1,81 @@ +/*/////////////////////////////////////////////////////////////////////////////// + Script: 0c_henchmenspell + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Action script to cast a specific spell for a henchman. + + Script Param + nTarget (INT) : 0 = ALL, 1 PC, 2 Caster, 3-6 = oPC's Henchman, 7 = PC's Familiar + 8 = PC's Animal Companion, 9 = PC's Summon. + nBuffType = 1 all 2 short 3 long, 4 healing, 5 lay on hands. + If nBuffType is 0 then it will cast a specific spell from + Variable "0_SPELL_TO_CAST". Use script: 0c_h_spell_cast spell to set the spell. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +float ai_UseLayOnHands(object oTarget, object oPC, float fDelay, object oCaster); +void main() +{ + object oTarget, oPC = GetPCSpeaker(); + object oCreature = OBJECT_SELF; + float fDelay; + int nTarget = StringToInt(GetScriptParam("nTarget")); + int nBuffType = StringToInt(GetScriptParam("nBuffType")); + // Cast a group of buff spells based on nBuffType and nTarget or a single spell. + if(nBuffType < 4) + { + // Cast a specific spell. + if(nBuffType == 0) + { + int nSpell = GetLocalInt(oCreature, "0_SPELL_TO_CAST"); + // These are buff spells so Acid fog (index 0) is not a valid spell. + if(nSpell > 0) + { + ai_ClearCreatureActions(); + object oTarget = GetLocalObject(oCreature, "AI_ALLY_TARGET_" + IntToString(nTarget)); + if(oTarget != OBJECT_INVALID && ai_CheckAndCastSpell(oCreature, nSpell, 0, 0.0f, oTarget, oPC)) + { + DeleteLocalInt(oCreature, "0_SPELL_TO_CAST"); + } + else + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) PlayVoiceChat(VOICE_CHAT_CANTDO, oCreature); + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_SendMessages("I cannot cast " + sSpellName + ".", AI_COLOR_RED, oPC); + } + } + } + // Cast a creatures buff spells on nTarget. + else ai_CastBuffs(oCreature, nBuffType, nTarget, oPC); + } + // Cast Healing spells. + else if(nBuffType == 4) + { + ai_SetupAllyTargets(oCreature, oPC); + oTarget = GetLocalObject(oCreature, "AI_ALLY_TARGET_" + IntToString(nTarget)); + ai_TryHealing(oCreature, oTarget); + } + // Use lay on hands. + else if(nBuffType == 5) + { + ai_SetupAllyTargets(oCreature, oPC); + oTarget = GetLocalObject(oCreature, "AI_ALLY_TARGET_" + IntToString(nTarget)); + ai_UseLayOnHands(oTarget, oPC, 0.0f, oCreature); + } + else if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) PlayVoiceChat(VOICE_CHAT_CUSS, oCreature); +} +float ai_UseLayOnHands(object oTarget, object oPC, float fDelay, object oCreature) +{ + int nHpLost = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + if(!nHpLost) + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) PlayVoiceChat(VOICE_CHAT_CANTDO, oCreature); + ai_SendMessages(GetName(oTarget) + " does not need healed.", AI_COLOR_RED, oPC); + } + else + { + ai_SendMessages(GetName(oCreature) + " is laying hands on " + GetName(oTarget), AI_COLOR_GREEN, oPC); + ActionUseFeat(FEAT_LAY_ON_HANDS, oTarget); + fDelay += 6.0f; + } + return fDelay; +} diff --git a/_module/nss/0c_if_a_magic_m.nss b/_module/nss/0c_if_a_magic_m.nss new file mode 100644 index 00000000..7ef48321 --- /dev/null +++ b/_module/nss/0c_if_a_magic_m.nss @@ -0,0 +1,16 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_a_magic_m + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if the henchmen has a specific + associate magic mode. + Param: + nMode - The mode to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + int nMode = StringToInt(GetScriptParam("nMode")); + return ai_GetMagicMode (oHenchman, nMode); +} diff --git a/_module/nss/0c_if_ass_convo.nss b/_module/nss/0c_if_ass_convo.nss new file mode 100644 index 00000000..190a0f73 --- /dev/null +++ b/_module/nss/0c_if_ass_convo.nss @@ -0,0 +1,132 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_ass_convo + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that has the henchman tell the player what options + have been selected. + + sOption will decide what the henchman says. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oPC = GetPCSpeaker(); + object oAssociate = OBJECT_SELF; + string sParam = GetScriptParam("sOption"); + if(sParam == "BaseMode") + { + string sBaseMode = "I'm ready to attack."; + string sVolume = " While shouting when I see things."; + // Lets get which base mode the henchman is in. + if(ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND)) sBaseMode = "I'm holding here."; + else if(ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER)) sBaseMode = "I'm defending you."; + else if(ai_GetAIMode(oAssociate, AI_MODE_FOLLOW)) sBaseMode = "I'm following you."; + if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_peaceful") sBaseMode = "I will not fight the enemy!"; + if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) sVolume = " While not speaking unless spoken to."; + SetCustomToken(AI_BASE_CUSTOM_TOKEN, sBaseMode + sVolume); + } + else if(sParam == "CombatTactics") + { + string sRangedUse = "", sCombatTactic = "I'm using my best judgement in combat "; + string sAtkAssociates = ""; + string sTargets = "against all enemies and "; + // Lets get which base mode the henchman is in. + if(ai_GetAIMode(oAssociate, AI_MODE_CHECK_ATTACK)) sTargets = "against enemies I can handle and "; + if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_ambusher") sCombatTactic = "I'm using ambush tactics "; + else if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_defensive") sCombatTactic = "I'm using defensive tactics "; + else if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_taunter") sCombatTactic = "I'm ready to taunt "; + else if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_cntrspell") sCombatTactic = "I'm ready to counter spell "; + if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_peaceful") + { + sCombatTactic = "I will not fight the enemy!"; + sTargets = ""; + } + else + { + if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) sRangedUse = "will not use a ranged weapon."; + else sRangedUse = "will use a ranged weapon."; + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) sAtkAssociates = " I will also ignore familiars, companions, and summons."; + else sAtkAssociates = " I will also attack familiars, companions, and summons."; + } + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 1, sCombatTactic + sTargets + sRangedUse + sAtkAssociates); + } + else if(sParam == "Plans") + { + float fFollowRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE); + string sFollowRange = FloatToString(fFollowRange, 0, 0); + string sDistance = "I'm following from " + sFollowRange + " meters away while"; + string sStealth, sSearch, sPickup; + if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sPickup = " picking up items"; + else sPickup = " not picking up any items"; + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sStealth = " in stealth"; + else sStealth = ""; + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sSearch = " and searching"; + else sSearch = ""; + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 2, sDistance + sPickup + sStealth + sSearch + "."); + } + else if(sParam == "Healing") + { + string sHealingIn = IntToString(GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT)) + "%"; + string sHealingOut = IntToString(GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT)) + "%"; + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 5, "I'm healing our allies if they go below " + + sHealingIn + " health in combat and " + sHealingOut + " out of combat."); + } + else if(sParam == "Spells") + { + string sCastingLevel = "[" + IntToString(GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT)) + "] "; + string sCasting = "I'm casting"; + string sType = " spells I choose."; + string sBuff = " I'll also targeting anyone that needs it "; + string sDispel = "while using Dispel spells."; + string sMagicItems = " Lastly I'll use any magic items I have."; + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_MASTER)) sBuff = " Ofcourse I'll target you first "; + if(ai_GetMagicMode(oAssociate, AI_MAGIC_STOP_DISPEL)) sDispel = "while not using Dispel spells."; + if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_a_cntrspell") + { + sCasting = "I'm ready to counter spell our enemies."; + sType = ""; + sBuff = ""; + sDispel = ""; + } + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC)) + { + sCasting = "I'm not use any magic."; + sType = ""; + sBuff = ""; + sDispel = ""; + } + else if(ai_GetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) sType = " defensive spells only."; + else if(ai_GetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) + { + sType = " offensive spells only."; + sBuff = ""; + } + else if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) sMagicItems = " Finally I'll not use magic items."; + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 5, sCastingLevel + sCasting + sType + sBuff + sDispel+ sMagicItems); + } + else if(sParam == "Objects") + { + int bTraps = ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS); + int bLocks = ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS); + int bBash = ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS); + string sText = "I'm going to ignore all traps and locks."; + if(bTraps && bLocks && bBash) + { + sText = "I'm disarming all the traps and am either picking or bashing any of the locks we find."; + } + else if(bTraps && bLocks) sText = "I'm going to disarm all the traps and I'll pick all the locks we encounter."; + else if(bTraps && bBash) sText = "I shall disarm all the traps and will bash any locks we come across."; + else if(bTraps) sText = "I will disarm all the traps I can but will leave any locks for you to deal with."; + else if(bLocks && bBash) sText = "I will leave the traps for you but will either pick or bash any locks we see."; + else if(bLocks) sText = "I'll keep my distance from any traps we see, but will pick the locks found."; + else if(bBash) sText = "I'll let you mess with the traps, but I'll bash any locks that are out there."; + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 3, sText); + } + else if(sParam == "RestBuffing") + { + string sRestBuffing = ""; + if(!ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) sRestBuffing = "not "; + SetCustomToken(AI_BASE_CUSTOM_TOKEN + 10, "After we rest I am " + sRestBuffing + "casting my long buff spells on us."); + } + return TRUE; +} diff --git a/_module/nss/0c_if_assoc_mode.nss b/_module/nss/0c_if_assoc_mode.nss new file mode 100644 index 00000000..342bfff3 --- /dev/null +++ b/_module/nss/0c_if_assoc_mode.nss @@ -0,0 +1,22 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_assoc_mode + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if the henchmen has a specific + associate mode. + Param: + nMode - The mode to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + int nMode = StringToInt(GetScriptParam("nMode")); + // This conversation line turns off picking up any items. + if (nMode == -1) + { + if(ai_SetAIMode (oHenchman, AI_MODE_PICKUP_ITEMS)) return TRUE; + return FALSE; + } + return ai_GetAIMode (oHenchman, nMode); +} diff --git a/_module/nss/0c_if_cntrspell.nss b/_module/nss/0c_if_cntrspell.nss new file mode 100644 index 00000000..a0a5c878 --- /dev/null +++ b/_module/nss/0c_if_cntrspell.nss @@ -0,0 +1,17 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_cntrspell + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that returns TRUE the server allows a henchman to + use counterspell and if they don't have the counterspell ai script set. + Param: + sAIScript - The special combat script to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + return (AI_COUNTERSPELLING_ON && + ai_CheckClassType(oHenchman, AI_CLASS_TYPE_CASTER) && + GetLocalString(oHenchman, AI_COMBAT_SCRIPT) != "ai_a_cntrspell"); +} diff --git a/_module/nss/0c_if_com_script.nss b/_module/nss/0c_if_com_script.nss new file mode 100644 index 00000000..34d8370e --- /dev/null +++ b/_module/nss/0c_if_com_script.nss @@ -0,0 +1,16 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_com_script + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that returns TRUE the caller does have an ai combat + script set to sAIScript. + Param: + sAIScript - The special combat script to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + string sAIScript = GetScriptParam("sAIScript"); + string sAICombatScript = GetLocalString (OBJECT_SELF, AI_COMBAT_SCRIPT); + return (sAIScript == sAICombatScript); +} diff --git a/_module/nss/0c_if_convo.nss b/_module/nss/0c_if_convo.nss new file mode 100644 index 00000000..83e1db43 --- /dev/null +++ b/_module/nss/0c_if_convo.nss @@ -0,0 +1,21 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_if_convo + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that check if oCreature has a linked conversation. + Only checks for Henchman. + Allows use of ai_conversation for henchman in other modules. +*/////////////////////////////////////////////////////////////////////////////// +#include "nw_inc_gff" +#include "0i_messages" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + if(GetAssociateType(oHenchman) == ASSOCIATE_TYPE_HENCHMAN) + { + json jHenchman = ObjectToJson(oHenchman); + string sConversation = JsonGetString(GffGetResRef(jHenchman, "Conversation")); + if(sConversation != "") return TRUE; + } + return FALSE; +} diff --git a/_module/nss/0c_if_has_assoc.nss b/_module/nss/0c_if_has_assoc.nss new file mode 100644 index 00000000..cd16680b --- /dev/null +++ b/_module/nss/0c_if_has_assoc.nss @@ -0,0 +1,18 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_has_assoc + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if caller has the specified feat + to summon either a companion or a familiar and they are not summoned. + Param + sAssociate - "Familiar" or "Companion" +*/////////////////////////////////////////////////////////////////////////////// +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + string sAssociate = GetScriptParam("sAssociate"); + if(sAssociate == "Familiar" && GetHasFeat(FEAT_SUMMON_FAMILIAR, oHenchman) && + GetAssociate(ASSOCIATE_TYPE_FAMILIAR) == OBJECT_INVALID) return TRUE; + return (sAssociate == "Companion" && GetHasFeat(FEAT_ANIMAL_COMPANION, oHenchman) && + GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION) == OBJECT_INVALID); +} diff --git a/_module/nss/0c_if_has_class.nss b/_module/nss/0c_if_has_class.nss new file mode 100644 index 00000000..1251c0a5 --- /dev/null +++ b/_module/nss/0c_if_has_class.nss @@ -0,0 +1,28 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_has_class + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if conversation owner has a + specified class. Multiple classes maybe selected. + Param + nClass# - the class to look for use nClass1, nClass2, nClass3 for each one to check. +*/////////////////////////////////////////////////////////////////////////////// +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + int nCntr = 1; + int nClass; + string sClass; + while(nCntr < 10) + { + sClass = GetScriptParam("nClass" + IntToString(nCntr)); + if(sClass != "") + { + nClass = StringToInt(sClass); + if(GetLevelByClass(nClass, oHenchman)) return TRUE; + nCntr++; + } + else break; + } + return FALSE; +} diff --git a/_module/nss/0c_if_has_feat.nss b/_module/nss/0c_if_has_feat.nss new file mode 100644 index 00000000..fc111d84 --- /dev/null +++ b/_module/nss/0c_if_has_feat.nss @@ -0,0 +1,22 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_has_feat + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if they have a specific feat. + Param: + sTarget - either "OBJECT_SELF", or "PCSpeaker", blanks defaults to "PCSpeaker" + nFeat - the feat number from Feats.2da + bNot - if 1 TRUE then this returns true for the target not having the feat. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +int StartingConditional() +{ + string sTarget = GetScriptParam("sTarget"); + int nFeat = StringToInt(GetScriptParam("nFeat")); + int bNot = StringToInt(GetScriptParam("bNot")); + object oCreature; + if(sTarget == "OBJECT_SELF") oCreature = OBJECT_SELF; + else if(sTarget == "" || sTarget == "PCSpeaker") oCreature = GetPCSpeaker(); + if(bNot) return !GetHasFeat(nFeat, oCreature); + return (GetHasFeat(nFeat ,oCreature) || ai_GetIsDungeonMaster(oCreature)); +} diff --git a/_module/nss/0c_if_has_spell.nss b/_module/nss/0c_if_has_spell.nss new file mode 100644 index 00000000..02004ff1 --- /dev/null +++ b/_module/nss/0c_if_has_spell.nss @@ -0,0 +1,26 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_has_spell + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if caster can cast the specified spell. + Param + nSpell# - the spell to look for nSpell1, sSpell2, nSpell3 for each spell to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_spells" +int StartingConditional() +{ + object oCaster = OBJECT_SELF; + int nCnt = 1; + int nSpell; + string sSpell; + while(nCnt < 20) + { + sSpell = GetScriptParam("nSpell" + IntToString(nCnt)); + if(sSpell == "") return FALSE; + nSpell = StringToInt(sSpell); + if(GetHasSpell(nSpell, oCaster)) return TRUE; + //else if(ai_GetKnownSpell(oCaster, nSpell)) return TRUE; + nCnt++; + } + return FALSE; +} diff --git a/_module/nss/0c_if_hen_leave.nss b/_module/nss/0c_if_hen_leave.nss new file mode 100644 index 00000000..e2b2bbdc --- /dev/null +++ b/_module/nss/0c_if_hen_leave.nss @@ -0,0 +1,12 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_hen_leave + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that check if allowing the player to remove a henchman + is activated on this server. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + return AI_REMOVE_HENCHMAN_ON; +} diff --git a/_module/nss/0c_if_identify.nss b/_module/nss/0c_if_identify.nss new file mode 100644 index 00000000..b593bafd --- /dev/null +++ b/_module/nss/0c_if_identify.nss @@ -0,0 +1,17 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_identify + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if the henchmen has a better lore + skill than the speaker. + Also checks AI_IDENTIFY_ON to see if the server wants them to help. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + if (!AI_IDENTIFY_ON && !ai_CanISpeak (oHenchman)) return FALSE; + int nHenchmanLore = GetSkillRank(SKILL_LORE, oHenchman); + int nMasterLore = GetSkillRank(SKILL_LORE, GetMaster(oHenchman)); + return (nHenchmanLore > nMasterLore); +} diff --git a/_module/nss/0c_if_not_master.nss b/_module/nss/0c_if_not_master.nss new file mode 100644 index 00000000..73cb84e6 --- /dev/null +++ b/_module/nss/0c_if_not_master.nss @@ -0,0 +1,11 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_not_master + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks if the speaker is the master of this + henchman. +*/////////////////////////////////////////////////////////////////////////////// +int StartingConditional() +{ + return !GetIsObjectValid(GetMaster()); +} diff --git a/_module/nss/0c_if_open_inven.nss b/_module/nss/0c_if_open_inven.nss new file mode 100644 index 00000000..2755c990 --- /dev/null +++ b/_module/nss/0c_if_open_inven.nss @@ -0,0 +1,13 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_open_equip + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks if opening a henchmans inventory + is activated on this server. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + if(GetAssociateType(OBJECT_SELF) != ASSOCIATE_TYPE_HENCHMAN) return FALSE; + return AI_OPEN_INVENTORY; +} diff --git a/_module/nss/0c_if_pickuploot.nss b/_module/nss/0c_if_pickuploot.nss new file mode 100644 index 00000000..f4edfdb3 --- /dev/null +++ b/_module/nss/0c_if_pickuploot.nss @@ -0,0 +1,12 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_pickuploot + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that check if having associates picking up loot is + activated on this server. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + return AI_PICKUP_LOOT; +} diff --git a/_module/nss/0c_if_polymorph.nss b/_module/nss/0c_if_polymorph.nss new file mode 100644 index 00000000..e2317f6f --- /dev/null +++ b/_module/nss/0c_if_polymorph.nss @@ -0,0 +1,11 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_polymorph +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if the caller is polymorphed. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + if (GetLocalInt(OBJECT_SELF, AI_NORMAL_FORM) != 0) return TRUE; + return FALSE; +} diff --git a/_module/nss/0c_if_scout.nss b/_module/nss/0c_if_scout.nss new file mode 100644 index 00000000..9f7b0a3b --- /dev/null +++ b/_module/nss/0c_if_scout.nss @@ -0,0 +1,11 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_scout + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that check if scouting is activated on this server. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + return AI_SCOUT_AHEAD_ON; +} diff --git a/_module/nss/0c_if_skillrank.nss b/_module/nss/0c_if_skillrank.nss new file mode 100644 index 00000000..e0d77294 --- /dev/null +++ b/_module/nss/0c_if_skillrank.nss @@ -0,0 +1,18 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_SkillRank + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that checks to see if the caller's skill ranks + are above or equal to the param value. + Param: + nSkill - the skill number for the skill. See skills.2da. + nRank - the rank required. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +int StartingConditional() +{ + string sSkill = GetScriptParam("nSkill"); + if(sSkill == "") return FALSE; + int nRank = StringToInt(GetScriptParam("nRank")); + return (GetSkillRank(StringToInt(sSkill)) >= nRank); +} diff --git a/_module/nss/0c_if_taunt.nss b/_module/nss/0c_if_taunt.nss new file mode 100644 index 00000000..3e0fde64 --- /dev/null +++ b/_module/nss/0c_if_taunt.nss @@ -0,0 +1,15 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_if_taunt + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that returns TRUE the server allows a henchman to + taunt and if they have the don't have the taunt ai script set. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + object oHenchman = OBJECT_SELF; + return (AI_TAUNTING_ON && + GetSkillRank(SKILL_TAUNT, oHenchman) > ai_GetCharacterLevels(oHenchman) && + GetLocalString(oHenchman, AI_COMBAT_SCRIPT) != "ai_a_taunter"); +} diff --git a/_module/nss/0c_listhenchman.nss b/_module/nss/0c_listhenchman.nss new file mode 100644 index 00000000..802f1003 --- /dev/null +++ b/_module/nss/0c_listhenchman.nss @@ -0,0 +1,19 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + Script Name: 0c_cast_polymorp + Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Conversation script to setup the tokens for the henchman in the speakers party + except for who they are talking to. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +void main() +{ + object oSpeaker = OBJECT_SELF; + object oPC = GetPCSpeaker(); + int nCntr = 1; + object oHenchman = GetHenchman(oPC, nCntr); + while(oHenchman != OBJECT_INVALID) + { + if(oHenchman != oSpeaker) SetCustomToken(77100 + nCntr, GetName(oHenchman)); + oHenchman = GetHenchman(oPC, ++nCntr); + } +} diff --git a/_module/nss/0c_no_com_script.nss b/_module/nss/0c_no_com_script.nss new file mode 100644 index 00000000..ca5c3863 --- /dev/null +++ b/_module/nss/0c_no_com_script.nss @@ -0,0 +1,27 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0c_no_com_script + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Text Appears When script that returns TRUE the caller does not have an ai combat + script set to sAIScript. + if sAIScript is blank then if its equal to all of them. + Param: sAIScripts:"ai_a_ambusher", "ai_a_defensive", "ai_a_taunter", "ai_coward". + sAIScript - The special combat script to check. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +int StartingConditional() +{ + string sAIScript = GetScriptParam("sAIScript"); + string sAICombatScript = GetLocalString (OBJECT_SELF, AI_COMBAT_SCRIPT); + // This is the value for do your own thing in combat! + if (sAIScript == "") + { + return (sAICombatScript == "ai_a_ambusher" || + sAICombatScript == "ai_a_defensive" || + sAICombatScript == "ai_a_ranged" || + sAICombatScript == "ai_a_taunter" || + sAICombatScript == "ai_a_cntrspell" || + sAICombatScript == "ai_a_peaceful"); + } + return (sAIScript != sAICombatScript); +} diff --git a/_module/nss/0c_remove_effect.nss b/_module/nss/0c_remove_effect.nss new file mode 100644 index 00000000..aa95a0ce --- /dev/null +++ b/_module/nss/0c_remove_effect.nss @@ -0,0 +1,14 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script:0c_remove_effect + Programmer:Philos +//////////////////////////////////////////////////////////////////////////////// + Actions Taken script that removes an effect from OBJECT_SELF. + Param: nEffect - the EFFECT_TYPE_* number to remove. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_spells" +void main () +{ + int nEffect = StringToInt (GetScriptParam ("nEffectType")); + ai_RemoveASpecificEffect (OBJECT_SELF, nEffect); +} + diff --git a/_module/nss/0c_summon_assoc.nss b/_module/nss/0c_summon_assoc.nss new file mode 100644 index 00000000..19544de2 --- /dev/null +++ b/_module/nss/0c_summon_assoc.nss @@ -0,0 +1,17 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + Script Name: 0c_summon_assoc + Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Conversation script to have the caller summon either an animal companion or + familiar associate. + + Param + sAssociate - which associate to summon. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + string sAssociate = GetScriptParam ("sAssociate"); + if (sAssociate == "Familiar") SummonFamiliar (); + else if (sAssociate == "Companion") SummonAnimalCompanion (); +} diff --git a/_module/nss/0c_use_feat.nss b/_module/nss/0c_use_feat.nss new file mode 100644 index 00000000..ec3ddcca --- /dev/null +++ b/_module/nss/0c_use_feat.nss @@ -0,0 +1,15 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + Script Name: 0c_summon_assoc + Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Conversation script to have the caller use nFeat from the feat.2da. + + Param + nFeat - Feat number from the feat.2da. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + int nFeat = StringToInt (GetScriptParam ("nFeat")); + ActionUseFeat(nFeat, OBJECT_SELF); +} diff --git a/_module/nss/0e_c2_1_hb.nss b/_module/nss/0e_c2_1_hb.nss new file mode 100644 index 00000000..05fbfc2c --- /dev/null +++ b/_module/nss/0e_c2_1_hb.nss @@ -0,0 +1,16 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_c2_1_hb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnHeartbeat script; + This will usually fire every 6 seconds (1 game round). + + I am reverting the AI script back to the games default scripts for efficiency. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_module" +void main() +{ + SetLocalInt(OBJECT_SELF, AI_ONSPAWN_EVENT, TRUE); + ai_ChangeEventScriptsForMonster(OBJECT_SELF); + ExecuteScript("nw_c2_default1"); +} diff --git a/_module/nss/0e_c2_7_ondeath.nss b/_module/nss/0e_c2_7_ondeath.nss new file mode 100644 index 00000000..129e81ec --- /dev/null +++ b/_module/nss/0e_c2_7_ondeath.nss @@ -0,0 +1,32 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_c2_7_ondeath + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnDeath script; + This fires when the creature dies. +*//////////////////////////////////////////////////////////////////////////////// +#include "0i_module" +void main() +{ + object oCreature = OBJECT_SELF; + // Added code to allow for permanent associates in the battle! + object oModule = GetModule(); + if(GetLocalInt(oModule, AI_RULE_PERM_ASSOC)) + { + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex < 5; nIndex++) + { + oAssociate = GetAssociate(nIndex, oCreature); + if(oAssociate != OBJECT_INVALID) + { + SetIsDestroyable(FALSE, FALSE, FALSE); + DelayCommand(0.1, ChangeToStandardFaction(oAssociate, STANDARD_FACTION_HOSTILE)); + } + } + } + if(GetLocalInt(oModule, AI_RULE_CORPSES_STAY)) SetIsDestroyable(FALSE, FALSE, TRUE); + ai_ClearCombatState(oCreature); + ExecuteScript(GetLocalString(oCreature, "AI_ON_DEATH")); +} + diff --git a/_module/nss/0e_ch_1_hb.nss b/_module/nss/0e_ch_1_hb.nss new file mode 100644 index 00000000..d04eeb8a --- /dev/null +++ b/_module/nss/0e_ch_1_hb.nss @@ -0,0 +1,14 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_ch_1_hb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate(Summons, Familiar, Companion) OnHeart beat script when out of combat; + This will usually fire every 6 seconds (1 game round). +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_module" +void main() +{ + SetLocalInt(OBJECT_SELF, AI_ONSPAWN_EVENT, TRUE); + ai_ChangeEventScriptsForAssociate(OBJECT_SELF); + ExecuteScript("nw_ch_ac1"); +} diff --git a/_module/nss/0e_ch_7_ondeath.nss b/_module/nss/0e_ch_7_ondeath.nss new file mode 100644 index 00000000..76d955df --- /dev/null +++ b/_module/nss/0e_ch_7_ondeath.nss @@ -0,0 +1,41 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_ch_7_ondeath + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate OnSpawn script; + This fires when an associate dies. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_module" +void main() +{ + object oCreature = OBJECT_SELF; + // Added code to allow for permanent associates in the battle! + if(AI_DEBUG) ai_Debug("0e_ch_7_ondeath", "13", GetName(oCreature) + " has died!" + + " AI_RULE_PERM_ASSOC: " + IntToString(GetLocalInt(GetModule(), AI_RULE_PERM_ASSOC))); + object oModule = GetModule(); + if(GetLocalInt(oModule, AI_RULE_PERM_ASSOC)) + { + object oAssociate; + int nIndex; + for(nIndex = 2; nIndex < 5; nIndex++) + { + oAssociate = GetAssociate(nIndex, oCreature); + if(oAssociate != OBJECT_INVALID) + { + SetIsDestroyable(FALSE, FALSE, FALSE); + ChangeFaction(oAssociate, oCreature); + } + } + } + // Remove the widget! + object oPC = GetMaster(oCreature); + if(oPC != OBJECT_INVALID) + { + NuiDestroy(oPC, NuiFindWindow(oPC, ai_GetAssociateType(oPC, oCreature) + AI_WIDGET_NUI)); + DelayCommand(0.5, ai_CheckXPPartyScale(oCreature)); + DelayCommand(2.0, ai_ClearCreatureActions(TRUE)); + } + DelayCommand(2.0, ai_ClearCombatState(oCreature)); + ExecuteScript(GetLocalString(oCreature, "AI_ON_DEATH")); +} + diff --git a/_module/nss/0e_do_combat_rnd.nss b/_module/nss/0e_do_combat_rnd.nss new file mode 100644 index 00000000..f1cb9c00 --- /dev/null +++ b/_module/nss/0e_do_combat_rnd.nss @@ -0,0 +1,22 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_do_combat_rnd + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Used to execute a combat round just after the current action is over. + Note: Do not use with an attack action since it will continue until + the attacked enemy is dead. We end attack actions with a ClearAllActions + command and would also end this one so it will not work with attack actions. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("0e_do_combat_rnd", "14", GetName(oCreature) + " is calculating a new round." + + "nAction: " + IntToString(GetCurrentAction(oCreature))); + if(ai_GetIsInCombat(oCreature)) + { + if(GetAssociateType(oCreature) == ASSOCIATE_TYPE_NONE && + !ai_GetIsCharacter(oCreature)) ai_DoMonsterCombatRound(oCreature); + else if(ai_CanIAttack(oCreature)) ai_DoAssociateCombatRound(oCreature); + } +} diff --git a/_module/nss/0e_gui_events.nss b/_module/nss/0e_gui_events.nss new file mode 100644 index 00000000..401c8254 --- /dev/null +++ b/_module/nss/0e_gui_events.nss @@ -0,0 +1,60 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: 0e_gui_events + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + OnPlayerGUIEvent event script + Used to allow PEPS to gain control of specific GUI events. + +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_gui_events" +#include "0i_menus" +void main() +{ + object oPC = GetLastGuiEventPlayer(); + int nEventType = GetLastGuiEventType(); + int nEventInt = GetLastGuiEventInteger(); + //object oEventObject = GetLastGuiEventObject(); + switch(nEventType) + { + case GUIEVENT_EFFECTICON_CLICK: + { + if(ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT)) + { + ai_CreateEffectChatReport(oPC, nEventInt); + return; + } + int nToken = NuiFindWindow(oPC, AI_EFFECT_ICON_NUI); + json jData; + if(nToken) + { + jData = NuiGetUserData(oPC, nToken); + int nOldEffectIcon = JsonGetInt(JsonArrayGet(jData, 1)); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + if(nOldEffectIcon == nEventInt) return; + } + ai_CreateEffectIconMenu(oPC, nEventInt); + } + case GUIEVENT_PARTYBAR_PORTRAIT_CLICK: + { + object oAssociate = GetLastGuiEventObject(); + if(GetMaster(oAssociate) == oPC) + { + // If all the Command buttons are blocked then don't load the menu. + if(GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028) + { + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + if(IsWindowClosed(oPC, sAssociateType + AI_COMMAND_NUI)) + { + ai_CreateAssociateCommandNUI(oPC, oAssociate); + } + IsWindowClosed(oPC, sAssociateType + AI_NUI); + IsWindowClosed(oPC, sAssociateType + AI_LOOTFILTER_NUI); + IsWindowClosed(oPC, sAssociateType + AI_COPY_NUI); + IsWindowClosed(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_MEMORIZE_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_KNOWN_NUI); + } + } + } + } +} diff --git a/_module/nss/0e_m1_3_endround.nss b/_module/nss/0e_m1_3_endround.nss new file mode 100644 index 00000000..e8a0125e --- /dev/null +++ b/_module/nss/0e_m1_3_endround.nss @@ -0,0 +1,46 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_m1_3_endround + Original Script: m1_combanter_3 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnCombatRoundEnd event script used in the original campaign + for monsters that may do a one liner during combat; + + Fires at the end of each combat round (6 seconds). + This will fire as long as oCreature is in combat (GetIsInCombat()). + This event starts counting once a combat action is started. + Every time a spell is cast it will queue another end combat round so haste with + two spells cast will fire this twice in one round. + It will also fire at the end of a hostile effect that stops actions i.e Stunned, Knockdown etc. + Action modes are also cleared prior to this event executing! + GetAttemptedAttackTarget() & GetAttemptedSpellTarget() also get cleared prior to this event. + This event can be canceled with ClearAllActions(TRUE) and SurrenderToEnemies. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("0e_m1_3_endround", "23", GetName(oCreature) + " ends combat round."); + // Action modes get cleared prior to each OnCombatRoundEnd! + // We do this to keep the action mode going. + int nActionMode = GetLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + if(nActionMode > 0) + { + SetActionMode(oCreature, nActionMode, TRUE); + // We don't want to use up all of the Dwarven Defenders uses! + if(nActionMode == 12) IncrementRemainingFeatUses(oCreature, FEAT_DWARVEN_DEFENDER_DEFENSIVE_STANCE); + } + if (ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(Random(4) == 0) SpeakOneLinerConversation(); + if(ai_GetIsInCombat(oCreature)) ai_DoMonsterCombatRound(oCreature); + ai_SpellConcentrationCheck(oCreature); + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) ai_DetermineSpecialBehavior(oCreature); + if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(1003)); + } +} + + + + diff --git a/_module/nss/0e_nui.nss b/_module/nss/0e_nui.nss new file mode 100644 index 00000000..7d18c65e --- /dev/null +++ b/_module/nss/0e_nui.nss @@ -0,0 +1,1975 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: 0e_nui + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Menu event script + sEvent: close, click, mousedown, mouseup, watch (if bindwatch is set). +/*////////////////////////////////////////////////////////////////////////////// +#include "nw_inc_gff" +#include "x0_i0_assoc" +#include "0i_menus" +#include "0i_player_target" +// Save a window ID to the database. +void ai_SaveWindowLocation(object oPC, int nToken, string sAssociateType, string sWindowID); +// Sets the Widget Buttons state to sElem Checkbox state. +void ai_SetWidgetButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem); +// Flips an AI Buttons state to sElem Checkbox state. +void ai_SetAIButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem); +// Flips the flag for the loot filter to sElem Checkbox state. +void ai_SetLootFilterToCheckbox(object oPC, object oAssociate, int nFilterBit, int nToken, string sElem); +// Sets an associates companion type. Cannot set companion for a player! +void ai_SetCompanionType(object oPC, object oAssociate, int nToken, int nCompanionType); +// Sets an associates companion name. Cannot set companion for a player! +void ai_SetCompanionName(object oPC, object oAssociate, int nToken, int nCompanionType); +// Sets an associates AI script via a combo box. +void ai_SetAIScript(object oPC, object oAssociate, int nToken); +// Increments/Decrements the Perception Range use variable for the AI. +void ai_PercRangeIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType, int nToken); +// Saves an associates perception range changed on the button. +void ai_Perc_Range(object oPC, object oAssociate, int nToken, string sAssociateType); +// Changes Perception Distance Rule for monsters. +void ai_RulePercDistInc(object oPC, object oModule, int nIncrement, int nToken); +// Adds a spell to a json AI restricted spell list then returns jRules. +// bRestrict = TRUE will add to the list FALSE will remove it from the list. +json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE); +// Turns on oAssociate AI, Setting all event scripts. +void ai_TurnOn(object oPC, object oAssociate, string sAssociateType); +// Turns off oAssociate AI, Setting all event scripts. +void ai_TurnOff(object oPC, object oAssociate, string sAssociateType); +// Adds a henchman back into the players party. +object ai_AddHenchman(object oPC, json jHenchman, location lLocation, int nFamiliar, int nCompanion); + +void ai_SaveWindowLocation(object oPC, int nToken, string sAssociateType, string sWindowID) +{ + json jGeometry = NuiGetBind(oPC, nToken, "window_geometry"); + float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); + float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) jLocations = JsonObject(); + json jWindow = JsonObjectGet(jLocations, sWindowID); + if(JsonGetType(jWindow) == JSON_TYPE_NULL) jWindow = JsonObject(); + jWindow = JsonObjectSet(jWindow, "x", JsonFloat(fX)); + jWindow = JsonObjectSet(jWindow, "y", JsonFloat(fY)); + jLocations = JsonObjectSet(jLocations, sWindowID, jWindow); + //SendMessageToPC(oPC, "0e_nui, 52, sAssociateType: " + sAssociateType + + // " sWindowID: " + sWindowID + + // " jLocations: " + JsonDump(jLocations, 1)); + ai_SetAssociateDbJson(oPC, sAssociateType, "locations", jLocations); +} +void ai_ToggleAssociateWidgetOnOff(object oPC, int nToken, object oAssociate, string sAssociateType) +{ + string sText, sText2, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int bWidget = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType, bWidget); + NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool (!bWidget)); + if(bWidget) + { + sText = "on"; + sText2 = "Off"; + IsWindowClosed(oPC, sAssociateType + AI_WIDGET_NUI); + } + else + { + sText = "off"; + sText2 = "On"; + ai_CreateWidgetNUI(oPC, oAssociate); + } + NuiSetBind(oPC, nToken, "btn_widget_onoff_label", JsonString("Widget " + sText2)); + NuiSetBind(oPC, nToken, "btn_widget_onoff_tooltip", JsonString(" Turn " + sName + " widget " + sText)); +} +void main() +{ + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + string sWndId = NuiGetWindowId(oPC, nToken); + //SendMessageToPC(oPC, "0e_nui , 64 sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem + + // " nToken: " + IntToString(nToken) + " nIndex: " + IntToString(nIndex) + + // " oPC: " + GetName(oPC)); + // Get if the menu has an associate attached. + json jData = NuiGetUserData(oPC, nToken); + object oAssociate = StringToObject(JsonGetString(JsonArrayGet(jData, 0))); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + if(!ai_GetIsCharacter(oAssociate) && !GetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE") && + (oAssociate == OBJECT_INVALID || GetMaster(oAssociate) != oPC)) + { + ai_SendMessages("This creature is no longer in your party!", AI_COLOR_RED, oPC); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + return; + } + if(sAssociateType == "") return; + //************************************************************************** + // Watch to see if the window moves and save. + if(sElem == "window_geometry" && sEvent == "watch") + { + if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + // If the widget is locked then don't save. + if(sWndId == sAssociateType + AI_WIDGET_NUI && + ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType)) return; + ai_SaveWindowLocation(oPC, nToken, sAssociateType, sWndId); + return; + } + //************************************************************************** + // Main AI events. + if(sWndId == AI_MAIN_NUI) + { + //if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + if(sEvent == "click") + { + if(sElem == "btn_plugin_manager") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreatePluginNUI(oPC); + } + else if(sElem == "btn_action_ghost") + { + // We set ghost mode differently for each AI. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + if(GetLocalInt(oPC, sGhostModeVarname)) + { + DeleteLocalInt(oPC, sGhostModeVarname); + ai_SendMessages("Action Ghost mode is turned off when using commands.", AI_COLOR_YELLOW, oPC); + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + } + else + { + SetLocalInt(oPC, sGhostModeVarname, TRUE); + ai_SendMessages("Action Ghost mode is turned on when using commands.", AI_COLOR_YELLOW, oPC); + } + } + else + { + if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST)) + { + ai_SetAIMode(oPC, AI_MODE_ACTION_GHOST, FALSE); + ai_SendMessages("Action Ghost mode is turned off when using commands.", AI_COLOR_YELLOW, oPC); + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID && !ai_GetAIMode(oAssociate, AI_MODE_GHOST)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID && !ai_GetAIMode(oAssociate, AI_MODE_GHOST)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + } + else + { + ai_SetAIMode(oPC, AI_MODE_ACTION_GHOST); + ai_SendMessages("Action Ghost mode is turned on when using commands.", AI_COLOR_YELLOW, oPC); + } + aiSaveAssociateModesToDb(oPC, oPC); + } + } + else if(sElem == "btn_toggle_assoc_widget") + { + int bWidgetOff = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oPC, "pc"); + string sAssocType; + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oPC, "pc", bWidgetOff); + object oAssoc = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); + if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); + else ai_CreateWidgetNUI(oPC, oAssoc); + } + oAssoc = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); + if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); + else ai_CreateWidgetNUI(oPC, oAssoc); + } + oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); + if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); + else ai_CreateWidgetNUI(oPC, oAssoc); + } + oAssoc = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); + if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); + else ai_CreateWidgetNUI(oPC, oAssoc); + } + int nIndex; + object oHenchman; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oHenchman != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oHenchman); + ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oHenchman, sAssocType, bWidgetOff); + if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); + else ai_CreateWidgetNUI(oPC, oHenchman); + } + } + } + else if(sElem == "btn_effect_icon") + { + if(ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT)) + { + ai_SetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT, FALSE); + ai_SendMessages("All effect icons will be reported in a menu at the top of the screen.", AI_COLOR_YELLOW, oPC); + } + else + { + ai_SetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT); + ai_SendMessages("All effect icons will be reported in the chat screen.", AI_COLOR_YELLOW, oPC); + } + aiSaveAssociateModesToDb(oPC, oPC); + } + if(sElem == "btn_default_xp") + { + int nDefaultXP = GetLocalInt(GetModule(), AI_RULE_DEFAULT_XP_SCALE); + SetModuleXPScale(nDefaultXP); + NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(IntToString(nDefaultXP))); + } + } + if(sEvent == "watch") + { + string sPreElem = GetStringLeft(sElem, 4); + if(sPreElem == "txt_") + { + object oModule = GetModule(); + json jRules = ai_GetCampaignDbJson("rules"); + string sText = JsonGetString(NuiGetBind(oPC, nToken, sElem)); + if(sElem == "txt_max_henchman") + { + int nMaxHenchmen = StringToInt(sText); + if(nMaxHenchmen < 1) nMaxHenchmen = 1; + if(nMaxHenchmen > 12) + { + nMaxHenchmen = 12; + ai_SendMessages("The maximum henchmen for this mod is 12!", AI_COLOR_RED, oPC); + } + SetMaxHenchmen(nMaxHenchmen); + SetLocalInt(oModule, AI_RULE_MAX_HENCHMAN, nMaxHenchmen); + jRules = JsonObjectSet(jRules, AI_RULE_MAX_HENCHMAN, JsonInt(nMaxHenchmen)); + ai_SendMessages("Maximum henchmen has been changed to " + IntToString(nMaxHenchmen), AI_COLOR_YELLOW, oPC); + } + else if(sElem == "txt_ai_difficulty") + { + int nChance = StringToInt(sText); + if(nChance < 0) nChance = 0; + else if(nChance > 100) nChance = 100; + SetLocalInt(oModule, AI_RULE_AI_DIFFICULTY, nChance); + jRules = JsonObjectSet(jRules, AI_RULE_AI_DIFFICULTY, JsonInt(nChance)); + } + else if(sElem == "txt_perception_distance") + { + float fDistance = StringToFloat(sText); + if(fDistance < 10.0) fDistance = 10.0; + else if(fDistance > 60.0) fDistance = 60.0; + SetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE, fDistance); + jRules = JsonObjectSet(jRules, AI_RULE_PERCEPTION_DISTANCE, JsonFloat(fDistance)); + } + else if(sElem == "txt_inc_enc") + { + float fNumber = StringToFloat(sText); + if(fNumber < 0.0) fNumber = 0.0; + else if(fNumber > 9.0) fNumber = 9.0; + SetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS, fNumber); + jRules = JsonObjectSet(jRules, AI_INCREASE_ENC_MONSTERS, JsonFloat(fNumber)); + } + else if(sElem == "txt_inc_hp") + { + int nNumber = StringToInt(sText); + if(nNumber < 0) nNumber = 0; + else if(nNumber > 100) nNumber = 100; + SetLocalInt(oModule, AI_INCREASE_MONSTERS_HP, nNumber); + jRules = JsonObjectSet(jRules, AI_INCREASE_MONSTERS_HP, JsonInt(nNumber)); + } + else if(sElem == "txt_wander_distance") + { + float fDistance = StringToFloat(sText); + if(fDistance < 0.0) fDistance = 0.0; + else if(fDistance > 99.0) fDistance = 99.0; + SetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE, fDistance); + jRules = JsonObjectSet(jRules, AI_RULE_WANDER_DISTANCE, JsonFloat(fDistance)); + } + else if(sElem == "txt_xp_scale") + { + int nNumber = StringToInt(sText); + if(nNumber < 0) nNumber = 0; + else if(nNumber > 200) nNumber = 200; + SetModuleXPScale(nNumber); + return; + } + ai_SetCampaignDbJson("rules", jRules); + } + else if(sPreElem == "chbx") + { + object oModule = GetModule(); + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + json jRules = ai_GetCampaignDbJson("rules"); + if(sElem == "chbx_moral_check") + { + SetLocalInt(oModule, AI_RULE_MORAL_CHECKS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_MORAL_CHECKS, JsonInt(bCheck)); + } + else if(sElem == "chbx_buff_monsters_check") + { + SetLocalInt(oModule, AI_RULE_BUFF_MONSTERS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_BUFF_MONSTERS, JsonInt(bCheck)); + } + else if(sElem == "chbx_buff_summons_check") + { + SetLocalInt(oModule, AI_RULE_PRESUMMON, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PRESUMMON, JsonInt(bCheck)); + } + else if(sElem == "chbx_ambush_monsters_check") + { + SetLocalInt(oModule, AI_RULE_AMBUSH, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_AMBUSH, JsonInt(bCheck)); + } + else if(sElem == "chbx_companions_check") + { + SetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_SUMMON_COMPANIONS, JsonInt(bCheck)); + } + else if(sElem == "chbx_advanced_movement_check") + { + SetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ADVANCED_MOVEMENT, JsonInt(bCheck)); + } + else if(sElem == "chbx_ilr_check") + { + SetLocalInt(oModule, AI_RULE_ILR, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ILR, JsonInt(bCheck)); + } + else if(sElem == "chbx_umd_check") + { + SetLocalInt(oModule, AI_RULE_ALLOW_UMD, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ALLOW_UMD, JsonInt(bCheck)); + } + else if(sElem == "chbx_use_healingkits_check") + { + SetLocalInt(oModule, AI_RULE_HEALERSKITS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_HEALERSKITS, JsonInt(bCheck)); + } + else if(sElem == "chbx_perm_assoc_check") + { + SetLocalInt(oModule, AI_RULE_PERM_ASSOC, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PERM_ASSOC, JsonInt(bCheck)); + } + else if(sElem == "chbx_corpses_stay_check") + { + SetLocalInt(oModule, AI_RULE_CORPSES_STAY, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_CORPSES_STAY, JsonInt(bCheck)); + } + else if(sElem == "chbx_wander_check") + { + SetLocalInt(oModule, AI_RULE_WANDER, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_WANDER, JsonInt(bCheck)); + NuiSetBind(oPC, nToken, "txt_wander_distance_event", JsonBool(bCheck)); + } + else if(sElem == "chbx_open_doors_check") + { + SetLocalInt(oModule, AI_RULE_OPEN_DOORS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_OPEN_DOORS, JsonInt(bCheck)); + } + else if(sElem == "chbx_party_scale_check") + { + if(bCheck) + { + SetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP, GetModuleXPScale()); + ai_CheckXPPartyScale(oPC); + } + else + { + SetModuleXPScale(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); + } + SetLocalInt(oModule, AI_RULE_PARTY_SCALE, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PARTY_SCALE, JsonInt(bCheck)); + string sText = IntToString(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); + NuiSetBind(oPC, nToken, "chbx_party_scale_tooltip", JsonString(" PEPS adjusts your XP based on party size from (" + sText + ").")); + sText = IntToString(GetModuleXPScale()); + NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(sText)); + } + else if(sElem == "chbx_darkness_check") + { + if(bCheck) + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS); + jRules = ai_AddRestrictedSpell(jRules, 159); + jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS); + jRules = ai_AddRestrictedSpell(jRules, 688); // WildShape_Darkness + } + else + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS, FALSE); + jRules = ai_AddRestrictedSpell(jRules, 159, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS, FALSE); + jRules = ai_AddRestrictedSpell(jRules, 688, FALSE); // WildShape_Darkness + } + } + else if(sElem == "chbx_dispels_check") + { + if(bCheck) + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL); + jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC); + jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING); + jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION); + } + else + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION, FALSE); + } + } + else if(sElem == "chbx_timestop_check") + { + if(bCheck) jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP); + else jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP, FALSE); + } + ai_SetCampaignDbJson("rules", jRules); + } + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + // Follow range is only changed on non-pc's + if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oPC, GetModule(), 1, nToken); + } + else if(nMouseScroll == -1.0) // Scroll down + { + // Follow range is only changed on non-pc's + if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oPC, GetModule(), -1, nToken); + } + } + return; + } + //************************************************************************** + // Associate Command events. + if(sWndId == sAssociateType + AI_COMMAND_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_ai_menu") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreateAssociateAINUI(oPC, oAssociate); + } + if(sElem == "btn_vertical_widget") + { + int bVertical = !ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); + ai_SetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType, bVertical); + if(oPC == oAssociate || + (oPC != oAssociate && !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType))) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + } + else if(sElem == "btn_main_menu") + { + if(ai_GetIsCharacter(oAssociate)) ai_CreateAIMainNUI(oPC); + } + else if(sElem == "btn_widget_onoff") + { + ai_ToggleAssociateWidgetOnOff(oPC, nToken, oAssociate, sAssociateType); + } + else if(sElem == "btn_widget_lock") + { + int bLocked = !ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); + ai_SetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType, bLocked); + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType) || oPC == oAssociate) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + } + else if(sElem == "btn_copy_settings") + { + ai_CreateCopySettingsNUI(oPC, oAssociate); + } + else if(sElem == "btn_cmd_action") ai_Action(oPC, oAssociate); + else if(sElem == "btn_cmd_guard") ai_DoCommand(oPC, oAssociate, 1); + else if(sElem == "btn_cmd_hold") ai_DoCommand(oPC, oAssociate, 3); + else if(sElem == "btn_cmd_search") ai_DoCommand(oPC, oAssociate, 5); + else if(sElem == "btn_cmd_stealth") ai_DoCommand(oPC, oAssociate, 6); + else if(sElem == "btn_cmd_attack") ai_DoCommand(oPC, oAssociate, 4); + else if(sElem == "btn_cmd_follow") ai_DoCommand(oPC, oAssociate, 2); + else if(sElem == "btn_follow_target") ai_FollowTarget(oPC, oAssociate); + else if(sElem == "btn_cmd_ai_script") ai_AIScript(oPC, oAssociate, sAssociateType, nToken); + else if(sElem == "btn_cmd_place_trap") ai_HavePCPlaceTrap(oPC, oAssociate); + else if(sElem == "btn_quick_widget") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate); + } + else if(sElem == "btn_spell_memorize") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreateSpellMemorizationNUI(oPC, oAssociate); + } + else if(sElem == "btn_spell_known") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreateSpellKnownNUI(oPC, oAssociate); + } + else if(sElem == "btn_buff_short") + { + ai_Buff_Button(oPC, oAssociate, 2, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_long") + { + ai_Buff_Button(oPC, oAssociate, 3, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_all") + { + ai_Buff_Button(oPC, oAssociate, 1, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_rest") ai_Buff_Button(oPC, oAssociate, 0, sAssociateType); + else if(sElem == "btn_jump_to") ai_JumpToPC(oPC, oAssociate); + else if(sElem == "btn_ghost_mode") ai_GhostMode(oPC, oAssociate, nToken, sAssociateType); + else if(sElem == "btn_camera") ai_ChangeCameraView(oPC, oAssociate); + else if(sElem == "btn_inventory") ai_OpenInventory(oAssociate, oPC); + else if(sElem == "btn_familiar_name") ai_SetCompanionName(oPC, oAssociate, nToken, ASSOCIATE_TYPE_FAMILIAR); + else if(sElem == "btn_companion_name") ai_SetCompanionName(oPC, oAssociate, nToken, ASSOCIATE_TYPE_ANIMALCOMPANION); + else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oPC, sElem); + } + else if(sEvent == "watch") + { + if(sElem == "txt_familiar_name") + { + string sName = JsonGetString(NuiGetBind(oPC, nToken, sElem)); + if(sName != "") NuiSetBind(oPC, nToken, "btn_familiar_name_event", JsonBool(TRUE)); + else NuiSetBind(oPC, nToken, "btn_familiar_name_event", JsonBool(FALSE)); + } + if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") + { + int nIndex = StringToInt(GetSubString(sElem, 12, 1)); + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + json jPlugin = JsonArrayGet(jPlugins, nIndex); + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + else if(sElem == "chbx_buff_rest_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_REST, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_action_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_guard_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_hold_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_search_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_stealth_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_attack_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_follow_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_ai_script_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cmd_place_trap_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_quick_widget_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_follow_target_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_buff_short_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_buff_long_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_buff_all_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_jump_to_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_ghost_mode_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_camera_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_inventory_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_familiar_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_companion_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "cmb_familiar_selected") ai_SetCompanionType(oPC, oAssociate, nToken, ASSOCIATE_TYPE_FAMILIAR); + else if(sElem == "cmb_companion_selected") ai_SetCompanionType(oPC, oAssociate, nToken, ASSOCIATE_TYPE_ANIMALCOMPANION); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + // Follow range is only changed on non-pc's + if(sElem == "btn_cmd_follow" && + oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); + } + else if(nMouseScroll == -1.0) // Scroll down + { + // Follow range is only changed on non-pc's + if(sElem == "btn_cmd_follow" && + oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + } + } + return; + } + //************************************************************************** + // Associate AI events. + if(sWndId == sAssociateType + AI_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_command_menu") + { + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_CreateAssociateCommandNUI(oPC, oAssociate); + } + if(sElem == "btn_main_menu") + { + if(ai_GetIsCharacter(oAssociate)) ai_CreateAIMainNUI(oPC); + } + else if(sElem == "btn_loot_filter") + { + ai_CreateLootFilterNUI(oPC, oAssociate); + } + else if(sElem == "btn_ai") + { + if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") ai_TurnOff(oPC, oAssociate, sAssociateType); + else ai_TurnOn(oPC, oAssociate, sAssociateType); + } + else if(sElem == "btn_quiet") ai_ReduceSpeech(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ranged") AssignCommand(oAssociate, ai_Ranged(oPC, oAssociate, sAssociateType)); + else if(sElem == "btn_equip_weapon") ai_EquipWeapons(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_search") ai_Search(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_stealth") ai_Stealth(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoor(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_traps") ai_Traps(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_pick_locks") ai_Locks(oPC, oAssociate, sAssociateType, 1); + else if(sElem == "btn_bash_locks") ai_Locks(oPC, oAssociate, sAssociateType, 2); + else if(sElem == "btn_magic") ai_UseMagic(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_magic_items") ai_UseMagicItems(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_def_magic") ai_UseOffensiveMagic(oPC, oAssociate, TRUE, FALSE, sAssociateType); + else if(sElem == "btn_off_magic") ai_UseOffensiveMagic(oPC, oAssociate, FALSE, TRUE, sAssociateType); + else if(sElem == "btn_spontaneous") ai_Spontaneous(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_heals_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 1); + else if(sElem == "btn_healp_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 2); + else if(sElem == "btn_cure_onoff") ai_Cure_OnOff(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_loot") ai_Loot(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ignore_assoc") ai_Ignore_Associates(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ignore_traps") ai_Ignore_Traps(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_perc_range") ai_Perc_Range(oPC, oAssociate, nToken, sAssociateType); + else if(sElem == "btn_ai_script") ai_SaveAIScript(oPC, oAssociate, nToken); + } + else if(sEvent == "watch") + { + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + if(sElem == "chbx_ai_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_quiet_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_ranged_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_equip_weapon_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_search_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_stealth_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_open_door_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_traps_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_pick_locks_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_bash_locks_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_magic_level_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_spontaneous_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_magic_items_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_def_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_off_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_heal_out_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_heal_in_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_heals_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_healp_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_cure_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_loot_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_LOOT, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_ignore_assoc_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_ignore_traps_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "chbx_perc_range_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType, nToken, sElem); + else if(sElem == "cmb_ai_script_selected") ai_SetAIScript(oPC, oAssociate, nToken); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, 1, sAssociateType, nToken); + } + else if(nMouseScroll == -1.0) // Scroll down + { + if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, -1, sAssociateType, nToken); + } + } + return; + } + //************************************************************************** + // Associate Widget events. + if(sWndId == sAssociateType + AI_WIDGET_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_open_main") + { + // If all the Command buttons are blocked then don't load the menu. + if(GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028) + { + if(IsWindowClosed(oPC, sAssociateType + AI_COMMAND_NUI)) + { + ai_CreateAssociateCommandNUI(oPC, oAssociate); + } + IsWindowClosed(oPC, sAssociateType + AI_NUI); + IsWindowClosed(oPC, sAssociateType + AI_LOOTFILTER_NUI); + IsWindowClosed(oPC, sAssociateType + AI_COPY_NUI); + IsWindowClosed(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_MEMORIZE_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_KNOWN_NUI); + if(ai_GetIsCharacter(oAssociate)) + { + IsWindowClosed(oPC, AI_MAIN_NUI); + IsWindowClosed(oPC, AI_PLUGIN_NUI); + } + } + } + else if(sElem == "btn_ai") + { + if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") + { + ai_TurnOff(oPC, oAssociate, sAssociateType); + } + else ai_TurnOn(oPC, oAssociate, sAssociateType); + } + else if(sElem == "btn_quiet") ai_ReduceSpeech(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ranged") AssignCommand(oAssociate, ai_Ranged(oPC, oAssociate, sAssociateType)); + else if(sElem == "btn_equip_weapon") ai_EquipWeapons(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_search") ai_Search(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_stealth") ai_Stealth(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoor(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_traps") ai_Traps(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_pick_locks") ai_Locks(oPC, oAssociate, sAssociateType, 1); + else if(sElem == "btn_bash_locks") ai_Locks(oPC, oAssociate, sAssociateType, 2); + else if(sElem == "btn_magic_minus") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); + else if(sElem == "btn_magic_plus") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); + else if(sElem == "btn_magic") ai_UseMagic(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_magic_items") ai_UseMagicItems(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_def_magic") ai_UseOffensiveMagic(oPC, oAssociate, TRUE, FALSE, sAssociateType); + else if(sElem == "btn_off_magic") ai_UseOffensiveMagic(oPC, oAssociate, FALSE, TRUE, sAssociateType); + else if(sElem == "btn_cure_onoff") ai_Cure_OnOff(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_loot") ai_Loot(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ignore_assoc") ai_Ignore_Associates(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_ignore_traps") ai_Ignore_Traps(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_perc_range") ai_Perc_Range(oPC, oAssociate, nToken, sAssociateType); + else if(sElem == "btn_spontaneous") ai_Spontaneous(oPC, oAssociate, sAssociateType); + else if(sElem == "btn_buff_short") + { + ai_Buff_Button(oPC, oAssociate, 2, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_long") + { + ai_Buff_Button(oPC, oAssociate, 3, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_all") + { + ai_Buff_Button(oPC, oAssociate, 1, sAssociateType); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sElem == "btn_buff_rest") ai_Buff_Button(oPC, oAssociate, 0, sAssociateType); + else if(sElem == "btn_jump_to") ai_JumpToPC(oPC, oAssociate); + else if(sElem == "btn_ghost_mode") ai_GhostMode(oPC, oAssociate, nToken, sAssociateType); + else if(sElem == "btn_camera") ai_ChangeCameraView(oPC, oAssociate); + else if(sElem == "btn_inventory") ai_OpenInventory(oAssociate, oPC); + else if(sElem == "btn_familiar") + { + if(GetHasFeat(FEAT_SUMMON_FAMILIAR, oAssociate)) + { + DecrementRemainingFeatUses(oAssociate, FEAT_SUMMON_FAMILIAR); + SummonFamiliar(oAssociate); + } + } + else if(sElem == "btn_companion") + { + if(GetHasFeat(FEAT_ANIMAL_COMPANION, oAssociate)) + { + DecrementRemainingFeatUses(oAssociate, FEAT_ANIMAL_COMPANION); + SummonAnimalCompanion(oAssociate); + } + } + else if(sElem == "btn_heals_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 1); + else if(sElem == "btn_healp_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 2); + else if(sElem == "btn_cmd_action") ai_Action(oPC, oAssociate); + else if(sElem == "btn_cmd_guard") ai_DoCommand(oPC, oAssociate, 1); + else if(sElem == "btn_cmd_hold") ai_DoCommand(oPC, oAssociate, 3); + else if(sElem == "btn_cmd_search") ai_DoCommand(oPC, oAssociate, 5); + else if(sElem == "btn_cmd_stealth") ai_DoCommand(oPC, oAssociate, 6); + else if(sElem == "btn_cmd_attack") ai_DoCommand(oPC, oAssociate, 4); + else if(sElem == "btn_cmd_follow") ai_DoCommand(oPC, oAssociate, 2); + else if(sElem == "btn_cmd_ai_script") ai_AIScript(oPC, oAssociate, sAssociateType, nToken); + else if(sElem == "btn_cmd_place_trap") ai_HavePCPlaceTrap(oPC, oAssociate); + else if(sElem == "btn_follow_target") ai_FollowTarget(oPC, oAssociate); + else if(sElem == "btn_update_widget") ai_UpdateAssociateWidget(oPC, oAssociate); + else if(GetStringLeft(sElem, 15) == "btn_exe_plugin_") ai_Plugin_Execute(oPC, sElem); + else if(GetStringLeft(sElem, 11) == "btn_widget_") ai_SelectWidgetSpellTarget(oPC, oAssociate, sElem); + } + if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + if(sElem == "btn_cmd_follow" && + oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); + else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); + else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, 1, sAssociateType, -1); + } + if(nMouseScroll == -1.0) // Scroll down + { + if(sElem == "btn_cmd_follow" && + oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_magic_plus") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); + if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); + else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); + else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, -1, sAssociateType, -1); + } + } + if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + AssignCommand(oPC, PlaySound("gui_button")); + if(sElem == "btn_open_main") + { + // If all the AI buttons are blocked then don't load the menu. + if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) + { + if(IsWindowClosed(oPC, sAssociateType + AI_NUI)) + { + ai_CreateAssociateAINUI(oPC, oAssociate); + } + } + IsWindowClosed(oPC, sAssociateType + AI_COMMAND_NUI); + IsWindowClosed(oPC, sAssociateType + AI_LOOTFILTER_NUI); + IsWindowClosed(oPC, sAssociateType + AI_COPY_NUI); + IsWindowClosed(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_MEMORIZE_NUI); + IsWindowClosed(oPC, sAssociateType + AI_SPELL_KNOWN_NUI); + if(ai_GetIsCharacter(oAssociate)) + { + IsWindowClosed(oPC, AI_MAIN_NUI); + IsWindowClosed(oPC, AI_PLUGIN_NUI); + } + } + else if(sElem == "btn_follow_range") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); + else if(GetStringLeft(sElem, 11) == "btn_widget_") + { + if(GetStringLength(sElem) == 13) nIndex = StringToInt(GetStringRight(sElem, 2)); + else nIndex = StringToInt(GetStringRight(sElem, 1)); + json jAIData = ai_GetAssociateDbJson(oPC, ai_GetAssociateType(oPC, oAssociate), "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jSpell = JsonArrayGet(jWidget, nIndex); + ai_CreateDescriptionNUI(oPC, jSpell); + } + } + } + return; + } + //************************************************************************** + // Associate Loot events. + if(sWndId == sAssociateType + AI_LOOTFILTER_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_set_all") + { + SetLocalInt(oPC, "AI_BLOCK_CHECKS", TRUE); + SetLocalInt(oAssociate, sLootFilterVarname, 65535); + int nIndex; + for(nIndex = 2; nIndex < 20; nIndex++) + { + NuiSetBind(oPC, nToken, "chbx_" + IntToString(nIndex) + "_check", JsonBool (TRUE)); + } + json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(65535)); + ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); + DelayCommand(1.0, DeleteLocalInt(oPC, "AI_BLOCK_CHECKS")); + } + else if(sElem == "btn_clear_all") + { + SetLocalInt(oPC, "AI_BLOCK_CHECKS", TRUE); + SetLocalInt(oAssociate, sLootFilterVarname, 0); + int nIndex; + for(nIndex = 2; nIndex < 20; nIndex++) + { + NuiSetBind(oPC, nToken, "chbx_" + IntToString(nIndex) + "_check", JsonBool (FALSE)); + } + json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(0)); + ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); + DelayCommand(1.0, DeleteLocalInt(oPC, "AI_BLOCK_CHECKS")); + } + } + else if(sEvent == "watch") + { + if(GetStringLeft(sElem, 5) == "chbx_") + { + if(GetLocalInt(oPC, "AI_BLOCK_CHECKS")) return; + if(sElem == "chbx_give_loot_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GIVE_TO_PC, nToken, sElem); + else if(sElem == "chbx_2_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_PLOT, nToken, sElem); + else if(sElem == "chbx_3_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_ARMOR, nToken, sElem); + else if(sElem == "chbx_4_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BELTS, nToken, sElem); + else if(sElem == "chbx_5_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BOOTS, nToken, sElem); + else if(sElem == "chbx_6_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_CLOAKS, nToken, sElem); + else if(sElem == "chbx_7_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GEMS, nToken, sElem); + else if(sElem == "chbx_8_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GLOVES, nToken, sElem); + else if(sElem == "chbx_9_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_HEADGEAR, nToken, sElem); + else if(sElem == "chbx_10_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_JEWELRY, nToken, sElem); + else if(sElem == "chbx_11_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_MISC, nToken, sElem); + else if(sElem == "chbx_12_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_POTIONS, nToken, sElem); + else if(sElem == "chbx_13_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_SCROLLS, nToken, sElem); + else if(sElem == "chbx_14_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_SHIELDS, nToken, sElem); + else if(sElem == "chbx_15_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_WANDS_RODS_STAVES, nToken, sElem); + else if(sElem == "chbx_16_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_WEAPONS, nToken, sElem); + else if(sElem == "chbx_17_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_ARROWS, nToken, sElem); + else if(sElem == "chbx_18_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BOLTS, nToken, sElem); + else if(sElem == "chbx_19_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BULLETS, nToken, sElem); + json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + int nLootFilter = GetLocalInt(oAssociate, sLootFilterVarname); + jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(nLootFilter)); + ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); + } + else if(GetStringLeft(sElem, 4) == "txt_") + { + if(sElem == "txt_max_weight") + { + int nMaxWeight = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, sElem))); + if(nMaxWeight > 1000) nMaxWeight = 1000; + if(nMaxWeight < 1) nMaxWeight = 1; + SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, nMaxWeight); + json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + jLootFilter = JsonArraySet(jLootFilter, 0, JsonInt(nMaxWeight)); + ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); + return; + } + if(GetStringLeft(sElem, 9) == "txt_gold_") + { + int nAmount = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, sElem))); + int nIndex; + if(GetStringLength(sElem) == 11) nIndex = StringToInt(GetStringRight(sElem, 2)); + else nIndex = StringToInt(GetStringRight(sElem, 1)); + SetLocalInt(oAssociate, AI_MIN_GOLD_ + IntToString(nIndex), nAmount); + json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + jLootFilter = JsonArraySet(jLootFilter, nIndex, JsonInt(nAmount)); + ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); + } + } + } + return; + } + //************************************************************************** + // Associate Paste events. + if(sWndId == sAssociateType + AI_COPY_NUI) + { + if(sEvent == "click") + { + int nIndex, nAssociateType = GetAssociateType(oAssociate); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + object oAssoc; + string sAssocType; + json jModes = ai_GetAssociateDbJson(oPC, sAssociateType, "modes"); + json jButtons = ai_GetAssociateDbJson(oPC, sAssociateType, "buttons"); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jLootFilters = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); + string sCombatScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + string sDefaultScript = GetLocalString(oAssociate, AI_DEFAULT_SCRIPT); + if(sElem == "btn_paste_all") + { + // Check all non-henchman associates. + for(nIndex = 2; nIndex < 6; nIndex++) + { + if(nAssociateType != nIndex) + { + oAssoc = GetAssociate(nIndex, oPC); + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); + ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); + ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); + ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); + SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); + SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); + if(oAssoc != OBJECT_INVALID) + { + // Clear the creatures Perception distance so we can + // repopulate the local variables. + SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); + ai_CheckAssociateData(oPC, oAssoc, sAssocType); + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); + } + } + } + } + // Check all of our henchman. + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); + ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); + ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); + ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); + SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); + SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); + // Clear the creatures Perception distance so we can + // repopulate the local variables. + SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); + ai_CheckAssociateData(oPC, oAssoc, sAssocType); + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); + } + } + else break; + } + ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to all associates.", AI_COLOR_GREEN, oPC); + return; + } + else if(GetStringLeft(sElem, 18) == "btn_paste_henchman") + { + int nIndex = StringToInt(GetStringRight(sElem, 1)); + oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssoc != OBJECT_INVALID) + { + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); + ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); + ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); + ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); + SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); + SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); + // Clear the creatures Perception distance so we can + // repopulate the local variables. + SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); + ai_CheckAssociateData(oPC, oAssoc, sAssocType); + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); + } + ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to " + GetName(oAssoc) + ".", AI_COLOR_GREEN, oPC); + } + return; + } + else if(sElem == "btn_paste_familiar") nIndex = ASSOCIATE_TYPE_FAMILIAR; + else if(sElem == "btn_paste_companion") nIndex = ASSOCIATE_TYPE_ANIMALCOMPANION; + else if(sElem == "btn_paste_summons") nIndex = ASSOCIATE_TYPE_SUMMONED; + else if(sElem == "btn_paste_dominated") nIndex = ASSOCIATE_TYPE_DOMINATED; + if(nIndex > 1 && nIndex < 6) + { + oAssoc = GetAssociate(nIndex, oPC); + sAssocType = ai_GetAssociateType(oPC, oAssoc); + ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); + ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); + ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); + ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); + SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); + SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); + if(oAssoc != OBJECT_INVALID) + { + // Clear the creatures Perception distance so we can + // repopulate the local variables. + SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); + ai_CheckAssociateData(oPC, oAssoc, sAssocType); + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) + { + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); + } + ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to " + GetName(oAssoc) + ".", AI_COLOR_GREEN, oPC); + } + } + } + return; + } + //************************************************************************** + // Plugins events. + if(sWndId == AI_PLUGIN_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_load_plugins") + { + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_buffing"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_forcerest"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_henchmen"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_crafting"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_mod_set"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_debug"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_test"); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + } + if(sElem == "btn_load_m_mods") + { + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, "mm_prc_spells"); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + } + if(sElem == "btn_check_plugins") + { + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + if(JsonGetInt(JsonArrayGet(jPlugin, 1)) < 3) + { + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(TRUE)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + if(sElem == "btn_clear_plugins") + { + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + if(JsonGetInt(JsonArrayGet(jPlugin, 1)) < 3) + { + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(FALSE)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + else if(sElem == "btn_add_plugin") + { + string sScript = JsonGetString(NuiGetBind (oPC, nToken, "txt_plugin")); + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + jPlugins = ai_Plugin_Add(oPC, jPlugins, sScript); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + } + else if(GetStringLeft(sElem, 18) == "btn_remove_plugin_") + { + int nIndex = StringToInt(GetStringRight(sElem, 1)); + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + jPlugins = JsonArrayDel(jPlugins, nIndex); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreatePluginNUI(oPC)); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oPC, sElem); + } + else if(sEvent == "watch") + { + if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") + { + int nIndex = StringToInt(GetSubString(sElem, 12, 1)); + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + json jPlugin = JsonArrayGet(jPlugins, nIndex); + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + } + return; + } + //************************************************************************** + // Quick Use Widget events. + if(sWndId == sAssociateType + AI_QUICK_WIDGET_NUI) + { + if(sEvent == "click") + { + if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. + { + string sClassPosition = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); + } + else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. + { + string sLevel; + if(GetStringLength(sElem) == 12) sLevel = GetStringRight(sElem, 2); + else sLevel = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); + } + else if(sElem == "btn_text_spell") // Adds abilities to quick use widget. + { + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + if(JsonGetType(jWidget) == JSON_TYPE_NULL) + { + jWidget = JsonArray(); + if(JsonGetLength(jSpells) == 2) jSpells = JsonArrayInsert(jSpells, JsonArray()); + } + if(JsonGetLength(jWidget) < 20) + { + json jData = NuiGetUserData(oPC, nToken); + json jQuickListArray = JsonArrayGet(jData, 1); + json jSpell = JsonArrayGet(jQuickListArray, nIndex); + jWidget = JsonArrayInsert(jWidget, jSpell); + jSpells = JsonArraySet(jSpells, 2, jWidget); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); + } + else ai_SendMessages("The quick widget can only have 20 abilities or spells!", AI_COLOR_RED, oPC); + } + else if(sElem == "btn_info_spell") + { + json jQuickListArray = JsonArrayGet(jData, 1); + json jSpell = JsonArrayGet(jQuickListArray, nIndex); + ai_CreateDescriptionNUI(oPC, jSpell); + } + else if(GetStringLeft(sElem, 11) == "btn_widget_") + { + string sIndex; + if(GetStringLength(sElem) == 13) sIndex = GetStringRight(sElem, 2); + else sIndex = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + jWidget = JsonArrayDel(jWidget, StringToInt(sIndex)); + jSpells = JsonArraySet(jSpells, 2, jWidget); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); + } + } + else if(sEvent == "close") + { + int nUIToken = NuiFindWindow(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); + if(nUIToken) + { + DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + } + return; + } + //************************************************************************** + // Spell Memorization events. + if(sWndId == sAssociateType + AI_SPELL_MEMORIZE_NUI) + { + if(sEvent == "click") + { + if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. + { + string sClassPosition = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateSpellMemorizationNUI(oPC, oAssociate)); + } + else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. + { + string sLevel = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateSpellMemorizationNUI(oPC, oAssociate)); + } + else if(sElem == "btn_text_spell") // Adds spell to memorization. + { + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); + int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); + json jSpellArray = JsonArrayGet(jData, 1); + int nMaxMemorizationSlot = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevel); + int nSlot, nSpell; + while(nSlot < nMaxMemorizationSlot) + { + if(GetMemorizedSpellId(oAssociate, nClass, nLevel, nSlot) == -1) + { + nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); + SetMemorizedSpell(oAssociate, nClass, nLevel, nSlot, nSpell, FALSE); + //NuiDestroy(oPC, nToken); + //ai_CreateSpellMemorizationNUI(oPC, oAssociate); + string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + string sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + string sIndex = IntToString(nSlot); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + return; + } + nSlot++; + } + if(nSlot >= nMaxMemorizationSlot) ai_SendMessages("All spell memorization slots are full!", AI_COLOR_RED, oPC); + } + else if(sElem == "btn_info_spell") + { + json jSpellArray = JsonArrayGet(jData, 1); + int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); + ai_CreateDescriptionNUI(oPC, JsonArray(), nSpell); + } + else if(GetStringLeft(sElem, 14) == "btn_memorized_") + { + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); + int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); + string sIndex = GetStringRight(sElem, 1); + ClearMemorizedSpell(oAssociate, nClass, nLevel, StringToInt(sIndex)); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString("")); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(FALSE)); + //NuiDestroy(oPC, nToken); + //ai_CreateSpellMemorizationNUI(oPC, oAssociate); + } + } + else if(sEvent == "close") + { + int nUIToken = NuiFindWindow(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); + if(nUIToken) + { + DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + } + return; + } + //************************************************************************** + // Spell Known events. + if(sWndId == sAssociateType + AI_SPELL_KNOWN_NUI) + { + if(sEvent == "click") + { + if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. + { + string sClassPosition = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateSpellKnownNUI(oPC, oAssociate)); + } + else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. + { + string sLevel = GetStringRight(sElem, 1); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateSpellKnownNUI(oPC, oAssociate)); + } + else if(sElem == "btn_text_spell") // Adds spell to known list. + { + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); + int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); + json jSpellArray = JsonArrayGet(jData, 1); + int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); + json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); + // Get the correct class array. + int bAddList, nClassIndex = 0; + json jClass = JsonArrayGet(jClassList, nClassIndex); + while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) + { + jClass = JsonArrayGet(jClassList, ++nClassIndex); + } + string sLevel = IntToString(nLevel); + json jSpell, jKnownList = GffGetList(jClass, "KnownList" + sLevel); + if(JsonGetType(jKnownList) == JSON_TYPE_NULL) + { + bAddList = TRUE; + jKnownList = JsonArray(); + } + int nMaxKnownSlots, nSlot; + string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); + if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + sLevel, GetLevelByClass(nClass, oAssociate) - 1)); + else nMaxKnownSlots = 20; + while(nSlot < nMaxKnownSlots) + { + jSpell = JsonArrayGet(jKnownList, nSlot); + if(JsonGetType(jSpell) == JSON_TYPE_NULL) + { + jSpell = GffAddWord(JsonObject(), "Spell", nSpell); + jSpell = JsonObjectSet(jSpell, "__struct_id", JsonInt(3)); + jKnownList = JsonArrayInsert(jKnownList, jSpell); + string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + string sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + string sIndex = IntToString(nSlot); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + sLevel + ")")); + SetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE", TRUE); + break; + } + else if(JsonGetInt(GffGetWord(jSpell, "Spell")) == nSpell) + { + string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_SendMessages(sName + " is already in the known spell list!", AI_COLOR_RED, oPC); + return; + } + nSlot++; + } + if(nSlot >= nMaxKnownSlots) + { + ai_SendMessages("All known spell slots are full!", AI_COLOR_RED, oPC); + return; + } + if(bAddList) jClass = GffAddList(jClass, "KnownList" + sLevel, jKnownList); + else jClass = GffReplaceList(jClass, "KnownList" + sLevel, jKnownList); + jClassList = JsonArraySet(jClassList, nClassIndex, jClass); + SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); + } + else if(sElem == "btn_info_spell") + { + json jSpellArray = JsonArrayGet(jData, 1); + int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); + ai_CreateDescriptionNUI(oPC, JsonArray(), nSpell); + } + else if(GetStringLeft(sElem, 10) == "btn_known_") // Remove a known spell. + { + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); + int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); + string sIndex = GetStringRight(sElem, 1); + // Check to see if there is a spell in this slot. + string sImageName = JsonGetString(NuiGetBind(oPC, nToken, "btn_known_" + sIndex + "_image")); + if(sImageName == "ctl_cg_btn_splvl") return; + json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); + // Get the correct class array. + int nClassIndex = 0; + json jClass = JsonArrayGet(jClassList, nClassIndex); + while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) + { + jClass = JsonArrayGet(jClassList, ++nClassIndex); + } + string sLevel = IntToString(nLevel); + json jKnownList = GffGetList(jClass, "KnownList" + sLevel); + jKnownList = JsonArrayDel(jKnownList, StringToInt(sIndex)); + jClass = GffReplaceList(jClass, "KnownList" + sLevel, jKnownList); + jClassList = JsonArraySet(jClassList, nClassIndex, jClass); + SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); + SetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE", TRUE); + // Relist all known spells so they match the index. + int nMaxKnownSlots, nSpell; + string sName, sSpellIcon, sClass = IntToString(nClass); + string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); + json jSpell; + if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + IntToString(nLevel), GetLevelByClass(nClass, oAssociate) - 1)); + else nMaxKnownSlots = 20; + nIndex = 0; + while(nIndex < 20) + { + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(TRUE)); + if(nIndex < nMaxKnownSlots) + { + jSpell = JsonArrayGet(jKnownList, nIndex); + if(JsonGetType(jSpell) == JSON_TYPE_NULL) + { + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" Empty known spell slot")); + } + else + { + nSpell = JsonGetInt(GffGetWord(jSpell, "Spell")); + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + //nMetaMagic = 255; + //nDomain = 0; + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, -1, -1, -1, nMetaMagic, nDomain); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + } + } + else + { + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(FALSE)); + } + ++nIndex; + } + } + } + else if(sEvent == "close") + { + if(GetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE")) + { + RemoveHenchman(oPC, oAssociate); + json jHenchman = ObjectToJson(oAssociate, TRUE); + json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); + jHenchman = GffReplaceList(jHenchman, "ClassList", jClassList); + location lLocation = GetLocation(oAssociate); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + AssignCommand(oAssociate, SetIsDestroyable(TRUE, FALSE, FALSE)); + DestroyObject(oAssociate); + oAssociate = ai_AddHenchman(oPC, jHenchman, lLocation, nFamiliar, nCompanion); + DeleteLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE"); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + } + } + return; + } + //************************************************************************** + // Spell Description events. + if(sWndId == AI_SPELL_DESCRIPTION_NUI) + { + if(sEvent == "click" && sElem == "btn_ok") DelayCommand(0.0, NuiDestroy(oPC, nToken)); + } + //************************************************************************** + // Effect Icon NUI events. + if(sWndId == AI_EFFECT_ICON_NUI) + { + if(sEvent == "click") + { + if(GetStringLeft(sElem, 18) == "btn_remove_effect_") + { + int nEffectIndex = StringToInt(GetStringRight(sElem, GetStringLength(sElem) - 18)); + json jEffectID = JsonArrayGet(jData, 2); + string sEffectLinkID = JsonGetString(JsonArrayGet(jEffectID, nEffectIndex)); + int nIndex; + effect eEffect = GetFirstEffect(oPC); + while(GetIsEffectValid(eEffect)) + { + if(GetEffectLinkId(eEffect) == sEffectLinkID) + { + RemoveEffect(oPC, eEffect); + int nEffectIconToken = NuiFindWindow(oPC, AI_EFFECT_ICON_NUI); + if(nEffectIconToken) DelayCommand(0.0, NuiDestroy(oPC, nEffectIconToken)); + } + nIndex++; + eEffect = GetNextEffect(oPC); + } + } + } + else if(sEvent == "mousedown") + { + AssignCommand(oPC, PlaySound("gui_button")); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + } + } +} +void ai_SetWidgetButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + ai_SetWidgetButton(oPC, nButton, oAssociate, sAssociateType, bCheck); +} +void ai_SetAIButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + ai_SetAIButton(oPC, nButton, oAssociate, sAssociateType, bCheck); +} +void ai_SetLootFilterToCheckbox(object oPC, object oAssociate, int nFilterBit, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + ai_SetLootFilter(oAssociate, nFilterBit, bCheck); +} +void ai_AddAssociate(object oPC, int nToken, json jAssociate, location lLocation, int nFamiliar, int nCompanion, int nRange = 0) +{ + object oAssociate = JsonToObject(jAssociate, lLocation, OBJECT_INVALID, TRUE); + //ChangeToStandardFaction(oAssociate, STANDARD_FACTION_COMMONER); + //SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 50, oAssociate); + //SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 50, oAssociate); + //SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 50, oAssociate); + //SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0, oAssociate); + AddHenchman(oPC, oAssociate); + DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + if(nRange) SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, nRange); + if(nFamiliar) SummonFamiliar(oAssociate); + if(nCompanion) SummonAnimalCompanion(oAssociate); +} +void ai_SetCompanionType(object oPC, object oAssociate, int nToken, int nAssociateType) +{ + if(ai_GetIsCharacter(oAssociate)) return; + SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); + int nSelection; + // Need to remove the henchman before we copy them to keep factions correct. + ai_FireHenchman(oPC, oAssociate); + json jAssociate = ObjectToJson(oAssociate, TRUE); + if(nAssociateType == ASSOCIATE_TYPE_FAMILIAR) + { + nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_familiar_selected")); + jAssociate = GffReplaceInt(jAssociate, "FamiliarType", nSelection); + } + else if(nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) + { + nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_companion_selected")); + jAssociate = GffReplaceInt(jAssociate, "CompanionType", nSelection); + } + //ai_Debug("0e_nui", "916", JsonDump(jAssociate, 1)); + location lLocation = GetLocation(oAssociate); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); + DestroyObject(oAssociate); + DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion)); +} +void ai_SetCompanionName(object oPC, object oAssociate, int nToken, int nAssociateType) +{ + if(ai_GetIsCharacter(oAssociate)) return; + SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); + string sAssociateType; + string sName; + // Need to remove the henchman before we copy them to keep factions correct. + ai_FireHenchman(oPC, oAssociate); + json jAssociate = ObjectToJson(oAssociate, TRUE); + if(nAssociateType == ASSOCIATE_TYPE_FAMILIAR) + { + sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_familiar_name")); + jAssociate = GffReplaceString(jAssociate, "FamiliarName", sName); + } + else if(nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) + { + sAssociateType = "txt_companion_name"; + sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_companion_name")); + jAssociate = GffReplaceString(jAssociate, "FamiliarName", sName); + } + location lLocation = GetLocation(oAssociate); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); + DestroyObject(oAssociate); + DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion)); +} +void ai_SetAIScript(object oPC, object oAssociate, int nToken) +{ + int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_ai_script_selected")); + if(nSelection == 0) return; + string sScript = sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, nSelection); + NuiSetBind(oPC, nToken, "txt_ai_script", JsonString(sScript)); + string sOldScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + if(sScript != sOldScript) + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + if(JsonGetType(JsonArrayGet(jAIData, 8)) == JSON_TYPE_NULL) jAIData = JsonArrayInsert(jAIData, JsonString(sScript)); + else jAIData = JsonArraySet(jAIData, 8, JsonString(sScript)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + ai_SendMessages(GetName(oAssociate) + " is now using " + sScript + " AI script!", AI_COLOR_GREEN, oPC); + } + else ai_SendMessages(GetName(oAssociate) + " is already using this script! Did not change AI script.", AI_COLOR_RED, oPC); +} +void ai_PercRangeIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType, int nToken) +{ + int nAdjustment = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); + nAdjustment += nIncrement; + if(nAdjustment < 8 || nAdjustment > 11) return; + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU", nAdjustment); + json jAssociate = ObjectToJson(oAssociate, TRUE); + int nHenchPercRange = JsonGetInt(GffGetByte(jAssociate, "PerceptionRange")); + string sText, sInfo; + if(nAdjustment == nHenchPercRange) + { + if(nAdjustment == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; + else if(nAdjustment == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; + else if(nAdjustment == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; + else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; + sInfo = " "; + } + else + { + if(nAdjustment == 8) sText = " !!! Click the Perception Range button to set to short range !!!"; + else if(nAdjustment == 9) sText = " !!! Click the Perception Range button to set to medium range !!!"; + else if(nAdjustment == 10) sText = " !!! Click the Perception Range button to set to long range !!!"; + else sText = " !!! Click the Perception Range button to set to the default range !!!"; + sInfo = sText; + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_perc_range_tooltip", sText); + if(nToken > -1) NuiSetBind (oPC, nToken, "lbl_info_label", JsonString(sInfo)); +} +void ai_Perc_Range(object oPC, object oAssociate, int nToken, string sAssociateType) +{ + if(ai_GetIsCharacter(oAssociate)) return; + SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); + int nBtnPercRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); + string sText, sText2; + float fRange = 20.0; + if(nBtnPercRange == 8) + { + sText = "short"; + sText2 = " Perception Range Short [10 meters Sight / 10 meters Listen]"; + fRange = 10.0; + } + else if(nBtnPercRange == 9) + { + sText = "medium"; + sText2 = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; + } + else if(nBtnPercRange == 10) + { + sText = "long"; + sText2 = " Perception Range Long [35 meters Sight / 20 meters Listen]"; + fRange = 35.0; + } + else if(nBtnPercRange == 11) + { + sText = "default"; + sText2 = " Perception Range Default [20 meters Sight / 20 meters Listen]"; + } + SetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE, fRange); + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, nBtnPercRange); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 7, JsonInt(nBtnPercRange)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + // Need to remove the henchman before we copy them to keep factions correct. + ai_FireHenchman(oPC, oAssociate); + json jAssociate = ObjectToJson(oAssociate, TRUE); + int nHenchPercRange = JsonGetInt(GffGetByte(jAssociate, "PerceptionRange")); + if(nBtnPercRange == nHenchPercRange) + { + ai_SendMessages(GetName(oAssociate) + " already has this perception set.", AI_COLOR_YELLOW, oPC); + AddHenchman(oPC, oAssociate); + DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); + return; + } + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_NUI))); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_perc_range_tooltip", sText2); + ai_SendMessages(GetName(oAssociate) + " has updated their perception range to " + sText + ".", AI_COLOR_YELLOW, oPC); + location lLocation = GetLocation(oAssociate); + jAssociate = GffReplaceByte(jAssociate, "PerceptionRange", nBtnPercRange); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); + DestroyObject(oAssociate); + DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion, nBtnPercRange)); +} +void ai_RulePercDistInc(object oPC, object oModule, int nIncrement, int nToken) +{ + int nAdjustment = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE) + nIncrement; + if(nAdjustment < 8 || nAdjustment > 11) return; + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, nAdjustment); + string sText; + if(nAdjustment == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; + else if(nAdjustment == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; + else if(nAdjustment == 10) sText = " Monster perception: Long [35 Sight / 20 Listen]"; + else sText = " Monster perception: Default [Monster's default values]"; + NuiSetBind(oPC, nToken, "lbl_perc_dist_label", JsonString(sText)); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_MON_PERC_DISTANCE, JsonInt(nAdjustment)); + ai_SetCampaignDbJson("rules", jRules); +} +json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE) +{ + object oModule = GetModule(); + json jRSpells = GetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS); + if(JsonGetType(jRSpells) == JSON_TYPE_NULL) jRSpells = JsonArray(); + int nIndex, nMaxIndex = JsonGetLength(jRSpells); + if(bRestrict) + { + while(nIndex < nMaxIndex) + { + if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) return jRules; + nIndex++; + } + jRSpells = JsonArrayInsert(jRSpells, JsonInt(nSpell)); + } + else + { + while(nIndex < nMaxIndex) + { + if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) + { + jRSpells = JsonArrayDel(jRSpells, nIndex); + break; + } + nIndex++; + } + } + SetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS, jRSpells); + return JsonObjectSet(jRules, AI_RULE_RESTRICTED_SPELLS, jRSpells); +} +void ai_TurnOn(object oPC, object oTarget, string sAssociateType) +{ + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ai_tooltip", " AI On"); + ai_SendMessages("AI turned on for " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "xx_pc_1_hb"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_NOTICE, "xx_pc_2_percept"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "xx_pc_3_endround"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "xx_pc_4_convers"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "xx_pc_5_phyatked"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "xx_pc_6_damaged"); + //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DEATH, ""); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "xx_pc_8_disturb"); + //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_RESTED, ""); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "xx_pc_b_castat"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "xx_pc_e_blocked"); + //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); + // This sets the script for the PC to run AI based on class. + ai_SetAssociateAIScript(oTarget, FALSE); + // Set so PC can hear associates talking in combat. + ai_SetListeningPatterns(oTarget); +} +void ai_TurnOff(object oPC, object oAssociate, string sAssociateType) +{ + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ai_tooltip", " AI Off"); + ai_SendMessages("AI Turned off for " + GetName(oAssociate) + ".", AI_COLOR_YELLOW, oPC); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_NOTICE, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DAMAGED, ""); + //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DEATH, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DISTURBED, ""); + //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_RESTED, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, ""); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, ""); + //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); + DeleteLocalInt(oAssociate, "AI_I_AM_BEING_HEALED"); + DeleteLocalString(oAssociate, "AIScript"); + ai_ClearCreatureActions(); +} +object ai_AddHenchman(object oPC, json jHenchman, location lLocation, int nFamiliar, int nCompanion) +{ + jHenchman = GffReplaceResRef(jHenchman, "ScriptSpawn", ""); + object oHenchman = JsonToObject(jHenchman, lLocation, OBJECT_INVALID, TRUE); + AddHenchman(oPC, oHenchman); + DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); + string sAssociateType = ai_GetAssociateType(oPC, oHenchman); + NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI)); + if(nFamiliar) SummonFamiliar(oHenchman); + if(nCompanion) SummonAnimalCompanion(oHenchman); + return oHenchman; +} + diff --git a/_module/nss/0e_nui_dm.nss b/_module/nss/0e_nui_dm.nss new file mode 100644 index 00000000..4ffd8515 --- /dev/null +++ b/_module/nss/0e_nui_dm.nss @@ -0,0 +1,700 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: 0e_nui_dm + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Menu event script + sEvent: close, click, mousedown, mouseup, watch (if bindwatch is set). +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_menus_dm" +void ai_SetDMWidgetButtonToCheckbox(object oDM, int nButton, int nToken, string sElem); +void ai_SetDMWAccessButtonToCheckbox(object oDM, int nButton, int nToken, string sElem); +void ai_SetDMAIAccessButtonToCheckbox(object oDM, int nButton, int nToken, string sElem); +void ai_SetDMAIAccessButtonToCheckbox(object oDM, int nButton, int nToken, string sElem); +void ai_RulePercDistInc(object oDM, object oModule, int nIncrement, int nToken); +// Adds a spell to a json AI restricted spell list then returns jRules. +// bRestrict = TRUE will add to the list FALSE will remove it from the list. +json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE); +// Adds a selected creature to the group. +void ai_SelectToGroup(object oDM, string sElem); +// Does a selected action for nGroup. +void ai_DMSelectAction(object oDM, string sElem); +// Changes if the group will run (nSpeed: 1) or walk (nSpeed: 0). +void ai_DMChangeMoveSpeed(object oDM, string sElem, int nSpeed); +void main() +{ + object oDM = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + string sWndId = NuiGetWindowId(oDM, nToken); + //if(AI_DEBUG) ai_Debug ("0e_nui", "58", "sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem + + // " nToken: " + IntToString(nToken) + " oPC: " + GetName(oPC)); + //WriteTimestampedLogEntry("0e_nui, 58, sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem + + // " nToken: " + IntToString(nToken) + " oDM: " + GetName(oDM)); + //************************************************************************** + string sName = ai_RemoveIllegalCharacters(GetName(oDM)); + // Watch to see if the window moves and save. + if(sElem == "window_geometry" && sEvent == "watch") + { + if(GetLocalInt(oDM, AI_NO_NUI_SAVE)) return; + SaveMenuToCampaignDb(oDM, nToken, sWndId); + } + //************************************************************************** + // Widget events. + if(sWndId == "dm" + AI_WIDGET_NUI) + { + //if(GetLocalInt(oDM, AI_NO_NUI_SAVE)) return; + if(sEvent == "click") + { + if(sElem == "btn_open_main") + { + if(IsWindowClosed(oDM, "dm" + AI_COMMAND_NUI)) ai_CreateDMCommandNUI(oDM); + IsWindowClosed(oDM, "dm" + AI_MAIN_NUI); + } + else if(sElem == "btn_camera") ai_SelectCameraView(oDM); + else if(sElem == "btn_inventory") ai_SelectOpenInventory(oDM); + else if(GetStringLeft(sElem, 13) == "btn_cmd_group") + { + ai_DMSelectAction(oDM, sElem); + } + else if(GetStringLeft(sElem, 15) == "btn_exe_plugin_") ai_Plugin_Execute(oDM, sElem, TRUE); + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + if(GetStringLeft(sElem, 13) == "btn_cmd_group") ai_DMChangeMoveSpeed(oDM, sElem, 1); + } + if(nMouseScroll == -1.0) // Scroll down + { + if(GetStringLeft(sElem, 13) == "btn_cmd_group") ai_DMChangeMoveSpeed(oDM, sElem, 0); + } + } + else if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + if(sElem == "btn_open_main") + { + if(IsWindowClosed(oDM, "dm" + AI_MAIN_NUI)) ai_CreateDMOptionsNUI(oDM); + } + else if(GetStringLeft(sElem, 13) == "btn_cmd_group") + { + ai_SelectToGroup(oDM, sElem); + } + } + } + } + else if(sWndId == "dm" + AI_COMMAND_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_widget_lock") + { + if(ai_GetDMWidgetButton(oDM, BTN_DM_WIDGET_LOCK)) + { + ai_SendMessages(GetName(oDM) + " AI widget unlocked.", AI_COLOR_YELLOW, oDM); + ai_SetDMWidgetButton(oDM, BTN_DM_WIDGET_LOCK, FALSE); + } + else + { + ai_SendMessages(GetName(oDM) + " AI widget locked.", AI_COLOR_YELLOW, oDM); + ai_SetDMWidgetButton(oDM, BTN_DM_WIDGET_LOCK, TRUE); + } + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + else if(sElem == "btn_main_menu") + { + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMOptionsNUI(oDM)); + } + else if(sElem == "btn_camera") ai_SelectCameraView(oDM); + else if(sElem == "btn_inventory") ai_SelectOpenInventory(oDM); + else if(GetStringLeft(sElem, 13) == "btn_cmd_group") ai_DMSelectAction(oDM, sElem); + else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oDM, sElem, 1); + } + else if(sEvent == "watch") + { + if(sElem == "chbx_cmd_group1_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP1, nToken, sElem); + else if(sElem == "chbx_cmd_group2_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP2, nToken, sElem); + else if(sElem == "chbx_cmd_group3_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP3, nToken, sElem); + else if(sElem == "chbx_cmd_group4_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP4, nToken, sElem); + else if(sElem == "chbx_cmd_group5_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP5, nToken, sElem); + else if(sElem == "chbx_cmd_group6_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_GROUP6, nToken, sElem); + else if(sElem == "chbx_camera_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_CAMERA, nToken, sElem); + else if(sElem == "chbx_inventory_check") ai_SetDMWidgetButtonToCheckbox(oDM, BTN_DM_CMD_INVENTORY, nToken, sElem); + if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") + { + int nIndex = StringToInt(GetSubString(sElem, 12, 1)); + json jPlugins = ai_GetCampaignDbJson("plugins", sName, AI_DM_TABLE); + json jPlugin = JsonArrayGet(jPlugins, nIndex); + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + ai_SetCampaignDbJson("plugins", jPlugins, sName, AI_DM_TABLE); + } + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + if(GetStringLeft(sElem, 13) == "btn_cmd_group") ai_DMChangeMoveSpeed(oDM, sElem, 1); + } + if(nMouseScroll == -1.0) // Scroll down + { + if(GetStringLeft(sElem, 13) == "btn_cmd_group") ai_DMChangeMoveSpeed(oDM, sElem, 0); + } + } + else if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + if(GetStringLeft(sElem, 13) == "btn_cmd_group") + { + ai_SelectToGroup(oDM, sElem); + } + } + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + } + else if(nMouseScroll == -1.0) // Scroll down + { + } + } + } + //************************************************************************** + // Main AI events. + if(sWndId == "dm" + AI_MAIN_NUI) + { + if(sEvent == "click") + { + if(sElem == "btn_plugin_manager") + { + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + } + if(sElem == "btn_widget_manager") + { + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMWidgetManagerNUI(oDM)); + } + } + if(sEvent == "watch") + { + if(sElem == "txt_max_henchman") + { + int nMaxHenchmen = StringToInt(JsonGetString(NuiGetBind(oDM, nToken, sElem))); + if(nMaxHenchmen < 1) nMaxHenchmen = 1; + if(nMaxHenchmen > 12) + { + nMaxHenchmen = 12; + ai_SendMessages("The maximum henchmen for this mod is 12!", AI_COLOR_RED, oDM); + } + SetMaxHenchmen(nMaxHenchmen); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_MAX_HENCHMAN, JsonInt(nMaxHenchmen)); + ai_SetCampaignDbJson("rules", jRules); + ai_SendMessages("Maximum henchmen has been changed to " + IntToString(nMaxHenchmen), AI_COLOR_YELLOW, oDM); + } + else if(sElem == "txt_ai_difficulty") + { + int nChance = StringToInt(JsonGetString(NuiGetBind(oDM, nToken, sElem))); + if(nChance < 0) nChance = 0; + else if(nChance > 100) nChance = 100; + SetLocalInt(GetModule(), AI_RULE_AI_DIFFICULTY, nChance); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_AI_DIFFICULTY, JsonInt(nChance)); + ai_SetCampaignDbJson("rules", jRules); + } + else if(sElem == "txt_perception_distance") + { + float fDistance = StringToFloat(JsonGetString(NuiGetBind(oDM, nToken, sElem))); + if(fDistance < 10.0) fDistance = 10.0; + else if(fDistance > 60.0) fDistance = 60.0; + SetLocalFloat(GetModule(), AI_RULE_PERCEPTION_DISTANCE, fDistance); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_PERCEPTION_DISTANCE, JsonFloat(fDistance)); + ai_SetCampaignDbJson("rules", jRules); + } + else if(sElem == "txt_inc_hp") + { + int nNumber = StringToInt(JsonGetString(NuiGetBind(oDM, nToken, sElem))); + if(nNumber < 0) nNumber = 0; + else if(nNumber > 100) nNumber = 100; + SetLocalInt(GetModule(), AI_INCREASE_MONSTERS_HP, nNumber); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_INCREASE_MONSTERS_HP, JsonInt(nNumber)); + ai_SetCampaignDbJson("rules", jRules); + } + else if(GetStringLeft(sElem, 4) == "chbx") + { + object oModule = GetModule(); + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + json jRules = ai_GetCampaignDbJson("rules"); + if(sElem == "chbx_moral_check") + { + SetLocalInt(oModule, AI_RULE_MORAL_CHECKS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_MORAL_CHECKS, JsonInt(bCheck)); + } + else if(sElem == "chbx_buff_monsters_check") + { + SetLocalInt(oModule, AI_RULE_BUFF_MONSTERS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_BUFF_MONSTERS, JsonInt(bCheck)); + } + else if(sElem == "chbx_buff_summons_check") + { + SetLocalInt(oModule, AI_RULE_PRESUMMON, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PRESUMMON, JsonInt(bCheck)); + } + else if(sElem == "chbx_ambush_monsters_check") + { + SetLocalInt(oModule, AI_RULE_AMBUSH, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_AMBUSH, JsonInt(bCheck)); + } + else if(sElem == "chbx_companions_check") + { + SetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_SUMMON_COMPANIONS, JsonInt(bCheck)); + } + else if(sElem == "chbx_advanced_movement_check") + { + SetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ADVANCED_MOVEMENT, JsonInt(bCheck)); + } + else if(sElem == "chbx_ilr_check") + { + SetLocalInt(oModule, AI_RULE_ILR, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ILR, JsonInt(bCheck)); + } + else if(sElem == "chbx_umd_check") + { + SetLocalInt(oModule, AI_RULE_ALLOW_UMD, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_ALLOW_UMD, JsonInt(bCheck)); + } + else if(sElem == "chbx_use_healingkits_check") + { + SetLocalInt(oModule, AI_RULE_HEALERSKITS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_HEALERSKITS, JsonInt(bCheck)); + } + else if(sElem == "chbx_perm_assoc_check") + { + SetLocalInt(oModule, AI_RULE_PERM_ASSOC, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PERM_ASSOC, JsonInt(bCheck)); + } + else if(sElem == "chbx_corpses_stay_check") + { + SetLocalInt(oModule, AI_RULE_CORPSES_STAY, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_CORPSES_STAY, JsonInt(bCheck)); + } + else if(sElem == "chbx_wander_check") + { + SetLocalInt(oModule, AI_RULE_WANDER, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_CORPSES_STAY, JsonInt(bCheck)); + } + else if(sElem == "chbx_open_doors_check") + { + SetLocalInt(oModule, AI_RULE_OPEN_DOORS, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_OPEN_DOORS, JsonInt(bCheck)); + } + else if(sElem == "chbx_party_scale_check") + { + if(bCheck) + { + SetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP, GetModuleXPScale()); + ai_CheckXPPartyScale(oDM); + } + else + { + SetModuleXPScale(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); + } + SetLocalInt(oModule, AI_RULE_PARTY_SCALE, bCheck); + jRules = JsonObjectSet(jRules, AI_RULE_PARTY_SCALE, JsonInt(bCheck)); + string sText = IntToString(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); + NuiSetBind(oDM, nToken, "chbx_party_scale_tooltip", JsonString(" PEPS adjusts your XP based on party size from (" + sText + ").")); + sText = IntToString(GetModuleXPScale()); + NuiSetBind(oDM, nToken, "txt_xp_scale", JsonString(sText)); + } + else if(sElem == "chbx_darkness_check") + { + if(bCheck) + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS); + jRules = ai_AddRestrictedSpell(jRules, 159); + jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS); + jRules = ai_AddRestrictedSpell(jRules, 688); // WildShape_Darkness + } + else + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS, FALSE); + jRules = ai_AddRestrictedSpell(jRules, 159, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS, FALSE); + jRules = ai_AddRestrictedSpell(jRules, 688, FALSE); // WildShape_Darkness + } + } + else if(sElem == "chbx_dispels_check") + { + if(bCheck) + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL); + jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC); + jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING); + jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION); + } + else + { + jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING, FALSE); + jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION, FALSE); + } + } + else if(sElem == "chbx_timestop_check") + { + if(bCheck) jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP); + else jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP, FALSE); + } + ai_SetCampaignDbJson("rules", jRules); + } + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + if(nMouseScroll == 1.0) // Scroll up + { + // Follow range is only changed on non-pc's + if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oDM, GetModule(), 1, nToken); + } + else if(nMouseScroll == -1.0) // Scroll down + { + // Follow range is only changed on non-pc's + if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oDM, GetModule(), -1, nToken); + } + } + } + //************************************************************************** + // Plugins events. + if(sWndId == "dmai_plugin_nui") + { + string sName = ai_RemoveIllegalCharacters(GetName(oDM)); + json jPlugins = ai_GetCampaignDbJson("plugins"); + if(sEvent == "click") + { + if(sElem == "btn_load_plugins") + { + string sScript = JsonGetString(NuiGetBind (oDM, nToken, "txt_plugin")); + if(JsonGetType(JsonArrayGet(jPlugins, 0)) == JSON_TYPE_NULL) jPlugins = JsonArray(); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_buffing"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_forcerest"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_henchmen"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_crafting"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_mod_set"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_debug"); + jPlugins = ai_Plugin_Add(oDM, jPlugins, "pi_test"); + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + if(sElem == "btn_check_plugins") + { + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(TRUE)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + if(sElem == "btn_clear_plugins") + { + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(FALSE)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + else if(sElem == "btn_add_plugin") + { + string sScript = JsonGetString(NuiGetBind (oDM, nToken, "txt_plugin")); + if(JsonGetType(JsonArrayGet(jPlugins, 0)) == JSON_TYPE_NULL) jPlugins = JsonArray(); + jPlugins = ai_Plugin_Add(oDM, jPlugins, sScript); + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + } + else if(GetStringLeft(sElem, 18) == "btn_remove_plugin_") + { + int nIndex = StringToInt(GetStringRight(sElem, 1)); + jPlugins = JsonArrayDel(jPlugins, nIndex); + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMPluginManagerNUI(oDM)); + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oDM, sElem, 2); + } + else if(sEvent == "watch") + { + if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") + { + int nIndex = StringToInt(GetSubString(sElem, 12, 1)); + json jPlugin = JsonArrayGet(jPlugins, nIndex); + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); + jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); + ai_SetCampaignDbJson("plugins", jPlugins); + DelayCommand(0.0, NuiDestroy(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI))); + DelayCommand(0.1, ai_CreateDMWidgetNUI(oDM)); + } + } + } + if(sWndId == "dm_widget_manager_nui") + { + //SendMessageToDM(oDM, "sEvent: " + sEvent + " sElem: " + sElem); + if(sEvent == "click") + { + if(sElem == "btn_clear_buttons") + { + object oModule = GetModule(); + SetLocalInt(oModule, sDMWidgetAccessVarname, 0); + SetLocalInt(oModule, sDMAIAccessVarname, 0); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, sDMWidgetAccessVarname, JsonInt(0)); + jRules = JsonObjectSet(jRules, sDMAIAccessVarname, JsonInt(0)); + ai_SetCampaignDbJson("rules", jRules); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMWidgetManagerNUI(oDM)); + return; + } + else if(sElem == "btn_check_buttons") + { + object oModule = GetModule(); + SetLocalInt(oModule, sDMWidgetAccessVarname, 7340028); + SetLocalInt(oModule, sDMAIAccessVarname, 203423743); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, sDMWidgetAccessVarname, JsonInt(7340028)); + jRules = JsonObjectSet(jRules, sDMAIAccessVarname, JsonInt(203423743)); + ai_SetCampaignDbJson("rules", jRules); + DelayCommand(0.0, NuiDestroy(oDM, nToken)); + DelayCommand(0.1, ai_CreateDMWidgetManagerNUI(oDM)); + return; + } + SetLocalInt(oDM, "CHBX_SKIP", TRUE); + DelayCommand(2.0, DeleteLocalInt(oDM, "CHBX_SKIP")); + if(sElem == "btn_cmd_action") NuiSetBind(oDM, nToken, "chbx_cmd_action_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_ACTION))); + else if(sElem == "btn_cmd_guard") NuiSetBind(oDM, nToken, "chbx_cmd_guard_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_GUARD))); + else if(sElem == "btn_cmd_hold") NuiSetBind(oDM, nToken, "chbx_cmd_hold_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_HOLD))); + else if(sElem == "btn_cmd_attack") NuiSetBind(oDM, nToken, "chbx_cmd_attack_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_ATTACK))); + else if(sElem == "btn_cmd_follow") NuiSetBind(oDM, nToken, "chbx_cmd_follow_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_FOLLOW))); + else if(sElem == "btn_follow_target") NuiSetBind(oDM, nToken, "chbx_follow_target_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_FOLLOW_TARGET))); + else if(sElem == "btn_cmd_search") NuiSetBind(oDM, nToken, "chbx_cmd_search_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_SEARCH))); + else if(sElem == "btn_cmd_stealth") NuiSetBind(oDM, nToken, "chbx_cmd_stealth_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_STEALTH))); + else if(sElem == "btn_cmd_ai_script") NuiSetBind(oDM, nToken, "chbx_cmd_ai_script_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT))); + else if(sElem == "btn_cmd_place_trap") NuiSetBind(oDM, nToken, "chbx_cmd_place_trap_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_PLACE_TRAP))); + else if(sElem == "btn_quick_widget") NuiSetBind(oDM, nToken, "chbx_quick_widget_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_SPELL_WIDGET))); + else if(sElem == "btn_spell_memorize") NuiSetBind(oDM, nToken, "chbx_spell_memorize_check", JsonBool(!ai_GetDMWAccessButton(BTN_DM_CMD_MEMORIZE))); + else if(sElem == "btn_buff_short") NuiSetBind(oDM, nToken, "chbx_buff_short_check", JsonBool(!ai_GetDMWAccessButton(BTN_BUFF_SHORT))); + else if(sElem == "btn_buff_long") NuiSetBind(oDM, nToken, "chbx_buff_long_check", JsonBool(!ai_GetDMWAccessButton(BTN_BUFF_LONG))); + else if(sElem == "btn_buff_all") NuiSetBind(oDM, nToken, "chbx_buff_all_check", JsonBool(!ai_GetDMWAccessButton(BTN_BUFF_ALL))); + else if(sElem == "btn_buff_rest") NuiSetBind(oDM, nToken, "chbx_buff_rest_check", JsonBool(!ai_GetDMWAccessButton(BTN_BUFF_REST))); + else if(sElem == "btn_jump_to") NuiSetBind(oDM, nToken, "chbx_jump_to_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_JUMP_TO))); + else if(sElem == "btn_ghost_mode") NuiSetBind(oDM, nToken, "chbx_ghost_mode_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_GHOST_MODE))); + else if(sElem == "btn_camera") NuiSetBind(oDM, nToken, "chbx_camera_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_CAMERA))); + else if(sElem == "btn_inventory") NuiSetBind(oDM, nToken, "chbx_inventory_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_INVENTORY))); + else if(sElem == "btn_familiar") NuiSetBind(oDM, nToken, "chbx_familiar_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_FAMILIAR))); + else if(sElem == "btn_companion") NuiSetBind(oDM, nToken, "chbx_companion_check", JsonBool(!ai_GetDMWAccessButton(BTN_CMD_COMPANION))); + else if(sElem == "btn_ai") NuiSetBind(oDM, nToken, "chbx_ai_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_FOR_PC))); + else if(sElem == "btn_quiet") NuiSetBind(oDM, nToken, "chbx_quiet_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_REDUCE_SPEECH))); + else if(sElem == "btn_ranged") NuiSetBind(oDM, nToken, "chbx_ranged_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_USE_RANGED))); + else if(sElem == "btn_search") NuiSetBind(oDM, nToken, "chbx_search_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_USE_SEARCH))); + else if(sElem == "btn_stealth") NuiSetBind(oDM, nToken, "chbx_stealth_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_USE_STEALTH))); + else if(sElem == "btn_open_door") NuiSetBind(oDM, nToken, "chbx_open_door_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_OPEN_DOORS))); + else if(sElem == "btn_traps") NuiSetBind(oDM, nToken, "chbx_traps_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_REMOVE_TRAPS))); + else if(sElem == "btn_pick_locks") NuiSetBind(oDM, nToken, "chbx_pick_locks_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_PICK_LOCKS))); + else if(sElem == "btn_bash_locks") NuiSetBind(oDM, nToken, "chbx_bash_locks_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_BASH_LOCKS))); + else if(sElem == "btn_magic_level") NuiSetBind(oDM, nToken, "chbx_magic_level_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_MAGIC_LEVEL))); + else if(sElem == "btn_spontaneous") NuiSetBind(oDM, nToken, "chbx_spontaneous_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_NO_SPONTANEOUS))); + else if(sElem == "btn_magic") NuiSetBind(oDM, nToken, "chbx_magic_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_USE))); + else if(sElem == "btn_magic_items") NuiSetBind(oDM, nToken, "chbx_magic_items_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_ITEM_USE))); + else if(sElem == "btn_def_magic") NuiSetBind(oDM, nToken, "chbx_def_magic_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_DEF_MAGIC_USE))); + else if(sElem == "btn_off_magic") NuiSetBind(oDM, nToken, "chbx_off_magic_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_OFF_MAGIC_USE))); + else if(sElem == "btn_heal_out") NuiSetBind(oDM, nToken, "chbx_heal_out_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_HEAL_OUT))); + else if(sElem == "btn_heal_in") NuiSetBind(oDM, nToken, "chbx_heal_in_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_HEAL_IN))); + else if(sElem == "btn_heals_onoff") NuiSetBind(oDM, nToken, "chbx_heals_onoff_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_STOP_SELF_HEALING))); + else if(sElem == "btn_healp_onoff") NuiSetBind(oDM, nToken, "chbx_healp_onoff_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_STOP_PARTY_HEALING))); + else if(sElem == "btn_loot") NuiSetBind(oDM, nToken, "chbx_loot_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_LOOT))); + else if(sElem == "btn_ignore_assoc") NuiSetBind(oDM, nToken, "chbx_ignore_assoc_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_IGNORE_ASSOCIATES))); + else if(sElem == "btn_ignore_traps") NuiSetBind(oDM, nToken, "chbx_ignore_traps_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_IGNORE_TRAPS))); + else if(sElem == "btn_perc_range") NuiSetBind(oDM, nToken, "chbx_perc_range_check", JsonBool(!ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE))); + } + if(sEvent == "watch") + { + if(GetLocalInt(oDM, "CHBX_SKIP")) return; + if(sElem == "chbx_cmd_action_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_ACTION, nToken, sElem); + else if(sElem == "chbx_cmd_guard_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_GUARD, nToken, sElem); + else if(sElem == "chbx_cmd_hold_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_HOLD, nToken, sElem); + else if(sElem == "chbx_cmd_attack_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_ATTACK, nToken, sElem); + else if(sElem == "chbx_cmd_follow_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_FOLLOW, nToken, sElem); + else if(sElem == "chbx_follow_target_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_FOLLOW_TARGET, nToken, sElem); + else if(sElem == "chbx_cmd_search_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_SEARCH, nToken, sElem); + else if(sElem == "chbx_cmd_stealth_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_STEALTH, nToken, sElem); + else if(sElem == "chbx_cmd_ai_script_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_AI_SCRIPT, nToken, sElem); + else if(sElem == "chbx_cmd_place_trap_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_PLACE_TRAP, nToken, sElem); + else if(sElem == "chbx_quick_widget_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_SPELL_WIDGET, nToken, sElem); + else if(sElem == "chbx_spell_memorize_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_DM_CMD_MEMORIZE, nToken, sElem); + else if(sElem == "chbx_buff_short_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_BUFF_SHORT, nToken, sElem); + else if(sElem == "chbx_buff_long_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_BUFF_LONG, nToken, sElem); + else if(sElem == "chbx_buff_all_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_BUFF_ALL, nToken, sElem); + else if(sElem == "chbx_buff_rest_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_BUFF_REST, nToken, sElem); + else if(sElem == "chbx_jump_to_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_JUMP_TO, nToken, sElem); + else if(sElem == "chbx_ghost_mode_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_GHOST_MODE, nToken, sElem); + else if(sElem == "chbx_camera_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_CAMERA, nToken, sElem); + else if(sElem == "chbx_inventory_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_INVENTORY, nToken, sElem); + else if(sElem == "chbx_familiar_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_FAMILIAR, nToken, sElem); + else if(sElem == "chbx_companion_check") ai_SetDMWAccessButtonToCheckbox(oDM, BTN_CMD_COMPANION, nToken, sElem); + else if(sElem == "chbx_ai_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_FOR_PC, nToken, sElem); + else if(sElem == "chbx_quiet_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_REDUCE_SPEECH, nToken, sElem); + else if(sElem == "chbx_ranged_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_USE_RANGED, nToken, sElem); + else if(sElem == "chbx_search_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_USE_SEARCH, nToken, sElem); + else if(sElem == "chbx_stealth_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_USE_STEALTH, nToken, sElem); + else if(sElem == "chbx_open_door_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_OPEN_DOORS, nToken, sElem); + else if(sElem == "chbx_traps_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_REMOVE_TRAPS, nToken, sElem); + else if(sElem == "chbx_pick_locks_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_PICK_LOCKS, nToken, sElem); + else if(sElem == "chbx_bash_locks_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_BASH_LOCKS, nToken, sElem); + else if(sElem == "chbx_magic_level_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_MAGIC_LEVEL, nToken, sElem); + else if(sElem == "chbx_spontaneous_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_NO_SPONTANEOUS, nToken, sElem); + else if(sElem == "chbx_magic_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_NO_MAGIC_USE, nToken, sElem); + else if(sElem == "chbx_magic_items_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_NO_MAGIC_ITEM_USE, nToken, sElem); + else if(sElem == "chbx_def_magic_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_DEF_MAGIC_USE, nToken, sElem); + else if(sElem == "chbx_off_magic_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_OFF_MAGIC_USE, nToken, sElem); + else if(sElem == "chbx_heal_out_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_HEAL_OUT, nToken, sElem); + else if(sElem == "chbx_heal_in_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_HEAL_IN, nToken, sElem); + else if(sElem == "chbx_heals_onoff_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_STOP_SELF_HEALING, nToken, sElem); + else if(sElem == "chbx_healp_onoff_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_STOP_PARTY_HEALING, nToken, sElem); + else if(sElem == "chbx_loot_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_LOOT, nToken, sElem); + else if(sElem == "chbx_ignore_assoc_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_IGNORE_ASSOCIATES, nToken, sElem); + else if(sElem == "chbx_ignore_traps_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_IGNORE_TRAPS, nToken, sElem); + else if(sElem == "chbx_perc_range_check") ai_SetDMAIAccessButtonToCheckbox(oDM, BTN_AI_PERC_RANGE, nToken, sElem); + } + } +} +void ai_SetDMWidgetButtonToCheckbox(object oDM, int nButton, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + ai_SetDMWidgetButton(oDM, nButton, bCheck); +} +void ai_SetDMWAccessButtonToCheckbox(object oDM, int nButton, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + ai_SetDMWAccessButton(nButton, bCheck); +} +void ai_SetDMAIAccessButtonToCheckbox(object oDM, int nButton, int nToken, string sElem) +{ + int bCheck = JsonGetInt(NuiGetBind(oDM, nToken, sElem)); + ai_SetDMAIAccessButton(nButton, bCheck); +} +void ai_RulePercDistInc(object oDM, object oModule, int nIncrement, int nToken) +{ + int nAdjustment = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE) + nIncrement; + if(nAdjustment < 8 || nAdjustment > 11) return; + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, nAdjustment); + string sText; + if(nAdjustment == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; + else if(nAdjustment == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; + else if(nAdjustment == 10) sText = " Monster perception: Long [35 Sight / 20 Listen]"; + else sText = " Monster perception: Default [Monster's default values]"; + NuiSetBind(oDM, nToken, "lbl_perc_dist_label", JsonString(sText)); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_MON_PERC_DISTANCE, JsonInt(nAdjustment)); + ai_SetCampaignDbJson("rules", jRules); +} +json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE) +{ + object oModule = GetModule(); + json jRSpells = GetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS); + int nIndex, nMaxIndex = JsonGetLength(jRSpells); + if(bRestrict) + { + while(nIndex < nMaxIndex) + { + if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) return jRules; + nIndex++; + } + jRSpells = JsonArrayInsert(jRSpells, JsonInt(nSpell)); + } + else + { + while(nIndex < nMaxIndex) + { + if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) + { + jRSpells = JsonArrayDel(jRSpells, nIndex); + break; + } + nIndex++; + } + } + SetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS, jRSpells); + return JsonObjectSet(jRules, AI_RULE_RESTRICTED_SPELLS, jRSpells); +} +void ai_SelectToGroup(object oDM, string sElem) +{ + string sGroup = GetStringRight(sElem, 1); + SetLocalString(oDM, AI_TARGET_MODE, "DM_SELECT_GROUP" + sGroup); + ai_SendMessages("Select a creature to add to group " + sGroup + ". Selecting yourself will clear group1.", AI_COLOR_YELLOW, oDM); + EnterTargetingMode(oDM, OBJECT_TYPE_CREATURE, MOUSECURSOR_PICKUP, MOUSECURSOR_PICKUP_DOWN); +} +void ai_DMSelectAction(object oDM, string sElem) +{ + string sGroup = GetStringRight(sElem, 1); + SetLocalString(oDM, AI_TARGET_MODE, "DM_ACTION_GROUP" + sGroup); + ai_SendMessages(GetName(oDM) + " select an action for group" + sGroup + ".", AI_COLOR_YELLOW, oDM); + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_DMChangeMoveSpeed(object oDM, string sElem, int nSpeed) +{ + string sGroup = GetStringRight(sElem, 1); + json jGroup = GetLocalJson(oDM, "DM_GROUP" + sGroup); + if(JsonGetType(jGroup) == JSON_TYPE_NULL) + { + ai_SendMessages("This group does not contain any creatures!", AI_COLOR_RED, oDM); + return; + } + jGroup = JsonArraySet(jGroup, 0, JsonInt(nSpeed)); + SetLocalJson(oDM, "DM_GROUP" + sGroup, jGroup); + object oLeader = GetObjectByUUID(JsonGetString(JsonArrayGet(jGroup, 1))); + string sName = GetName(oLeader); + string sText = " " + sName + "'s group"; + if(nSpeed == 0) sText += " [Walk]"; + else sText += " [Run]"; + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText)); + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_COMMAND_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText)); +} diff --git a/_module/nss/0e_onclientload.nss b/_module/nss/0e_onclientload.nss new file mode 100644 index 00000000..041d49ff --- /dev/null +++ b/_module/nss/0e_onclientload.nss @@ -0,0 +1,23 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_onclientload + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnClientLoad script; + This will fire when the client is loading. + + If you have your own OnClientLoad event script just take the below + script lines and add them into your OnClientLoad script. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_menus_dm" +#include "0i_module" +void main() +{ + object oCreature = OBJECT_SELF; + // This can be moved to the OnClientLoad script event of your module. + if(ai_GetIsCharacter(oCreature)) ai_CheckPCStart(oCreature); + // If this is a server you can add this as well. + else if(AI_SERVER && (GetIsDM(oCreature) || GetIsPlayerDM(oCreature))) + { + ai_CheckPCStart(oCreature); + } +} diff --git a/_module/nss/0e_player_target.nss b/_module/nss/0e_player_target.nss new file mode 100644 index 00000000..16b83fb6 --- /dev/null +++ b/_module/nss/0e_player_target.nss @@ -0,0 +1,154 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: 0e_player_target + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + OnPlayerTarget event script + Used to allow player targeting while passing any module player targeting + script through to work as intended. + + We Use a string variable upon the player using the targeting mode to define the + action of the target. + AI_TARGET_MODE is the constant used. + AI_TARGET_ASSOCIATE is the associate that triggered the target mode. +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_player_target" +void main() +{ + object oPC = GetLastPlayerToSelectTarget(); + // Get any plugin target scripts and run it instead of this one. + string sPluginTargetScript = GetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT); + if(sPluginTargetScript != "") + { + DeleteLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT); + ExecuteScript(sPluginTargetScript, oPC); + // Remove the plugin script as it must be set each time the plugin uses the target event. + } + else + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + object oAssociate = GetLocalObject(oPC, AI_TARGET_ASSOCIATE); + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + // ********************* Exiting Target Actions ************************ + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + if(sTargetMode == "ASSOCIATE_ACTION_ALL") + { + ai_SendMessages("You have exited selecting an action for the party.", AI_COLOR_YELLOW, oPC); + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + if(GetLocalInt(oPC, sGhostModeVarname)) ai_OriginalRemoveAllActionMode(oPC); + } + else ai_RemoveAllActionMode(oPC); + } + else if(sTargetMode == "ASSOCIATE_ACTION") + { + ai_SendMessages("You have exited selecting an action for " + GetName(oAssociate) + ".", AI_COLOR_YELLOW, oPC); + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + if(GetLocalInt(oPC, sGhostModeVarname)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + else + { + ai_SetAIMode(oAssociate, AI_MODE_COMMANDED, FALSE); + if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST) && !ai_GetAIMode(oPC, AI_MODE_GHOST) && + GetLocalInt(oAssociate, sGhostModeVarname)) + { + + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + ExecuteScript("nw_ch_ac1", oAssociate); + } + } + else if(sTargetMode == "ASSOCIATE_GET_TRAP") + { + ai_SendMessages(GetName(oAssociate) + " has exited selecing a trap!", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "ASSOCIATE_PLACE_TRAP") + { + ai_SendMessages(GetName(oAssociate) + " has exited placing the trap!", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DM_SELECT_CAMERA_VIEW") + { + AttachCamera(oPC, oPC); + ai_SendMessages(GetName(oPC) + " has defaulted camera view back to the player!", AI_COLOR_YELLOW, oPC); + } + return; + } + // ************************* Targeted Actions ************************** + else + { + // This action makes an associates move to vTarget. + if(sTargetMode == "ASSOCIATE_ACTION_ALL") + { + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + ai_OriginalActionAllAssociates(oPC, oTarget, lLocation); + } + else ai_ActionAllAssociates(oPC, oTarget, lLocation); + } + else if(sTargetMode == "ASSOCIATE_ACTION") + { + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + AssignCommand(oAssociate, ai_OriginalActionAssociate(oPC, oTarget, lLocation)); + } + else AssignCommand(oAssociate, ai_ActionAssociate(oPC, oTarget, lLocation)); + } + else if(sTargetMode == "ASSOCIATE_FOLLOW_TARGET") ai_SelectFollowTarget(oPC, oAssociate, oTarget); + else if(sTargetMode == "ASSOCIATE_GET_TRAP") ai_SelectTrap(oPC, oAssociate, oTarget); + else if(sTargetMode == "ASSOCIATE_PLACE_TRAP") AssignCommand(oAssociate, ai_PlaceTrap(oPC, lLocation)); + else if(sTargetMode == "ASSOCIATE_USE_ITEM") + { + if(oTarget == GetArea(oPC)) oTarget = OBJECT_INVALID; + ai_UseWidgetItem(oPC, oAssociate, oTarget, lLocation); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sTargetMode == "ASSOCIATE_USE_FEAT") + { + if(oTarget == GetArea(oPC)) oTarget = OBJECT_INVALID; + ai_UseWidgetFeat(oPC, oAssociate, oTarget, lLocation); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sTargetMode == "ASSOCIATE_CAST_SPELL") + { + if(oTarget == GetArea(oPC)) oTarget = OBJECT_INVALID; + ai_CastWidgetSpell(oPC, oAssociate, oTarget, lLocation); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + } + else if(sTargetMode == "DM_SELECT_CAMERA_VIEW") + { + AttachCamera(oPC, oTarget); + ai_SendMessages(GetName(oPC) + " has changed the camera view to " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DM_SELECT_OPEN_INVENTORY") + { + if(LineOfSightObject(oPC, oTarget)) + { + OpenInventory(oTarget, oPC); + ai_SendMessages("You have opened the inventory of "+ GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + } + else ai_SendMessages(GetName(oTarget) + " is not in your line of sight!", AI_COLOR_YELLOW, oPC); + } + else if(GetStringLeft(sTargetMode, 15) == "DM_SELECT_GROUP") + { + ai_AddToGroup(oPC, oTarget, sTargetMode); + } + else if(GetStringLeft(sTargetMode, 15) == "DM_ACTION_GROUP") + { + ai_DMAction(oPC, oTarget, lLocation, sTargetMode); + } + // Get saved module player target script and execute it for pass through compatibility. + string sModuleTargetScript = GetLocalString(GetModule(), AI_MODULE_TARGET_EVENT); + ExecuteScript(sModuleTargetScript); + } + } +} diff --git a/_module/nss/0e_prc_ch_events.nss b/_module/nss/0e_prc_ch_events.nss new file mode 100644 index 00000000..3028e9c8 --- /dev/null +++ b/_module/nss/0e_prc_ch_events.nss @@ -0,0 +1,78 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0e_prc_ch_events +//////////////////////////////////////////////////////////////////////////////// + associate event handler while using the PRC. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +#include "x0_i0_assoc" +void main() +{ + object oCreature = OBJECT_SELF; + int nEvent = GetCurrentlyRunningEvent(); + //WriteTimestampedLogEntry("0e_prc_ch_events [13] " + GetName(oCreature) + " nEvent: " + IntToString(nEvent)); + switch (nEvent) + { + case EVENT_SCRIPT_CREATURE_ON_HEARTBEAT: + { + if(GetLocalInt(oCreature, "CohortID")) ExecuteScript("prc_ai_coh_hb"); + ExecuteScript("nw_ch_ac1", oCreature); + ExecuteScript("prc_npc_hb", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_NOTICE: + { + ExecuteScript("nw_ch_ac2", oCreature); + ExecuteScript("prc_npc_percep", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_DIALOGUE: + { + //if(GetLocalInt(oCreature, "CohortID")) ExecuteScript("prc_ai_coh_conv"); + ExecuteScript("nw_ch_ac4", oCreature); + //ExecuteScript("prc_npc_conv", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED: + { + ExecuteScript("nw_ch_ac5", oCreature); + ExecuteScript("prc_npc_physatt", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_DAMAGED: + { + ExecuteScript("nw_ch_ac6", oCreature); + ExecuteScript("prc_npc_damaged", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT: + { + ExecuteScript("nw_ch_acb", oCreature); + ExecuteScript("prc_npc_spellat", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND: + { + ExecuteScript("nw_ch_ac3", oCreature); + ExecuteScript("prc_npc_combat", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR: + { + ExecuteScript("nw_ch_ace", oCreature); + ExecuteScript("prc_npc_blocked", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_RESTED: + { + ExecuteScript("nw_ch_aca", oCreature); + //ExecuteScript("prc_npc_rested", oCreature); + break; + } + case EVENT_SCRIPT_CREATURE_ON_DISTURBED: + { + ExecuteScript("nw_ch_ac8", oCreature); + ExecuteScript("prc_npc_disturb", oCreature); + break; + } + } +} diff --git a/_module/nss/0i_actions.nss b/_module/nss/0i_actions.nss new file mode 100644 index 00000000..7d7d2d75 --- /dev/null +++ b/_module/nss/0i_actions.nss @@ -0,0 +1,2325 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_actions +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts for action in and out of combat. + + Detect Mode: + Passive(default) mode + * Trap detection radius: 5ft + * Trap detection rate: every 6 seconds + * Trap detection roll: d20 + 1/2 skill + * Spot/Listen roll: d10 + 1/2 skill + + Active(Detect) mode + * Trap detection radius: 10ft + * Trap detection rate: every 3 seconds + * Trap detection roll: d20 + skill + * Spot/Listen roll: d20 + skill + + Stealth checks + * Player detects stealth: 5 times per second. + * Player rolls for hide/move silently & spot/listen: every 6 seconds. + * NPC detects stealth: 4 seconds + * NPC rolls for hide/move silently & spot/listen: every 6 seconds. + + Listen/Move Silently: + * Cannot detect silenced creatures. + * Cannot detect sanctuaried creatures. + * Can only detect invisible (or when your blind) creatures within max attack range. + * Listen checks are made each round for success and failur. + * Outdoors: Objects between you and the target gives a +5 DC for every 40cm of thickness. + * Indoors: No Line of sight and the target is within 40 meters gives a +2 DC. + * +10 DC in combat for the target. + * +5 DC if the target is standing still. + * -5 DC if the listener is standing still. + * +1 DC for every 3 meters of distance to the target. + * Relative size modifiers for both: Tiny +8, Small +4, Medium 0, Larget -4, Huge -8. + * Favored enemy bonuses. + + Spot/Hide: + * Cannot spot invisible creatures. + * Cannot spot any creatures while blinded. + * Night time: Spotter has not light or darkvision +5 DC. + * Night time: Target has a light no them -10 DC. + * +5 DC if target is behind the spotter. + * +10 DC if the spotter are in combat. + * +5 DC if the target is standing still. + * -5 DC if the spotter is standing still. + * Relative size modifiers for both: Tiny +8, Small +4, Medium 0, Larget -4, Huge -8. + * Favored enemy bonuses. + +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_talents" +#include "x0_inc_henai" +#include "X0_I0_ANIMS" +// Chooses an action in combat and executes it for oCreature that is an associate. +void ai_DoAssociateCombatRound(object oCreature, object oTarget = OBJECT_INVALID); +// Sets variables and states for oAssociate to start combat. +void ai_StartAssociateCombat(object oAssociate, object oTarget = OBJECT_INVALID); +// Chooses an action in combat and executes it for oCreature that is a monster. +void ai_DoMonsterCombatRound(object oCreature); +// Sets variables and states for oMonster to start combat. +void ai_StartMonsterCombat(object oMonster); +// Return the distance that is set for how close we should follow our master. +float ai_GetFollowDistance(object oCreature); +// Returns TRUE if the caller's distance is greater than fDistance from who they +// are following. Unless they are cowardly or in stand ground mode. +// This will also force the caller to move towards them. +int ai_StayClose(object oCreature); +// Returns TRUE if oCreature becomes invisible or hides. +int ai_TryToBecomeInvisible(object oCreature); +// Returns TRUE if oCreature continues to bash a door. +int ai_BashDoorCheck(object oCreature); +// Returns TRUE if we find an hidden creature within battle and do an action. +// If oCreature is too far away they will run upto 14 meters of the invisible creature. +// If oCreature is close they will attempt to cast a spell or search for them. +// bMonster needs to be set for monsters otherwise we do associate perception checks. +// fRange is how close we want to get to hidden targets. +int ai_SearchForHiddenCreature(object oCreature, int bMonster, object oHidden = OBJECT_INVALID, float fRange = 1.0); +// Returns TRUE if oCreature fails a moral check. +// We only make moral checks once we are below AI_HEALTH_WOUNDED health percent. +// If we are at AI_HEALTH_BLOODY hp percent then add + AI_MORAL_INC_DC to the Check. +int ai_MoralCheck(object oCreature); +// Returns TRUE if oCreature is in and nSpell is a dangerous Area Of Effect. +// Used in the on spell cast at scripts. [nw_c2_defaultb and nw_ch_acb]. +int ai_GetInAOEReaction(object oCreature, object oCaster, int nSpell); +// Have the associate speak a random voice from VOICE_CHAT_*. +// nRoll is the number to roll. If nRoll is 0 then it will SpeakString(sVoiceChatArray); +// sVoiceChatArray is an array of VOICE_CHAT_* numbers over nRoll. +// example(4, ":3:4:8:7:") will roll a d4() picking from 3,4,8,7 of VOICE_CHAT_*. +// if nRoll is higher than the number of VOICE_CHAT_* then it will not speak. +void ai_HaveCreatureSpeak(object oCreature, int nRoll, string sVoiceChatArray, int bImportant = FALSE); +// Returns if a spell talent was used. +// This is a common set of AI scripts ran on associate spell casters. +int ai_CheckForAssociateSpellTalent(object oAssociate, int nInMelee, int nMaxLevel, int nRound = 0); +// Targets the best creature oCreature it can see. +// This checks all physcal attack talents starting with ranged attacks then melee. +// Using TALENT_CATEGORY_HARMFUL_MELEE [22] talents. +// If no talents are used it will do either a ranged attack or a melee attack. +void ai_DoPhysicalAttackOnBest(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Targets the nearest creature oCreature it can see. +// This checks all physcal attack talents starting with ranged attacks then melee. +// Using TALENT_CATEGORY_HARMFUL_MELEE [22] talents. +// If no talents are used it will do either a ranged attack or a melee attack. +void ai_DoPhysicalAttackOnNearest(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Targets the weakest creature oCreature can see. +// This checks all physcal attack talents starting with ranged attacks then melee. +// Using TALENT_CATEGORY_HARMFUL_MELEE [22] talents. +// If no talents are used it will do either a ranged attack or a melee attack. +void ai_DoPhysicalAttackOnLowestCR(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Returns TRUE if they equip a melee weapon, FALSE if they don't. +// This also calls for the next combat round. +int ai_InCombatEquipBestMeleeWeapon(object oCreature); +// Returns TRUE if they equip a ranged weapon, FALSE if they don't. +// This also calls for the next combat round. +int ai_InCombatEquipBestRangedWeapon(object oCreature); +// Action wrapper for ai_TryHealing. +void ai_ActionTryHealing(object oCreature, object oTarget); +// Returns TRUE if oCreature heals oTarget. +// This uses an action and must use AssignCommand or OBJECT_SELF is the caster! +int ai_TryHealing(object oCreature, object oTarget, int bForce = FALSE); +// oCreature will move into the area looking for creatures. +void ai_ScoutAhead(object oCreature); +// Have oCreature search one object, may continue from that object. +void ai_SearchObject(object oCreature, object oObject, object oMaster, int bOnce = FALSE); +// Returns TRUE if oCreature disarms oTrap. +// bForce if TRUE, oCreature will try to disarm the trap even if they have tried before. +int ai_ReactToTrap(object oCreature, object oTrap, int bForce = FALSE); +// Returns TRUE if oCreature opens oLocked object. +// This will make oCreature open oLocked either by picking or casting a spell. +// bForce if TRUE, oCreature will try to pick the lock even if they have tried before. +int ai_AttemptToByPassLock(object oCreature, object oLocked, int bForce = FALSE); +// Returns TRUE if oCreature opens oDoor. +// bForce if TRUE, oCreature will try to open the door even if they have tried before. +int ai_AttemptToOpenDoor(object oCreature, object oDoor, int bForce = FALSE); +// Action for Checking nearby objects for traps, locks and loot. +void ai_ActionCheckNearbyObjects(object oCreature); +// oCreature will check nearby objects and see what they should do based upon +// selected actions by the player. +int ai_CheckNearbyObjects(object oCreature); +// Used to determine special behaviors for oCeature. +void ai_DetermineSpecialBehavior(object oCreature); +// The target object flees to the specified way point and then destroys itself, +// to be respawned at a later point. For unkillable sign post characters +// who are not meant to fight back. +void ai_ActivateFleeToExit(object oCreature); +// Returns TRUE if oCreature should flee to an exit. +int ai_GetFleeToExit(object oCreature); +// Does random animation in a close distance for creatures. +void ai_AmbientAnimations(); + +void ai_DoAssociateCombatRound(object oCreature, object oTarget = OBJECT_INVALID) +{ + if(ai_StayClose(oCreature)) return; + // Is the target our Player has locked in dead? If so then clear it. + if(GetIsDead(GetLocalObject(oCreature, AI_PC_LOCKED_TARGET))) DeleteLocalObject(oCreature, AI_PC_LOCKED_TARGET); + // Setup the combat state for this round of combat. + object oNearestEnemy = ai_SetCombatState(oCreature); + // If we are in standground mode we only fight if the enemy is near us. + if(ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND) && + ai_GetEnemyAttackingMe(oCreature) == OBJECT_INVALID) oNearestEnemy = OBJECT_INVALID; + // If we found an Enemy or we have a Target then continue into the combat round. + if(oNearestEnemy != OBJECT_INVALID || oTarget != OBJECT_INVALID) + { + // In combat we should stop searching. + if(GetActionMode(oCreature, ACTION_MODE_DETECT) && !GetHasFeat(FEAT_KEEN_SENSE)) + { + SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + } + ai_SetCombatRound(oCreature); + string sAI = GetLocalString(oCreature, AI_COMBAT_SCRIPT); + if(AI_DEBUG) ai_Debug("0i_actions", "167", " AI not Coward/Peaceful: " + + IntToString(sAI != "ai_coward" && sAI != "ai_a_peaceful")); + // If we are using a normal AI script and are polymorphed we should use + // the polymorph AI script. + if(sAI != "ai_coward" && sAI != "ai_a_peaceful") + { + if(AI_DEBUG) ai_Debug("0i_actions", "173", "Should we use polymorph? " + + IntToString(GetAppearanceType(oCreature) != ai_GetNormalAppearance(oCreature))); + if(AI_DEBUG) + { + if(ai_GetIsHidden(oCreature)) + { + ai_Debug("0i_actions", "179", "We are hidden!" + + " Can they see us? " + IntToString(ai_GetNearestIndexThatSeesUs(oCreature))); + } + } + if(GetAppearanceType(oCreature) != ai_GetNormalAppearance(oCreature)) + { + sAI = "ai_a_polymorphed"; + } + else if(ai_GetIsHidden(oCreature) && !ai_GetNearestIndexThatSeesUs(oCreature)) sAI = "ai_a_invisible"; + } + if(sAI == "") sAI = "ai_a_default"; + if(AI_DEBUG) ai_Debug("0i_actions", "190", "********** " + GetName (oCreature) + " **********"); + if(AI_DEBUG) ai_Debug("0i_actions", "191", "********** " + sAI + " **********"); + ai_ClearCreatureActions(); + if(AI_DEBUG) ai_Counter_Start(); + // Execute this creatures AI routine. + ExecuteScript(sAI, oCreature); + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + " has finalized round action."); + return; + } + // We have exhausted our check for an enemy. Combat is over. + if(AI_DEBUG) ai_Debug("0i_actions", "200", "---------- " + GetName (OBJECT_SELF) + "'s combat has ended! ----------"); + ai_ClearCombatState(oCreature); + // Run the heartbeat script so we start doing our actions out of combat. + ExecuteScript("nw_ch_ac1", oCreature); +} +void ai_StartAssociateCombat(object oAssociate, object oTarget = OBJECT_INVALID) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "217", "---------- " + GetName(oAssociate) + " is starting combat! ----------"); + ai_SetCreatureTalents(oAssociate, FALSE); + ai_CheckXPPartyScale(oAssociate); + ai_DoAssociateCombatRound(oAssociate, oTarget); +} +void ai_DoMonsterCombatRound(object oMonster) +{ + object oNearestEnemy = ai_SetCombatState(oMonster); + if(oNearestEnemy != OBJECT_INVALID) + { + if(GetActionMode(oMonster, ACTION_MODE_DETECT) && !GetHasFeat(FEAT_KEEN_SENSE, oMonster)) + SetActionMode(oMonster, ACTION_MODE_DETECT, FALSE); + ai_SetCombatRound(oMonster); + string sAI = GetLocalString(oMonster, AI_COMBAT_SCRIPT); + if(sAI != "ai_coward") + { + if(GetAppearanceType(oMonster) != ai_GetNormalAppearance(oMonster)) + { + sAI = "ai_polymorphed"; + } + else if(ai_GetIsHidden(oMonster) && !ai_GetNearestIndexThatSeesUs(oMonster)) sAI = "ai_invisible"; + } + if(sAI == "") sAI = "ai_default"; + if(AI_DEBUG) ai_Debug("0i_actions", "230", "********** " + GetName (oMonster) + " **********"); + if(AI_DEBUG) ai_Debug("0i_actions", "231", "********** " + sAI + " **********"); + // We clear actions here and setup multiple actions to the queue for oCreature. + ai_ClearCreatureActions(); + ai_Counter_Start(); + ExecuteScript(sAI, oMonster); + ai_Counter_End(GetName(oMonster) + " is ending round calculations."); + return; + } + // Check to see if we just didn't see the enemies. + if(GetLocalInt(oMonster, AI_ENEMY_NUMBERS) && + ai_SearchForHiddenCreature(oMonster, TRUE)) return; + // We have exhausted our check for an enemy. Combat is over. + ai_EndCombatRound(oMonster); + ai_ClearCombatState(oMonster); + // Run the heartbeat script so we start doing our actions out of combat. + ExecuteScript("nw_c2_default1", oMonster); + if(AI_DEBUG) ai_Debug("0i_actions", "247", GetName(oMonster) + "'s combat has ended!"); + return; +} +void ai_StartMonsterCombat(object oMonster) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "264", "---------- " + GetName(oMonster) + " is starting combat! ----------"); + ai_SetCreatureTalents(oMonster, TRUE); + ai_DoMonsterCombatRound(oMonster); +} +float ai_GetFollowDistance(object oCreature) +{ + // Also check for size of creature and adjust based on that. + float fDistance = StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oCreature))); + return GetLocalFloat(oCreature, AI_FOLLOW_RANGE) + fDistance; +} +int ai_StayClose(object oCreature) +{ + if(ai_GetIsCharacter(oCreature) || + ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND) || + GetLocalString(oCreature, AI_COMBAT_SCRIPT) == "ai_a_peaceful" || + GetLocalString(oCreature, AI_COMBAT_SCRIPT) == "ai_coward") return FALSE; + object oMaster = GetMaster(oCreature); + // We stay within our perception range of who we are following. + float fPerceptionDistance = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fPerceptionDistance == 0.0) + { + fPerceptionDistance = GetLocalFloat(oMaster, AI_ASSOC_PERCEPTION_DISTANCE); + if(fPerceptionDistance == 0.0) fPerceptionDistance = 20.0; + } + object oTarget = GetLocalObject(oCreature, AI_FOLLOW_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oMaster; + if(AI_DEBUG) ai_Debug("0i_associates", "214", "Distance from who we are following in combat." + + " oFollowing: " + FloatToString(GetDistanceBetween(oTarget, oCreature), 0, 2) + " fPerceptionDistance: " + FloatToString(fPerceptionDistance, 0, 2)); + if(GetDistanceBetween(oTarget, oCreature) < fPerceptionDistance) return FALSE; + ai_ClearCreatureActions(); + if(AI_DEBUG) ai_Debug("0i_associates", "218", "We are too far away! Move back to our master."); + ActionMoveToObject(oTarget, TRUE, ai_GetFollowDistance(oCreature)); + return TRUE; +} +int ai_TryToBecomeInvisible(object oCreature) +{ + // If we are invisible then we don't need to check this. + if(!ai_GetIsHidden(oCreature)) return FALSE; + // If we are not invisible lets try. + int nDarkness; + if(GetHasSpell(SPELL_DARKNESS, oCreature) && ai_GetHasEffectType(oCreature, EFFECT_TYPE_ULTRAVISION)) nDarkness = TRUE; + if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oCreature) || GetHasSpell(SPELL_INVISIBILITY, oCreature) || + GetHasSpell(SPELL_INVISIBILITY_SPHERE, oCreature) ||(nDarkness) || + GetHasSpell(SPELL_SANCTUARY, oCreature) || GetHasSpell(SPELL_ETHEREALNESS, oCreature) || + GetHasSpell(799/*SPELLABILITY_VAMPIRE_INVISIBILITY*/) || + GetHasFeat(FEAT_HIDE_IN_PLAIN_SIGHT, oCreature) == TRUE) + { + // This bit ported directly from Jasperre + // Can anyone see me?(has spell effects of X) + // The point of this is to see if its even worthwhile to go invisbile + // or will it be immediately dispeled. + object oSeeMe = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oCreature, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN, CREATURE_TYPE_HAS_SPELL_EFFECT, SPELL_TRUE_SEEING); + if(oSeeMe == OBJECT_INVALID) + { + oSeeMe = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oCreature, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN, CREATURE_TYPE_HAS_SPELL_EFFECT, SPELL_SEE_INVISIBILITY); + } + if(oSeeMe == OBJECT_INVALID) + { + // Check non-invisibility options first. Since they can be used + // while near enemies. + if(GetHasFeat(FEAT_HIDE_IN_PLAIN_SIGHT, oCreature)) + { + // Go into stealth mode + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + if(AI_DEBUG) ai_Debug("0i_actions", "207", "Using HIDE_IN_PLAIN_SIGHT!"); + return TRUE; + } + if(nDarkness) + { + ai_SetLastAction(oCreature, SPELL_DARKVISION); + ActionCastSpellAtObject(SPELL_DARKVISION, oCreature); + return TRUE; + } + if(GetHasSpell(SPELL_ETHEREALNESS, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_ETHEREALNESS); + ActionCastSpellAtObject(SPELL_ETHEREALNESS, oCreature); + return TRUE; + } + if(GetHasSpell(SPELL_SANCTUARY, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_SANCTUARY); + ActionCastSpellAtObject(SPELL_SANCTUARY, oCreature); + return TRUE; + } + // Get the nearest Enemy and how close they are. + // Use this to keep invisibility from being spammed in melee. + object oEnemy = ai_GetNearestEnemy(oCreature); + if(GetDistanceBetween(oCreature, oEnemy) > AI_RANGE_MELEE) + { + if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_IMPROVED_INVISIBILITY); + ActionCastSpellAtObject(SPELL_IMPROVED_INVISIBILITY, oCreature); + return TRUE; + } + if(GetHasSpell(SPELL_INVISIBILITY, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_INVISIBILITY); + ActionCastSpellAtObject(SPELL_INVISIBILITY, oCreature); + return TRUE; + } + if(GetHasSpell(SPELL_INVISIBILITY_SPHERE, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_INVISIBILITY_SPHERE); + ActionCastSpellAtObject(SPELL_INVISIBILITY_SPHERE, oCreature); + return TRUE; + } + if(GetHasSpell(799/*SPELLABILITY_VAMPIRE_INVISIBILITY*/, oCreature)) + { + ai_SetLastAction(oCreature, 799/*SPELLABILITY_VAMPIRE_INVISIBILITY*/); + ActionCastSpellAtObject(799/*SPELLABILITY_VAMPIRE_INVISIBILITY*/, oCreature); + return TRUE; + } + } + } + } + return FALSE; +} +int ai_SearchForHiddenCreature(object oCreature, int bMonster, object oInvisible = OBJECT_INVALID, float fRange = 1.0) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "358", GetName(oCreature) + " is searching for an invisible creature (" + + GetName(oInvisible) + ")."); + if(oInvisible == OBJECT_INVALID) + { + // Have we seen anyone go invisible? + oInvisible = GetLocalObject(oCreature, AI_IS_INVISIBLE); + if(oInvisible == OBJECT_INVALID || GetIsDead(oInvisible)) + { + oInvisible = ai_GetNearestEnemy(oCreature, 1, 7, PERCEPTION_HEARD_AND_NOT_SEEN); + if(oInvisible == OBJECT_INVALID) oInvisible = ai_GetNearestEnemy(oCreature); + } + } + float fPerceptionDistance, fDistance; + if(bMonster) + { + GetDistanceBetween(oCreature, oInvisible); + fPerceptionDistance = GetLocalFloat(GetModule(), AI_RULE_PERCEPTION_DISTANCE); + } + else + { + // We want to use the distance between the PC and target not us. + object oMaster = GetMaster(); + if(oMaster != OBJECT_INVALID) fDistance = GetDistanceBetween(oMaster, oInvisible); + else GetDistanceBetween(oCreature, oInvisible); + fPerceptionDistance = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fPerceptionDistance == 0.0) fPerceptionDistance = 20.0; + } + if(AI_DEBUG) ai_Debug("0i_actions", "383", "Is invisible: " + GetName(oInvisible) + + " fDistance: " + FloatToString(fDistance, 0, 2) + + " fPerceptionDistance: " + FloatToString(fPerceptionDistance, 0, 2)); + // Might need to end combat at this point? + if(fDistance > fPerceptionDistance) return FALSE; + // If we are close enough then lets look for them. + if(fDistance < AI_RANGE_LONG) + { + // nHidden 1 = Invisible effects, 2 = Darkness effects, 3 = Sanctuary effects, 4 Stealth. + int nHidden = ai_GetIsHidden(oInvisible); + if(nHidden) + { + // They have a magical effect! Is there a spell we can use to see? + if(nHidden < 4) + { + if(AI_DEBUG) ai_Debug("0i_actions", "399", " They are using magic to hide: " + + IntToString(nHidden)); + // True Seeing pierces all types of magical hiding. + if(GetHasSpell(SPELL_TRUE_SEEING, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_TRUE_SEEING); + ActionCastSpellAtObject(SPELL_TRUE_SEEING, oCreature); + return TRUE; + } + if(nHidden == 1 || nHidden == 3) // Invisibility or Ethereal effect. + { + if(GetHasSpell(SPELL_SEE_INVISIBILITY, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_SEE_INVISIBILITY); + ActionCastSpellAtObject(SPELL_SEE_INVISIBILITY, oCreature); + return TRUE; + } + if(GetHasSpell(SPELL_INVISIBILITY_PURGE, oCreature)) + { + ai_SetLastAction(oCreature, SPELL_INVISIBILITY_PURGE); + ActionCastSpellAtObject(SPELL_INVISIBILITY_PURGE, oCreature); + return TRUE; + } + } + if(nHidden == 2) // Darkness spell effect. + { + if(GetHasSpell(SPELL_DARKVISION)) + { + ai_SetLastAction(oCreature, SPELL_DARKVISION); + ActionCastSpellAtObject(SPELL_DARKVISION, oCreature); + return TRUE; + } + } + // To be able to attack a magically hidden foe we have to be + // with in melee attack range. Cannot hear Ethereal foes! + // We will automatically hear them once we are within range. + // We also walk so we don't give attacks of opportunity. + if(nHidden < 3) + { + if(AI_DEBUG) ai_Debug("0i_actions", "437", " We have no spells to counter with. Moving up to attack!"); + SetLocalInt(oCreature, AI_AM_I_SEARCHING, TRUE); + ActionMoveToObject(oInvisible); + ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING)); + if(ai_GetIsInCombat(oCreature)) ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + } + else // They are using stealth! + { + if(AI_DEBUG) ai_Debug("0i_actions", "447", " Using Detect mode and moving up."); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + SetLocalInt(oCreature, AI_AM_I_SEARCHING, TRUE); + // We use to move to the object but that is creepy! + //ActionMoveToObject(oInvisible, FALSE, fRange); + ActionMoveToLocation(GetLocation(oInvisible), FALSE); + ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING)); + if(ai_GetIsInCombat(oCreature)) ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + } + else // They are not hidden, then that means we can hear them but not see them. + // Probably behind a wall or door. + { + SetLocalInt(oCreature, AI_AM_I_SEARCHING, TRUE); + // We use to move to the object but that is creepy! + //ActionMoveToObject(oInvisible, FALSE, fRange); + ActionMoveToLocation(GetLocation(oInvisible), FALSE); + ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING)); + if(ai_GetIsInCombat(oCreature)) ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + } + else // We need to get closer to start looking for them. + { + if(AI_DEBUG) ai_Debug("0i_actions", "469", "Moving towards invisible creature from a distance: " + GetName(oInvisible)); + SetLocalInt(oCreature, AI_AM_I_SEARCHING, TRUE); + // We use to move to the object but that is creepy! + //ActionMoveToObject(oInvisible, TRUE, 14.0); + ActionMoveToLocation(GetLocation(oInvisible), FALSE); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING))); + if(ai_GetIsInCombat(oCreature)) ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + return FALSE; +} +int ai_MoralCheck(object oCreature) +{ + // If we are immune to fear then we are immune to MoralChecks! + // Constructs and Undead are also immune to fear. + int nRaceType = GetRacialType(oCreature); + if(!GetLocalInt(GetModule(), AI_RULE_MORAL_CHECKS) || GetIsImmune(oCreature, IMMUNITY_TYPE_FEAR) || + nRaceType == RACIAL_TYPE_UNDEAD || + nRaceType == RACIAL_TYPE_CONSTRUCT || + ai_GetIsCharacter(oCreature)) return FALSE; + // Moral DC is AI_WOUNDED_MORAL_DC - The number of allies. + // or AI_BLOODY_MORAL_DC - number of allies. + int nDC; + int nHpPercent = ai_GetPercHPLoss(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + // We only make moral checks if we are below half hitpoints and the Difficulty should be adjusted to -10 at 0. + if(nHpPercent <= AI_HEALTH_WOUNDED) + { + // Debug code to look for multiple moral checks at once by one creature? + if(GetLocalString(GetModule(), AI_RULE_DEBUG_CREATURE) == "") + { + SetLocalString(GetModule(), AI_RULE_DEBUG_CREATURE, GetName(oCreature)); + ai_Debug("0i_actions", "424", GetName(oCreature) + " starting debug mode to test Moral checks!"); + } + if(nHpPercent <= AI_HEALTH_BLOODY) nDC = AI_BLOODY_MORAL_DC; + else nDC = AI_WOUNDED_MORAL_DC; + nDC = nDC - GetLocalInt(oCreature, AI_ALLY_NUMBERS); + if(nDC < 1) nDC = 1; + if(AI_DEBUG) ai_Debug("0i_talents", "367", "Moral check DC: " + IntToString(nDC) + "."); + //SendMessageToPC(GetFirstPC(), "0i_talents, 431, " + GetName(oCreature) + " Moral check DC: " + IntToString(nDC) + "."); + if(!WillSave(oCreature, nDC, SAVING_THROW_TYPE_FEAR, oNearestEnemy)) + { + if(AI_DEBUG) ai_Debug("0i_talents", "370", "Moral check failed, we are fleeing!"); + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_coward"); + effect eVFX = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVFX, oCreature, 6.0f); + ActionMoveAwayFromObject(oNearestEnemy, TRUE, AI_RANGE_LONG); + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + int nRoll = d4(); + if(nRoll == 1) PlayVoiceChat(VOICE_CHAT_FLEE, oCreature); + else if(nRoll == 2) PlayVoiceChat(VOICE_CHAT_GUARDME, oCreature); + else if(nRoll == 3) PlayVoiceChat(VOICE_CHAT_HELP, oCreature); + else if(nRoll == 4 && nHpPercent < 100) PlayVoiceChat(VOICE_CHAT_HEALME, oCreature); + } + return TRUE; + } + if(nDC >= 11 && !ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + int nRoll = d6(); + // Cry out when you are overwhelmed! + if(nRoll == 1) PlayVoiceChat(VOICE_CHAT_CUSS, oCreature); + else if(nRoll == 2) PlayVoiceChat(VOICE_CHAT_BADIDEA, oCreature); + else if(nRoll == 3) PlayVoiceChat(VOICE_CHAT_ENEMIES, oCreature); + } + } + return FALSE; +} +int ai_GetInAOEReaction(object oCreature, object oCaster, int nSpell) +{ + switch(nSpell) + { + case SPELL_ACID_FOG: + case SPELL_CLOUDKILL: + case SPELL_CREEPING_DOOM: + { + // Nothing but bad times with these spells. + return TRUE; + } + case SPELL_STORM_OF_VENGEANCE: + { + // This only harms our enemies! + return (oCaster != oCreature && GetIsEnemy(oCaster, oCreature)); + } + // They should only flee Silence if they want to cast a spell! + //case SPELL_SILENCE: + case SPELL_BLADE_BARRIER: + case SPELL_WALL_OF_FIRE: + case SPELL_INCENDIARY_CLOUD: + { + // Check reflex feats and saves. + return (!GetHasFeat(FEAT_EVASION, oCreature) && + !GetHasFeat(FEAT_IMPROVED_EVASION, oCreature) && + GetReflexSavingThrow(oCreature) < 21 + d6()); + } + case SPELL_STINKING_CLOUD: + { + // Do we have a high fortitude save? 20 + 5 + return (GetFortitudeSavingThrow(oCreature) < 20 + d6()); + } + case SPELL_GREASE: + case SPELL_ENTANGLE: + case SPELL_VINE_MINE_ENTANGLE: + case SPELL_WEB: + { + // Do we have a high reflex save? d20 + 1 + return (!GetHasFeat(FEAT_WOODLAND_STRIDE, oCreature) && + !GetLocalInt(oCreature, "X2_L_IS_INCORPOREAL") && + GetReflexSavingThrow(oCreature) < 15 + d6()); + } + case SPELL_EVARDS_BLACK_TENTACLES: + { + // Small creatures are immune and can they hit me? d20 + 8 + caster lvl(7) + return (GetCreatureSize(oCreature) > 2 && + GetAC(oCreature) < 30 + d6()); + } + case SPELL_CLOUD_OF_BEWILDERMENT: + { + // Do we have a high fortitude save? 20 + 2 + return (GetFortitudeSavingThrow(oCreature) < 17 + d6()); + } + case SPELL_MIND_FOG: + case SPELL_STONEHOLD: + { + // Do we have a high enough will save? 20 + 6 + return (GetWillSavingThrow(oCreature) < 21 + d6()); + } + case SPELL_SPIKE_GROWTH: + case SPELL_VINE_MINE_HAMPER_MOVEMENT: + { + // Do we have a high reflex save? d20 + 3 + return (GetReflexSavingThrow(oCreature) < 18 + d6()); + } + } + return FALSE; +} +void ai_HaveCreatureSpeak(object oCreature, int nRoll, string sVoiceChatArray, int bImportant = FALSE) +{ + if(ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK) && !bImportant) return; + if(nRoll == 0) + { + // Some races shouldn't talk. + int nRacialType = GetRacialType(oCreature); + if(nRacialType == RACIAL_TYPE_ANIMAL || nRacialType == RACIAL_TYPE_BEAST || + nRacialType == RACIAL_TYPE_MAGICAL_BEAST || nRacialType == RACIAL_TYPE_OOZE || + nRacialType == RACIAL_TYPE_UNDEAD || nRacialType == RACIAL_TYPE_VERMIN) return; + SpeakString(sVoiceChatArray); + return; + } + nRoll = Random(nRoll); + string sVoice = ai_GetStringArray(sVoiceChatArray, nRoll); + if(sVoice != "") PlayVoiceChat(StringToInt(sVoice), oCreature); +} +int ai_CheckForAssociateSpellTalent(object oAssociate, int nInMelee, int nMaxLevel, int nRound = 0) +{ + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oAssociate, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return TRUE; + if(ai_UseCreatureTalent(oAssociate, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return TRUE; + } + if(ai_GetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) return FALSE; + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oAssociate); + return ai_TryDefensiveTalents(oAssociate, nInMelee, nMaxLevel, nRound, oTarget); +} +void ai_DoPhysicalAttackOnBest(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + talent tUse; + object oTarget; + if(AI_DEBUG) ai_Debug("0i_actions", "496", "Check for ranged attack on nearest enemy!"); + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the nearest targets first. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "519", "Do ranged attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("0i_actions", "525", "Check for melee attack on nearest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, bAlwaysAtk); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "536", "Do melee attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} +void ai_DoPhysicalAttackOnNearest(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + talent tUse; + object oTarget; + if(AI_DEBUG) ai_Debug("0i_actions", "496", "Check for ranged attack on nearest enemy!"); + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the nearest targets first. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "519", "Do ranged attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("0i_actions", "525", "Check for melee attack on nearest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee, bAlwaysAtk); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "536", "Do melee attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} +void ai_DoPhysicalAttackOnLowestCR(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "533", "Check for ranged attack on weakest enemy!"); + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the weaker targets. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "559", GetName(OBJECT_SELF) + " does ranged attack on weakest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("0i_actions", "571", "Check for melee attack on weakest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee, bAlwaysAtk); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "577", GetName(OBJECT_SELF) + " does melee attack against weakest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} +int ai_InCombatEquipBestMeleeWeapon(object oCreature) +{ + if(ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature))) return FALSE; + if(ai_EquipBestMeleeWeapon(oCreature)) + { + // We delay 1 second since ActionEquip is not an action we can check for. + // This keeps event scripts from clearing before we actually equip. + SetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS, 2); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + return FALSE; +} +int ai_InCombatEquipBestRangedWeapon(object oCreature) +{ + if(ai_EquipBestRangedWeapon(oCreature)) + { + // We delay 1 second since ActionEquip is not an action we can check for. + // This keeps event scripts from clearing before we actually equip. + SetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS, 1); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + return FALSE; +} +int ai_CheckItemForHealing(object oCreature, object oTarget, object oItem, int nHpLost, int bEquiped = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "629", "Checking Item properties on " + GetName(oItem)); + int nIprpSubType, nSpell, nLevel, nIPType; + itemproperty ipProp = GetFirstItemProperty(oItem); + // Lets skip this if there are no properties. + if(!GetIsItemPropertyValid(ipProp)) return FALSE; + // Check for cast spell property and add them to the talent list. + int nIndex; + ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + if(AI_DEBUG) ai_Debug("0i_actions", "639", "ItempropertyType(15): " + IntToString(GetItemPropertyType(ipProp))); + nIPType = GetItemPropertyType(ipProp); + if(nIPType == ITEM_PROPERTY_CAST_SPELL) + { + nIprpSubType = GetItemPropertySubType(ipProp); + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + if(ai_ShouldWeCastThisCureSpell(nSpell, nHpLost)) + { + // We have established that we can use the item if it is equiped. + if(!bEquiped) ai_CheckIfCanUseItem(oCreature, oItem); + // Get how they use the item (charges or uses per day). + int nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses > 1 && nUses < 7) + { + int nCharges = GetItemCharges(oItem); + if(AI_DEBUG) ai_Debug("0i_actions", "654", "Item charges: " + IntToString(nCharges)); + if(nUses == 6 && nCharges < 1 || nUses == 5 && nCharges < 3 || + nUses == 4 && nCharges < 5 || nUses == 3 && nCharges < 7 || + nUses == 2 && nCharges < 9) return FALSE; + } + else if(nUses > 7 && nUses < 13) + { + int nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(AI_DEBUG) ai_Debug("0i_actions", "662", "Item uses: " + IntToString(nPerDay)); + if(nPerDay == 0) return FALSE; + } + // SubType is the ip spell index for iprp_spells.2da + nIprpSubType = GetItemPropertySubType(ipProp); + if(AI_DEBUG) ai_Debug("0i_actions", "667", GetName(oCreature) + " is using " + GetName(oItem) + " on " + GetName(oTarget) + "."); + ActionUseItemOnObject(oItem, ipProp, oTarget, nIprpSubType); + return TRUE; + } + } + nIndex++; + ipProp = GetNextItemProperty(oItem); + } + return FALSE; +} +int ai_HealSickness(object oCreature, object oTarget, object oPC, int nSickness, int bForce = FALSE) +{ + // If the player is not forcing a check. + if(!bForce) + { + // Is Casting Cure spells off? + if(ai_GetMagicMode(oCreature, AI_MAGIC_CURE_SPELLS_OFF)) return FALSE; + // Do we have no magic on? + if(ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) return FALSE; + // Should we ignore associates? + if(ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + } + // Check for spells. + if(nSickness == AI_ALLY_IS_DISEASED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "717", "Attempting to remove disease."); + if(ai_CheckAndCastSpell(oCreature, SPELL_REMOVE_DISEASE, 0, 0.0, oTarget)) return TRUE; + } + else if(nSickness == AI_ALLY_IS_POISONED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "726", "Attempting to remove poison."); + if(ai_CheckAndCastSpell(oCreature, SPELL_NEUTRALIZE_POISON, 0, 0.0, oTarget)) return TRUE; + } + else if(nSickness == AI_ALLY_IS_WEAK) + { + if(AI_DEBUG) ai_Debug("0i_actions", "735", "Attempting to remove ability score drain."); + if(ai_CheckAndCastSpell(oCreature, SPELL_LESSER_RESTORATION, 0, 0.0, oTarget)) return TRUE; + if(ai_CheckAndCastSpell(oCreature, SPELL_RESTORATION, 0, 0.0, oTarget)) return TRUE; + if(ai_CheckAndCastSpell(oCreature, SPELL_GREATER_RESTORATION, 0, 0.0, oTarget)) return TRUE; + } + else return FALSE; + // Check for healing kits. + if(!GetLocalInt(GetModule(), AI_RULE_HEALERSKITS)) return FALSE; + int nIprpSubType, nSpell; + itemproperty ipProp; + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetIdentified(oItem)) + { + int nBaseItemType = GetBaseItemType(oItem); + if(nBaseItemType == BASE_ITEM_HEALERSKIT && + (nSickness == AI_ALLY_IS_DISEASED || + nSickness == AI_ALLY_IS_POISONED)) + { + ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + if(GetItemPropertyType(ipProp) == ITEM_PROPERTY_HEALERS_KIT) + { + if(AI_DEBUG) ai_Debug("0i_actions", "772", "Attempting to remove (" + IntToString(nSickness) + ") with a healing kit."); + if(ai_GetIsCharacter(oPC)) ai_SendMessages(GetName(oCreature) + " uses " + GetName(oItem) + " on " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + ipProp = GetNextItemProperty(oItem); + } + } + else if(nBaseItemType == BASE_ITEM_POTIONS || + nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == FEAT_BREW_POTION) + { + ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + nIprpSubType = GetItemPropertySubType(ipProp); + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + if(AI_DEBUG) ai_Debug("0i_actions", "789", "Checking potion, " + IntToString(nSpell)); + if(nSpell == SPELL_REMOVE_DISEASE && nSickness == AI_ALLY_IS_DISEASED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "786", "Using a potion of Remove Disease."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_NEUTRALIZE_POISON && nSickness == AI_ALLY_IS_POISONED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "786", "Using a potion of Neturalize Poison."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_LESSER_RESTORATION && nSickness == AI_ALLY_IS_WEAK) + { + if(AI_DEBUG) ai_Debug("0i_actions", "781", "Using a potion of Lesser Restoration."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_RESTORATION && nSickness == AI_ALLY_IS_WEAK) + { + if(AI_DEBUG) ai_Debug("0i_actions", "791", "Using a potion of Restoration."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + ipProp = GetNextItemProperty(oItem); + } + } + else if(nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL || + nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == BASE_ITEM_MAGICSTAFF) + { + if(ai_CheckIfCanUseItem(oCreature, oItem)) + { + ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + if(nSpell == SPELL_REMOVE_DISEASE && nSickness == AI_ALLY_IS_DISEASED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "786", "Using a potion of Remove Disease."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_NEUTRALIZE_POISON && nSickness == AI_ALLY_IS_POISONED) + { + if(AI_DEBUG) ai_Debug("0i_actions", "786", "Using a potion of Neturalize Poison."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_LESSER_RESTORATION && nSickness == AI_ALLY_IS_WEAK) + { + if(AI_DEBUG) ai_Debug("0i_actions", "781", "Using a potion of Lesser Restoration."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + if(nSpell == SPELL_RESTORATION && nSickness == AI_ALLY_IS_WEAK) + { + if(AI_DEBUG) ai_Debug("0i_actions", "791", "Using a potion of Restoration."); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + ipProp = GetNextItemProperty(oItem); + } + } + } + } + oItem = GetNextItemInInventory(oCreature); + } + return FALSE; +} +int ai_UseHealingItem(object oCreature, object oTarget, object oPC) +{ + if(ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC_ITEMS)) return FALSE; + string sSlots; + int nDamage = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + itemproperty ipProp; + // Cycle through all the creatures equiped items. + int nSlot; + object oItem = GetItemInSlot(nSlot, oCreature); + while(nSlot < 11) + { + if(oItem != OBJECT_INVALID && + ai_CheckItemForHealing(oCreature, oTarget, oItem, nDamage, TRUE)) return TRUE; + oItem = GetItemInSlot(++nSlot, oCreature); + } + oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetIdentified(oItem)) + { + // Does the item need to be equiped to use its powers? + sSlots = Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)); + if(AI_DEBUG) ai_Debug("0i_actions", "696", GetName(oItem) + " requires " + Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)) + " slots."); + if(sSlots == "0x00000") + { + int nBaseItemType = GetBaseItemType(oItem); + // Lets not use up our healing kits on minor damage. + if(nBaseItemType == BASE_ITEM_HEALERSKIT) + { + if(!GetLocalInt(GetModule(), AI_RULE_HEALERSKITS)) return FALSE; + ipProp = GetFirstItemProperty(oItem); + if(GetItemPropertyType(ipProp) == ITEM_PROPERTY_HEALERS_KIT) + { + if(ai_GetIsCharacter(oPC)) ai_SendMessages(GetName(oCreature) + " uses " + GetName(oItem) + " on " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + ActionUseItemOnObject(oItem, ipProp, oTarget); + return TRUE; + } + } + // Do we want Player AI and Associates to use potions on others? + //else if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + // nBaseItemType == BASE_ITEM_POTIONS) + //{ + // if(oCaster == oTarget) + // { + // if(ai_CheckItemForHealing(oCreature, oTarget, oItem, nDamage)) return TRUE; + // } + //} + else if(ai_CheckItemForHealing(oCreature, oTarget, oItem, nDamage)) return TRUE; + } + } + oItem = GetNextItemInInventory(oCreature); + } + return FALSE; +} +void ai_ActionTryHealing(object oCreature, object oTarget) +{ + ai_TryHealing(oCreature, oTarget, TRUE); +} +int ai_TryHealing(object oCreature, object oTarget, int bForce = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "733", "Try healing: oCreature: " + GetName(oCreature) + + " oTarget: " + GetName(oTarget) + " No Party Healing: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) + + " No Self Healing: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_SELF_HEALING_OFF)) + + " AI_I_AM_BEING_HEALED: " + IntToString(GetLocalInt(oTarget, "AI_I_AM_BEING_HEALED")) + + " Undead: " + IntToString(GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)); + // If the player is not forcing a check. + if(!bForce) + { + // Should we ignore associates? + if(ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + } + // Limits the number of times a wounded creature will ask for help. + if(GetLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT") > 3) return FALSE; + // This keeps everyone from healing the same character in one round and over healing! + if(oCreature == oTarget) DeleteLocalInt(oTarget, "AI_I_AM_BEING_HEALED"); + else if(GetLocalInt(oTarget, "AI_I_AM_BEING_HEALED")) return FALSE; + if(ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF) && + oCreature != oTarget) return FALSE; + if(ai_GetAIMode(oCreature, AI_MODE_SELF_HEALING_OFF) && + oCreature == oTarget) return FALSE; + // Undead don't heal so lets skip this for them, maybe later we can fix this. + if(GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) return FALSE; + int nHpLost = ai_GetPercHPLoss(oTarget); + if(bForce && nHpLost < 100) nHpLost = 0; + if(AI_DEBUG) ai_Debug("0i_actions", "743", "nHpLost: " + IntToString(nHpLost) + + " limit: " + IntToString(ai_GetHealersHpLimit(oTarget, FALSE))); + if(nHpLost >= ai_GetHealersHpLimit(oTarget, FALSE)) + { + // Check to see if we need poison, disease, or ability drain removed. + int nEffectType; + effect eEffect = GetFirstEffect(oTarget); + while(GetIsEffectValid(eEffect)) + { + nEffectType = GetEffectType(eEffect); + if(AI_DEBUG) ai_Debug("0i_actions", "1094", "Checking to cure(31/32/39) nEffectType: " + IntToString(nEffectType)); + if(nEffectType == EFFECT_TYPE_DISEASE) + { + if(AI_DEBUG) ai_Debug("0i_actions", "1097", "I am diseased!"); + if(ai_HealSickness(oCreature, oTarget, ai_GetPlayerMaster(oCreature), AI_ALLY_IS_DISEASED, bForce)) return TRUE; + if(oCreature == oTarget) + { + if(!d20()) ai_HaveCreatureSpeak(oCreature, 5, ":43:4:14:15:16:"); + SpeakString(AI_I_AM_DISEASED, TALKVOLUME_SILENT_TALK); + } + } + else if(nEffectType == EFFECT_TYPE_POISON) + { + if(AI_DEBUG) ai_Debug("0i_actions", "1107", "I am poisoned!"); + if(ai_HealSickness(oCreature, oTarget, ai_GetPlayerMaster(oCreature), AI_ALLY_IS_POISONED, bForce)) return TRUE; + if(oCreature == oTarget) + { + if(!d20()) ai_HaveCreatureSpeak(oCreature, 6, ":43:4:14:15:16:19:"); + SpeakString(AI_I_AM_POISONED, TALKVOLUME_SILENT_TALK); + } + } + else if(nEffectType == EFFECT_TYPE_ABILITY_DECREASE) + { + if(AI_DEBUG) ai_Debug("0i_actions", "1117", "I am weak!"); + if(ai_HealSickness(oCreature, oTarget, ai_GetPlayerMaster(oCreature), AI_ALLY_IS_WEAK, bForce)) return TRUE; + if(oCreature == oTarget) + { + if(!d20()) ai_HaveCreatureSpeak(oCreature, 3, ":43:4:5:"); + SpeakString(AI_I_AM_WEAK, TALKVOLUME_SILENT_TALK); + } + } + eEffect = GetNextEffect(oTarget); + } + return FALSE; + } + // Do they have Lay on Hands? + if(GetHasFeat(FEAT_LAY_ON_HANDS, oCreature)) + { + int nCanHeal = GetAbilityModifier(ABILITY_CHARISMA, oCreature) * ai_GetCharacterLevels(oCreature); + if(nCanHeal <= nHpLost) + { + ai_UseFeat(oCreature, FEAT_LAY_ON_HANDS, oTarget); + return TRUE; + } + } + object oMaster = ai_GetPlayerMaster(oCreature); + // Do we have no magic on? + if(!ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) + { + int nClass, nPosition = 1; + string sMemorized; + while(nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + nClass = GetClassByPosition(nPosition, oCreature); + if(AI_DEBUG) ai_Debug("0i_actions", "753", "nClass: " + IntToString(nClass)); + if(nClass == CLASS_TYPE_INVALID) break; + sMemorized = Get2DAString("classes", "MemorizesSpells", nClass); + // If Memorized column is "" then they are not a caster. + if(sMemorized != "") + { + if(sMemorized == "1") + { + if(ai_CastMemorizedHealing(oCreature, oTarget, oMaster, nClass)) + { + SetLocalInt(oTarget, "AI_I_AM_BEING_HEALED", TRUE); + return TRUE; + } + } + else if(ai_CastKnownHealing(oCreature, oTarget, oMaster, nClass)) + { + SetLocalInt(oTarget, "AI_I_AM_BEING_HEALED", TRUE); + return TRUE; + } + } + nPosition++; + } + } + // We have exhausted all attempts to use normal healing spells. + if(ai_UseHealingItem(oCreature, oTarget, oMaster)) + { + SetLocalInt(oTarget, "AI_I_AM_BEING_HEALED", TRUE); + return TRUE; + } + // Final attempt to heal oTarget, check for Spontaneous cure spells. + if(ai_CastSpontaneousCure(oCreature, oTarget, oMaster)) + { + SetLocalInt(oTarget, "AI_I_AM_BEING_HEALED", TRUE); + return TRUE; + } + // We can't heal ourselves! Can any of our allies? Lets ask. + if(oCreature == oTarget) + { + SetLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT", GetLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT") + 1); + SpeakString(AI_I_AM_WOUNDED, TALKVOLUME_SILENT_TALK); + } + return FALSE; +} +int ai_PerceiveEnemy(object oCreature, object oEnemy) +{ + float fDistance = GetDistanceBetween(oCreature, oEnemy); + if(fDistance < 50.0) + { + // Game is in meters, so 1 foot = 3.333 meter + // penalty is -1 per 10' so divide it by 10 to use 0.3333f + int nDC = 10 + FloatToInt(fDistance * 0.3333f); + // Check to see if the creature is hiding and add the creatures checks. + int nEnemyMoveSilent, nEnemyHide; + if(GetStealthMode(oEnemy)) + { + nEnemyMoveSilent =(d20() + GetSkillRank(SKILL_MOVE_SILENTLY, oEnemy)); + nEnemyHide =(d20() + GetSkillRank(SKILL_HIDE, oEnemy)); + } + if(GetIsSkillSuccessful (oCreature, SKILL_SPOT, nDC + nEnemyHide)) return TRUE; + if(GetIsSkillSuccessful (oCreature, SKILL_LISTEN, nDC + nEnemyMoveSilent)) return TRUE; + } + return FALSE; +} +void ai_ScoutAhead(object oCreature) +{ + object oPerceived; + object oEnemy = ai_GetNearestEnemy(oCreature, 1, -1, -1, -1, -1, TRUE); + // We see them so fight! + if(oEnemy != OBJECT_INVALID) + { + if(ai_PerceiveEnemy(oCreature, oEnemy)) + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + int nRoll = d10(); + if(nRoll == 1) PlayVoiceChat(VOICE_CHAT_ENEMIES, oCreature); + else if(nRoll == 2) PlayVoiceChat(VOICE_CHAT_FOLLOWME, oCreature); + else if(nRoll == 3) PlayVoiceChat(VOICE_CHAT_LOOKHERE, oCreature); + } + ActionMoveToObject(oEnemy, TRUE, AI_RANGE_LONG); + return; + } + // There are enemies here so lets go to them. + else + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + int nRoll = d3(); + if(nRoll == 1) PlayVoiceChat(VOICE_CHAT_BADIDEA, oCreature); + else if(nRoll == 2) PlayVoiceChat(VOICE_CHAT_SEARCH, oCreature); + else if(nRoll == 3) PlayVoiceChat(VOICE_CHAT_FOLLOWME, oCreature); + } + ActionMoveToObject(oEnemy, TRUE, AI_RANGE_CLOSE); + } + } + // There are no more enemies, but we must look like we are patroling so + // go to encounter points. + else + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + int nRoll = d10(); + if(nRoll == 1) PlayVoiceChat(VOICE_CHAT_BADIDEA, oCreature); + else if(nRoll == 2) PlayVoiceChat(VOICE_CHAT_SEARCH, oCreature); + else if(nRoll == 3) PlayVoiceChat(VOICE_CHAT_FOLLOWME, oCreature); + } + // No enemy so lets get a spawn point! + object oSpawnPoint = GetNearestObjectByTag("ip_encounter", oCreature, d6()); + ActionMoveToObject(oSpawnPoint, TRUE, AI_RANGE_CLOSE); + } +} +int ai_ShouldIPickItUp(object oCreature, object oItem) +{ + int nMinGold; + if(GetResRef(oItem) == "nw_it_gold001") return TRUE; + int nBaseItem = GetBaseItemType(oItem); + if(GetPlotFlag(oItem)) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_PLOT)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_2"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_ARMOR) + { + if (ai_GetLootFilter(oCreature, AI_LOOT_ARMOR)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_3"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BELT) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_BELTS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_4"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BOOTS) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_BOOTS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_5"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_CLOAK) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_CLOAKS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_6"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_GEM) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_GEMS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_7"); + else return FALSE; + } + else if((nBaseItem == BASE_ITEM_BRACER|| nBaseItem == BASE_ITEM_GLOVES)) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_GLOVES)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_8"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_HELMET) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_HEADGEAR)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_9"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_AMULET || nBaseItem == BASE_ITEM_RING) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_JEWELRY)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_10"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BLANK_POTION || nBaseItem == BASE_ITEM_POTIONS || + nBaseItem == BASE_ITEM_ENCHANTED_POTION) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_POTIONS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_12"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BLANK_SCROLL || nBaseItem == BASE_ITEM_SCROLL || + nBaseItem == BASE_ITEM_ENCHANTED_SCROLL || nBaseItem == BASE_ITEM_SPELLSCROLL) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_SCROLLS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_13"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BLANK_WAND || nBaseItem == BASE_ITEM_ENCHANTED_WAND || + nBaseItem == BASE_ITEM_MAGICWAND || nBaseItem == BASE_ITEM_MAGICROD || + nBaseItem == BASE_ITEM_MAGICSTAFF) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_WANDS_RODS_STAVES)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_15"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_ARROW) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_ARROWS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_17"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BOLT) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_BOLTS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_18"); + else return FALSE; + } + else if(nBaseItem == BASE_ITEM_BULLET) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_BULLETS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_19"); + else return FALSE; + } + else if(ai_GetIsWeapon(oItem)) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_WEAPONS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_16"); + else return FALSE; + } + else if(ai_GetIsShield(oItem)) + { + if(ai_GetLootFilter(oCreature, AI_LOOT_SHIELDS)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_14"); + else return FALSE; + } + else if(ai_GetLootFilter(oCreature, AI_LOOT_MISC)) nMinGold = GetLocalInt(oCreature, "AI_MIN_GOLD_11"); + else return FALSE; + // Check if it is too heavy. + int nItemWeight = GetWeight(oItem); + if(AI_DEBUG) ai_Debug("0i_actions", "1146", GetName(oItem) + " nItemWeight: " + + IntToString(nItemWeight) + " Max Weight: " + IntToString(GetLocalInt(oCreature, AI_MAX_LOOT_WEIGHT) * 10)); + if(nItemWeight > GetLocalInt(oCreature, AI_MAX_LOOT_WEIGHT) * 10) return FALSE; + // Check if it is not valuable enough. + int bID = GetIdentified(oItem); + if(!bID) SetIdentified(oItem, TRUE); + int nItemValue = GetGoldPieceValue(oItem); + if(!bID) SetIdentified(oItem, FALSE); + if(AI_DEBUG) ai_Debug("0i_actions", "998", GetName(oItem) + " nMinGold: " + IntToString(nMinGold) + " nItemValue: " + + IntToString(nItemValue) + " bID: " + IntToString(bID)); + if(nMinGold > nItemValue) return FALSE; + return TRUE; +} +void ai_TakeItemMessage(object oCreature, object oObject, object oItem, object oMaster) +{ + int bId = GetIdentified(oItem); + int nCreatureSkill = GetSkillRank(SKILL_LORE, oCreature); + int nMasterSkill = GetSkillRank(SKILL_LORE, oMaster); + if(nCreatureSkill + nMasterSkill > 0) + { + if(nCreatureSkill > nMasterSkill) ai_IdentifyItemVsKnowledge(oCreature, oItem); + else ai_IdentifyItemVsKnowledge(oMaster, oItem); + } + if(!ai_GetIsCharacter(oCreature)) + { + if(GetIdentified(oItem)) + { + if(bId) ai_SendMessages(GetName(oCreature) + " has found a " + GetName(oItem) + " from the " + GetName(oObject) + ".", AI_COLOR_GRAY, oMaster); + else ai_SendMessages(GetName(oCreature) + " has found and identified " + GetName(oItem) + " from the " + GetName(oObject) + ".", AI_COLOR_GREEN, oMaster); + } + else if(!ai_GetIsCharacter(oCreature)) + { + string sBaseName = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "name", GetBaseItemType(oItem)))); + ai_SendMessages(GetName(oCreature) + " has found a " + sBaseName + " from the " + GetName(oObject) + ".", AI_COLOR_GRAY, oMaster); + } + } + else if(GetIdentified(oItem) && !bId) + { + ai_SendMessages(GetName(oCreature) + " has identified " + GetName(oItem) + " from the " + GetName(oObject) + ".", AI_COLOR_GREEN, oMaster); + } + if(GetPlotFlag(oItem)) + { + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) PlayVoiceChat(VOICE_CHAT_LOOKHERE, oCreature); + } +} +void ai_SearchObject(object oCreature, object oObject, object oMaster, int bOnce = FALSE) +{ + ai_Debug("0i_actions", "966", GetName(OBJECT_SELF) + " is opening " + GetName(oObject)); + string sTag = GetTag(oCreature); + AssignCommand(oObject, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN)); + if(GetIsTrapped(oObject)) DoPlaceableObjectAction(oObject, PLACEABLE_ACTION_USE); + SetLocalInt(oObject, "AI_LOOTED_" + sTag, TRUE); + // Big Hack to allow NPC's to loot! + string sLootScript = GetEventScript(oObject, EVENT_SCRIPT_PLACEABLE_ON_OPEN); + //ai_Debug("0i_actions", "972", "Loot script: " + sLootScript); + if(sLootScript != "") + { + // Used in Original Campaign, and SOU for loot scripts to get treasure to work. + SetLocalObject(oObject, "AI_GET_LAST_OPENED_BY", oMaster); + ExecuteScript(sLootScript, oObject); + } + AssignCommand(oObject, ActionWait(2.0f)); + AssignCommand(oObject, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE)); + int nItemType, nGold; + object oItem = GetFirstItemInInventory(oObject); + //ai_Debug("0i_actions", "983", "Found: " + GetName(oItem) + " ResRef: " + GetResRef(oItem) + + // " in " + GetName(oObject)); + while(oItem != OBJECT_INVALID) + { + ai_Debug("0i_actions", "987", "Found: " + GetName(oItem) + " ResRef: " + GetResRef(oItem)); + if(ai_ShouldIPickItUp(oCreature, oItem)) + { + ai_Debug("0i_actions", "1002", "Taking: " + GetName(oItem)); + if(GetResRef(oItem) == "nw_it_gold001") + { + if(!ai_GetIsCharacter(oCreature)) + { + int nGold = GetItemStackSize(oItem); + DestroyObject(oItem); + ActionDoCommand(GiveGoldToCreature(oMaster, nGold)); + ActionDoCommand(ai_SendMessages(GetName(oCreature) + " has retrieved " + IntToString(nGold) + + " gold from the " + GetName(oObject) + ".", AI_COLOR_GRAY, oMaster)); + } + else AssignCommand(oCreature, ActionTakeItem(oItem, oObject)); + } + // Check if they are a henchman, companions and familiars give all items to the pc. + else if(!ai_GetLootFilter(oCreature, AI_LOOT_GIVE_TO_PC) && + GetAssociateType(oCreature) == ASSOCIATE_TYPE_HENCHMAN && + !GetPlotFlag(oItem)) + { + if(GetBaseItemFitsInInventory(GetBaseItemType(oItem), oCreature)) + { + ActionDoCommand(ai_TakeItemMessage(oCreature, oObject, oItem, oMaster)); + ActionTakeItem(oItem, oObject); + } + else + { + if(GetIdentified(oItem)) SpeakString("My inventory is full! I cannot pick up the " + GetName(oItem) + "."); + else + { + string sBaseName = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "name", GetBaseItemType(oItem)))); + SpeakString("My inventory is full! I cannot pick up the " + sBaseName + "."); + } + } + } + else + { + if(GetBaseItemFitsInInventory(GetBaseItemType(oItem), oMaster)) + { + //ai_Debug("0i_actions", "1010", "Giving to master: " + GetName(oItem)); + ActionDoCommand(ai_TakeItemMessage(oCreature, oObject, oItem, oMaster)); + AssignCommand(oObject, ActionGiveItem(oItem, oMaster)); + } + else + { + if(GetIdentified(oItem)) SpeakString("Your inventory is full! You cannot take the " + GetName(oItem) + "."); + else + { + string sBaseName = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "name", GetBaseItemType(oItem)))); + SpeakString("Your inventory is full! You cannot take the " + sBaseName + "."); + } + } + } + } + oItem = GetNextItemInInventory(oObject); + //ai_Debug("0i_actions", "1016", GetName(oItem) + " is the next item."); + } + //ai_Debug("0i_actions", "1018", "Setting object as looted. Check for a new Placeable."); + if(!bOnce) ActionDoCommand(ai_ActionCheckNearbyObjects(oCreature)); +} +int ai_IsContainerLootable(object oCreature, object oObject) +{ + string sTag = GetTag(oCreature); + //ai_Debug("0i_actions", "1303", GetName(oObject) + " (sTag " + GetTag(oObject) + ") " + + // "has inventory: " + IntToString(GetHasInventory(oObject)) + " Has been looted: " + + // IntToString(GetLocalInt(oObject, "AI_LOOTED_" + sTag)) + " Is Useable? " + + // IntToString(GetUseableFlag(oObject))); + if(!GetHasInventory(oObject) || !GetUseableFlag(oObject)) return FALSE; + // This associate has already looted this object, skip. + if(GetLocalInt(oObject, "AI_LOOTED_" + sTag) || ai_GetIsCharacter(oObject)) return FALSE; + return TRUE; +} +int ai_AttempToCastKnockSpell(object oCreature, object oLocked) +{ + if(GetHasSpell(SPELL_KNOCK, oCreature) && + (GetIsDoorActionPossible(oLocked, DOOR_ACTION_KNOCK) || + GetIsPlaceableObjectActionPossible(oLocked, PLACEABLE_ACTION_KNOCK)) && + ai_GetIsInLineOfSight(oCreature, oLocked)) + { + SetLocalInt(oLocked, AI_OBJECT_IN_USE, TRUE); + DelayCommand(6.0, DeleteLocalInt(oLocked, AI_OBJECT_IN_USE)); + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionWait(1.0)); + AssignCommand(oCreature, ActionCastSpellAtObject(SPELL_KNOCK, oLocked)); + AssignCommand(oCreature, ActionWait(1.0)); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oLocked, AI_OBJECT_IN_USE))); + return TRUE; + } + return FALSE; +} +int ai_ReactToTrap(object oCreature, object oTrap, int bForce = FALSE) +{ + int nTrapDC = GetTrapDisarmDC(oTrap); + if(AI_DEBUG) ai_Debug("0i_actions", "1520", "Reacting to trap on " + GetName(oTrap) + + " bForce: " + IntToString(bForce) + " nTrapDC: " + IntToString(nTrapDC) + + " [AI_OBJECT_IN_USE: " + IntToString(GetLocalInt(oTrap, AI_OBJECT_IN_USE)) + "]."); + if(nTrapDC == 0) return FALSE; + string sTag = GetTag(oCreature); + if(bForce || ai_GetAIMode(oCreature, AI_MODE_DISARM_TRAPS)) + { + if(GetTrapDisarmable(oTrap)) + { + if(GetLocalInt(oTrap, AI_OBJECT_IN_USE)) return FALSE; + // We must have ranks in disable traps to actually disable the trap! + if(GetSkillRank(SKILL_DISABLE_TRAP, oCreature, TRUE)) + { + int nSkill = GetSkillRank(SKILL_DISABLE_TRAP, oCreature); + if(AI_DEBUG) ai_Debug("0i_actions", "1534", "nSkill: " + IntToString(nSkill) + + " + 20 = " + IntToString(nSkill + 20) + " nTrapDC: " + IntToString(nTrapDC)); + if(nSkill + 20 >= nTrapDC) + { + SetLocalInt(oTrap, AI_OBJECT_IN_USE, TRUE); + DelayCommand(18.0, DeleteLocalInt(oTrap, AI_OBJECT_IN_USE)); + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionUseSkill(SKILL_DISABLE_TRAP, oTrap, 0)); + // Let them know we did it! + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 6, ":44:42:31:35:"))); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oTrap, AI_OBJECT_IN_USE))); + // Continue checking for traps, locks, and loot. + AssignCommand(oCreature, ActionDoCommand(ai_ActionCheckNearbyObjects(oCreature))); + return TRUE; + } + if(GetHasSpell(SPELL_FIND_TRAPS, oCreature)) + { + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionCastSpellAtObject(SPELL_FIND_TRAPS, oTrap)); + // Continue checking for traps, locks, and loot. + AssignCommand(oCreature, ActionDoCommand(ai_ActionCheckNearbyObjects(oCreature))); + return TRUE; + } + } + if(GetLocalInt(oTrap, "AI_CANNOT_TRAP_" + sTag) && !bForce) return FALSE; + // Let them know we can't get this done!. + //StrRef(40551) "I cannot disarm this trap!" + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, GetStringByStrRef(40551))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oTrap, "AI_CANNOT_TRAP_" + sTag, TRUE); + return FALSE; + } + if(GetLocalInt(oTrap, "AI_SAW_TRAP_" + sTag) && !bForce) return FALSE; + // Let them know we can't get this done!. + ai_HaveCreatureSpeak(oCreature, 0, "I'm not skilled enough to disable the trap!", TRUE); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oTrap, "AI_SAW_TRAP_" + sTag, TRUE); + return FALSE; + } + if(GetObjectType(oTrap) == OBJECT_TYPE_TRIGGER) + { + object oMaster = ai_GetPlayerMaster(oCreature); + if(oMaster != OBJECT_INVALID && !ai_GetIsCharacter(oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_IGNORE_TRAPS)) + { + ai_SetAIMode(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_SetAIMode(oCreature, AI_MODE_STAND_GROUND, TRUE); + ai_SetAIMode(oCreature, AI_MODE_FOLLOW, FALSE); + ai_SetAIMode(oCreature, AI_MODE_COMMANDED, FALSE); + int nToken = NuiFindWindow(oMaster, ai_GetAssociateType(oMaster, oCreature) + AI_WIDGET_NUI); + ai_HighlightWidgetMode(oMaster, oCreature, nToken); + aiSaveAssociateModesToDb(oMaster, oCreature); + if(ai_IsInCombatRound(oCreature)) ai_ClearCombatState(oCreature); + ai_ClearCreatureActions(TRUE); + ai_SendMessages(GetName(oCreature) + " has went into hold mode after seeing a trap!", AI_COLOR_YELLOW, oMaster); + return TRUE; + } + } + if(ai_GetAIMode(oCreature, AI_MODE_PICKUP_ITEMS)) + { + if(GetLocalInt(oTrap, "AI_SAW_TRAP_" + sTag) && !bForce) return FALSE; + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oTrap) + " is trapped!", TRUE)); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oTrap, "AI_SAW_TRAP_" + sTag, TRUE); + } + return FALSE; +} +int ai_AttemptToByPassLock(object oCreature, object oLocked, int bForce = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "1446", "Attempting to bypass lock on " + + GetName(oLocked) + " [AI_OBJECT_IN_USE: " + + IntToString(GetLocalInt(oLocked, AI_OBJECT_IN_USE)) + "]" + + " bForce: " + IntToString(bForce)); + if(GetLocalInt(oLocked, AI_OBJECT_IN_USE)) return FALSE; + string sTag = GetTag(oCreature); + // Attempt to cast knock because its always safe to cast it, even on a trapped object. + if(ai_AttempToCastKnockSpell(oLocked, oCreature)) return TRUE; + // First, let's see if we notice that it's trapped + if(GetTrapDetectedBy(oCreature, oLocked)) + { + // Ick! Try and disarm the trap first + if(ai_ReactToTrap(oCreature, oLocked, bForce)) return TRUE; + } + if(GetLockKeyRequired(oLocked)) + { + // We might be able to open this. + string sKeyTag = GetLockKeyTag(oLocked); + // Do we have the key? + object oKey = ai_GetCreatureHasItem(oCreature, sKeyTag, FALSE); + if(AI_DEBUG) ai_Debug("0i_actions", "1469", "Requires a Key! sKeyTag: " + + sKeyTag + " Has key oKey: " + GetName(oKey)); + if(oKey != OBJECT_INVALID) + { + int nObjectType = GetObjectType(oLocked); + if(nObjectType == OBJECT_TYPE_DOOR) return ai_AttemptToOpenDoor(oCreature, oLocked, bForce); + else if (nObjectType == OBJECT_TYPE_PLACEABLE) + { + SetLocalInt(oLocked, AI_OBJECT_IN_USE, TRUE); + DelayCommand(18.0, DeleteLocalInt(oLocked, AI_OBJECT_IN_USE)); + AssignCommand(oCreature, ActionUnlockObject(oLocked)); + // Let them know we did it! + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 6, ":44:42:31:35:")); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oLocked, AI_OBJECT_IN_USE))); + // Continue checking for traps, locks, and loot. + AssignCommand(oCreature, ActionDoCommand(ai_ActionCheckNearbyObjects(oCreature))); + return TRUE; + } + } + else + { + if(GetLocalInt(oLocked, "AI_LOCKED_" + sTag) && !bForce) return FALSE; + // Let them know we can't get this done!. + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oLocked) + " is special! It requires a special key to open."))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oLocked, "AI_LOCKED_" + sTag, TRUE); + return FALSE; + } + } + if(bForce || ai_GetAIMode(oCreature, AI_MODE_PICK_LOCKS)) + { + // We must have ranks in open locks to actually open the lock! + if(GetSkillRank(SKILL_OPEN_LOCK, oCreature, TRUE)) + { + int nSkill = GetSkillRank(SKILL_OPEN_LOCK, oCreature); + int nLockDC = GetLockUnlockDC(oLocked); + object oPicks = ai_GetBestPicks(oCreature, nLockDC); + int nPickBonus = GetLocalInt(oPicks, "AI_BONUS"); + if(AI_DEBUG) ai_Debug("0i_actions", "1497", "I have picks: " + GetName(oPicks) + + " nSkill :" + IntToString(nSkill) + " nPickBonus: " + + IntToString(nPickBonus) + " + 20 = " + + IntToString(nSkill + nPickBonus + 20) + + " nLockDC: " + IntToString(nLockDC)); + if(nSkill + 20 + nPickBonus >= nLockDC) + { + SetLocalInt(oLocked, AI_OBJECT_IN_USE, TRUE); + DelayCommand(18.0, DeleteLocalInt(oLocked, AI_OBJECT_IN_USE)); + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionWait(1.0)); + AssignCommand(oCreature, ActionUseSkill(SKILL_OPEN_LOCK, oLocked, 0, oPicks)); + AssignCommand(oCreature, ActionWait(1.0)); + // Let them know we did it! + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":44:42:26:31:35:")); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oLocked, AI_OBJECT_IN_USE))); + // Continue checking for traps, locks, and loot. + AssignCommand(oCreature, ActionDoCommand(ai_ActionCheckNearbyObjects(oCreature))); + return TRUE; + } + else if(!GetLocalInt(oLocked, "AI_LOCKED_" + sTag)) + { + // Let them know we can't get this done! + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "I'm not skilled enough to pick the lock on this " + GetName(oLocked) + "!", TRUE))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oLocked, "AI_LOCKED_" + sTag, TRUE); + return FALSE; + } + } + } + if(bForce || ai_GetAIMode(oCreature, AI_MODE_BASH_LOCKS)) + { + //AssignCommand(oCreature, ai_ClearCreatureActions()); + // Check to make sure we are not using a ranged weapon. + if(!ai_GetIsRangeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature))) + { + if(ai_CheckClassType(oCreature, CLASS_TYPE_MONK)) ai_EquipBestMonkMeleeWeapon(oCreature); + else ai_EquipBestMeleeWeapon(oCreature); + AssignCommand(oCreature, ActionWait(1.0)); + if(ai_TryImprovedPowerAttackFeat(oCreature, oLocked)) return TRUE; + if(ai_TryPowerAttackFeat(oCreature, oLocked)) return TRUE; + if(ai_TryFlurryOfBlowsFeat(oCreature, oLocked)) return TRUE; + AssignCommand(oCreature, ActionAttack(oLocked)); + return TRUE; + } + if(GetLocalInt(oLocked, "AI_LOCKED_" + sTag) && !bForce) return FALSE; + // Let them know we can't get this done!. + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "I cannot bash this " + GetName(oLocked) + " open!", TRUE))); + SetLocalInt(oLocked, "AI_LOCKED_" + sTag, TRUE); + return FALSE; + } + if(bForce || ai_GetAIMode(oCreature, AI_MODE_PICKUP_ITEMS)) + { + if(GetLocalInt(oLocked, "AI_LOCKED_" + sTag) && !bForce) return FALSE; + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oLocked) + " is locked!", TRUE))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oLocked, "AI_LOCKED_" + sTag, TRUE); + } + return FALSE; +} +int ai_AttemptToOpenDoor(object oCreature, object oDoor, int bForce = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_actions", "1542", "Attempting to open " + + GetName(oDoor) + " [AI_OBJECT_IN_USE: " + + IntToString(GetLocalInt(oDoor, AI_OBJECT_IN_USE)) + "] " + + " IsOpen: " + IntToString(GetIsOpen(oDoor)) + + " Plot: " + IntToString(GetPlotFlag(oDoor)) + "."); + if(!ai_GetAIMode(oCreature, AI_MODE_OPEN_DOORS) && !bForce) return FALSE; + if(GetLocalInt(oDoor, AI_OBJECT_IN_USE)) return FALSE; + if(GetIsOpen(oDoor)) return FALSE; + string sTag = GetTag(oCreature); + if(GetIsTrapped(oDoor)) + { + if(GetTrapDetectedBy(oDoor, GetMaster(oCreature))) SetTrapDetectedBy(oDoor, oCreature); + if(GetTrapDetectedBy(oDoor, oCreature)) + { + if(GetLocalInt(oDoor, "AI_SAW_TRAP_" + sTag)) return FALSE; + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oDoor) + " is trapped!", TRUE)); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oDoor, "AI_SAW_TRAP_" + sTag, TRUE); + return FALSE; + } + } + if(GetLocked(oDoor)) + { + if(GetLocalInt(oDoor, "AI_LOCKED_" + sTag)) return FALSE; + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oDoor) + " is locked!", TRUE))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oDoor, "AI_LOCKED_" + sTag, TRUE); + return FALSE; + } + SetLocalInt(oDoor, AI_OBJECT_IN_USE, TRUE); + DelayCommand(18.0, DeleteLocalInt(oDoor, AI_OBJECT_IN_USE)); + AssignCommand(oCreature, ActionOpenDoor(oDoor, TRUE)); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oDoor, AI_OBJECT_IN_USE))); + return TRUE; +} +void ai_ActionCheckNearbyObjects(object oCreature) +{ + if(ai_GetIsBusy(oCreature)) return; + ai_CheckNearbyObjects(oCreature); +} +int ai_CheckNearbyObjects(object oCreature) +{ + object oMaster = ai_GetPlayerMaster(oCreature); + location lMaster = GetLocation(oMaster); + int nObjectType, bIgnore; + int nFilter = OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER | OBJECT_TYPE_ITEM; + float fLockRange, fDoorRange, fLootRange, fObjectDistance; + float fTrapRange = GetLocalFloat(oCreature, AI_TRAP_CHECK_RANGE); + if(ai_GetAIMode(oCreature, AI_MODE_PICK_LOCKS) || + ai_GetAIMode(oCreature, AI_MODE_BASH_LOCKS)) fLockRange = GetLocalFloat(oCreature, AI_LOCK_CHECK_RANGE); + if(ai_GetAIMode(oCreature, AI_MODE_PICKUP_ITEMS)) fLootRange = GetLocalFloat(oCreature, AI_LOOT_CHECK_RANGE); + if(ai_GetAIMode(oCreature, AI_MODE_OPEN_DOORS)) fDoorRange = GetLocalFloat(oCreature, AI_OPEN_DOORS_RANGE); + if(AI_DEBUG && fTrapRange != 0.0) ai_Debug("0i_actions", "1579", " Checking " + FloatToString(fTrapRange, 0, 0) + " foot area for traps."); + if(AI_DEBUG && fLootRange != 0.0) ai_Debug("0i_actions", "1580", " Checking " + FloatToString(fLootRange, 0, 0) + " foot area for traps."); + if(AI_DEBUG && fLockRange != 0.0) ai_Debug("0i_actions", "1581", " Checking " + FloatToString(fLockRange, 0, 0) + " foot area for locks."); + if(AI_DEBUG && fDoorRange != 0.0) ai_Debug("0i_actions", "1582", " Checking " + FloatToString(fDoorRange, 0, 0) + " foot area for doors."); + float fLongestRange = fTrapRange; + vector vCreature = GetPositionFromLocation(GetLocation(oCreature)); + if(fLongestRange < fLootRange) fLongestRange = fLootRange; + if(fLongestRange < fLockRange) fLongestRange = fLockRange; + if(fLongestRange < fDoorRange) fLongestRange = fDoorRange; + object oObject = GetFirstObjectInShape(SHAPE_SPHERE, fLongestRange, lMaster, TRUE, nFilter); + while(oObject != OBJECT_INVALID) + { + fObjectDistance = GetDistanceBetween(oMaster, oObject); + if(AI_DEBUG) ai_Debug("0i_actions", "1651", "Checking Nearby Objects: " + + GetName(oObject) + " fDistance: " + FloatToString(fObjectDistance, 0, 2)); + if(GetTrapDetectedBy(oObject, oCreature)) + { + if(fTrapRange >= fObjectDistance) + { + if(ai_ReactToTrap(oCreature, oObject)) return TRUE; + } + } + if(GetLocked(oObject)) + { + if(fLockRange >= fObjectDistance) + { + if(ai_AttemptToByPassLock(oCreature, oObject)) return TRUE; + } + } + nObjectType = GetObjectType(oObject); + if(fDoorRange >= fObjectDistance && nObjectType == OBJECT_TYPE_DOOR) + { + if(ai_AttemptToOpenDoor(oCreature, oObject)) return TRUE; + } + if(fLootRange >= fObjectDistance) + { + if(nObjectType == OBJECT_TYPE_PLACEABLE) + { + if(!GetLocalInt(oObject, AI_OBJECT_IN_USE) && + ai_IsContainerLootable(oCreature, oObject)) + { + if(GetLocked(oObject)) + { + string sTag = GetTag(oCreature); + if(GetLocalInt(oObject, "AI_LOCKED_" + sTag)) return FALSE; + AssignCommand(oCreature, ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oObject) + " is locked!", TRUE))); + ActionDoCommand(ai_HaveCreatureSpeak(oCreature, 8, ":47:30:43:5:36:")); + SetLocalInt(oObject, "AI_LOCKED_" + sTag, TRUE); + return FALSE; + } + ai_ClearCreatureActions(); + ActionMoveToObject(oObject, TRUE); + AssignCommand(oCreature, ActionDoCommand(ai_SearchObject(oCreature, oObject, oMaster))); + return TRUE; + } + } + else if(nObjectType == OBJECT_TYPE_ITEM) + { + if(ai_ShouldIPickItUp(oCreature, oObject)) + { + ActionPickUpItem(oObject); + return TRUE; + } + } + } + oObject = GetNextObjectInShape(SHAPE_SPHERE, fLongestRange, lMaster, TRUE, nFilter); + } + return FALSE; +} +void ai_DetermineSpecialBehavior(object oCreature) +{ + object oTarget = ai_GetNearestEnemy(oCreature, 1, 7, 7, -1, -1, TRUE); + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE)) + { + if(ai_GetIsInCombat(oCreature)) ai_DoMonsterCombatRound(oTarget); + // * if not attacking, then wander. + else + { + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionRandomWalk()); + return; + } + } + else if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE)) + { + if(GetIsObjectValid(ai_GetAttackedTarget(oCreature, TRUE, TRUE))) + { + if(oTarget != OBJECT_INVALID && GetDistanceBetween(oCreature, oTarget) <= 6.0) + { + if(!GetIsFriend(oTarget)) + { + if(GetLevelByClass(CLASS_TYPE_DRUID, oTarget) == 0 && GetLevelByClass(CLASS_TYPE_RANGER, oTarget) == 0) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_coward"); + ActionMoveAwayFromObject(oTarget, TRUE, AI_RANGE_LONG); + } + } + } + } + else if(!IsInConversation(OBJECT_SELF)) + { + AssignCommand(oCreature, ai_ClearCreatureActions()); + AssignCommand(oCreature, ActionRandomWalk()); + return; + } + } +} +//This function is used only because ActionDoCommand can only accept void functions +void ai_CreateSignPostNPC(string sTag, location lLocal) +{ + CreateObject(OBJECT_TYPE_CREATURE, sTag, lLocal); +} +void ai_ActivateFleeToExit(object oCreature) +{ + //minor optimizations - only grab these variables when actually needed + //can make for larger code, but it's faster + //object oExitWay = GetWaypointByTag("EXIT_" + GetTag(OBJECT_SELF)); + //location lLocal = GetLocalLocation(OBJECT_SELF, "NW_GENERIC_START_POINT"); + //string sTag = GetTag(OBJECT_SELF); + int nPlot = GetLocalInt(oCreature, "NW_GENERIC_MASTER"); + if(nPlot & NW_FLAG_TELEPORT_RETURN || nPlot & NW_FLAG_TELEPORT_LEAVE) + { + effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature); + if(nPlot & NW_FLAG_TELEPORT_RETURN) + { + location lLocal = GetLocalLocation(oCreature, "NW_GENERIC_START_POINT"); + string sTag = GetTag(oCreature); + DelayCommand(6.0, AssignCommand(oCreature, ActionDoCommand(ai_CreateSignPostNPC(sTag, lLocal)))); + } + AssignCommand(oCreature, ActionDoCommand(DestroyObject(oCreature, 0.75))); + } + else + { + if(nPlot & NW_FLAG_ESCAPE_LEAVE) + { + object oExitWay = GetWaypointByTag("EXIT_" + GetTag(oCreature)); + ActionMoveToObject(oExitWay, TRUE); + AssignCommand(oCreature, ActionDoCommand(DestroyObject(oCreature, 1.0))); + } + else if(nPlot & NW_FLAG_ESCAPE_RETURN) + { + string sTag = GetTag(oCreature); + object oExitWay = GetWaypointByTag("EXIT_" + sTag); + ActionMoveToObject(oExitWay, TRUE); + location lLocal = GetLocalLocation(oCreature, "NW_GENERIC_START_POINT"); + DelayCommand(6.0, AssignCommand(oCreature, ActionDoCommand(ai_CreateSignPostNPC(sTag, lLocal)))); + AssignCommand(oCreature, ActionDoCommand(DestroyObject(oCreature, 1.0))); + } + } +} +int ai_GetFleeToExit(object oCreature) +{ + int nPlot = GetLocalInt(oCreature, "NW_GENERIC_MASTER"); + if(nPlot & NW_FLAG_ESCAPE_RETURN) return TRUE; + else if(nPlot & NW_FLAG_ESCAPE_LEAVE) return TRUE; + else if(nPlot & NW_FLAG_TELEPORT_RETURN) return TRUE; + else if(nPlot & NW_FLAG_TELEPORT_LEAVE) return TRUE; + return FALSE; +} +void ai_ActionInitialization() +{ + SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); + SetAnimationCondition(NW_ANIM_FLAG_INITIALIZED); + SetLocalLocation(OBJECT_SELF, "ANIM_START_LOCATION", GetLocation(OBJECT_SELF)); +} +// Start interacting with a placeable object +void ai_ActionStartInteracting(object oPlaceable) +{ + SetAnimationCondition(NW_ANIM_FLAG_IS_INTERACTING); + ActionMoveToObject(oPlaceable, FALSE, DISTANCE_TINY); + ActionDoCommand(SetFacingPoint(GetPosition(oPlaceable))); + SetCurrentInteractionTarget(oPlaceable); + AnimActionPlayRandomInteractAnimation(oPlaceable); +} + +void ai_ActionStopInteracting() +{ + AnimActionRandomMoveAway(GetCurrentInteractionTarget(), DISTANCE_LARGE); + SetCurrentInteractionTarget(OBJECT_INVALID); + SetAnimationCondition(NW_ANIM_FLAG_IS_INTERACTING, FALSE); + AnimActionTurnAround(); + AnimActionPlayRandomAnimation(); +} + +// Start talking with a friend +void ai_ActionStartTalking(object oFriend, int nHDiff=0) +{ + object oMe = OBJECT_SELF; + ActionMoveToObject(oFriend, FALSE, DISTANCE_TINY); + AnimActionPlayRandomGreeting(nHDiff); + AssignCommand(oFriend, ActionMoveToObject(oMe, FALSE, DISTANCE_TINY)); + AssignCommand(oFriend, AnimActionPlayRandomGreeting(0 - nHDiff)); + SetCurrentFriend(oFriend); + AssignCommand(oFriend, SetCurrentFriend(oMe)); + ActionDoCommand(SetFacingPoint(GetPosition(oFriend))); + AssignCommand(oFriend, ActionDoCommand(SetFacingPoint(GetPosition(oMe)))); + SetAnimationCondition(NW_ANIM_FLAG_IS_TALKING); + SetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, TRUE, oFriend); +} +void ai_ActionStopTalking(object oFriend, int nHDiff=0) +{ + object oMe = OBJECT_SELF; + AnimActionPlayRandomGoodbye(nHDiff); + AnimActionRandomMoveAway(oFriend, DISTANCE_LARGE); + AssignCommand(oFriend, AnimActionPlayRandomGoodbye(0 - nHDiff)); + AssignCommand(oFriend, AnimActionRandomMoveAway(oMe, DISTANCE_HUGE)); + SetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, FALSE); + SetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, FALSE, oFriend); +} +object ai_GetRandomFriend(float fMaxDistance) +{ + object oCreature = OBJECT_SELF; + location lStartLocation = GetLocalLocation(oCreature, "ANIM_START_LOCATION"); + object oFriend = GetNearestCreature(CREATURE_TYPE_REPUTATION, + REPUTATION_TYPE_FRIEND, + oCreature, d2(), + CREATURE_TYPE_PERCEPTION, + PERCEPTION_SEEN); + //SendMessageToPC(GetFirstPC(), " 0i_actions, 1748 oFriend: " + GetName(oFriend) + + // " AnimationCondition: " + IntToString(GetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE, oFriend)) + + // " Conversation: " + IntToString(IsInConversation(oFriend)) + + // " Combat: " + IntToString(GetIsInCombat(oFriend)) + + // " Distance: " + FloatToString(GetDistanceBetweenLocations(GetLocation(oFriend), lStartLocation), 0,0 )); + if(fMaxDistance > 20.0) fMaxDistance = 20.0; + if(GetIsObjectValid(oFriend) + && !GetIsPC(oFriend) + && !GetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, oFriend) + && !IsInConversation(oFriend) + && !GetIsInCombat(oFriend) + && GetDistanceBetweenLocations(GetLocation(oFriend), lStartLocation) <= fMaxDistance) + { + return oFriend; + } + + return OBJECT_INVALID; +} +int ai_ActionFindFriend(float fMaxDistance) +{ + // Try and find a friend to talk to. + object oFriend = ai_GetRandomFriend(fMaxDistance); + //SendMessageToPC(GetFirstPC(), GetName(oFriend) + " TALKING: " + IntToString(GetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, oFriend))); + if(GetIsObjectValid(oFriend) && !GetAnimationCondition(NW_ANIM_FLAG_IS_TALKING, oFriend)) + { + int nHDiff = GetHitDice(OBJECT_SELF) - GetHitDice(oFriend); + ai_ActionStartTalking(oFriend, nHDiff); + return TRUE; + } + return FALSE; +} +object ai_GetRandomObjectbyTag(string sTag, float fMaxDistance) +{ + int nIndex; + if(fMaxDistance < DISTANCE_MEDIUM) nIndex = d4(); + else if (fMaxDistance < DISTANCE_HUGE) nIndex = d8(); + else nIndex = d10(); + location lStartLocation = GetLocalLocation(OBJECT_SELF, "ANIM_START_LOCATION"); + if(fMaxDistance > 20.0) fMaxDistance = 20.0; + object oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lStartLocation, nIndex); + while(nIndex > 0) + { + if(GetTag(oObject) == sTag && + GetDistanceBetweenLocations(GetLocation(oObject), lStartLocation) <= fMaxDistance) break; + oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lStartLocation, --nIndex); + } + if(GetIsObjectValid(oObject)) + return oObject; + return OBJECT_INVALID; +} +int ai_ActionSitInChair(float fMaxDistance) +{ + object oChair = GetRandomObjectByTag("Chair", fMaxDistance); + if (GetIsObjectValid(oChair) && + !GetIsObjectValid(GetSittingCreature(oChair))) + { + ActionSit(oChair); + SetAnimationCondition(NW_ANIM_FLAG_IS_INTERACTING); + return TRUE; + } + return FALSE; +} +object ai_GetRandomUseableObject(float fMaxDistance) +{ + int nIndex; + if(fMaxDistance < DISTANCE_MEDIUM) nIndex = d2(); + else if (fMaxDistance < DISTANCE_HUGE) nIndex = d4(); + else nIndex = d6(); + location lStartLocation = GetLocalLocation(OBJECT_SELF, "ANIM_START_LOCATION"); + if(fMaxDistance > 20.0) fMaxDistance = 20.0; + object oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lStartLocation, nIndex); + while(nIndex > 0) + { + if(GetUseableFlag(oObject) && !GetLocked(oObject) && + GetDistanceBetweenLocations(GetLocation(oObject), lStartLocation) <= fMaxDistance) break; + oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lStartLocation, --nIndex); + } + if(GetIsObjectValid(oObject)) + return oObject; + return OBJECT_INVALID; +} +int ai_ActionFindPlaceable(float fMaxDistance) +{ + object oPlaceable = ai_GetRandomUseableObject(fMaxDistance); + if(GetIsObjectValid(oPlaceable)) + { + ai_ActionStartInteracting(oPlaceable); + return 1; + } + return 0; +} +int ai_ActionCheckDoor(float fMaxDistance) +{ + int nIndex = 1; + object oCreature = OBJECT_SELF; + location lStartLocation = GetLocalLocation(oCreature, "ANIM_START_LOCATION"); + if(fMaxDistance > 20.0) fMaxDistance = 20.0; + object oDoor = GetNearestObject(OBJECT_TYPE_DOOR, oCreature); + while(oDoor != OBJECT_INVALID) + { + if(GetDistanceBetweenLocations(GetLocation(oDoor), lStartLocation) <= fMaxDistance) + { + // Make sure everyone doesn't run to close or open the same door. + if(!GetLocalInt(oDoor, "DOOR_INTERACTION")) + { + if(GetIsOpen(oDoor)) + { + //SendMessageToPC(GetFirstPC(), GetName(oCreature) + + // " Closing " + GetName(oDoor) + "."); + SetLocalInt(oDoor, "DOOR_INTERACTION", TRUE); + ActionCloseDoor(oDoor); + AssignCommand(oDoor, ActionDoCommand(SetLocalInt(oDoor, "DOOR_INTERACTION", FALSE))); + return TRUE; + } + else if(GetLocalInt(GetModule(), AI_RULE_OPEN_DOORS)) + { + //SendMessageToPC(GetFirstPC(), GetName(oDoor) + " Locked: " + + // IntToString(GetLocked(oDoor)) + " Trapped: " + + // IntToString(GetIsTrapped(oDoor)) + + // " Plot: " + IntToString(GetPlotFlag(oDoor))); + if(!GetLocked(oDoor) && + !GetIsTrapped(oDoor) && + !GetPlotFlag(oDoor)) + { + //SendMessageToPC(GetFirstPC(), GetName(oCreature) + + // " Opening " + GetName(oDoor) + "."); + SetLocalInt(oDoor, "DOOR_INTERACTION", TRUE); + ActionOpenDoor(oDoor); + // If a door has been opened lets not go right behind and close for a minute. + DelayCommand(60.0, SetLocalInt(oDoor, "DOOR_INTERACTION", FALSE)); + return TRUE; + } + } + } + } + oDoor = GetNearestObject(OBJECT_TYPE_DOOR, oCreature, ++nIndex); + } + return FALSE; +} +int ai_ActionInteraction() +{ + // If we're talking, either keep going or stop. + // Low prob of stopping, since both parties have + // a chance and conversations are cool. + if(GetAnimationCondition(NW_ANIM_FLAG_IS_TALKING)) + { + object oFriend = GetCurrentFriend(); + //SendMessageToPC(GetFirstPC(), GetName(OBJECT_SELF) + " Is talking to " + GetName(oFriend)); + int nHDiff = GetHitDice(OBJECT_SELF) - GetHitDice(oFriend); + if(Random(100) < 20) + { + //SendMessageToPC(GetFirstPC(), GetName(OBJECT_SELF) + " I'm done talking!"); + ai_ActionStopTalking(oFriend, nHDiff); + return TRUE; + } + AnimActionPlayRandomTalkAnimation(nHDiff); + return TRUE; + } + // If we're interacting with a placeable, either keep going or stop. + // High probability of stopping, since looks silly to + // constantly turn something on-and-off. + if(GetAnimationCondition(NW_ANIM_FLAG_IS_INTERACTING)) + { + //SendMessageToPC(GetFirstPC(), GetName(OBJECT_SELF) + " Is interacting."); + if(Random(100) < 40) + { + //SendMessageToPC(GetFirstPC(), GetName(OBJECT_SELF) + " I'm done interacting!"); + ai_ActionStopInteracting(); + return TRUE; + } + AnimActionPlayRandomInteractAnimation(GetCurrentInteractionTarget()); + return TRUE; + } + return FALSE; +} +location ai_GetWalkingLocation(object oSource, float fDistance) +{ + location lStart = GetLocation(oSource); + // Try to move in a north/south/east/west direction that will allow better + // movement around the map! + float fFacing = GetFacing(oSource); + if(Random(100) < 25) fFacing = IntToFloat(Random(360)); + float fAngle; + if(fFacing > 315.0 || fFacing < 45.0) fAngle = DIRECTION_EAST; + else if(fFacing < 135.0) fAngle = DIRECTION_NORTH; + else if(fFacing < 225.0) fAngle = DIRECTION_WEST; + else fAngle = DIRECTION_SOUTH; + fAngle += IntToFloat(Random(20) - 10); + float fOrientation = fAngle; + return GenerateNewLocationFromLocation(lStart, fDistance, fAngle, fOrientation); +} +void ai_ActionRandomWalk(float fMaxDistance) +{ + // If we stay within our alloted distance then we can walk to the new location. + location lStartLocation = GetLocalLocation(OBJECT_SELF, "ANIM_START_LOCATION"); + int nRandom = FloatToInt(fMaxDistance); + if(nRandom > 20) nRandom = 20; + float fRandom = IntToFloat(Random(nRandom) + 1); + location lNewLocation = ai_GetWalkingLocation(OBJECT_SELF, fRandom); + if(AI_DEBUG) ai_Debug("0i_actions", "2092", GetName(OBJECT_SELF) + " is walking " + + FloatToString(GetDistanceBetweenLocations(lNewLocation, lStartLocation), 0, 0) + + " distance of fMaxDistance: " + FloatToString(fMaxDistance, 0, 0)); + ActionMoveToLocation(lNewLocation); +} +void ai_Actions() +{ + float fMaxDistance = GetLocalFloat(GetModule(), AI_RULE_WANDER_DISTANCE); + // Are we interacting? If so continue else see what else there is to do. + if(ai_ActionInteraction()) return; + // If we got here, we're not busy + ClearAllActions(); + // Check for chance to do an action to keep things interesting. + int nRoll = Random(100); + if(fMaxDistance < 2.0) + { + if(nRoll < 51) AnimActionPlayRandomAnimation(); + return; + } + int nRace = GetRacialType(OBJECT_SELF); + if(nRace != RACIAL_TYPE_ABERRATION && nRace != RACIAL_TYPE_ANIMAL && + nRace != RACIAL_TYPE_BEAST && nRace != RACIAL_TYPE_MAGICAL_BEAST && + nRace != RACIAL_TYPE_OOZE && nRace != RACIAL_TYPE_VERMIN) + { + if(nRoll < 5) if(ai_ActionSitInChair(fMaxDistance)) return; + // Open or close a door + if(nRoll < 20) if(ai_ActionCheckDoor(fMaxDistance)) return; + // Fiddle with a placeable + if(nRoll < 40) if(ai_ActionFindPlaceable(fMaxDistance)) return; + // Start talking to a friend + if(nRoll < 50) if(ai_ActionFindFriend(fMaxDistance)) return; + } + // Lets walk around. + if(nRoll < 80) + { + ai_ActionRandomWalk(fMaxDistance); + return; + } + // If we find nothing interesting to do then just stay put and look interesting. + AnimActionPlayRandomAnimation(); +} +int ai_CheckCurrentAction() +{ + int nAction = GetCurrentAction(); + if(nAction == ACTION_SIT) + { + // low prob of getting up, so we don't bop up and down constantly + if (Random(10) == 0) + { + AnimActionGetUpFromChair(); + return TRUE; + } + } + else if(nAction != ACTION_INVALID) + { + // Sometimes we cannot do an action so lets break out sometimes. + if((nAction == ACTION_CLOSEDOOR || + nAction == ACTION_OPENDOOR || + nAction == ACTION_MOVETOPOINT) && Random(100) < 20) return FALSE; + // we're doing *something*, don't switch + //AnimDebug("performing action"); + return TRUE; + } + return FALSE; +} +void ai_AmbientAnimations() +{ + if(!GetAnimationCondition(NW_ANIM_FLAG_INITIALIZED)) ai_ActionInitialization(); + // Check if we should turn off + if(!CheckIsAnimActive(OBJECT_SELF)) return; + // Check current actions so we don't interrupt something in progress + if(ai_CheckCurrentAction()) return; + // First check: go back to starting position and rest if we are hurt + //if(AnimActionRest()) return; + // If we get here then lets go see what we can do! + ai_Actions(); +} diff --git a/_module/nss/0i_associates.nss b/_module/nss/0i_associates.nss new file mode 100644 index 00000000..23091603 --- /dev/null +++ b/_module/nss/0i_associates.nss @@ -0,0 +1,2192 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0i_associates + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Scripts used for Associates. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +#include "nw_inc_gff" +// Return TRUE if oCreature can attack based on current modes and actions. +int ai_CanIAttack(object oCreature); +// Returns the nearest locked object from oMaster. +object ai_GetNearestLockedObject(object oCreature); +// Will look for the oTarget or go to the oSpeaker depending on the situation. +void ai_FindTheEnemy(object oCreature, object oSpeaker, object oTarget, int bMonster); +// Selects the correct response base on nCommand from oCommander. +// These are given from either a radial menu option or voice command. +void ai_SelectAssociateCommand(object oCreature, object oCommander, int nCommand); +// Set nAction for the caller to pass to their associates. i.e. For henchmans summons. +void ai_PassActionToAssociates(object oCreature, int nAction, int bStatus = TRUE); +// Set Set the AI Mode to oAssociate and their associates. +void ai_PassAIModeToAssociates(object oAssociate, int nAIMode, int bStatus = TRUE); +// Set oCreature's ai scripts based on its first class or the variable "AI_DEFAULT_SCRIPT". +// bSetBasicAIScript set to TRUE will skip defensive and ambush tactic type scripts. +void ai_SetAssociateAIScript(object oCreature, int bCheckTacticScripts = TRUE); +// Returns TRUE if oCreature can speak. +int ai_CanISpeak(object oCreature); +// Cleansup any henchman actions and then removes them from the PC's faction. +void ai_FireHenchman(object oPC, object oHenchman); +// Will cast defensive spells (Buffs) on oPC's party from oCreature. +void ai_HenchmanCastDefensiveSpells(object oCreature, object oPC); +// Returns TRUE if we are starting combat due to an enemy being near. +// This should be checked after any "is in combat" checks. +int ai_CheckForCombat(object oCreature, int bMonster); +// Checks all perceived creatures to see if we should calculate a combat round +// or start combat for Associates. +void ai_AssociateEvaluateNewThreat(object oCreature, object oLastPerceived, string sPerception); +// Checks all perceived creatures to see if we should calculate a combat round +// or start combat for Monsters. +void ai_MonsterEvaluateNewThreat(object oCreature, object oLastPerceived, string sPerception); +// Copies all int, float, and string variables from oOldObject to oNewObject. +void ai_CopyObjectVariables(object oOldObject, object oNewObject); +//****************************************************************************** +//********************* Creature event scripts ********************************* +//****************************************************************************** + +// Add to nw_ch_aca OnRested event script of henchman. +void ai_OnRested(object oCreature); + +//****************************************************************************** +//******************* Associate AI option scripts ****************************** +//****************************************************************************** + +// Increments/Decrements the following distance of associates. +void ai_FollowIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType); +// Turns on/off Ranged combat for oAssociate. +void ai_Ranged(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Ignore enemy associates for oAssociate. +void ai_Ignore_Associates(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Ignore floor traps for oAssociate. +void ai_Ignore_Traps(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Search for oAssociate. +void ai_Search(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Stealth for oAssociate. +void ai_Stealth(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Open Doors for oAssociate. +void ai_OpenDoor(object oPC, object oAssociate, string sAssociateType); +// Turns on/off Picking/Bashing locks for oAssociate. +void ai_Locks(object oPC, object oAssociate, string sAssociateType, int nMode); +// Turns on/off Disarming of Traps for oAssociate. +void ai_Traps(object oPC, object oAssociate, string sAssociateType); +// Turns on/off the amount of speaking for oAssociate. +void ai_ReduceSpeech(object oPC, object oAssociate, string sAssociateType); +// Turns on/off use of offensive/defensive spells. +void ai_UseOffensiveMagic(object oPC, object oAssociate, int bDefensive, int bOffensive, string sAssociateType); +// Turns on/off magic use. +void ai_UseMagic(object oPC, object oAssociate, string sAssociateType); +// Turn Magic Item use on/off for oAssociates. +void ai_UseMagicItems(object oPC, object oAssociate, string sAssociateType); +// Adjusts loot options for oAssociate +void ai_Loot(object oPC, object oAssociate, string sAssociateType); +// Adjust loot options for oAssociate +void ai_Spontaneous(object oPC, object oAssociate, string sAssociateType); +// Increments/Decrements the magic use variable for the AI. +void ai_MagicIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType); +// Increments/Decrements the Loot Range use variable for the AI. +void ai_LootRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType); +// Increments/Decrements the Lock Range use variable for the AI. +void ai_LockRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType); +// Increments/Decrements the Trap Range use variable for the AI. +void ai_TrapRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType); +// Increments/Decrements the Open Door Range use variable for the AI. +void ai_OpenDoorIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType); +// Saves a new AI script for oAssociate. +void ai_SaveAIScript(object oPC, object oAssociate, int nToken); +// Button action for buffing a PC. +void ai_Buff_Button(object oPC, object oAssociate, int nOption, string sAssociateType); +// Button action for setting healing ranges. +void ai_Heal_Button(object oPC, object oAssociate, int nIncrement, string sVar, string sAssociateType); +// Button action for turning healing on/off. +void ai_Heal_OnOff(object oPC, object oAssociate, string sAssociateType, int nMode); +// Button action for selecting a target to follow. +void ai_FollowTarget(object oPC, object oAssociate); +// Code to make oCreature guard oMaster. +void ai_Philos_Guard(object oMaster, object oCreature); +// Code to make OBJECT_SELF follow oMaster. +void ai_Philos_Follow(object oMaster); +// Code to make OBJECT_SELF hold at their location. +void ai_Philos_StandGround(object oMaster); +// Code to make oCreature attack the nearest enemy. +void ai_Philos_AttackNearest(object oMaster, object oCreature); +// Code to make oCreature turn search mode on. +void ai_Philos_SetSearch(object oMaster, object oCreature, string sAssociateType, int bTurnOn); +// Code to make oCreature turn stealth mode on. +void ai_Philos_SetStealth(object oMaster, object oCreature, string sAssociateType, int bTurnOn); +// Button action for giving commands to associates. +void ai_DoCommand(object oPC, object oAssociate, int nCommand); +// Button action to have associate do an action based on the target via OnPlayer Target event. +void ai_Action(object oPC, object oAssociate); +// Toggles between normal ai script and special tactic ai scripts. +void ai_AIScript(object oPC, object oAssociate, string sAssociate, int nToken); +// Has the PC select a Trap and then place it on the ground from an associate. +void ai_HavePCPlaceTrap(object oPC, object oAssociate); +// Jumps oAssociate to oPC, if oPC == oAssociate it jumps all oAssocites to oPC. +void ai_JumpToPC(object oPC, object oAssociate); +// Allow oAssociate to use no clipping. +void ai_GhostMode(object oPC, object oAssociate, int nToken, string sAssociateType); +// Changes the camera view from either the player to the associate or back. +void ai_ChangeCameraView(object oPC, object oAssociate); +// Checks that the oAssociate is within sight and then opens the inventory. +void ai_OpenInventory(object oAssociate, object oPC); +// Executes an installed plugin. +void ai_Plugin_Execute(object oPC, string sElem, int bUser = 0); + +int ai_CanIAttack(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_associate", "122", "Can I attack? Hold mode: " + + IntToString(ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND)) + + " Follow mode: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_FOLLOW)) + + " Action (19/4): " + IntToString(GetCurrentAction(oCreature))); + if(ai_GetIsCharacter(oCreature)) return TRUE; + int nAction = GetCurrentAction(oCreature); + return (!ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND) && + !ai_GetAIMode(oCreature, AI_MODE_FOLLOW) && + nAction != ACTION_ITEMCASTSPELL && + nAction != ACTION_CASTSPELL); +} +object ai_GetNearestLockedObject(object oCreature) +{ + int nCnt = 1; + object oMaster = GetMaster(oCreature); + float fRange = GetLocalFloat(oCreature, AI_TRAP_CHECK_RANGE); + location lCreature = GetLocation(oCreature); + object oObject = GetNearestObjectToLocation(OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, lCreature, nCnt); + while (oObject != OBJECT_INVALID || GetDistanceBetween(oMaster, oObject) > fRange) + { + if(GetLocked(oObject) && ai_GetIsInLineOfSight(oMaster, oObject)) return oObject; + oObject = GetNearestObjectToLocation(OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, lCreature, ++nCnt); + } + return OBJECT_INVALID; +} +void ai_FindTheEnemy(object oCreature, object oSpeaker, object oTarget, int bMonster) +{ + if(GetLocalInt(oCreature, AI_AM_I_SEARCHING)) return; + if(oSpeaker == oTarget && d100() < 34) + { + // Let them know we heard something in the distance!. + if(!ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) + { + string sSpeak = "I heard something!"; + int nRoll = d8(); + if(nRoll == 1) sSpeak = "Did you hear that?"; + if(nRoll == 2) sSpeak = "What was that noise?"; + if(nRoll == 3) sSpeak = "Something is moving."; + if(nRoll == 4) sSpeak = "Lookout! I heard a noise."; + if(nRoll == 5) sSpeak = "Listen! We have company."; + AssignCommand(oCreature, ai_HaveCreatureSpeak(oCreature, 0, sSpeak)); + } + ai_HaveCreatureSpeak(oCreature, 8, ":43:6:9:10:23:42:"); + } + if(GetLocalString(oCreature, AI_COMBAT_SCRIPT) == "ai_a_peaceful" || + GetLocalString(oCreature, AI_COMBAT_SCRIPT) == "ai_coward") return; + float fDistance, fPerceptionDistance; + if(bMonster) + { + // Check distance from the creature hearing this and the target. + fDistance = GetDistanceBetween(oCreature, oTarget); + fPerceptionDistance = GetLocalFloat(GetModule(), AI_RULE_PERCEPTION_DISTANCE); + } + else + { + // We want to use the distance between the PC and target not us. + fDistance = GetDistanceBetween(GetMaster(), oTarget); + fPerceptionDistance = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + } + if(AI_DEBUG) ai_Debug("0i_associates", "175", " fDistance: " + FloatToString(fDistance, 0, 2) + + " fPerceptionDistance: " + FloatToString(fPerceptionDistance, 0, 2) + + " Hiding? " + IntToString(GetStealthMode(oTarget))); + if(fDistance <= fPerceptionDistance) + { + SetLocalInt(oCreature, AI_AM_I_SEARCHING, TRUE); + if(LineOfSightObject(oCreature, oTarget)) + { + if(fDistance > AI_RANGE_CLOSE) + { + int bMoveForward = TRUE; + // We check this because if the enemy is moving or has not + // started acting then we don't want to move up on them as they + // might move towards us! Just attack! Only sneak attack if they are busy. + int nAction = GetCurrentAction(oTarget); + if(AI_DEBUG) ai_Debug("0i_associates", "189", GetName(oTarget) + " current action: " + IntToString(nAction)); + if(nAction == ACTION_MOVETOPOINT || + nAction == ACTION_INVALID || + nAction == ACTION_RANDOMWALK) bMoveForward = FALSE; + // If they are attacking make sure it is in melee? + // If not then don't move since they might be moving toward us. + if(nAction == ACTION_ATTACKOBJECT) + { + if(!ai_GetNumOfEnemiesInRange(oTarget)) bMoveForward = FALSE; + } + if(bMoveForward) + { + if(AI_DEBUG) ai_Debug("0i_associates", "201", "Running towards combat to engage " + GetName(oTarget)); + ActionMoveToObject(oTarget, TRUE, AI_RANGE_CLOSE); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING))); + return; + } + if(AI_DEBUG) ai_Debug("0i_associates", "207", "Searching for " + GetName(oTarget) + " while moving towards " + GetName(oSpeaker)); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + ActionMoveToObject(oSpeaker); + return; + } + if(AI_DEBUG) ai_Debug("0i_associates", "176", "Moving and searching for " + GetName(oTarget)); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + ActionMoveToLocation(GetLocation(oTarget), FALSE); + //ActionMoveToObject(oTarget, FALSE, AI_RANGE_MELEE); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING))); + return; + } + if(AI_DEBUG) ai_Debug("0i_associates", "218", "No line of sight for " + GetName(oTarget) + ". Moving towards " + GetName(oSpeaker)); + ActionMoveToObject(oSpeaker, TRUE); + AssignCommand(oCreature, ActionDoCommand(DeleteLocalInt(oCreature, AI_AM_I_SEARCHING))); + } + +} +void ai_ReactToAssociate(object oCreature, object oCommander, int bMonster) +{ + object oTarget = GetLocalObject(oCommander, AI_MY_TARGET); + if (oTarget == OBJECT_INVALID) return; + if(ai_GetIsInCombat(oCreature)) + { + if(oCommander == GetMaster(oCreature) && ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) + { + ai_DoAssociateCombatRound(oCreature, oTarget); + } + else ai_DoAssociateCombatRound(oCreature); + return; + } + ai_FindTheEnemy(oCreature, oCommander, oTarget, bMonster); +} +void ai_SelectAssociateCommand(object oCreature, object oCommander, int nCommand) +{ + object oMaster = GetMaster(oCreature); + // These nCommands can be issued even when the caller is busy. + switch(nCommand) + { + // Master is being attacked by the enemy. + case ASSOCIATE_COMMAND_MASTERGOINGTOBEATTACKED: + { + object oAttacker = GetGoingToBeAttackedBy(oMaster); + if(AI_DEBUG) ai_Debug("0i_associate", "120", GetName(oMaster) + " has been attack by " + + GetName(GetGoingToBeAttackedBy(oMaster)) + "!"); + // Used to set who monsters are attacking. + int nAction = GetCurrentAction(oAttacker); + if(nAction == ACTION_ATTACKOBJECT) SetLocalObject(oAttacker, AI_ATTACKED_PHYSICAL, oMaster); + else if(nAction == ACTION_CASTSPELL || nAction == ACTION_ITEMCASTSPELL) + { + SetLocalObject(oAttacker, AI_ATTACKED_SPELL, oMaster); + } + if(!ai_GetIsBusy(oCreature) && ai_CanIAttack(oCreature)) + { + if(ai_GetIsInCombat(oCreature)) ai_DoAssociateCombatRound(oCreature); + else ai_FindTheEnemy(oCreature, oCommander, oAttacker, FALSE); + } + return; + } + // Menu used by a player to have the henchman follow them. + case ASSOCIATE_COMMAND_FOLLOWMASTER: + { + if(AI_DEBUG) ai_Debug("0i_associate", "135", GetName(oMaster) + " has commanded " + + GetName(oCreature) + " to FOLLOW."); + AssignCommand(oCreature, ai_Philos_Follow(oMaster)); + return; + } + // Menu used by a player to have the henchman go into NORMAL MODE. + // We also attack the nearest, this keeps henchman going into combat quickly. + case ASSOCIATE_COMMAND_ATTACKNEAREST: + { + if(AI_DEBUG) ai_Debug("0i_associates", "158", GetName(oMaster) + " has commanded " + + GetName(oCreature) + " to attack nearest(NORMAL MODE)."); + ai_Philos_AttackNearest(oMaster, oCreature); + return; + } + // Menu used by a player to have the henchman stay where they are standing. + case ASSOCIATE_COMMAND_STANDGROUND: + { + if(AI_DEBUG) ai_Debug("0i_associate", "189", GetName(oMaster) + " has commanded " + + GetName(OBJECT_SELF) + " to STANDGROUND."); + AssignCommand(oCreature, ai_Philos_StandGround(oMaster)); + return; + } + // Menu used by a player to have the henchman attack anyone who attacks them. + case ASSOCIATE_COMMAND_GUARDMASTER: + { + if(AI_DEBUG) ai_Debug("0i_associate", "211", GetName(oMaster) + " has commanded " + + GetName(oCreature) + " to GAURDMASTER."); + ai_Philos_Guard(oMaster, oCreature); + return; + } + // Menu used by a player to have the henchman heal them as soon as possible. + case ASSOCIATE_COMMAND_HEALMASTER: + { + // Player will be stuck with this variable if they are not using the AI. + DeleteLocalInt(oCommander, "AI_I_AM_BEING_HEALED"); + if(ai_GetIsInCombat(oCreature)) ai_TryHealingTalent(oCreature, ai_GetNumOfEnemiesInRange(oCreature), oCommander); + else AssignCommand(oCreature, ai_ActionTryHealing(oCreature, oCommander)); + return; + } + // Menu used by a player to toggle a henchmans casting options. + case ASSOCIATE_COMMAND_TOGGLECASTING: + { + if(ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) + { + ai_SetMagicMode(oCreature, AI_MAGIC_NO_MAGIC, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING, TRUE); + ai_SetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING, FALSE); + ai_SendMessages(GetName(oCreature) + " will now cast defensive spells only.", AI_COLOR_GRAY, oCommander); + } + else if(ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + ai_SetMagicMode(oCreature, AI_MAGIC_NO_MAGIC, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING, TRUE); + ai_SendMessages(GetName(oCreature) + " will now cast offensive spells only.", AI_COLOR_GRAY, oCommander); + } + else if(ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + ai_SetMagicMode(oCreature, AI_MAGIC_NO_MAGIC, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING, FALSE); + ai_SendMessages(GetName(oCreature) + " will now cast any spell.", AI_COLOR_GRAY, oCommander); + } + else + { + ai_SetMagicMode(oCreature, AI_MAGIC_NO_MAGIC, TRUE); + ai_SetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING, FALSE); + ai_SetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING, FALSE); + ai_SendMessages(GetName(oCreature) + " will not use any magic.", AI_COLOR_GRAY, oCommander); + } + aiSaveAssociateModesToDb(oMaster, oCreature); + return; + } + } + // If we are busy then these nCommands are ignored. + if(!ai_GetIsBusy(oCreature)) + { + // Respond to shouts from friendly non-PCs only. + if (ai_CanIAttack(oCreature)) + { + if(nCommand == AI_ALLY_IS_WOUNDED) + { + if(ai_TryHealing(oCreature, oCommander)) return; + } + else if(nCommand == AI_ALLY_IS_DISEASED || + nCommand == AI_ALLY_IS_POISONED || + nCommand == AI_ALLY_IS_WEAK) + { + if(ai_HealSickness(oCreature, oCommander, oMaster, nCommand)) return; + } + // A friend sees an enemy. If we are not in combat lets seek them out too! + else if(nCommand == AI_ALLY_SEES_AN_ENEMY || + nCommand == AI_ALLY_HEARD_AN_ENEMY) + { + if(AI_DEBUG) ai_Debug("0i_associates", "282", GetName(oCreature) + " receives notice that " + + GetName(oCommander) + " has seen1/heard2(" + IntToString(nCommand) + " an enemy: " + + GetName(GetLocalObject(oCommander, AI_MY_TARGET)) + "!"); + ai_ReactToAssociate(oCreature, oCommander, FALSE); + return; + } + // A friend is in combat. Make some checks to see if we should help. + else if(nCommand == AI_ALLY_ATKED_BY_WEAPON || + nCommand == AI_ALLY_ATKED_BY_SPELL) + { + if(AI_DEBUG) ai_Debug("0i_associates", "291", GetName(oCreature) + " receives notice that " + + GetName(oCommander) + " was attacked by an enemy!" + + GetName(GetLocalObject(oCommander, AI_MY_TARGET)) + "!"); + ai_ReactToAssociate(oCreature, oCommander, FALSE); + return; + } + else if(nCommand == AI_ALLY_IS_DEAD) + { // Nothing at the moment. + if(AI_DEBUG) ai_Debug("0i_associates", "298", GetName(oCreature) + " receives notice that " + + GetName(oCommander) + " has died!"); + return; + } + } + switch(nCommand) + { + case ASSOCIATE_COMMAND_MASTERATTACKEDOTHER: + { + if(AI_DEBUG) ai_Debug("0i_associate", "307", GetName(oMaster) + " has attacked!"); + if(ai_CanIAttack(oCreature)) + { + if(ai_GetIsInCombat(oCreature)) ai_DoAssociateCombatRound(oCreature); + else ai_FindTheEnemy(oCreature, oCommander, ai_GetAttackedTarget(oCommander, TRUE, TRUE), FALSE); + } + return; + } + // Master tried to open a door or chest that is locked. + case ASSOCIATE_COMMAND_MASTERFAILEDLOCKPICK: + { + // In command mode we let the player tell us what to do. + if(ai_CanIAttack(oCreature)) + { + object oLock = ai_GetNearestLockedObject(oMaster); + //Check and see if our master want's us to open locks. + if(ai_GetAIMode(oCreature, AI_MODE_PICK_LOCKS) || + ai_GetAIMode(oCreature, AI_MODE_BASH_LOCKS)) + { + ai_SetAIMode(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_SetAIMode(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_AttemptToByPassLock(oCreature, oLock); + } + } + return; + } + // Master saw a trap. + case ASSOCIATE_COMMAND_MASTERSAWTRAP: + { + // In command mode we let the player tell us what to do. + if(ai_CanIAttack(oCreature)) + { + object oTrap = GetLastTrapDetected(oMaster); + // Sometimes GetLastTrapDetected seems to fail. + if(oTrap == OBJECT_INVALID) oTrap = GetNearestTrapToObject(oMaster, TRUE); + //Check and see if our master want's us to disarm the trap. + ai_SetAIMode(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_SetAIMode(oCreature, AI_MODE_STAND_GROUND, FALSE); + SetTrapDetectedBy(oTrap, oCreature); + ai_ReactToTrap(oCreature, oTrap); + } + return; + } + // Menu used by a player to toggle henchmans search on and off. + case ASSOCIATE_COMMAND_TOGGLESEARCH: + { + int bTurnOn = !ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH); + string sAssociateType = ai_GetAssociateType(oMaster, oCreature); + ai_Philos_SetSearch(oMaster, oCreature, sAssociateType, bTurnOn); + return; + } + // Menu used by a player to toggle henchmans stealth on and off. + case ASSOCIATE_COMMAND_TOGGLESTEALTH: + { + int bTurnOn = !ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH); + string sAssociateType = ai_GetAssociateType(oMaster, oCreature); + ai_Philos_SetStealth(oMaster, oCreature, sAssociateType, bTurnOn); + return; + } + // Menu used by a player to have the henchman try to bypass the nearest lock. + case ASSOCIATE_COMMAND_PICKLOCK: + { + ai_SetAIMode(oCreature, AI_MODE_DEFEND_MASTER, FALSE); + ai_SetAIMode(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_SetAIMode(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_SetAIMode(oCreature, AI_MODE_FOLLOW, FALSE); + object oLock = ai_GetNearestLockedObject(oMaster); + // Clear locked variable incase we tried already. + string sID = ObjectToString(oCreature); + SetLocalInt(oLock, "AI_LOCKED_" + sID, FALSE); + ai_AttemptToByPassLock(oCreature, oLock); + aiSaveAssociateModesToDb(oMaster, oCreature); + return; + } + // Menu used by a player to have the henchman try to disarm the nearest trap. + case ASSOCIATE_COMMAND_DISARMTRAP: + { + ai_SetAIMode(oCreature, AI_MODE_DEFEND_MASTER, FALSE); + ai_SetAIMode(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_SetAIMode(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_SetAIMode(oCreature, AI_MODE_FOLLOW, FALSE); + object oTrap = GetNearestTrapToObject(oMaster); + // Clear trapped variable incase we tried already. + string sID = ObjectToString(oCreature); + ai_ReactToTrap(oCreature, oTrap, TRUE); + aiSaveAssociateModesToDb(oMaster, oCreature); + return; + } + // Menu used by a player to open a henchmans inventory to give, move, or take. + case ASSOCIATE_COMMAND_INVENTORY: + { + if(AI_OPEN_INVENTORY) + { + ai_HaveCreatureSpeak(oCreature, 4, ":29:46:35:"); + OpenInventory(oCreature, oCommander); + } + // Can't look at an associate's inventory. + else + { + ai_HaveCreatureSpeak(oCreature, 6, ":47:30:36:8:48:"); + ai_SendMessages("You cannot open " + GetName(oCreature) + "'s inventory.", AI_COLOR_GRAY, oMaster); + } + return; + } + case ASSOCIATE_COMMAND_LEAVEPARTY: + { + if(AI_REMOVE_HENCHMAN_ON) + { + ai_ClearCreatureActions(); + ai_FireHenchman (GetPCSpeaker(), oCreature); + PlayVoiceChat (VOICE_CHAT_GOODBYE, oCreature); + } + } + } + } +} +void ai_PassActionToAssociates(object oCreature, int nAction, int bStatus = TRUE) +{ + int nAssociateType; + object oAssociate; + for(nAssociateType = 2; nAssociateType < 6; nAssociateType ++) + { + oAssociate = GetAssociate(nAssociateType); + if(oAssociate != OBJECT_INVALID) SetActionMode(oAssociate, nAction, bStatus); + } +} +void ai_PassToAssociate(object oAssociate, int nAIMode, int bStatus) +{ + ai_ClearCreatureActions(TRUE); + ai_SetAIMode(oAssociate, nAIMode, bStatus); +} +void ai_PassAIModeToAssociates(object oAssociate, int nAIMode, int bStatus = TRUE) +{ + ai_SetAIMode(oAssociate, nAIMode, bStatus); + int nAssociateType; + object oAssoc; + for(nAssociateType = 2; nAssociateType < 6; nAssociateType ++) + { + oAssoc = GetAssociate(nAssociateType, oAssociate); + if(oAssoc != OBJECT_INVALID) AssignCommand(oAssoc, ai_PassToAssociate(oAssoc, nAIMode, bStatus)); + } +} +void ai_SetAssociateAIScript(object oCreature, int bCheckTacticScripts = TRUE) +{ + string sCombatAI; + object oMaster = GetMaster(); + if(ai_GetIsCharacter(oMaster)) + { + string sAssociateType = ai_GetAssociateType(oMaster, oCreature); + json jAIData = ai_GetAssociateDbJson(oMaster, sAssociateType, "aidata"); + sCombatAI = JsonGetString(JsonArrayGet(jAIData, 8)); + } + else sCombatAI = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + int nAssociateType = GetAssociateType(oCreature); + if (nAssociateType == ASSOCIATE_TYPE_FAMILIAR && sCombatAI == "") + { + sCombatAI = "ai_a_default"; + } + else if(sCombatAI == "ai_coward") + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, sCombatAI); + return; + } + else if(bCheckTacticScripts && GetLocalInt(GetModule(), AI_RULE_AMBUSH)) + { + // They should have a skill ranks equal to their level + 1 to use a special AI. + int nSkillNeeded = GetHitDice(oCreature) + 1; + if(sCombatAI == "" || sCombatAI == "ai_a_ambusher") + { + // Ambusher: requires either Improved Invisibility or Invisibility. + if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oCreature) || + GetHasSpell(SPELL_INVISIBILITY, oCreature)) + { + int bCast = ai_TryToCastSpell(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature); + if(!bCast) bCast = ai_TryToCastSpell(oCreature, SPELL_INVISIBILITY, oCreature); + if(bCast) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_a_ambusher"); + return; + } + } + // Ambusher: Requires a Hide and Move silently skill equal to your level + 1. + else if(GetSkillRank(SKILL_HIDE, oCreature) >= nSkillNeeded && + GetSkillRank(SKILL_MOVE_SILENTLY, oCreature) >= nSkillNeeded) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_a_ambusher"); + return; + } + } + // Defensive : requires Parry skill equal to your level or Expertise. + else if(sCombatAI == "ai_a_defensive" || + (sCombatAI == "" && + (GetSkillRank(SKILL_PARRY, oCreature) >= nSkillNeeded || + GetHasFeat(FEAT_EXPERTISE, oCreature) || + GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature)))) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_a_defensive"); + return; + } + else if(sCombatAI == "ai_cntrspell" || GetHasSpell(SPELL_LESSER_DISPEL, oCreature) || + GetHasSpell(SPELL_DISPEL_MAGIC, oCreature) || GetHasSpell(SPELL_GREATER_DISPELLING, oCreature)) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_cntrspell"); + return; + } + } + if(sCombatAI == "") + { + // Select the best ai for this henchmen based on class. + int nClass = GetClassByPosition(1, oCreature); + // If they have more than one class use the default ai. + if(GetClassByPosition(2, oCreature) != CLASS_TYPE_INVALID) sCombatAI = "ai_a_default"; + else if(nClass == CLASS_TYPE_BARBARIAN) sCombatAI = "ai_a_barbarian"; + else if(nClass == CLASS_TYPE_BARD) sCombatAI = "ai_a_bard"; + else if(nClass == CLASS_TYPE_CLERIC) sCombatAI = "ai_a_cleric"; + else if(nClass == CLASS_TYPE_DRUID) sCombatAI = "ai_a_druid"; + else if(nClass == CLASS_TYPE_FIGHTER) sCombatAI = "ai_a_fighter"; + else if(nClass == CLASS_TYPE_MONK) sCombatAI = "ai_a_monk"; + else if(nClass == CLASS_TYPE_PALADIN) sCombatAI = "ai_a_paladin"; + else if(nClass == CLASS_TYPE_RANGER) sCombatAI = "ai_a_ranger"; + else if(nClass == CLASS_TYPE_ROGUE) sCombatAI = "ai_a_rogue"; + else if(nClass == CLASS_TYPE_SORCERER) sCombatAI = "ai_a_sorcerer"; + else if(nClass == CLASS_TYPE_WIZARD) sCombatAI = "ai_a_wizard"; + //else if(nClass == CLASS_TYPE_ABERRATION) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_ANIMAL) sCombatAI = "ai_a_animal"; + //else if(nClass == CLASS_TYPE_CONSTRUCT) sCombatAI = "ai_a_animal"; + //else if(nClass == CLASS_TYPE_DRAGON) sCombatAI = "ai_a_dragon"; + //else if(nClass == CLASS_TYPE_ELEMENTAL) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_FEY) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_GIANT) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_HUMANOID) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_MAGICAL_BEAST) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_MONSTROUS) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_OOZE) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_OUTSIDER) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_UNDEAD) sCombatAI = "ai_a_default"; + //else if(nClass == CLASS_TYPE_VERMIN) sCombatAI = "ai_a_animal"; + else sCombatAI = "ai_a_default"; + } + if(AI_DEBUG) ai_Debug("0i_associates", "530", GetName(oCreature) + " is setting AI to " + sCombatAI); + SetLocalString(oCreature, AI_COMBAT_SCRIPT, sCombatAI); + SetLocalString(oCreature, AI_DEFAULT_SCRIPT, sCombatAI); +} +int ai_CanISpeak (object oCreature) +{ + int nRace = GetRacialType (oCreature); + if (nRace == RACIAL_TYPE_ANIMAL || nRace == RACIAL_TYPE_BEAST || + nRace == RACIAL_TYPE_CONSTRUCT || nRace == RACIAL_TYPE_OOZE) return FALSE; + return (GetAbilityScore (oCreature, ABILITY_INTELLIGENCE) > 7); +} +void ai_FireHenchman(object oPC, object oHenchman) +{ + if(oPC == OBJECT_INVALID || oHenchman == OBJECT_INVALID) return; + // Now double-check that this is actually our master + if(GetMaster(oHenchman) != oPC) return; + // Turn off stealth mode + SetActionMode(oHenchman, ACTION_MODE_STEALTH, FALSE); + // Remove the henchman + RemoveHenchman (oPC, oHenchman); + ChangeToStandardFaction(oHenchman, STANDARD_FACTION_DEFENDER); +} +void ai_HenchmanCastDefensiveSpells (object oCreature, object oPC) +{ + ai_CastBuffs(oCreature, 3, 0, oPC); +} +int ai_CheckForCombat(object oCreature, int bMonster) +{ + object oEnemy = ai_GetNearestEnemy(oCreature, 1, 7, 7, 7, 5, TRUE); + //object oEnemy = ai_GetNearestEnemy(oCreature, 1, -1, -1, -1, -1, TRUE); + if(AI_DEBUG) ai_Debug("0i_associate", "586", "Checking for Combat: oEnemy is " + GetName(oEnemy) + + " Distance: " + FloatToString(GetDistanceBetween(oEnemy, oCreature), 0, 2)); + if(oEnemy != OBJECT_INVALID) + { + float fPerceptionDistance, fDistance; + if(bMonster) + { + fDistance = GetDistanceBetween(oCreature, oEnemy); + fPerceptionDistance = GetLocalFloat(GetModule(), AI_RULE_PERCEPTION_DISTANCE); + } + else + { + // We want to use the distance between the PC and target not us. + object oMaster = GetMaster(); + if(oMaster != OBJECT_INVALID) fDistance = GetDistanceBetween(oMaster, oEnemy); + else fDistance = GetDistanceBetween(oCreature, oEnemy); + fPerceptionDistance = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fPerceptionDistance == 0.0) fPerceptionDistance = 20.0; + } + if(fDistance < fPerceptionDistance) + { + ai_HaveCreatureSpeak(oCreature, 5, ":0:1:2:3:6:"); + SetLocalObject (oCreature, AI_MY_TARGET, oEnemy); + SpeakString(AI_I_SEE_AN_ENEMY, TALKVOLUME_SILENT_TALK); + if(bMonster) ai_StartMonsterCombat(oCreature); + else if(ai_CanIAttack(oCreature)) ai_StartAssociateCombat(oCreature); + return TRUE; + } + } + return FALSE; +} +void ai_AssociateEvaluateNewThreat(object oCreature, object oLastPerceived, string sPerception) +{ + if(!ai_CanIAttack(oCreature)) return; + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("0i_associates", "775", "Our current action: " + IntToString(nAction)); + switch(nAction) + { + // These actions are uninteruptable. + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_COUNTERSPELL : return; + // Might be doing a special action that is not a defined action. + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("0i_associate", "761", "Doing a special action (nCombatWait): " + IntToString(nCombatWait)); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + } + // We need to reevaluate combat during these actions when we see a new enemy. + //case ACTION_ATTACKOBJECT : + //case ACTION_MOVETOPOINT : + } + if(ai_GetIsInCombat(oCreature)) + { + object oTarget = ai_GetAttackedTarget(oCreature); + if(AI_DEBUG) ai_Debug("0i_associates", "775", "Should we recalculate our combat round? oTarget: " + GetName(oTarget) + + " oTarget Distance: " + FloatToString(GetDistanceBetween(oCreature, oTarget), 0, 2) + + " oLastPerceived Distance: " + FloatToString(GetDistanceBetween(oCreature, oLastPerceived), 0, 2)); + // If the LastPerceived is our target then don't recalculate. + if(oTarget == oLastPerceived) return; + // If we don't have a target or the lastperceived is closer than our + // target then recalculate. + if(oTarget == OBJECT_INVALID || + GetDistanceBetween(oCreature, oTarget) > GetDistanceBetween(oCreature, oLastPerceived)) + { + // We should clear any skill cooldowns that are at at max since that means they were skipped. + if(GetLocalInt(oCreature, "AI_EMPATHY_COOLDOWN") == AI_EMPATHY_COOLDOWN) + { DeleteLocalInt(oCreature, "AI_EMPATHY_COOLDOWN"); } + else if (GetLocalInt(oCreature, "AI_TAUNT_COOLDOWN") == AI_TAUNT_COOLDOWN) + { DeleteLocalInt(oCreature, "AI_EMPATHY_COOLDOWN"); } + ai_DoAssociateCombatRound(oCreature); + return; + } + // Lets only reevaluate combat if the new enemy is more powerful + // than the average enemies we already know about. + int nPower = ai_GetCharacterLevels(oLastPerceived) / 2; + int nEnemyPower = GetLocalInt(oCreature, AI_ENEMY_POWER) / (GetLocalInt(oCreature, AI_ENEMY_NUMBERS) + 1); + if(AI_DEBUG) ai_Debug("0i_associates", "797", " Is the new opponent more powerful? " + + GetName(oLastPerceived) + " nPower: " + IntToString(nPower) + + " nEnemyPower: " + IntToString(nEnemyPower)); + if(nEnemyPower < nPower) ai_DoAssociateCombatRound(oCreature); + return; + } + // Heard fires first, but Heard and Seen are both set at the same time. + // So lets skip the hearing code if they are also seen. + if(sPerception == AI_I_SEE_AN_ENEMY || GetObjectSeen(oLastPerceived, oCreature)) + { + // We are not in combat and we see the enemy so alert our allies! + ai_HaveCreatureSpeak(oCreature, 5, ":0:1:2:3:6:"); + SetLocalObject (oCreature, AI_MY_TARGET, oLastPerceived); + SpeakString(sPerception, TALKVOLUME_SILENT_TALK); + ai_StartAssociateCombat(oCreature); + } + else ai_FindTheEnemy(oCreature, oLastPerceived, oLastPerceived, FALSE); +} +void ai_MonsterEvaluateNewThreat(object oCreature, object oLastPerceived, string sPerception) +{ + if(!ai_CanIAttack(oCreature)) return; + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("0i_associates", "672", "nAction: " + IntToString(nAction)); + switch(nAction) + { + // These actions are uninteruptable. + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_COUNTERSPELL : return; + // Might be doing a special action that is not a defined action. + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("0i_associates", "683", "nCombatWait: " + IntToString(nCombatWait)); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + } + // We need to reevaluate combat during these actions when we see a new enemy. + //case ACTION_ATTACKOBJECT : + //case ACTION_MOVETOPOINT : + } + if(ai_GetIsInCombat(oCreature)) + { + object oTarget = ai_GetAttackedTarget(oCreature); + if(AI_DEBUG) ai_Debug("0i_associates", "697", "oTarget: " + GetName(oTarget) + + " oTarget Distance: " + FloatToString(GetDistanceBetween(oCreature, oTarget), 0, 2) + + " oLastPerceived Distance: " + FloatToString(GetDistanceBetween(oCreature, oLastPerceived), 0, 2)); + // If the LastPerceived is our target then don't recalculate. + if(oTarget == oLastPerceived) return; + // If we don't have a target or the lastperceived is closer than our + // target then recalculate. + if(oTarget == OBJECT_INVALID || + GetDistanceBetween(oCreature, oTarget) > GetDistanceBetween(oCreature, oLastPerceived)) + { + ai_DoMonsterCombatRound(oCreature); + return; + } + // Now only reevaluate combat if the new enemy is more powerful + // than the average enemies we already know about. + int nPower = ai_GetCharacterLevels(oLastPerceived) / 2; + int nEnemyPower = GetLocalInt(oCreature, AI_ENEMY_POWER) / (GetLocalInt(oCreature, AI_ENEMY_NUMBERS) + 1); + if(AI_DEBUG) ai_Debug("0i_associates", "714", GetName(oLastPerceived) + " nPower: " + IntToString(nPower) + + " nEnemyPower: " + IntToString(nEnemyPower)); + if(nEnemyPower < nPower) ai_DoMonsterCombatRound(oCreature); + return; + } + if(sPerception == AI_I_SEE_AN_ENEMY) + { + if(d100() < 34) + { + // We are not in combat so alert our allies! + ai_HaveCreatureSpeak(oCreature, 5, ":0:1:2:3:6:"); + } + SetLocalObject(oCreature, AI_MY_TARGET, oLastPerceived); + SpeakString(sPerception, TALKVOLUME_SILENT_TALK); + ai_StartMonsterCombat(oCreature); + } + else ai_FindTheEnemy(oCreature, oLastPerceived, oLastPerceived, TRUE); +} +void ai_CopyObjectVariables(object oOldObject, object oNewObject) +{ + json jObject = ObjectToJson(oOldObject, TRUE); + json jVarTable = GffGetList(jObject, "VarTable"); + string sVariable, sName; + int nIndex, nVarType; + json jVar = JsonArrayGet(jVarTable, nIndex); + while(JsonGetType(jVar) != JSON_TYPE_NULL) + { + sName = JsonGetString(GffGetString(jVar, "Name")); + nVarType = JsonGetInt(GffGetDword(jVar, "Type")); + if(nVarType == 1) SetLocalInt(oNewObject, sName, JsonGetInt(GffGetInt(jVar, "Value"))); + else if(nVarType == 2) SetLocalFloat(oNewObject, sName, JsonGetFloat(GffGetFloat(jVar, "Value"))); + else if(nVarType == 3) SetLocalString(oNewObject, sName, JsonGetString(GffGetString(jVar, "Value"))); + jVar = JsonArrayGet(jVarTable, ++nIndex); + } +} +//****************************************************************************** +//********************* Creature event scripts ********************************* +//****************************************************************************** + +void ai_OnRested(object oCreature) +{ + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_AFTER_REST)) + { + int nLevel = ai_GetCharacterLevels(oCreature); + float fDelay = StringToFloat(Get2DAString("restduration", "DURATION", nLevel)); + fDelay = (fDelay / 1000.0f) + 2.0f; + DelayCommand(fDelay, ai_HenchmanCastDefensiveSpells(oCreature, GetMaster())); + } +} + +//****************************************************************************** +//******************* Associate AI option scripts ****************************** +//****************************************************************************** +void ai_UpdateToolTipUI(object oPC, string sWindowID1, string sWindowID2, string sToolTipBind, string sText) +{ + int nMenuToken = NuiFindWindow(oPC, sWindowID1); + if(nMenuToken) NuiSetBind (oPC, nMenuToken, sToolTipBind, JsonString (sText)); + if(sWindowID2 != "") + { + int nWidgetToken = NuiFindWindow(oPC, sWindowID2); + if(nWidgetToken) NuiSetBind (oPC, nWidgetToken, sToolTipBind, JsonString (sText)); + } +} +void ai_FollowIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType) +{ + float fAdjustment = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + fIncrement; + if(fAdjustment > 10.0) fAdjustment = 10.0; + else if(fAdjustment < 1.0) fAdjustment = 1.0; + SetLocalFloat(oAssociate, AI_FOLLOW_RANGE, fAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 6, JsonFloat(fAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sName; + object oTarget = GetLocalObject(oAssociate, AI_FOLLOW_TARGET); + string sTarget; + if(oTarget != OBJECT_INVALID) sTarget = GetName(oTarget); + else + { + if(ai_GetIsCharacter(oAssociate)) sTarget = "nobody"; + else sTarget = GetName(oPC); + } + float fRange = fAdjustment + + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); + string sRange = FloatToString(fRange, 0, 0); + if(oPC == oAssociate) + { + sName = " All associates"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_follow_tooltip", sName + " enter follow mode "); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_follow_target_tooltip", " " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]"); + } + else + { + sName = " " + GetName(oAssociate); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_follow_tooltip", sName + " enter follow mode [" + sRange + " meters]"); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_follow_target_tooltip", " " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]"); + } +} +void ai_Ranged(object oPC, object oAssociate, string sAssociateType) +{ + //ai_ClearCreatureActions(); + if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) + { + ai_SendMessages(GetName(oAssociate) + " is using ranged combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ranged_tooltip", " Ranged On"); + ai_SetAIMode(oAssociate, AI_MODE_STOP_RANGED, FALSE); + ai_EquipBestRangedWeapon(oAssociate); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is using melee combat only.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ranged_tooltip", " Ranged Off"); + ai_SetAIMode(oAssociate, AI_MODE_STOP_RANGED, TRUE); + ai_EquipBestMeleeWeapon(oAssociate); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_EquipWeapons(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF)) + { + ai_SendMessages(GetName(oAssociate) + " will be equiping their best weapons.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_equip_weapon_tooltip", " Equiping Best Weapons On"); + ai_SetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will not equip their best weapons.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_equip_weapon_tooltip", " Equiping Best Weapons Off"); + ai_SetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Search(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) + { + ai_SendMessages(GetName(oAssociate) + " is turning search off.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_search_tooltip", " Search mode Off"); + SetActionMode(oAssociate, ACTION_MODE_DETECT, FALSE); + ai_SetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is turning search on.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_search_tooltip", " Search mode On"); + SetActionMode(oAssociate, ACTION_MODE_DETECT, TRUE); + ai_SetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Stealth(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) + { + ai_SendMessages(GetName(oAssociate) + " is turning stealth off.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_stealth_tooltip", " Stealth mode Off"); + SetActionMode(oAssociate, ACTION_MODE_STEALTH, FALSE); + ai_SetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is turning stealth on.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_stealth_tooltip", " Stealth mode On"); + SetActionMode(oAssociate, ACTION_MODE_STEALTH, TRUE); + ai_SetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_OpenDoor(object oPC, object oAssociate, string sAssociateType) +{ + string sRange = FloatToString(GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE), 0, 0); + if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) + { + ai_SendMessages(GetName(oAssociate) + " is turning open doors off.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_open_door_tooltip", " Open Doors Off [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_OPEN_DOORS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is turning open doors on.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_open_door_tooltip", " Open Doors On [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_OPEN_DOORS, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Locks(object oPC, object oAssociate, string sAssociateType, int nMode) +{ + string sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); + if(nMode == 1) + { + if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) + { + ai_SendMessages(GetName(oAssociate) + " will stop picking locks.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_pick_locks_tooltip", " Pick Locks Off [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_PICK_LOCKS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will now pick locks.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_pick_locks_tooltip", " Pick Locks On [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_PICK_LOCKS, TRUE); + } + } + else if(nMode == 2) + { + if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) + { + ai_SendMessages(GetName(oAssociate) + " will stop bashing.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_bash_locks_tooltip", " Bash Locks Off [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_BASH_LOCKS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will now bash things.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_bash_locks_tooltip", " Bash Locks On [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_BASH_LOCKS, TRUE); + } + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Traps(object oPC, object oAssociate, string sAssociateType) +{ + string sRange = FloatToString(GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE), 0, 0); + if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) + { + ai_SendMessages(GetName(oAssociate) + " will stop disarming traps.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_traps_tooltip", " Disable Traps Off [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_DISARM_TRAPS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will now disarm traps.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_traps_tooltip", " Disable Traps On [" + sRange + " meters]"); + ai_SetAIMode(oAssociate, AI_MODE_DISARM_TRAPS, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_ReduceSpeech(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) + { + ai_SendMessages(GetName(oAssociate) + " will increase speech.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_quiet_tooltip", " Reduced Speech Off"); + ai_SetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will reduce speech.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_quiet_tooltip", " Reduced Speech On"); + ai_SetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_UseOffensiveMagic(object oPC, object oAssociate, int bDefensive, int bOffensive, string sAssociateType) +{ + if(bOffensive) + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) + { + ai_SendMessages(GetName(oAssociate) + " has stopped using offensive magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_off_magic_tooltip", " Offensive Magic Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is now using offensive magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_off_magic_tooltip", " Offensive Magic On"); + ai_SetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING, TRUE); + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_def_magic_tooltip", " Defensive Magic Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING, FALSE); + } + else if(bDefensive) + { + if(ai_GetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) + { + ai_SendMessages(GetName(oAssociate) + " has stopped using defensive magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_def_magic_tooltip", " Defensive Magic Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " is now using defensive magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_def_magic_tooltip", " Defensive Magic On"); + ai_SetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING, TRUE); + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_off_magic_tooltip", " Offensive Magic Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING, FALSE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_UseMagic(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC)) + { + ai_SendMessages(GetName(oAssociate) + " is now using magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_magic_tooltip", " Magic On"); + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " has stopped using magic in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_magic_tooltip", " Magic Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_UseMagicItems(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) + { + ai_SendMessages(GetName(oAssociate) + " is now using magic items in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_magic_items_tooltip", " Magic Items On"); + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " has stopped using magic items in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_magic_items_tooltip", " Magic Items Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Loot(object oPC, object oAssociate, string sAssociateType) +{ + int bLooting = !ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS); + string sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE), 0, 0); + string sMessage, sText; + if(bLooting) + { + sMessage = " is picking up items."; + sText = " Looting On [" + sRange + " meters]"; + } + else + { + sMessage = " is not picking up items."; + sText = " Looting Off [" + sRange + " meters]"; + } + ai_SendMessages(GetName(oAssociate) + sMessage, AI_COLOR_YELLOW, oPC); + ai_SetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS, bLooting); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_loot_tooltip", sText); + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Spontaneous(object oPC, object oAssociate, string sAssociateType) +{ + int bSpontaneous = !ai_GetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE); + string sMessage, sText; + + if(bSpontaneous) + { + sMessage = " has stop casting spontaneous healing spells."; + sText = " Spontaneous casting Off"; + } + else + { + sMessage = " will now cast spontaneous healing spells."; + sText = " Spontaneous casting On"; + } + ai_SendMessages(GetName(oAssociate) + sMessage, AI_COLOR_YELLOW, oPC); + ai_SetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE, bSpontaneous); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_spontaneous_tooltip", sText); + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_MagicIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType) +{ + int nAdjustment = GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT) + nIncrement; + if(nAdjustment > 100) nAdjustment = 100; + else if(nAdjustment < -100) nAdjustment = -100; + SetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT, nAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 0, JsonInt(nAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sMagic = IntToString(nAdjustment); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_magic_level_tooltip", " Magic Level [" + sMagic + "]"); +} +void ai_LootRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType) +{ + float fAdjustment = GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE) + fIncrement; + if(fAdjustment > 40.0) fAdjustment = 40.0; + else if(fAdjustment < 0.0) fAdjustment = 0.0; + SetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE, fAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 3, JsonFloat(fAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sRange = FloatToString(fAdjustment, 0, 0); + string sLoot = " Looting Off [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sLoot = " Looting On [" + sRange + " meters]"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_loot_tooltip", sLoot); +} +void ai_LockRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType) +{ + float fAdjustment = GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE) + fIncrement; + if(fAdjustment > 40.0) fAdjustment = 40.0; + else if(fAdjustment < 0.0) fAdjustment = 0.0; + SetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE, fAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 4, JsonFloat(fAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sRange = FloatToString(fAdjustment, 0, 0); + string sPick = " Pick Locks Off [" + sRange + " meters]"; + string sBash = " Bash Off [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) sPick = " Pick Locks On [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) sBash = " Bash On [" + sRange + " meters]"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_pick_locks_tooltip", sPick); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_bash_locks_tooltip", sBash); +} +void ai_TrapRangeIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType) +{ + float fAdjustment = GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE) + fIncrement; + if(fAdjustment > 40.0) fAdjustment = 40.0; + else if(fAdjustment < 0.0) fAdjustment = 0.0; + SetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE, fAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 5, JsonFloat(fAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sRange = FloatToString(fAdjustment, 0, 0); + string sText = " Disable Traps Off [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) sText = " Disable Traps On [" + sRange + " meters]"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_traps_tooltip", sText); +} +void ai_OpenDoorIncrement(object oPC, object oAssociate, float fIncrement, string sAssociateType) +{ + float fAdjustment = GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE) + fIncrement; + if(fAdjustment > 40.0) fAdjustment = 40.0; + else if(fAdjustment < 0.0) fAdjustment = 0.0; + SetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE, fAdjustment); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jAIData = JsonArraySet(jAIData, 9, JsonFloat(fAdjustment)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + string sRange = FloatToString(fAdjustment, 0, 0); + string sText = " Open Doors Off [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) sText = " Open Doors On [" + sRange + " meters]"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_open_door_tooltip", sText); +} +void ai_SaveAIScript(object oPC, object oAssociate, int nToken) +{ + string sScript = JsonGetString(NuiGetBind(oPC, nToken, "txt_ai_script")); + string sOldScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + if(GetStringLeft(sScript, 5) != "ai_a_") ai_SendMessages(sScript + " does not have correct prefix it must have ai_a_ for associates! Did not change AI script.", AI_COLOR_RED, oPC); + else if(ResManGetAliasFor(sScript, RESTYPE_NCS) == "") + { + ai_SendMessages(sScript + " not found by ResMan! This is not a valid AI script.", AI_COLOR_RED, oPC); + } + else if(sScript != sOldScript) + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + if(JsonGetType(JsonArrayGet(jAIData, 8)) == JSON_TYPE_NULL) jAIData = JsonArrayInsert(jAIData, JsonString(sScript)); + else jAIData = JsonArraySet(jAIData, 8, JsonString(sScript)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + ai_SendMessages(GetName(oAssociate) + " is now using " + sScript + " AI script!", AI_COLOR_GREEN, oPC); + } + else ai_SendMessages(GetName(oAssociate) + " is already using this script! Did not change AI script.", AI_COLOR_RED, oPC); +} +void ai_Buff_Button(object oPC, object oAssociate, int nOption, string sAssociateType) +{ + if(nOption == 0) + { + int bRestBuff = !ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST); + ai_SetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST, bRestBuff); + if(bRestBuff) + { + ai_SendMessages(GetName(oAssociate) + " will cast long buffs after resting.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_buff_rest_tooltip", " [On] Turn buffing after resting off."); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will not cast long buffs after resting.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_buff_rest_tooltip", " [Off] Turn buffing after resting on."); + } + aiSaveAssociateModesToDb(oPC, oAssociate); + } + else + { + if(!GetIsPossessedFamiliar(oAssociate)) + { + object oEnemy = GetNearestEnemy(oAssociate); + //ai_Debug("0e_nui", "865", "oEnemy: " + GetName(oEnemy) + " fDistance: " + + // FloatToString(GetDistanceBetween(oAssociate, oEnemy), 0, 2)); + if(GetDistanceBetween(oAssociate, oEnemy) > 30.0 || + oEnemy == OBJECT_INVALID) + { + ai_CastBuffs(oAssociate, nOption, 0, oPC); + } + else ai_SendMessages("You cannot buff while there are enemies nearby.", AI_COLOR_RED, oPC); + } + else ai_SendMessages("You cannot buff while possessing your familiar.", AI_COLOR_RED, oPC); + } +} +void ai_Heal_Button(object oPC, object oAssociate, int nIncrement, string sVar, string sAssociateType) +{ + int nHeal = GetLocalInt(oAssociate, sVar); + if(nIncrement > 0 && nHeal > 100 - nIncrement) nHeal = 100 - nIncrement; + if(nIncrement < 0 && nHeal < abs(nIncrement)) nHeal = abs(nIncrement); + nHeal += nIncrement; + SetLocalInt(oAssociate, sVar, nHeal); + string sHeal = IntToString(nHeal); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + if(sVar == AI_HEAL_OUT_OF_COMBAT_LIMIT) + { + string sText = " Will heal at or below [" + sHeal + "%] health out of combat"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_heal_out_tooltip", sText); + jAIData = JsonArraySet(jAIData, 1, JsonInt(nHeal)); + } + else if(sVar == AI_HEAL_IN_COMBAT_LIMIT) + { + string sText = " Will heal at or below [" + sHeal + "%] health in combat"; + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_heal_in_tooltip", sText); + jAIData = JsonArraySet(jAIData, 2, JsonInt(nHeal)); + } + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); +} +void ai_Heal_OnOff(object oPC, object oAssociate, string sAssociateType, int nMode) +{ + string sText, sText2; + if(nMode == 1) + { + if(ai_GetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF)) + { + ai_SetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF, FALSE); + sText = " Self healing On"; + sText2 = " will now use healing on themselves."; + } + else + { + ai_SetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF, TRUE); + sText = " Self healing Off"; + sText2 = " will stop using healing on themselves."; + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_heals_onoff_tooltip", sText); + } + else + { + if(ai_GetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF)) + { + ai_SetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF, FALSE); + sText = " Party healing On"; + sText2 = " will now use healing on party members."; + } + else + { + ai_SetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF, TRUE); + sText = " Party healing Off"; + sText2 = " will stop using healing on party members."; + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_healp_onoff_tooltip", sText); + } + ai_SendMessages(GetName(oAssociate) + sText2, AI_COLOR_YELLOW, oPC); + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Cure_OnOff(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF)) + { + ai_SendMessages(GetName(oAssociate) + " will now cast cure spells.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cure_onoff_tooltip", " Cast Cure Spells On"); + ai_SetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will stop casting cure spells.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cure_onoff_tooltip", " Cast Cure Spells Off"); + ai_SetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Ignore_Associates(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) + { + ai_SendMessages(GetName(oAssociate) + " will stop ignoring henchman's associates and enemy associates.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ignore_assoc_tooltip", " Ignore Enemy Associates Off"); + ai_SetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will now ignore henchman's associates and enemy associates.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ignore_assoc_tooltip", " Ignore Enemy Associates On"); + ai_SetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_Ignore_Traps(object oPC, object oAssociate, string sAssociateType) +{ + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS)) + { + ai_SendMessages(GetName(oAssociate) + " will stop ignoring traps on the floor and will stop moving when one is seen.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ignore_traps_tooltip", " Ignore Floor Traps Off"); + ai_SetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS, FALSE); + } + else + { + ai_SendMessages(GetName(oAssociate) + " will now ignore traps on the floor and will continue with their actions.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ignore_traps_tooltip", " Ignore Floor Traps On"); + ai_SetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS, TRUE); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_FollowTarget(object oPC, object oAssociate) +{ + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oAssociate); + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_FOLLOW_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_Original_Guard() +{ + ResetHenchmenState(); + //Companions will only attack the Masters Last Attacker + SetAssociateState(NW_ASC_MODE_DEFEND_MASTER); + SetAssociateState(NW_ASC_MODE_STAND_GROUND, FALSE); + object oMaster = GetMaster(); + object oLastAttacker = GetLastHostileActor(oMaster); + // * for some reason this is too often invalid. still the routine + // * works corrrectly + SetLocalInt(OBJECT_SELF, "X0_BATTLEJOINEDMASTER", TRUE); + HenchmenCombatRound(oLastAttacker); + ai_SendMessages(GetName(OBJECT_SELF) + " is now guarding you!", AI_COLOR_YELLOW, oMaster); +} +void ai_Original_Follow() +{ + ResetHenchmenState(); + SetAssociateState(NW_ASC_MODE_STAND_GROUND, FALSE); + DelayCommand(2.5, VoiceCanDo()); + object oMaster = GetMaster(); + ActionForceFollowObject(oMaster, GetFollowDistance()); + SetAssociateState(NW_ASC_IS_BUSY); + DelayCommand(5.0, SetAssociateState(NW_ASC_IS_BUSY, FALSE)); + ai_SendMessages(GetName(OBJECT_SELF) + " is now following You!", AI_COLOR_YELLOW, oMaster); +} +void ai_Original_StandGround() +{ + SetAssociateState(NW_ASC_MODE_STAND_GROUND); + SetAssociateState(NW_ASC_MODE_DEFEND_MASTER, FALSE); + DelayCommand(2.0, VoiceCanDo()); + ActionAttack(OBJECT_INVALID); + ClearActions(CLEAR_X0_INC_HENAI_RespondToShout1); + ai_SendMessages(GetName(OBJECT_SELF) + " is now standing their ground!", AI_COLOR_YELLOW, GetMaster()); +} +void ai_Original_AttackNearest() +{ + ResetHenchmenState(); + SetAssociateState(NW_ASC_MODE_DEFEND_MASTER, FALSE); + SetAssociateState(NW_ASC_MODE_STAND_GROUND, FALSE); + DetermineCombatRound(); + // * bonus feature. If master is attacking a door or container, issues VWE Attack Nearest + // * will make henchman join in on the fun + object oMaster = GetMaster(); + object oTarget = GetAttackTarget(oMaster); + if (GetIsObjectValid(oTarget) == TRUE) + { + if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE || GetObjectType(oTarget) == OBJECT_TYPE_DOOR) + { + ActionAttack(oTarget); + } + } + ai_SendMessages(GetName(OBJECT_SELF) + " is now in normal mode!", AI_COLOR_YELLOW, oMaster); +} +void ai_Original_SetSearch(object oAssociate, int bTurnOn) +{ + if(GetRacialType(oAssociate) != RACIAL_TYPE_ELF) SetActionMode(oAssociate, ACTION_MODE_DETECT, bTurnOn); +} +void ai_Original_SetStealth(object oAssociate, int bTurnOn) +{ + SetActionMode(oAssociate, ACTION_MODE_STEALTH, bTurnOn); +} +void ai_Philos_Guard(object oMaster, object oCreature) +{ + ai_PassAIModeToAssociates(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_DEFEND_MASTER, TRUE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_FOLLOW, FALSE); + ai_SetAIMode(oCreature, AI_MODE_COMMANDED, FALSE); + int nToken = NuiFindWindow(oMaster, ai_GetAssociateType(oMaster, oCreature) + AI_WIDGET_NUI); + ai_HighlightWidgetMode(oMaster, oCreature, nToken); + if(!ai_GetIsBusy(oCreature) && ai_GetIsInCombat(oCreature)) + { + object oLastAttacker = GetLastHostileActor(oMaster); + if(oLastAttacker != OBJECT_INVALID) ai_DoAssociateCombatRound(oCreature, oLastAttacker); + else AssignCommand(oCreature, ActionMoveToObject(oMaster, TRUE)); + } + ai_SendMessages(GetName(oCreature) + " is now guarding you!", AI_COLOR_YELLOW, oMaster); + aiSaveAssociateModesToDb(oMaster, oCreature); +} +void ai_Philos_Follow(object oMaster) +{ + object oCreature = OBJECT_SELF; + ai_PassAIModeToAssociates(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_FOLLOW, TRUE); + ai_SetAIMode(oCreature, AI_MODE_COMMANDED, FALSE); + int nToken = NuiFindWindow(oMaster, ai_GetAssociateType(oMaster, oCreature) + AI_WIDGET_NUI); + ai_HighlightWidgetMode(oMaster, oCreature, nToken); + aiSaveAssociateModesToDb(oMaster, oCreature); + // To follow we probably should be running and not searching or hiding. + if(GetDetectMode(oCreature) && !GetHasFeat(FEAT_KEEN_SENSE, oCreature)) SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + if(GetStealthMode(oCreature)) SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + ai_PassActionToAssociates(oCreature, ACTION_FOLLOW); + if(ai_IsInCombatRound(oCreature)) ai_ClearCombatState(oCreature); + ai_ClearCreatureActions(TRUE); + object oTarget = GetLocalObject(oCreature, AI_FOLLOW_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oMaster; + ActionMoveToObject(oTarget, TRUE, ai_GetFollowDistance(oCreature)); + ai_SendMessages(GetName(oCreature) + " is now following " + GetName(oTarget) + "!", AI_COLOR_YELLOW, oMaster); +} +void ai_Philos_StandGround(object oMaster) +{ + object oCreature = OBJECT_SELF; + ai_PassAIModeToAssociates(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_STAND_GROUND, TRUE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_DEFEND_MASTER, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_FOLLOW, FALSE); + ai_PassActionToAssociates(oCreature, ACTION_FOLLOW, FALSE); + ai_SetAIMode(oCreature, AI_MODE_COMMANDED, FALSE); + int nToken = NuiFindWindow(oMaster, ai_GetAssociateType(oMaster, oCreature) + AI_WIDGET_NUI); + ai_HighlightWidgetMode(oMaster, oCreature, nToken); + if(ai_IsInCombatRound(oCreature)) + { + ai_ClearCombatState(oCreature); + DeleteLocalObject(oCreature, AI_ATTACKED_PHYSICAL); + DeleteLocalObject(oCreature, AI_ATTACKED_SPELL); + } + ai_ClearCreatureActions(TRUE); + ai_SendMessages(GetName(oCreature) + " is now standing their ground!", AI_COLOR_YELLOW, oMaster); + aiSaveAssociateModesToDb(oMaster, oCreature); +} +void ai_Philos_AttackNearest(object oMaster, object oCreature) +{ + ai_PassAIModeToAssociates(oCreature, AI_MODE_SCOUT_AHEAD, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_STAND_GROUND, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_DEFEND_MASTER, FALSE); + ai_PassAIModeToAssociates(oCreature, AI_MODE_FOLLOW, FALSE); + ai_PassActionToAssociates(oCreature, ACTION_FOLLOW, FALSE); + ai_SetAIMode(oCreature, AI_MODE_COMMANDED, FALSE); + int nToken = NuiFindWindow(oMaster, ai_GetAssociateType(oMaster, oCreature) + AI_WIDGET_NUI); + ai_HighlightWidgetMode(oMaster, oCreature, nToken); + // Removes any targets the PC may have given the associate. + DeleteLocalObject(oCreature, AI_PC_LOCKED_TARGET); + // This resets a henchmens failed Moral save in combat. + string sScript = GetLocalString(oCreature, AI_COMBAT_SCRIPT); + if(sScript == "ai_coward") + { + sScript = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + SetLocalString(oCreature, AI_COMBAT_SCRIPT, sScript); + } + if(!ai_GetIsBusy(oCreature)) + { + object oEnemy = ai_GetNearestEnemy(oCreature, 1, 7, 7); + if(oEnemy != OBJECT_INVALID && GetDistanceBetween(oCreature, oEnemy) < AI_RANGE_BATTLEFIELD) + { + ai_HaveCreatureSpeak(oCreature, 5, ":0:1:2:3:6:"); + // If master is attacking a target we will attack them too! + if(!ai_GetIsInCombat(oCreature)) ai_StartAssociateCombat(oCreature); + object oTarget = ai_GetAttackedTarget(oMaster); + if(oTarget == OBJECT_INVALID) ai_DoAssociateCombatRound(oCreature); + else ai_DoAssociateCombatRound(oCreature, oTarget); + } + else + { + object oTarget = GetLocalObject(oCreature, AI_FOLLOW_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oMaster; + AssignCommand(oCreature, ActionMoveToObject(oMaster, TRUE, ai_GetFollowDistance(oCreature))); + } + } + ai_SendMessages(GetName(oCreature) + " is now in normal mode!", AI_COLOR_YELLOW, oMaster); + aiSaveAssociateModesToDb(oMaster, oCreature); +} +void ai_Philos_SetSearch(object oMaster, object oCreature, string sAssociateType, int bTurnOn) +{ + if(bTurnOn) + { + ai_SetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH, TRUE); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + ai_PassActionToAssociates(oCreature, ACTION_MODE_DETECT, TRUE); + //ai_PassActionToAssociates(oCreature, ACTION_MODE_DETECT, TRUE); + ai_UpdateToolTipUI(oMaster, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_search_tooltip", " Search mode On"); + } + else + { + ai_SetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH, FALSE); + SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + ai_PassActionToAssociates(oCreature, ACTION_MODE_DETECT, FALSE); + //ai_PassActionToAssociates(oCreature, ACTION_MODE_DETECT, FALSE); + ai_UpdateToolTipUI(oMaster, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_search_tooltip", " Search mode Off"); + } + aiSaveAssociateModesToDb(oMaster, oCreature); +} +void ai_Philos_SetStealth(object oMaster, object oCreature, string sAssociateType, int bTurnOn) +{ + if(bTurnOn) + { + ai_SetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + ai_PassActionToAssociates(oCreature, ACTION_MODE_STEALTH, TRUE); + ai_UpdateToolTipUI(oMaster, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_stealth_tooltip", " Stealth mode On"); + } + else + { + ai_SetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH, FALSE); + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + ai_PassActionToAssociates(oCreature, ACTION_MODE_STEALTH, FALSE); + //ai_PassActionToAssociates(oCreature, ACTION_MODE_STEALTH, FALSE); + ai_UpdateToolTipUI(oMaster, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_stealth_tooltip", " Stealth mode Off"); + } + aiSaveAssociateModesToDb(oMaster, oCreature); +} +void ai_DoCommand(object oPC, object oAssociate, int nCommand) +{ + int nIndex = 1; + if(oPC == oAssociate) + { + if(nCommand == 1) // Guard PC. + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_Guard()); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_Guard()); + } + } + // Use Philos AI commands. + else + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) ai_Philos_Guard(oPC, oAssociate); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) ai_Philos_Guard(oPC, oAssociate); + } + } + } + else if(nCommand == 2) // Follow PC. + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_Follow()); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_Follow()); + } + } + // Use Philos AI commands. + else + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Philos_Follow(oPC)); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Philos_Follow(oPC)); + } + } + } + else if(nCommand == 3) // Standground. + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_StandGround()); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_StandGround()); + } + } + // Use Philos AI commands. + else + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Philos_StandGround(oPC)); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Philos_StandGround(oPC)); + } + } + } + else if(nCommand == 4) // Normal mode - i.e. Attack nearest. + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_AttackNearest()); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_Original_AttackNearest()); + } + } + // Use Philos AI commands. + else + { + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) ai_Philos_AttackNearest(oPC, oAssociate); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) ai_Philos_AttackNearest(oPC, oAssociate); + } + } + } + if(nCommand == 5) // All associates toggle search mode + { + int bTurnOn = !ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_SEARCH); + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + ai_Original_SetSearch(oPC, bTurnOn); + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) ai_Original_SetSearch(oAssociate, bTurnOn); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) ai_Original_SetSearch(oAssociate, bTurnOn); + } + } + else + { + ai_Philos_SetSearch(oPC, oPC, "pc", bTurnOn); + string sAssociateType; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) + { + sAssociateType = ai_GetAssociateType(oPC, oAssociate); + ai_Philos_SetSearch(oPC, oAssociate, sAssociateType, bTurnOn); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) + { + sAssociateType = ai_GetAssociateType(oPC, oAssociate); + ai_Philos_SetSearch(oPC, oAssociate, sAssociateType, bTurnOn); + } + } + } + if(bTurnOn) + { + ai_SendMessages("Everyone is now in search mode!", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, "pc" + AI_COMMAND_NUI, "pc" + AI_WIDGET_NUI, "btn_cmd_search_tooltip", " Everyone leave search mode"); + } + else + { + ai_SendMessages("Everyone has left search mode!", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, "pc" + AI_COMMAND_NUI, "pc" + AI_WIDGET_NUI, "btn_cmd_search_tooltip", " Everyone enter search mode"); + } + } + if(nCommand == 6) // All associate use stealth mode + { + int bTurnOn = !ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_STEALTH); + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + ai_Original_SetStealth(oPC, bTurnOn); + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) ai_Original_SetStealth(oAssociate, bTurnOn); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) ai_Original_SetStealth(oAssociate, bTurnOn); + } + } + else + { + ai_Philos_SetStealth(oPC, oPC, "pc", bTurnOn); + string sAssociateType; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) + { + sAssociateType = ai_GetAssociateType(oPC, oAssociate); + ai_Philos_SetStealth(oPC, oAssociate, sAssociateType, bTurnOn); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) + { + sAssociateType = ai_GetAssociateType(oPC, oAssociate); + ai_Philos_SetStealth(oPC, oAssociate, sAssociateType, bTurnOn); + } + } + } + if(bTurnOn) + { + ai_SendMessages("Everyone is now in stealth mode.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, "pc" + AI_COMMAND_NUI, "pc" + AI_WIDGET_NUI, "btn_cmd_stealth_tooltip", " Everyone leave stealth mode"); + } + else + { + ai_SendMessages("Everyone has left stealth mode.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, "pc" + AI_COMMAND_NUI, "pc" + AI_WIDGET_NUI, "btn_cmd_stealth_tooltip", " Everyone enter stealth mode"); + } + } + } + else + { + if(nCommand == 1) + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + AssignCommand(oAssociate, ai_Original_Guard()); + } + else ai_Philos_Guard(oPC, oAssociate); + } + else if(nCommand == 2) + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + AssignCommand(oAssociate, ai_Original_Follow()); + } + else AssignCommand(oAssociate, ai_Philos_Follow(oPC)); + } + else if(nCommand == 3) + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + AssignCommand(oAssociate, ai_Original_StandGround()); + } + else AssignCommand(oAssociate, ai_Philos_StandGround(oPC)); + } + else if(nCommand == 4) + { + // Not using Philos Henchman AI. Use vanilla commands. + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") + { + AssignCommand(oAssociate, ai_Original_AttackNearest()); + } + else ai_Philos_AttackNearest(oPC, oAssociate); + } + } +} +void ai_Action(object oPC, object oAssociate) +{ + if(oPC == oAssociate) + { + DeleteLocalObject(oPC, "NW_ASSOCIATE_COMMAND"); + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_ACTION_ALL"); + ai_SendMessages("Select an action for the party.", AI_COLOR_YELLOW, oPC); + } + else + { + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oAssociate); + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_ACTION"); + ai_SendMessages("Select an action for " + GetName(oAssociate) + ".", AI_COLOR_YELLOW, oPC); + } + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_AIScript(object oPC, object oAssociate, string sAssociateType, int nToken) +{ + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != "") + { + string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + string sIcon = "ir_scommand"; + if(sScript == "ai_a_ambusher") + { + sScript = "ai_a_flanker"; + sIcon = "ir_invite"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using flanking tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Flanker: Attacks enemies engaged with allies"); + } + else if(sScript == "ai_a_flanker") + { + sScript = "ai_a_peaceful"; + sIcon = "ir_ignore"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using peaceful tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Peaceful: Avoids attacking any enemies if possible"); + } + else if(sScript == "ai_a_peaceful") + { + sScript = "ai_a_defensive"; + sIcon = "ir_knockdwn"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using defensive tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Defensive: Attacks then uses Expertise/Parry"); + } + else if(sScript == "ai_a_defensive") + { + sScript = "ai_a_ranged"; + sIcon = "ir_ranger"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using ranged tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Ranged: Attacks from range as much as possible"); + } + else if(sScript == "ai_a_ranged") + { + sScript = "ai_a_cntrspell"; + sIcon = "ir_dcaster"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using counter spell tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Counter Spell: Tries to counter enemy spells"); + } + else if(sScript == "ai_a_cntrspell") + { + DeleteLocalString(oAssociate, AI_DEFAULT_SCRIPT); + ai_SetAssociateAIScript(oAssociate, FALSE); + sScript = GetLocalString(oAssociate, AI_DEFAULT_SCRIPT); + ai_SendMessages(GetName(oAssociate) + " is now using default tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Default tactics: Using the creatures base AI script"); + } + else + { + sScript = "ai_a_ambusher"; + sIcon = "ir_rogue"; + SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); + ai_SendMessages(GetName(oAssociate) + " is now using ambush tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Ambusher: Attacks from a hidden position"); + } + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_image", JsonString(sIcon)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_label", JsonString("Tactics: " + sScript)); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + if(JsonGetType(JsonArrayGet(jAIData, 8)) == JSON_TYPE_NULL) jAIData = JsonArrayInsert(jAIData, JsonString(sScript)); + else jAIData = JsonArraySet(jAIData, 8, JsonString(sScript)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + else + { + if(GetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, oAssociate)) + { + SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_COWARDLY, TRUE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_RANGED, FALSE, oAssociate); + ai_SendMessages(GetName(oAssociate) + " is now using coward tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Using coward tactics"); + } + else if(GetCombatCondition(X0_COMBAT_FLAG_COWARDLY, oAssociate)) + { + SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_COWARDLY, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, TRUE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_RANGED, FALSE, oAssociate); + ai_SendMessages(GetName(oAssociate) + " is now using defensive tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Using defensive tactics"); + } + else if(GetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, oAssociate)) + { + SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_COWARDLY, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_RANGED, TRUE, oAssociate); + ai_SendMessages(GetName(oAssociate) + " is now using ranged tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Using ranged tactics"); + } + else if(GetCombatCondition(X0_COMBAT_FLAG_RANGED, oAssociate)) + { + SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_COWARDLY, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_RANGED, FALSE, oAssociate); + ai_SendMessages(GetName(oAssociate) + " is now using normal tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Using ambush tactics"); + } + else + { + SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, TRUE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_COWARDLY, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, FALSE, oAssociate); + SetCombatCondition(X0_COMBAT_FLAG_RANGED, FALSE, oAssociate); + ai_SendMessages(GetName(oAssociate) + " is now using ambush tactics in combat.", AI_COLOR_YELLOW, oPC); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_cmd_ai_script_tooltip", " Using ambush tactics"); + } + } +} +void ai_HavePCPlaceTrap(object oPC, object oAssociate) +{ + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oAssociate); + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_GET_TRAP"); + ai_SendMessages(GetName(oAssociate) + " select a trap to place.", AI_COLOR_YELLOW, oPC); + OpenInventory(oAssociate, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ITEM, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_JumpAssociateToPC(object oPC) +{ + ai_ClearCreatureActions(TRUE); + JumpToObject(oPC); +} +void ai_JumpToPC(object oPC, object oAssociate) +{ + int nAssociateType, nHenchman, nHenchAssociate; + object oHenchman, oHenchmanAssociate; + if(oPC != oAssociate) + { + if(nAssociateType == ASSOCIATE_TYPE_HENCHMAN) + { + for(nHenchAssociate = 2; nHenchAssociate <= 5; nHenchAssociate++) + { + oHenchmanAssociate = GetAssociate(nHenchAssociate, oHenchman, 1); + if(oHenchmanAssociate != OBJECT_INVALID) + { + AssignCommand(oHenchmanAssociate, ai_JumpAssociateToPC(oPC)); + } + } + AssignCommand(oHenchman, ai_JumpAssociateToPC(oPC)); + } + else AssignCommand(oAssociate, ai_JumpAssociateToPC(oPC)); + return; + } + for(nAssociateType = 1; nAssociateType <= 5; nAssociateType++) + { + if(nAssociateType == ASSOCIATE_TYPE_HENCHMAN) + { + for(nHenchman = 1; nHenchman <= AI_MAX_HENCHMAN; nHenchman++) + { + oHenchman = GetAssociate(nAssociateType, oPC, nHenchman); + if(oHenchman != OBJECT_INVALID) + { + for(nHenchAssociate = 2; nHenchAssociate <= 5; nHenchAssociate++) + { + oHenchmanAssociate = GetAssociate(nHenchAssociate, oHenchman, 1); + if(oHenchmanAssociate != OBJECT_INVALID) + { + AssignCommand(oHenchmanAssociate, ai_JumpAssociateToPC(oPC)); + } + } + AssignCommand(oHenchman, ai_JumpAssociateToPC(oPC)); + } + } + } + else + { + oHenchman = GetAssociate(nAssociateType, oPC, 1); + if(oHenchman != OBJECT_INVALID) AssignCommand(oHenchman, ai_JumpAssociateToPC(oPC)); + } + } +} +void ai_GhostMode(object oPC, object oAssociate, int nToken, string sAssociateType) +{ + string sText; + if(ai_GetAIMode(oAssociate, AI_MODE_GHOST)) + { + ai_SetAIMode(oAssociate, AI_MODE_GHOST, FALSE); + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + sText = " Turn On clipping through creatures for " + GetName(oAssociate); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ghost_mode_tooltip", sText); + ai_SendMessages(GetName(oAssociate) + " is not in Ghost Mode and will run into creatures.", AI_COLOR_YELLOW, oPC); + } + else + { + ai_SetAIMode(oAssociate, AI_MODE_GHOST, TRUE); + effect eGhost = EffectCutsceneGhost(); + eGhost = UnyieldingEffect(eGhost); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oAssociate); + sText = " Turn Off clipping through creatures for " + GetName(oAssociate); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ghost_mode_tooltip", sText); + ai_SendMessages(GetName(oAssociate) + " is now in Ghost Mode and will clip through creatures.", AI_COLOR_YELLOW, oPC); + } +} +void ai_ChangeCameraView(object oPC, object oAssociate) +{ + object oCamAssociate = GetLocalObject(oPC, "AI_CAMERA_ON_ASSOCIATE"); + if(oCamAssociate == oAssociate) + { + DeleteLocalObject(oPC, "AI_CAMERA_ON_ASSOCIATE"); + AttachCamera(oPC, oPC); + } + else + { + SetLocalObject(oPC, "AI_CAMERA_ON_ASSOCIATE", oAssociate); + AttachCamera(oPC, oAssociate); + } +} +void ai_SelectCameraView(object oPC) +{ + SetLocalString(oPC, AI_TARGET_MODE, "DM_SELECT_CAMERA_VIEW"); + ai_SendMessages(GetName(oPC) + " select an object to change the camera view to.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_CREATE, MOUSECURSOR_NOCREATE); +} +void ai_OpenInventory(object oAssociate, object oPC) +{ + // Funny things happen when you open associate inventories when they are not + // within sight. + if(LineOfSightObject(oPC, oAssociate)) + { + OpenInventory(oAssociate, oPC); + } + else ai_SendMessages(GetName(oAssociate) + " is not within sight!", AI_COLOR_RED, oPC); +} +void ai_SelectOpenInventory(object oPC) +{ + SetLocalString(oPC, AI_TARGET_MODE, "DM_SELECT_OPEN_INVENTORY"); + ai_SendMessages(GetName(oPC) + " select an object to open its inventory.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); +} +void ai_Plugin_Execute(object oPC, string sElem, int bUser = 0) +{ + int nIndex = StringToInt(GetStringRight(sElem, 1)); + json jPlugins, jPlugin; + if(bUser == 1) // From DM command menu. + { + string sName = ai_RemoveIllegalCharacters(GetName(oPC)); + jPlugins = ai_GetCampaignDbJson("plugins", sName, AI_DM_TABLE); + } + else if(bUser == 2) // From DM plugin menu, master plugin list. + { + jPlugins = ai_GetCampaignDbJson("plugins"); + } + else jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + jPlugin = JsonArrayGet(jPlugins, nIndex); + string sScript = JsonGetString(JsonArrayGet(jPlugin, 0)); + if(ResManGetAliasFor(sScript, RESTYPE_NCS) == "") + { + ai_SendMessages(sScript + " not found by ResMan!", AI_COLOR_RED, oPC); + } + else + { + string sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + ai_SendMessages("Executing plugin " + sName + ".", AI_COLOR_GREEN, oPC); + ExecuteScript(sScript, oPC); + } +} diff --git a/_module/nss/0i_color.nss b/_module/nss/0i_color.nss new file mode 100644 index 00000000..b18fe7ac --- /dev/null +++ b/_module/nss/0i_color.nss @@ -0,0 +1,70 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_color +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts that are used to change the color of names and text. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Basic color codes. Message Notes +const string AI_COLOR_BLACK = "000"; // Nothing. +const string AI_COLOR_WHITE = "999"; // _Debug messages. +const string AI_COLOR_GRAY = "666"; // Server messages +const string AI_COLOR_YELLOW = "990"; // Generic messages to players. +const string AI_COLOR_DARK_YELLOW = "660"; // +const string AI_COLOR_RED = "900"; // Negative message to players. +const string AI_COLOR_DARK_RED = "600"; // +const string AI_COLOR_GREEN = "080"; // Positive message to players. +const string AI_COLOR_DARK_GREEN = "060"; // +const string AI_COLOR_BLUE = "009"; // +const string AI_COLOR_DARK_BLUE = "006"; // In game descriptive text. +const string AI_COLOR_CYAN = "099"; // +const string AI_COLOR_DARK_CYAN = "066"; // +const string AI_COLOR_MAGENTA = "909"; // +const string AI_COLOR_DARK_MAGENTA = "606";// +const string AI_COLOR_LIGHT_MAGENTA = "868"; // <âcâ> Combat text: Enemy name color. +const string AI_COLOR_ORANGE = "950"; // +const string AI_COLOR_DARK_ORANGE = "940"; // Combat text: base text color. +const string AI_COLOR_GOLD = "860"; // +// Strips the color codes from sText +string ai_StripColorCodes(string sText); +// This function will make sString be the specified color +// as specified in sRGB. RGB is the Red, Green, and Blue +// Each color can have a value from 0 to 9. +// 1 - 0(20)[ ] 142 - 5(8E)[?] +// 32 - 1(20)[ ] 170 - 6(AA)[ª] +// 57 - 2(39)[9] 198 - 7(C6)[Æ] +// 85 - 3(55)[U] 226 - 8(E2)[â] +// 113 - 4(71)[q] 255 - 9(FE)[ÿ] +string ai_AddColorToText(string sText, string sRGB = AI_COLOR_WHITE); + +string ai_StripColorCodes(string sText) +{ + string sColorCode, sChar; + int nStringLength = GetStringLength(sText); + int i = FindSubString(sText, "" + // End the color token + sText + ""; +} diff --git a/_module/nss/0i_combat.nss b/_module/nss/0i_combat.nss new file mode 100644 index 00000000..6c40eb1c --- /dev/null +++ b/_module/nss/0i_combat.nss @@ -0,0 +1,3498 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_combat +//////////////////////////////////////////////////////////////////////////////// + Include scripts for combat scripts. +*/////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// +#include "0i_messages" +#include "0i_items" +#include "0i_spells" +// This structure is used to represent the number and type of +// enemies that a creature is facing, divided into four main +// categories: FIGHTERS, CLERICS, MAGES, MONSTERS. +struct stClasses +{ + int FIGHTERS; + int FIGHTER_LEVELS; + int CLERICS; + int CLERIC_LEVELS; + int MAGES; + int MAGE_LEVELS; + int MONSTERS; + int MONSTER_LEVELS; + int TOTAL; + int TOTAL_LEVELS; +}; +struct stTarget +{ + object oTarget; + int nValue; + int nBestValue; + int nBestSecondaryValue; + float fNearestRange; + float fNearestSecondaryRange; + int nIndex; + int nSecondaryIndex; + string sTargetType; +}; +//****************************************************************************** +//************ GET TARGETS USING THE OBJECT SEARCH FUNCTIONS ******************* +//****************************************************************************** +// Returns the nearest enemy that is not disabled from oCreature. +// You may pass in any of the CREATURE_TYPE_* constants +// used in GetNearestCreature as nCType1 & nCType2, with +// corresponding values for nCValue1 & nCValue2. +// NOTE: CREATURE_TYPE_PERCEPTION = 7, PERCEPTION_SEEN = 7. +// bDisabled = TRUE will also return any disabled targets that are not dead. +object ai_GetNearestEnemy(object oCreature, int nNth = 1, int nCType1 = -1, int nCValue1 = -1, int nCType2 = -1, int nCValue2 = -1, int bDisabled = FALSE); +// Returns the nearest ally from oCreature. +// You may pass in any of the CREATURE_TYPE_* constants +// used in GetNearestCreature as nCType1 & nCType2, with +// corresponding values for nCValue1 & nCValue2. +// NOTE: CREATURE_TYPE_PERCEPTION = 7, PERCEPTION_SEEN = 7. +object ai_GetNearestAlly(object oCreature, int nNth = 1, int nCType1 = -1, int nCValue1 = -1, int nCType2 = -1, int nCValue2 = -1); +// Returns the number of alive enemies grouped near oCreature within fDistance. +int ai_GetNumOfEnemiesInGroup(object oCreature, float fDistance = AI_RANGE_MELEE); +// Returns the number of alive allies grouped near oCreature within fDistance. +int ai_GetNumOfAlliesInGroup(object oCreature, float fDistance = AI_RANGE_MELEE); +// Returns the number of creatures of nRacial_Type within fDistance that can be seen by oCreature. +int ai_GetRacialTypeCount(object oCreature, int nRacial_Type, float fDistance = AI_RANGE_PERCEPTION); +// Returns the weakest attacker that is in melee or is attacking oCreature's master. +object ai_GetLowestCRAttackerOnMaster(object oCreature); + +//****************************************************************************** +//******************** SET/CLEAR COMBAT STATE FUNCTIONS ************************ +//****************************************************************************** +// Sets oCreatures's combat state by setting variables for AI_ALLIES and AI_ENEMIES. +// Returns the nearest visible enemy. +object ai_SetCombatState(object oCreature); +// Clears all variables that were define for the current round for oCreature. +void ai_ClearCombatState(object oCreature); + +//****************************************************************************** +//*************** GET TARGETS USING COMBAT STATE FUNCTIONS ********************* +//****************************************************************************** +// These functions will find a target or an index to a target based on the +// combat state variables created by the function ai_SetCombatState. + +// Returns the Index of the nearest creature seen within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetNearestIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest creature seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetNearestTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest creature seen with the lowest combat rating +// within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetLowestCRIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest creature seen with the lowest combat rating within fMaxRange +// in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetLowestCRTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest creature seen with the highest combat rating +// within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetHighestCRIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest creature seen with the highest combat rating within fMaxRange +// in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetHighestCRTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the creature seen with the lowest enemies to oCreature that +// they are in melee with minus the number of allies to the caller they are in +// melee with within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetLowestMeleeIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY); +// Returns the index of the creature seen with the most enemies to the caller that +// they are in melee with minus the number of allies to oCreature they are in +// melee with within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetHighestMeleeIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY); +// Returns a creature of sTargetType where they have the least number of +// allies and the most number of enemies within fMaxRange in the combat state. +// Returns OBJECT_INVALID if there is not a good creature to select. +// sTargetType is either AI_ENEMY, or AI_ALLY. +object ai_GetGroupedTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY); +// Returns the index of the nearest creature with the least % of hitpoints within +// fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetMostWoundedIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the creature with the lowest health seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetMostWoundedTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest ally with the least % of hitpoints within +// fMaxRange in the combat state. +// This also filters for AI_MODE_PARTY_HEALING_OFF and AI_MODE_SELF_HEALING_OFF. +// If no ally is found then it will return an index of 0. +int ai_GetAllyToHealIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the ally with the lowest health seen within fMaxRange in the combat state. +// This also filters for AI_MODE_PARTY_HEALING_OFF and AI_MODE_SELF_HEALING_OFF. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetAllyToHealTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the creature with the lowest fortitude save seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetLowestFortitudeSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the creature with the lowest reflex save seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetLowestReflexSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the creature with the lowest will save seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetLowestWillSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the creature with the lowest save based on nSpell save type seen +// within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +object ai_GetSpellTargetBasedOnSaves(object oCreature, int nSpell, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the index of the nearest creature seen that is busy attacking an ally +// within fMaxRange in the combat state. +// If none is found then it will return 0. +int ai_GetSneakAttackIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE); +// Returns the index of the nearest creature seen that is busy attacking an ally +// within fMaxRange in the combat state. +// If none is found then it will return 0. +int ai_GetNearestIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest combat creature seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetNearestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest creature seen with the lowest combat rating +// that is not in a dangerous area of effect within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetLowestCRIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the lowest combat creature seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetLowestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest creature seen with the highest combat rating +// that is not in a dangerous area of effect within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetHighestCRIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the highest combat creature seen within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +object ai_GetHighestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the creature seen with the most enemies to oCreature that +// they are in melee with minus the number of allies to oCreature they are in +// melee with that is not in a dangerous area of effect within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_GetHighestMeleeIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY); +// Returns a creature of sTargetType where they have the least number of +// allies and the most number of enemies within fMaxRange that are not in a +// dangerous area of effect in the combat state. +// Returns OBJECT_INVALID if there is not a good creature to select. +// sTargetType is either AI_ENEMY, or AI_ALLY. +object ai_GetGroupedTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY); +// Returns the nearest creature seen of nClassType within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetNearestClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the creature with the lowest combat rating seen of nClassType within +// fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetLowestCRClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the creature with the highest combat rating seen of nClassType within +// fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetHighestCRClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest creature seen of nRacialType within fMaxRange in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetNearestRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the creature with the lowest combat rating seen of nRacialType within +// fMaxRange in the combat state. Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetLowestCRRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the creature with the highest combat rating seen of nRacialType within +// fMaxRange in the combat state. Returns OBJECT_INVALID if no creature is found. +// sTargetType is either AI_ENEMY or AI_ALLY. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetHighestCRRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the nearest enemy seen that is attacking an ally with the least +// number of enemies on them within fMaxRange in the combat state. +// If none is found then it will return 0. +object ai_GetFlankTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE); +// Returns the nearest enemy creature seen wihtin fMaxRange that is a favored enemy +// of the caller in the combat state. +// Returns OBJECT_INVALID if no creature is found. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetNearestFavoredEnemyTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE); +// Returns the best target for melee combat based if we are in melee or not. +// If not in melee it will get the nearest target that is not in a dangerous +// area of effect for us to attack in the combat state. +// If in melee it will get the weakest target. +// If it returns OBJECT_INVALID then we should stop the attack. The only way +// to not get a target is if we have been told not to attack strong opponents. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetBestCRTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Returns the nearest target for melee combat based if we are in melee or not. +// If not in melee it will get the nearest target that is not in a dangerous +// area of effect for us to attack in the combat state. +// If it returns OBJECT_INVALID then we should stop the attack. The only way +// to not get a target is if we have been told not to attack strong opponents. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetNearestTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Returns the target with the lowest combat rating for melee combat based if +// we are in melee or not. If not in melee it will get the nearest target that +// is not in a dangerous area of effect for us to attack in the combat state. +// If it returns OBJECT_INVALID then we should stop the attack. The only way +// to not get a target is if we have been told not to attack strong opponents. +// bAlwaysAtk TRUE we attack everything! FALSE we don't attack strong enemies. +object ai_GetLowestCRTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Returns the target with the highest combat rating for melee combat based if +// we are in melee or not. If not in melee it will get the nearest target that +// is not in a dangerous area of effect for us to attack in the combat state. +// If it returns OBJECT_INVALID then we should stop the attack. +object ai_GetHighestCRTargetForMeleeCombat(object oCreature, int nInMelee); +// Returns the Index of the nearest creature seen within fMaxRange in the combat state. +// If no creature is found then it will return an index of 0. +// sTargetType is either AI_ENEMY or AI_ALLY. +int ai_MonsterGetNearestIndex(object oMonster, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE); +// Returns the index of the nearest enemy creature that can see oCreature. +int ai_GetNearestIndexThatSeesUs(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION); +// Returns the nearest creature attacking the caller within fMaxRange in the combat state. +// Returns OBJECT_INVALID if oCreature is not being attacked. +object ai_GetEnemyAttackingMe(object oCreature, float fMaxRange = AI_RANGE_MELEE); +// Returns the nearest creature attacking oAlly from oCreature within fMaxRange +// in the combat state. +// Returns OBJECT_INVALID if oAlly is not being attacked. +object ai_GetEnemyAttackingMyAlly(object oCreature, object oAlly, float fMaxRange = AI_RANGE_MELEE); +// Returns the number of enemies within fMaxRange of the caller in the combat state. +int ai_GetNumOfEnemiesInRange(object oCreature, float fMaxRange = AI_RANGE_MELEE); +// Returns the best ally target withing fMaxRange for nSpell to be cast on. +// Uses the ai_spells.2da file to pick a target. +object ai_GetAllyBuffTarget(object oCreature, int nSpell, float fMaxRange = AI_RANGE_BATTLEFIELD); + +//****************************************************************************** +//******************** OTHER COMBAT FUNCTIONS ******************************** +//****************************************************************************** + +// Returns the current round that oCreature is in for this combat. +int ai_GetCurrentRound(object oCreature); +// Returns the difficulty of the battle based on the combat state. +// nDifficulty is Enemy level - Ally level + 20 + Player adjustment. +// 20+ : Impossible - Cannot win. +// 17 to 19 : Overpowering - Use all of our powers. +// 15 to 16 : Very Difficult - Use all of our power (Highest level spells). +// 11 to 14 : Challenging - Use most of our power (Higher level powers). +// 8 to 10 : Moderate - Use half of our power (Mid level powers and less). +// 5 to 7 : Easy - Use our weaker powers (Lowest level powers). +// 2 to 4 : Effortless - Don't waste spells and powers on this. +// 1 or less: Pointless - We probably should ignore these dangers. +int ai_GetDifficulty(object oCreature); +// Returns oCreatures Combat rating. +//(BAB + AC - 10) / 2 +int ai_GetMyCombatRating(object oCreature); +// Returns the last creature oCreature attacked. +// bPhysical checks for creatures attacked in melee or range with a weapon. +// bSpell will look for creatures attacked by a spell. +object ai_GetAttackedTarget(object oCreature, int bPhysical = TRUE, int bSpell = FALSE); +// Returns TRUE if oCreature is of nClassType; +// May also check for general Class types with +// AI_CLASS_TYPE_ARCANE, AI_CLASS_TYPE_DIVINE, AI_CLASS_TYPE_CASTER, AI_CLASS_TYPE_WARRIOR. +int ai_CheckClassType(object oCreature, int nClassType); +// Returns TRUE if oCreature is of nRacialType; +// May also check for general racial types with +// AI_RACIAL_TYPE_ANIMAL_BEAST +int ai_CheckRacialType(object oCreature, int nRacialType); +// Saves oCreatures Normal appearance if they are not polymorphed and it has +// not already been saved. +void ai_SetNormalAppearance(object oCreature); +// Returns the normal appearance of oCreature. +int ai_GetNormalAppearance(object oCreature); +// Return the number and levels of all creatures within fMaxRange. +// They are grouped into Fighters, Clerics, Mages, and Monsters. +struct stClasses ai_GetFactionsClasses(object oCreature, int bEnemy = TRUE, float fMaxRange = AI_RANGE_BATTLEFIELD); +// This will return the class with the most levels. +// Returns a string of "FIGHTER", "CLERIC", "MAGE", or "MONSTER". +// Execute with GetFactionsClasses. +string ai_GetMostDangerousClass(struct stClasses stCount); +// Equips the best weapon, ranged or melee. +// Returns TRUE if equiped, FALSE if not. +// oTarget is the creature the caller is targeting. +void ai_EquipBestWeapons(object oCreature, object oTarget = OBJECT_INVALID); +// Equips a melee weapon AND checks for shield, two weapons, two handed, etc. +// Returns TRUE if equiped, FALSE if not. +// oTarget is the creature the caller is targeting. +int ai_EquipBestMeleeWeapon(object oCreature, object oTarget = OBJECT_INVALID); +// Equips a ranged weapon AND checks for ammo. +// Returns TRUE if equiped, FALSE if not. +// oTarget is the creature the caller is targeting. +int ai_EquipBestRangedWeapon(object oCreature, object oTarget = OBJECT_INVALID); +// Equips the best weapon for a monk character. +// Returns TRUE if equiped, FALSE if not. +// oTarget is the creature the caller is targeting. +int ai_EquipBestMonkMeleeWeapon(object oCreature, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature is in a Dangerous Area of Effect in fMaxRange. +// bMove will attempt to move oCreature out of the Dangerous AOE if needed. +int ai_IsInADangerousAOE(object oCreature, float fMaxRange = AI_RANGE_BATTLEFIELD, int bMove = FALSE); +// Returns 1 if oHidden has an Invisiblity effect, Can't be spotted but can be heard. +// Returns 2 if oHidden has a Darkness effect. Can't be spotted but can be heard. +// Returns 3 if oHidden has a Sanctuary effect, Can't be spotted or heard. +// Returns 4 if oHidden is in stealth mode, Can be spotted and heard. +int ai_GetIsHidden(object oHidden); +// Returns TRUE if if oCaster has a good chance of effecting oCreature with nSpell. +int ai_CastOffensiveSpellVsTarget(object oCaster, object oCreature, int nSpell); +// Gets the base DC for a dragon. +int ai_GetDragonDC(object oCreature); +// Set oCreature's ai scripts based on its first class or the variable "AI_DEFAULT_SCRIPT". +void ai_SetCreatureAIScript(object oCreature); +// Returns TRUE if oTarget is immune to sneak attacks. +int ai_IsImmuneToSneakAttacks(object oCreature, object oTarget); +// Returns TRUE if iIndex target has a higher combat rating than oCreature. +int ai_IsStrongerThanMe(object oCreature, int nIndex); +// Returns TRUE if oTarget's CR is within nAdj of oCreature's level, otherwise FALSE. +int ai_StrongOpponent(object oCreature, object oTarget, int nAdj = 2); +// Returns TRUE if attacking oTarget with Power attack is a good option. +int ai_PowerAttackGood(object oCreature, object oTarget, float fAdj); +// Returns TRUE if oTarget's AC - oCreature Atk - nAtkAdj can hit within 25% to 75%. +int ai_AttackPenaltyOk(object oCreature, object oTarget, float fAtkAdj); +// Returns TRUE if oCreature AC - oTarget's Atk is less than 20. +int ai_ACAdjustmentGood(object oCreature, object oTarget, float fACAdj); +// Checks oCreatures melee weapon to see if they can kill oTarget in one hit. +int ai_WillKillInOneHit(object oCreature, object oTarget); +// Returns TRUE if oCreature has Mobility, SpringAttack, or a high Tumble. +int ai_CanIMoveInCombat(object oCreature); +// Returns TRUE if oCreature can safely fire a ranged weapon. +int ai_CanIUseRangedWeapon(object oCreature, int nInMelee); +// Returns TRUE if oCreature moves before the action. FALSE if they do not move. +// and -1 if the action is canceled. +// Checks current combat state to see if oCreature needs to move before using an action. +int ai_CheckCombatPosition(object oCreature, object oTarget, int nInMelee, int nAction, int nBaseItemType = 0); + +//****************************************************************************** +//************ GET TARGETS USING THE OBJECT SEARCH FUNCTIONS ******************* +//****************************************************************************** +object ai_GetNearestEnemy(object oCreature, int nNth = 1, int nCType1 = -1, int nCValue1 = -1, int nCType2 = -1, int nCValue2 = -1, int bDisabled = FALSE) +{ + object oTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, + oCreature, nNth, nCType1, nCValue1, nCType2, nCValue2); + if(bDisabled) + { + while(oTarget != OBJECT_INVALID && GetIsDead(oTarget)) + { + oTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, + oCreature, ++nNth, nCType1, nCValue1, nCType2, nCValue2); + } + } + else + { + while(oTarget != OBJECT_INVALID && ai_Disabled(oTarget)) + { + oTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, + oCreature, ++nNth, nCType1, nCValue1, nCType2, nCValue2); + } + } + return oTarget; +} +object ai_GetNearestAlly(object oCreature, int nNth = 1, int nCType1 = -1, int nCValue1 = -1, int nCType2 = -1, int nCValue2 = -1) +{ + return GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, + oCreature, ++nNth, nCType1, nCValue1, nCType2, nCValue2); +} +int ai_GetNumOfEnemiesInGroup(object oCreature, float fDistance = AI_RANGE_MELEE) +{ + int nCnt; + location lLocation = GetLocation(oCreature); + object oEnemy = GetFirstObjectInShape(SHAPE_SPHERE, fDistance, lLocation); + while(oEnemy != OBJECT_INVALID) + { + if(GetIsEnemy(oEnemy, oCreature) && !GetIsDead(oEnemy)) nCnt++; + oEnemy = GetNextObjectInShape(SHAPE_SPHERE, fDistance, lLocation); + } + return nCnt; +} +int ai_GetNumOfAlliesInGroup(object oCreature, float fDistance = AI_RANGE_MELEE) +{ + int nCnt; + location lLocation = GetLocation(oCreature); + object oAlly = GetFirstObjectInShape(SHAPE_SPHERE, fDistance, lLocation); + while(oAlly != OBJECT_INVALID) + { + if(GetReputation(oCreature, oAlly) > 89 && oAlly != oCreature && !GetIsDead(oAlly)) + { + nCnt++; + } + oAlly = GetNextObjectInShape(SHAPE_SPHERE, fDistance, lLocation); + } + return nCnt; +} +int ai_GetRacialTypeCount(object oCreature, int nRacial_Type, float fDistance = AI_RANGE_PERCEPTION) +{ + int nCnt = 1; + int nCount = 0; + object oEnemy = ai_GetNearestEnemy(oCreature, nCnt, + CREATURE_TYPE_PERCEPTION, + PERCEPTION_SEEN, + CREATURE_TYPE_RACIAL_TYPE, + nRacial_Type); + while(oEnemy != OBJECT_INVALID && GetDistanceBetween(oEnemy, oCreature) <= fDistance) + { + if(!ai_GetHasEffectType(oEnemy, EFFECT_TYPE_TURNED)) nCount++; + nCnt++; + oEnemy = ai_GetNearestEnemy(oCreature, nCnt, + CREATURE_TYPE_PERCEPTION, + PERCEPTION_SEEN, + CREATURE_TYPE_RACIAL_TYPE, + nRacial_Type); + } + return nCount; +} +object ai_GetLowestCRAttackerOnMaster(object oCreature) +{ + object oTarget = OBJECT_INVALID, oMaster = GetMaster(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "419", "Checking for weakest attacker on " + GetName(oMaster)); + int nEnemyCombatRating, nWeakestCombatRating, nCntr = 1; + float fNearest = AI_RANGE_MELEE + 1.0f; + // Get the weakest opponent in melee with our master. + object oEnemy = ai_GetNearestEnemy(oMaster, nCntr, 7, 7); + float fDistance = GetDistanceBetween(oMaster, oEnemy); + while (oEnemy != OBJECT_INVALID && fDistance <= AI_RANGE_MELEE) + { + nEnemyCombatRating = ai_GetMyCombatRating(oEnemy); + if(AI_DEBUG) ai_Debug("0i_combat", "428", GetName(oEnemy) + " nECR: " + IntToString(nEnemyCombatRating)); + if (nEnemyCombatRating < nWeakestCombatRating || + nEnemyCombatRating == nWeakestCombatRating && fDistance < fNearest) + { + fNearest = fDistance; + nWeakestCombatRating = nEnemyCombatRating; + oTarget = oEnemy; + } + oEnemy = ai_GetNearestEnemy(oMaster, ++nCntr, 7, 7); + } + // No targets in melee with our master, lets see if there is a ranged attacker. + if (oTarget == OBJECT_INVALID) oTarget = GetLastHostileActor(oMaster); + return oTarget; +} + +//****************************************************************************** +//******************** SET/CLEAR COMBAT STATE FUNCTIONS ************************ +//****************************************************************************** + +object ai_SetCombatState(object oCreature) +{ + if(AI_DEBUG) ai_Counter_Start(); + object oMaster = GetMaster(); + if(oMaster == OBJECT_INVALID) oMaster = oCreature; + int nEnemyNum, nEnemyPower, nAllyNum, nAllyPower, nInMelee, nMagic; + int nHealth, nNth, nAllies, nPower, nDisabled, bThreat,nObjects; + int nEnemyHighestPower, nAllyHighestPower; + float fNearest = AI_RANGE_BATTLEFIELD; + float fDistance; + float fMaxRange = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fMaxRange == 0.0) fMaxRange = AI_RANGE_PERCEPTION; + string sCnt, sDebugText; + location lLocation = GetLocation(oMaster); + object oMelee, oNearestEnemy = OBJECT_INVALID; + if(AI_DEBUG) ai_Debug("0i_combat", "491", "************************************************************"); + if(AI_DEBUG) ai_Debug("0i_combat", "492", "******************* CREATING COMBAT DATA *******************"); + if(AI_DEBUG) ai_Debug("0i_combat", "493", GetName(oCreature)); + // We want to include ourselves in the combat state. + object oObject = GetFirstObjectInShape(SHAPE_SPHERE, AI_RANGE_BATTLEFIELD, lLocation); + // Get all creatures within 40 meters(5 meters beyond our perception of 35). + // Centered on either the creature or their master. + while(oObject != OBJECT_INVALID) + { + // Process all enemies. + if(GetIsEnemy(oObject, oCreature)) + { + if(GetObjectSeen(oObject, oCreature) || GetObjectHeard(oObject, oCreature)) + { + fDistance = GetDistanceBetween(oObject, oCreature); + if(fDistance <= fMaxRange) + { + // ********** Get the Total levels of the Enemy ********** + nPower = ai_GetCharacterLevels(oObject); + if(nPower < 1) nPower = 1; + if(nEnemyHighestPower < nPower) nEnemyHighestPower = nPower; + nEnemyPower += nPower; + // ********** Check if the Enemy is disabled ********** + bThreat = TRUE; + nDisabled = ai_Disabled(oObject); + if(nDisabled) + { + if(AI_DEBUG) sDebugText += "**** DISABLED(" + IntToString(nDisabled) + ") ****"; + // Decide if they are still a threat: 1 - dead, 2 - Bleeding. + if(nDisabled == 1 || nDisabled == 2 || + //nDisabled == EFFECT_TYPE_CONFUSED || + //nDisabled == EFFECT_TYPE_FRIGHTENED || + //nDisabled == EFFECT_TYPE_PARALYZE || + nDisabled == EFFECT_TYPE_CHARMED || + nDisabled == EFFECT_TYPE_PETRIFY) + { + bThreat = FALSE; + if(AI_DEBUG) ai_Debug("0i_combat", "527", "Enemy: " + GetName(oObject) + sDebugText); + } + } + // If they are using the coward ai then treat them as frightened. + // we place it here as an else so we don't overwrite another disabled effect. + else if(GetLocalString(oObject, AI_COMBAT_SCRIPT) == "ai_coward") + { + nDisabled = EFFECT_TYPE_FRIGHTENED; + // !!!! For /DEBUG CODE !!!! + if(AI_DEBUG) sDebugText += "**** DISABLED(" + IntToString(nDisabled) + ") ****"; + } + if(bThreat) + { + sCnt = IntToString(++nEnemyNum); + // ********** Set if the Enemy is disabled ********** + SetLocalInt(oCreature, AI_ENEMY_DISABLED + sCnt, nDisabled); + // ********** Set the Enemy Object ********** + SetLocalObject(oCreature, AI_ENEMY + sCnt, oObject); + // ********** Set the Enemy Combat Rating ********** + SetLocalInt(oCreature, AI_ENEMY_COMBAT + sCnt, ai_GetMyCombatRating(oObject)); + // ********** Set the Enemy Health Percentage ********** + nHealth = ai_GetPercHPLoss(oObject); + SetLocalInt(oCreature, AI_ENEMY_HEALTH + sCnt, nHealth); + // ********** Set the number of enemies near the enemy ********** + nInMelee = 0; + nNth = 1; + oMelee = GetNearestObject(OBJECT_TYPE_CREATURE, oObject, nNth); + while(oMelee != OBJECT_INVALID && !GetIsDead(oMelee) && + GetDistanceBetween(oMelee, oObject) < AI_RANGE_MELEE) + { + // We add an enemy to the group. + if(GetIsEnemy(oMelee, oCreature)) nInMelee++; + oMelee = GetNearestObject(OBJECT_TYPE_CREATURE, oObject, ++nNth); + } + SetLocalInt(oCreature, AI_ENEMY_MELEE + sCnt, nInMelee); + // ********** Set the Enemies distance ********** + fDistance = GetDistanceBetween(oObject, oCreature); + SetLocalFloat(oCreature, AI_ENEMY_RANGE + sCnt, fDistance); + // ********** Set if the Enemy is perceived ********** + if(GetObjectSeen(oObject, oCreature) || + (GetObjectHeard(oObject, oCreature) && fDistance <= AI_RANGE_MELEE && + ai_GetIsHidden(oObject))) + { + SetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCnt, TRUE); + if(AI_DEBUG) sDebugText += "**** PERCEIVED Seen: " + + IntToString(GetObjectSeen(oObject, oCreature)) + + " Heard: " + IntToString(GetObjectHeard(oObject, oCreature)) + " ****"; + } + else SetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCnt, FALSE); + // ********** Set the Nearest Enemy seen ********** + if(fDistance < fNearest) + { + fNearest = fDistance; + oNearestEnemy = oObject; + } + } + } + // !!! Debug code !!! + if(AI_DEBUG && fDistance < AI_RANGE_MELEE) sDebugText += "**** MELEE ****"; + if(AI_DEBUG) ai_Debug("0i_combat", "587", "Enemy(" + IntToString(nEnemyNum) + "): " + + GetName(oObject) + sDebugText); + if(AI_DEBUG) ai_Debug("0i_combat", "589", "nHealth: " + IntToString(nHealth) + + " nInMelee: " + IntToString(nInMelee) + + " fDistance: " + FloatToString(fDistance, 0, 2) + + " nNum: " + IntToString(nEnemyNum) + + " nPower: " + IntToString(nEnemyPower / 2)); + } + else + { + // ********** Also add the levels of Unknown Enemies *********** + nPower = FloatToInt(ai_GetCharacterLevels(oObject) / 1.5); + if(nPower < 1) nPower = 1; + nEnemyPower += nPower; + if(AI_DEBUG) ai_Debug("0i_combat", "601", "Enemy(NOT PERCEIVED): " + + GetName(oObject) + " fDistance: " + + FloatToString(GetDistanceBetween(oObject, oCreature), 0, 2) + + " nPower: " + IntToString(nEnemyPower)); + } + } + // Process all Allies. + else if(GetFactionEqual(oObject, oCreature)) + { + // ********** Set if the Ally is disabled ********** + nDisabled = ai_Disabled(oObject); + if(nDisabled) + { + sDebugText += "**** DISABLED(" + IntToString(nDisabled) + ") ****"; + SetLocalInt(oCreature, AI_ALLY_DISABLED + sCnt, nDisabled); + } + if(nDisabled != 1) + { + sCnt = IntToString(++nAllyNum); + // ********** Set the Ally Object ********** + SetLocalObject(oCreature, AI_ALLY + sCnt, oObject); + // ********** Set the Ally Combat Rating ********** + SetLocalInt(oCreature, AI_ALLY_COMBAT + sCnt, ai_GetMyCombatRating(oObject)); + // ********** Set the Ally Health Percentage ********** + nHealth = ai_GetPercHPLoss(oObject); + SetLocalInt(oCreature, AI_ALLY_HEALTH + sCnt, nHealth); + // ********** Set the number of enemies near the ally ********** + nInMelee = 0; + nNth = 1; + oMelee = GetNearestObject(OBJECT_TYPE_CREATURE, oObject, nNth); + while(oMelee != OBJECT_INVALID && !GetIsDead(oMelee) && + GetDistanceBetween(oMelee, oObject) < AI_RANGE_MELEE) + { + if(GetIsEnemy(oMelee, oCreature)) nInMelee++; + //else nInMelee--; + oMelee = GetNearestObject(OBJECT_TYPE_CREATURE, oObject, ++nNth); + } + SetLocalInt(oCreature, AI_ALLY_MELEE + sCnt, nInMelee); + // ********** Set the Allies distance ********** + SetLocalFloat(oCreature, AI_ALLY_RANGE + sCnt, GetDistanceBetween(oObject, oCreature)); + // ********** All allies are considered to be seen ********** + SetLocalInt(oCreature, AI_ALLY_PERCEIVED + sCnt, TRUE); + // ********** Get the Total levels of the Allies ********** + nPower = ai_GetCharacterLevels(oObject); + if(nAllyHighestPower < nPower) nAllyHighestPower = nPower; + nAllyPower +=(nPower * nHealth) / 100; + if(AI_DEBUG) ai_Debug("0i_combat", "647", "Ally(" + IntToString(nAllyNum) + "): " + + GetName(oObject) + sDebugText); + if(AI_DEBUG) ai_Debug("0i_combat", "649", "nHealth: " + IntToString(nHealth) + + " nInMelee: " + IntToString(nInMelee) + + " fDistance: " + FloatToString(GetDistanceToObject(oObject), 0, 2) + + " nNum: " + IntToString(nAllyNum) + + " nPower: " + IntToString(nAllyPower / 2)); + } + } + if(AI_DEBUG) sDebugText = ""; + oObject = GetNextObjectInShape(SHAPE_SPHERE, AI_RANGE_BATTLEFIELD, lLocation); + } + if(AI_DEBUG) ai_Debug("0i_combat", "659", "Nearest Enemy: " + GetName(oNearestEnemy)); + if(AI_DEBUG) ai_Debug("0i_combat", "660", "****************** FINISHED COMBAT DATA *******************"); + if(AI_DEBUG) ai_Debug("0i_combat", "661", "************************************************************"); + // Lets save processing by only clearing previous enemy data we don't overwrite. + int nPreviousEnd = GetLocalInt(oCreature, AI_ENEMY_NUMBERS); + int nCnt = nEnemyNum + 1; + if(AI_DEBUG) ai_Debug("0i_combat", "665", "Clearing Enemy Combat Data: nPreviousEnd: " + + IntToString(nPreviousEnd) + " nCurrentEnd: " + IntToString(nCnt - 1)); + while(nPreviousEnd >= nCnt) + { + sCnt = IntToString(nCnt); + if(AI_DEBUG) ai_Debug("0i_combat", "670", "Clearing Enemy Combat Data: " + sCnt + " " + + GetName(GetLocalObject(oCreature, AI_ENEMY + sCnt))); + DeleteLocalObject(oCreature, AI_ENEMY + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCnt); + DeleteLocalFloat(oCreature, AI_ENEMY_RANGE + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_COMBAT + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_MELEE + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_HEALTH + sCnt); + nCnt ++; + } + // Lets save processing by only clearing previous ally data we don't overwrite. + nPreviousEnd = GetLocalInt(oCreature, AI_ALLY_NUMBERS); + nCnt = nAllyNum + 1; + if(AI_DEBUG) ai_Debug("0i_combat", "683", "Clearing Ally Combat Data: nPreviousEnd: " + + IntToString(nPreviousEnd) + " nCurrentEnd: " + IntToString(nCnt - 1)); + while(nPreviousEnd >= nCnt) + { + sCnt = IntToString(nCnt); + if(AI_DEBUG) ai_Debug("0i_combat", "688", "Clearing Ally Combat Data: " + sCnt + " " + + GetName(GetLocalObject(oCreature, AI_ENEMY + sCnt))); + DeleteLocalObject(oCreature, AI_ALLY + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_PERCEIVED + sCnt); + DeleteLocalFloat(oCreature, AI_ALLY_RANGE + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_COMBAT + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_MELEE + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_HEALTH + sCnt); + nCnt ++; + } + // Finally set all group states. + SetLocalInt(oCreature, AI_ENEMY_NUMBERS, nEnemyNum); + // Total enemy power is half the levels of all enemies + the total levels + // of the highest level enemy. + nEnemyPower = (nEnemyPower / 2) + nEnemyHighestPower; + SetLocalInt(oCreature, AI_ENEMY_POWER, nEnemyPower); + SetLocalObject(oCreature, AI_ENEMY_NEAREST, oNearestEnemy); + SetLocalInt(oCreature, AI_ALLY_NUMBERS, nAllyNum); + // Total ally power is half the levels of all allies + the total levels + // of the highest level ally, only used by associates. + nAllyPower = (nAllyPower / 2) + nAllyHighestPower; + SetLocalInt(oCreature, AI_ALLY_POWER, nAllyPower); + if(AI_DEBUG) ai_Debug("0i_combat", "710", "nEnemyPower: " + IntToString(nEnemyPower) + + " nEnemyHighestPower: " + IntToString(nEnemyHighestPower) + + " nAllyPower: " + IntToString(nAllyPower) + + " nAllyHighestPower: " + IntToString(nAllyHighestPower)); + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + " has finished the Combat State"); + return oNearestEnemy; +} +void ai_ClearCombatState(object oCreature) +{ + int bEnemyDone, bAllyDone, nCnt = 1; + int nEnemyNum = GetLocalInt(oCreature, AI_ENEMY_NUMBERS); + int nAllyNum = GetLocalInt(oCreature, AI_ALLY_NUMBERS); + if(AI_DEBUG) ai_Debug("0i_combat", "722", "Clearing " + GetName(oCreature) + "'s combat state." + + " nEnemyNum: " + IntToString(nEnemyNum) + " nAllyNum: " + IntToString(nAllyNum)); + string sCnt; + while(!bEnemyDone || !bAllyDone) + { + sCnt = IntToString(nCnt); + if(nCnt <= nEnemyNum) + { + if(AI_DEBUG) ai_Debug("0i_combat", "730", "Clearing " + GetName(GetLocalObject(oCreature, AI_ENEMY + sCnt)) + "."); + DeleteLocalObject(oCreature, AI_ENEMY + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_DISABLED + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCnt); + DeleteLocalFloat(oCreature, AI_ENEMY_RANGE + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_COMBAT + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_MELEE + sCnt); + DeleteLocalInt(oCreature, AI_ENEMY_HEALTH + sCnt); + } + else bEnemyDone = TRUE; + if(nCnt <= nAllyNum) + { + if(AI_DEBUG) ai_Debug("0i_combat", "742", "Clearing " + GetName(GetLocalObject(oCreature, AI_ALLY + sCnt)) + "."); + DeleteLocalObject(oCreature, AI_ALLY + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_DISABLED + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_PERCEIVED + sCnt); + DeleteLocalFloat(oCreature, AI_ALLY_RANGE + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_COMBAT + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_MELEE + sCnt); + DeleteLocalInt(oCreature, AI_ALLY_HEALTH + sCnt); + } + else bAllyDone = TRUE; + nCnt++; + } + DeleteLocalObject(oCreature, AI_ENEMY_NEAREST); + DeleteLocalInt(oCreature, AI_ENEMY_NUMBERS); + DeleteLocalInt(oCreature, AI_ENEMY_POWER); + DeleteLocalInt(oCreature, AI_ALLY_NUMBERS); + DeleteLocalObject(oCreature, AI_ALLY_POWER); + // Also clear these combat variables at the end of combat. + DeleteLocalObject(oCreature, AI_ATTACKED_PHYSICAL); + DeleteLocalObject(oCreature, AI_ATTACKED_SPELL); + // Remove Talent variables. + DeleteLocalJson(oCreature, AI_TALENT_CURE); + DeleteLocalJson(oCreature, AI_TALENT_HEALING); + DeleteLocalJson(oCreature, AI_TALENT_ENHANCEMENT); + DeleteLocalJson(oCreature, AI_TALENT_PROTECTION); + DeleteLocalJson(oCreature, AI_TALENT_SUMMON); + DeleteLocalJson(oCreature, AI_TALENT_DISCRIMINANT_AOE); + DeleteLocalJson(oCreature, AI_TALENT_INDISCRIMINANT_AOE); + DeleteLocalJson(oCreature, AI_TALENT_RANGED); + DeleteLocalJson(oCreature, AI_TALENT_TOUCH); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_HEALING); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_ENHANCEMENT); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_PROTECTION); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_SUMMON); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_DISCRIMINANT_AOE); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_INDISCRIMINANT_AOE); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_RANGED); + DeleteLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_TOUCH); + DeleteLocalInt(oCreature, AI_AM_I_SEARCHING); + DeleteLocalInt(oCreature, AI_TRIED_TO_HIDE); + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); + DeleteLocalInt(oCreature, sLastActionVarname); + DeleteLocalInt(oCreature, AI_TALENTS_SET); + DeleteLocalInt(oCreature, AI_ROUND); + DeleteLocalInt(oCreature, sIPHasHasteVarname); + DeleteLocalInt(oCreature, sIPImmuneVarname); + DeleteLocalInt(oCreature, sIPResistVarname); + DeleteLocalInt(oCreature, sIPReducedVarname); + ai_EndCombatRound(oCreature); +} +//****************************************************************************** +//*********************** GET TARGETS INTERNAL FUNCTIONS *********************** +//****************************************************************************** +// These functions are used by the Get Index/ Get Target functions below. + +int ai_TargetIsInRangeofCreature(object oCreature, string sTargetType, string sCounter, float fMaxRange) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "796", "fMaxRange: " + FloatToString(fMaxRange, 0, 2) + + " fTargetRange: " + FloatToString(GetLocalFloat(oCreature, sTargetType + "_RANGE" + sCounter), 0, 2)); + return fMaxRange >= GetLocalFloat(oCreature, sTargetType + "_RANGE" + sCounter); +} +int ai_TargetIsInRangeofMaster(object oCreature, object oTarget) +{ + object oMaster = GetMaster(); + if(oMaster == OBJECT_INVALID) return TRUE; + float fMaxRange = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fMaxRange == 0.0) fMaxRange = 20.0; + float fTargetRangefromMaster = GetDistanceBetween(oTarget, oMaster); + if(AI_DEBUG) ai_Debug("0i_combat", "807", "fMaxRangefromMaster: " + FloatToString(fMaxRange, 0, 2) + + " fTargetRangefromMaster: " + FloatToString(fTargetRangefromMaster, 0, 2)); + return fMaxRange >= fTargetRangefromMaster; +} +struct stTarget ai_CheckForNearestTarget(object oCreature, struct stTarget sTarget, int nIndex, string sIndex) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "817", "Getting nearest index: " + sIndex + + " fRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestRange: " + FloatToString(sTarget.fNearestRange, 0, 2) + + " fNearestSecondaryRange: " + FloatToString(sTarget.fNearestSecondaryRange, 0, 2)); + // Lets put any disabled targets and associates if set in a secondary group. + if(GetLocalInt(oCreature, sTarget.sTargetType + "_DISABLED" + sIndex) || + (ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && GetAssociateType(sTarget.oTarget))) + { + if(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestSecondaryRange) + { + sTarget.fNearestSecondaryRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nSecondaryIndex = nIndex; + } + } + else if(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestRange) + { + sTarget.fNearestRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nIndex = nIndex; + } + return sTarget; +} +struct stTarget ai_CheckForLowestValueTarget(object oCreature, struct stTarget sTarget, int nIndex, string sIndex) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "835", "Getting lowest value index: " + sIndex + + " fRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestSecondaryRange: " + FloatToString(sTarget.fNearestSecondaryRange, 0, 2) + + " sTarget.nValue: " + IntToString(sTarget.nValue) + + " sTarget.nBestValue: " + IntToString(sTarget.nBestValue) + + " sTarget.nBestSecondaryValue: " + IntToString(sTarget.nBestSecondaryValue)); + // Lets put any disabled targets and associates if set in a secondary group. + if(GetLocalInt(oCreature, sTarget.sTargetType + "_DISABLED" + sIndex) || + (ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && GetAssociateType(sTarget.oTarget))) + { + if(sTarget.nValue < sTarget.nBestSecondaryValue || + (sTarget.nValue == sTarget.nBestSecondaryValue && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestSecondaryRange)) + { + sTarget.fNearestSecondaryRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nBestSecondaryValue = sTarget.nValue; + sTarget.nSecondaryIndex = nIndex; + } + } + // Has less value or equal value and is closer. + else if(sTarget.nValue < sTarget.nBestValue || + (sTarget.nBestValue == sTarget.nValue && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestRange)) + { + sTarget.fNearestRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nBestValue = sTarget.nValue; + sTarget.nIndex = nIndex; + } + return sTarget; +} +struct stTarget ai_CheckForHighestValueTarget(object oCreature, struct stTarget sTarget, int nIndex, string sIndex) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "865", "Getting highest value index: " + sIndex + + " fRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestRange: " + FloatToString(sTarget.fNearestRange, 0, 2) + + " fNearestSecondaryRange: " + FloatToString(sTarget.fNearestSecondaryRange, 0, 2) + + " sTarget.nValue: " + IntToString(sTarget.nValue) + + " sTarget.nBestValue: " + IntToString(sTarget.nBestValue) + + " sTarget.nBestSecondaryValue: " + IntToString(sTarget.nBestSecondaryValue)); + // Lets put any disabled targets and associates if set in a secondary group. + if(GetLocalInt(oCreature, sTarget.sTargetType + "_DISABLED" + sIndex) || + (ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && GetAssociateType(sTarget.oTarget))) + { + if(sTarget.nValue > sTarget.nBestSecondaryValue || + (sTarget.nValue == sTarget.nBestSecondaryValue && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestSecondaryRange)) + { + sTarget.fNearestSecondaryRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nBestSecondaryValue = sTarget.nValue; + sTarget.nSecondaryIndex = nIndex; + } + } + // Has less value or equal value and is closer. + else if(sTarget.nValue > sTarget.nBestValue || + (sTarget.nBestValue == sTarget.nValue && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestRange)) + { + sTarget.fNearestRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nBestValue = sTarget.nValue; + sTarget.nIndex = nIndex; + } + return sTarget; +} +struct stTarget ai_CheckForNearestAllTarget(object oCreature, struct stTarget sTarget, int nIndex, string sIndex) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "895", "Getting nearest (not disabled) index: " + sIndex + + " fRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestRange: " + FloatToString(sTarget.fNearestRange, 0, 2)); + // If we are ignoring associates set then ignore them. + // Has lower value or equal value and is closer. Familiars/Companions/Summons/Dominated. + if(AI_DEBUG) ai_Debug("0i_combat", "911", "Don't Ignore Associate: " + IntToString(!ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES)) + + " Not an Associate? " + IntToString(GetAssociateType(sTarget.oTarget) < 2)); + if((!ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) || GetAssociateType(sTarget.oTarget) < 2) && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestRange) + { + sTarget.fNearestRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nIndex = nIndex; + } + return sTarget; +} +struct stTarget ai_CheckForLowestValueAllTarget(object oCreature, struct stTarget sTarget, int nIndex, string sIndex) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "923", "Getting lowest value index: " + sIndex + + " fRange: " + FloatToString(GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex), 0, 2) + + " fNearestRange: " + FloatToString(sTarget.fNearestRange, 0, 2) + + " sTarget.nValue: " + IntToString(sTarget.nValue) + + " sTarget.nBestValue: " + IntToString(sTarget.nBestValue)); + // Has less value or equal value and is closer. Ignoring only Familiars/Companions/Summons/Dominated. + if(AI_DEBUG) ai_Debug("0i_combat", "922", "Don't Ignore Associate: " + IntToString(!ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES)) + + " Not an Associate? " + IntToString(GetAssociateType(sTarget.oTarget) < 2)); + if((!ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) || GetAssociateType(sTarget.oTarget) < 2) && + sTarget.nValue < sTarget.nBestValue || + (sTarget.nBestValue == sTarget.nValue && + GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex) < sTarget.fNearestRange)) + { + sTarget.fNearestRange = GetLocalFloat(oCreature, sTarget.sTargetType + "_RANGE" + sIndex); + sTarget.nBestValue = sTarget.nValue; + sTarget.nIndex = nIndex; + } + return sTarget; +} + +//****************************************************************************** +//************ GET INDEX/TARGETs USING COMBAT STATE FUNCTIONS ****************** +//****************************************************************************** +// These functions will find a target based on the combat state variables created +// by the function ai_SetCombatState for associates. + +int ai_GetNearestIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(GetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY)) + { + return ai_GetLowestCRIndex(oCreature, fMaxRange, sTargetType, bAlwaysAtk); + } + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "911", "Getting the nearest index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "918", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "931", "Found nearest [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetNearestTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "936", "Getting the nearest target."); + string sIndex = IntToString(ai_GetNearestIndex(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetLowestCRIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 100; + sTarget.nBestSecondaryValue = 100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "953", "Getting the lowest CR index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "960", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "974", "Found lowest CR [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetLowestCRTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "979", "Getting the lowest CR target."); + string sIndex = IntToString(ai_GetLowestCRIndex(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetHighestCRIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "995", "Getting the highest CR index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1002", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1016", "Found highest CR [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetHighestCRTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1021", "Getting the highest CR target."); + string sIndex = IntToString(ai_GetHighestCRIndex(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetLowestMeleeIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 100; + sTarget.nBestSecondaryValue = 100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1037", "Getting the lowest InMelee index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_MELEE" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1058", "Found lowest InMelee [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +int ai_GetHighestMeleeIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1073", "Getting the highest InMelee index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_MELEE" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1094", "Found highest InMelee [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_CheckForGroupedTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1124", "Getting the highest InMelee target."); + string sIndex = IntToString(ai_GetHighestMeleeIndex(oCreature, fMaxRange, sTargetType)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetMostWoundedIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 200; + sTarget.nBestSecondaryValue = 200; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1113", "Getting the most wounded index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1120", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_HEALTH" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1130", "Found most wounded [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetMostWoundedTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1139", "Getting the most wounded target."); + string sIndex = IntToString(ai_GetMostWoundedIndex(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetAllyToHealIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.nBestValue = 200; + sTarget.sTargetType = AI_ALLY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTarget.sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1154", "Getting the most wounded ally to heal index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ALLY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ALLY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ALLY, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, AI_ALLY_HEALTH + sCounter); + sTarget = ai_CheckForLowestValueAllTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ALLY + sCounter); + } + // If we do not have a normal target then we are done.. + if(AI_DEBUG) ai_Debug("0i_combat", "1187", "Found most wounded ally to heal Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetAllyToHealTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1192", "Getting the most wounded ally to heal target."); + string sIndex = IntToString(ai_GetAllyToHealIndex(oCreature, fMaxRange)); + return GetLocalObject(oCreature, AI_ALLY + sIndex); +} +object ai_GetLowestFortitudeSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 200; + sTarget.nBestSecondaryValue = 200; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1113", "Getting the lowest fortitude save index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetFortitudeSavingThrow(sTarget.oTarget); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1232", "Found lowest fortitude save Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, AI_ENEMY + IntToString(sTarget.nIndex)); +} +object ai_GetLowestReflexSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 200; + sTarget.nBestSecondaryValue = 200; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1248", "Getting the lowest reflex save index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetReflexSavingThrow(sTarget.oTarget); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1269", "Found lowest reflex save Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, AI_ENEMY + IntToString(sTarget.nIndex)); +} +object ai_GetLowestWillSaveTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 200; + sTarget.nBestSecondaryValue = 200; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1285", "Getting the lowest will save index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetWillSavingThrow(sTarget.oTarget); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1306", "Found lowest will save Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, AI_ENEMY + IntToString(sTarget.nIndex)); +} +object ai_GetSpellTargetBasedOnSaves(object oCreature, int nSpell, float fMaxRange = AI_RANGE_PERCEPTION) +{ + // Check the spells save type in "ai_spells.2da" and find the weakest + // creature based on that save. + string sSaveType = Get2DAString("ai_spells", "SaveType", nSpell); + if(sSaveType == "Reflex") return ai_GetLowestReflexSaveTarget(oCreature, fMaxRange); + if(sSaveType == "Fortitude") return ai_GetLowestFortitudeSaveTarget(oCreature, fMaxRange); + if(sSaveType == "Will") return ai_GetLowestWillSaveTarget(oCreature, fMaxRange); + // If there is no save then lets see if we can find an enemy with the lowest health. + return ai_GetMostWoundedTarget(oCreature, fMaxRange); +} +int ai_GetNearestIndexThatSeesUs(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1334", "Getting the nearest creature that sees us index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1373", GetName(sTarget.oTarget) + " can see us? " + + IntToString(GetObjectSeen(oCreature, sTarget.oTarget))); + if(GetObjectSeen(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestAllTarget(oCreature, sTarget, nCounter, sCounter); + } + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(AI_DEBUG) ai_Debug("0i_combat", "1354", "Found nearest creature that sees us Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +int ai_GetBestSneakAttackIndex(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + object oAttacking; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1372", "Getting the best sneak attack index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget) && + !ai_IsImmuneToSneakAttacks(oCreature, sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + oAttacking = ai_GetAttackedTarget(sTarget.oTarget); + if(AI_DEBUG) ai_Debug("0i_combat", "1383", "oTarget: " + GetName(sTarget.oTarget) + + " is attacking " + GetName(oAttacking)); + // They are attacking someone besides us or we are hidden? + if((oAttacking != OBJECT_INVALID && oAttacking != oCreature) || + GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1398", "Found best sneak attack Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +int ai_GetNearestIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(GetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY)) + { + ai_GetLowestCRIndexNotInAOE(oCreature, fMaxRange, sTargetType, bAlwaysAtk); + } + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1416", "Getting the nearest not in AOE index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget) && !ai_IsInADangerousAOE(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1434", "Found nearest not in AOE Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetNearestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1439", "Getting the nearest not in AOE target."); + string sIndex = IntToString(ai_GetNearestIndexNotInAOE(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetLowestCRIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 100; + sTarget.nBestSecondaryValue = 100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1456", "Getting the lowest CR not in AOE index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && !ai_IsInADangerousAOE(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1463", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1477", "Found lowest CR not in AOE [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetLowestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1482", "Getting the lowest cr not in AOE target."); + string sIndex = IntToString(ai_GetLowestCRIndexNotInAOE(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetHighestCRIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1499", "Getting the highest CR not in AOE index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && !ai_IsInADangerousAOE(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1506", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1520", "Found highest CR not in AOE [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_GetHighestTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1525", "Getting the highest cr not in AOE target."); + string sIndex = IntToString(ai_GetHighestCRIndexNotInAOE(oCreature, fMaxRange, sTargetType, bAlwaysAtk)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +int ai_GetHighestMeleeIndexNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1542", "Getting the highest InMelee not in AOE index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && !ai_IsInADangerousAOE(sTarget.oTarget)) + { + if(ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_MELEE" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1563", "Found highest InMelee not in AOE [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return sTarget.nIndex; +} +object ai_CheckForGroupedTargetNotInAOE(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "1574", "Getting the highest InMelee not in AOE target."); + string sIndex = IntToString(ai_GetHighestMeleeIndexNotInAOE(oCreature, fMaxRange, sTargetType)); + return GetLocalObject(oCreature, sTargetType + sIndex); +} +object ai_GetNearestClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(GetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY)) + { + ai_GetLowestCRClassTarget(oCreature, nClassType, fMaxRange, sTargetType, bAlwaysAtk); + } + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1591", "Getting the nearest class index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckClassType(sTarget.oTarget, nClassType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1598", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1611", "Found nearest class Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetLowestCRClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 100; + sTarget.nBestSecondaryValue = 100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1626", "Getting the lowest CR class index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckClassType(sTarget.oTarget, nClassType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1634", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1648", "Found lowest CR class [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetHighestCRClassTarget(object oCreature, int nClassType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1664", "Getting the highest CR class index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckClassType(sTarget.oTarget, nClassType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1671", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1685", "Found highest CR class [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetNearestRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + if(GetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY)) + { + ai_GetLowestCRRacialTarget(oCreature, nRacialType, fMaxRange, sTargetType, bAlwaysAtk); + } + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1703", "Getting the nearest race index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckRacialType(sTarget.oTarget, nRacialType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1710", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1723", "Found nearest race Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetLowestCRRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = 100; + sTarget.nBestSecondaryValue = 100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1739", "Getting the lowest CR race index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckRacialType(sTarget.oTarget, nRacialType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1746", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForLowestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1760", "Found lowest CR race [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetHighestCRRacialTarget(object oCreature, int nRacialType, float fMaxRange = AI_RANGE_PERCEPTION, string sTargetType = AI_ENEMY, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = sTargetType; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1776", "Getting the highest CR race index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, sTargetType + "_PERCEIVED" + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckRacialType(sTarget.oTarget, nRacialType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1783", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, sTargetType, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget.nValue = GetLocalInt(oCreature, sTargetType + "_COMBAT" + sCounter); + sTarget = ai_CheckForHighestValueTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, sTargetType + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1797", "Found highest CR race [" + sTargetType + "] Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, sTargetType + IntToString(sTarget.nIndex)); +} +object ai_GetNearestFavoredEnemyTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.nBestValue = -100; + sTarget.nBestSecondaryValue = -100; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + int nRace, nRacialType; + while(nRace < 24) + { + // Find which favored enemies we have. + if(nRace < 1 && GetHasFeat(FEAT_FAVORED_ENEMY_ABERRATION, oCreature)) + { + nRace = 1; + nRacialType = RACIAL_TYPE_ABERRATION; + } + else if(nRace < 2 && GetHasFeat(FEAT_FAVORED_ENEMY_ANIMAL, oCreature)) + { + nRace = 2; + nRacialType = RACIAL_TYPE_ANIMAL; + } + else if(nRace < 3 && GetHasFeat(FEAT_FAVORED_ENEMY_BEAST, oCreature)) + { + nRace = 3; + nRacialType = RACIAL_TYPE_BEAST; + } + else if(nRace < 4 && GetHasFeat(FEAT_FAVORED_ENEMY_CONSTRUCT, oCreature)) + { + nRace = 4; + nRacialType = RACIAL_TYPE_CONSTRUCT; + } + else if(nRace < 5 && GetHasFeat(FEAT_FAVORED_ENEMY_DRAGON, oCreature)) + { + nRace = 5; + nRacialType = RACIAL_TYPE_DRAGON; + } + else if(nRace < 6 && GetHasFeat(FEAT_FAVORED_ENEMY_DWARF, oCreature)) + { + nRace = 6; + nRacialType = RACIAL_TYPE_DWARF; + } + else if(nRace < 7 && GetHasFeat(FEAT_FAVORED_ENEMY_ELEMENTAL, oCreature)) + { + nRace = 7; + nRacialType = RACIAL_TYPE_ELEMENTAL; + } + else if(nRace < 8 && GetHasFeat(FEAT_FAVORED_ENEMY_ELF, oCreature)) + { + nRace = 8; + nRacialType = RACIAL_TYPE_ELF; + } + else if(nRace < 9 && GetHasFeat(FEAT_FAVORED_ENEMY_FEY, oCreature)) + { + nRace = 9; + nRacialType = RACIAL_TYPE_FEY; + } + else if(nRace < 10 && GetHasFeat(FEAT_FAVORED_ENEMY_GIANT, oCreature)) + { + nRace = 10; + nRacialType = RACIAL_TYPE_GIANT; + } + else if(nRace < 11 && GetHasFeat(FEAT_FAVORED_ENEMY_GNOME, oCreature)) + { + nRace = 11; + nRacialType = RACIAL_TYPE_GNOME; + } + else if(nRace < 12 && GetHasFeat(FEAT_FAVORED_ENEMY_GOBLINOID, oCreature)) + { + nRace = 12; + nRacialType = RACIAL_TYPE_HUMANOID_GOBLINOID; + } + else if(nRace < 13 && GetHasFeat(FEAT_FAVORED_ENEMY_HALFELF, oCreature)) + { + nRace = 13; + nRacialType = RACIAL_TYPE_HALFELF; + } + else if(nRace < 14 && GetHasFeat(FEAT_FAVORED_ENEMY_HALFLING, oCreature)) + { + nRace = 14; + nRacialType = RACIAL_TYPE_HALFLING; + } + else if(nRace < 15 && GetHasFeat(FEAT_FAVORED_ENEMY_HALFORC, oCreature)) + { + nRace = 15; + nRacialType = RACIAL_TYPE_HALFORC; + } + else if(nRace < 16 && GetHasFeat(FEAT_FAVORED_ENEMY_HUMAN, oCreature)) + { + nRace = 16; + nRacialType = RACIAL_TYPE_HUMAN; + } + else if(nRace < 17 && GetHasFeat(FEAT_FAVORED_ENEMY_MAGICAL_BEAST, oCreature)) + { + nRace = 17; + nRacialType = RACIAL_TYPE_MAGICAL_BEAST; + } + else if(nRace < 18 && GetHasFeat(FEAT_FAVORED_ENEMY_MONSTROUS, oCreature)) + { + nRace = 18; + nRacialType = RACIAL_TYPE_HUMANOID_MONSTROUS; + } + else if(nRace < 19 && GetHasFeat(FEAT_FAVORED_ENEMY_ORC, oCreature)) + { + nRace = 19; + nRacialType = RACIAL_TYPE_HUMANOID_ORC; + } + else if(nRace < 20 && GetHasFeat(FEAT_FAVORED_ENEMY_OUTSIDER, oCreature)) + { + nRace = 20; + nRacialType = RACIAL_TYPE_OUTSIDER; + } + else if(nRace < 21 && GetHasFeat(FEAT_FAVORED_ENEMY_REPTILIAN, oCreature)) + { + nRace = 21; + nRacialType = RACIAL_TYPE_HUMANOID_REPTILIAN; + } + else if(nRace < 22 && GetHasFeat(FEAT_FAVORED_ENEMY_SHAPECHANGER, oCreature)) + { + nRace = 22; + nRacialType = RACIAL_TYPE_SHAPECHANGER; + } + else if(nRace < 23 && GetHasFeat(FEAT_FAVORED_ENEMY_UNDEAD, oCreature)) + { + nRace = 23; + nRacialType = RACIAL_TYPE_UNDEAD; + } + else if(nRace < 24 && GetHasFeat(FEAT_FAVORED_ENEMY_VERMIN, oCreature)) + { + nRace = 24; + nRacialType = RACIAL_TYPE_VERMIN; + } + else nRace = 25; + if(nRace < 25) + { + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1940", "Getting the nearest favored race index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget) && ai_CheckRacialType(sTarget.oTarget, nRacialType)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "1947", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) + + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + } + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "1962", "Found nearest favored race Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, AI_ENEMY + IntToString(sTarget.nIndex)); +} +object ai_GetFlankTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE) +{ + int nCnt = 1, nInMelee, nHighestMelee; + string sCnt = "1"; + float fAllyRange; + object oTarget, oAlly = GetLocalObject(oCreature, AI_ALLY + sCnt); + while(oAlly != OBJECT_INVALID) + { + fAllyRange = GetLocalFloat(oCreature, AI_ALLY_RANGE + sCnt); + if(AI_DEBUG) ai_Debug("0i_combat", "1974", "Getting Ally being Flanked Index: " + sCnt + " " + + GetName(oAlly) + " fAllyRange: " + FloatToString(fAllyRange, 0, 2) + + " fMaxRange: " + FloatToString(fMaxRange, 0, 2)); + if(fAllyRange <= fMaxRange) + { + nInMelee = GetLocalInt(oCreature, AI_ALLY_MELEE + sCnt); + if(AI_DEBUG) ai_Debug("0i_combat", "1980", "nInMelee: " + IntToString(nInMelee)); + if(!GetIsDead(oAlly) && nInMelee > nHighestMelee) + { + oTarget = ai_GetEnemyAttackingMyAlly(oCreature, oAlly, fMaxRange); + if(oTarget != OBJECT_INVALID) nHighestMelee = nInMelee; + } + } + sCnt = IntToString(++nCnt); + oAlly = GetLocalObject(oCreature, AI_ALLY + sCnt); + } + // If we do not have a good target then lets see if there are more targets. + if(oTarget == OBJECT_INVALID) + { + // If we just checked within melee then lets check what we can see if + // we can move around in combat. + if (fMaxRange == AI_RANGE_MELEE && ai_CanIMoveInCombat(oCreature)) + { + oTarget = ai_GetFlankTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + } + } + if(AI_DEBUG) ai_Debug("0i_combat", "2000", "oTarget " + GetName(oTarget) + + " is attacking " + GetName(oAlly)); + return oTarget; +} +object ai_GetRangedTarget(object oCreature, float fMaxRange = AI_RANGE_PERCEPTION, int bAlwaysAtk = TRUE) +{ + struct stTarget sTarget; + sTarget.fNearestRange = fMaxRange + 1.0; + sTarget.fNearestSecondaryRange = sTarget.fNearestRange; + sTarget.sTargetType = AI_ENEMY; + int nCounter = 1; + string sCounter = "1"; + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + while(sTarget.oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "2037", "Getting the nearest ranged index: " + + sCounter + " " + GetName(sTarget.oTarget) + + " Seen: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter)) + + " GetIsDead: " + IntToString(GetIsDead(sTarget.oTarget))); + if(GetLocalInt(oCreature, AI_ENEMY_PERCEIVED + sCounter) && + !GetIsDead(sTarget.oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "2044", "bAlwaysAtk: " + IntToString(bAlwaysAtk)); + if((bAlwaysAtk || !ai_IsStrongerThanMe(oCreature, nCounter)) && + ai_TargetIsInRangeofCreature(oCreature, AI_ENEMY, sCounter, fMaxRange) && + ai_TargetIsInRangeofMaster(oCreature, sTarget.oTarget)) + { + if(ai_GetIsRangeWeapon(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, sTarget.oTarget))) + { + sTarget = ai_CheckForNearestTarget(oCreature, sTarget, nCounter, sCounter); + } + } + } + sCounter = IntToString(++nCounter); + sTarget.oTarget = GetLocalObject(oCreature, AI_ENEMY + sCounter); + } + // If we do not have a normal target then use our best secondary target. + if(sTarget.nIndex == 0 && sTarget.nSecondaryIndex != 0) sTarget.nIndex = sTarget.nSecondaryIndex; + if(AI_DEBUG) ai_Debug("0i_combat", "2060", "Found nearest ranged Index: " + IntToString(sTarget.nIndex)); + return GetLocalObject(oCreature, AI_ENEMY + IntToString(sTarget.nIndex)); +} +object ai_GetBestTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget != OBJECT_INVALID) return oPCTarget; + string sIndex; + // Are we in melee? If so try to get the weakest enemy in melee. + if(nInMelee > 0) + { + if(ai_CanIMoveInCombat(oCreature)) + { + sIndex = IntToString(ai_GetLowestCRIndex(oCreature, AI_RANGE_MELEE)); + } + else sIndex = IntToString(ai_GetNearestIndex(oCreature, AI_RANGE_MELEE)); + } + // If not then lets go find someone to attack! + else + { + // If we are not in melee then we should get the nearest enemy. + sIndex = IntToString(ai_GetNearestIndexNotInAOE(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + /* Lets stay out of bad AOE's. + // If we didn't get a target then get any target within range. + if(sIndex == "0") + { + sIndex = IntToString(ai_GetLowestCRIndex(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + } */ + } + object oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("0i_combat", "2048", GetName(oTarget) + " is the best target for melee combat!"); + return oTarget; +} +object ai_GetNearestTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget != OBJECT_INVALID) return oPCTarget; + string sIndex; + // Are we in melee? If so try to get the nearest enemy in melee. + if(nInMelee > 0) sIndex = IntToString(ai_GetNearestIndex(oCreature, AI_RANGE_MELEE)); + // If not then lets go find someone to attack! + else + { + // Get the nearest enemy. + sIndex = IntToString(ai_GetNearestIndexNotInAOE(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + // If we didn't get a target then get any target within range. + if(sIndex == "0") + { + sIndex = IntToString(ai_GetNearestIndex(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + } + } + object oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("0i_combat", "2024", GetName(oTarget) + " is the nearest target for melee combat!"); + return oTarget; +} +object ai_GetLowestCRTargetForMeleeCombat(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget != OBJECT_INVALID) return oPCTarget; + string sIndex; + // Are we in melee? If so try to get the weakest enemy in melee. + if(nInMelee > 0) sIndex = IntToString(ai_GetLowestCRIndex(oCreature, AI_RANGE_MELEE)); + // If not then lets go find someone to attack! + else + { + // Get the weakest combat rated enemy. + sIndex = IntToString(ai_GetLowestCRIndexNotInAOE(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + /* Lets stay out of bad AOE's. + // If we didn't get a target then get any target within range. + if(sIndex == "0") + { + sIndex = IntToString(ai_GetLowestCRIndex(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk)); + } */ + } + object oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("0i_combat", "2048", GetName(oTarget) + " is the weakest target for melee combat!"); + return oTarget; +} +object ai_GetHighestCRTargetForMeleeCombat(object oCreature, int nInMelee) +{ + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget != OBJECT_INVALID) return oPCTarget; + string sIndex; + // Are we in melee? If so try to get the weakest enemy in melee. + if(nInMelee > 0) sIndex = IntToString(ai_GetHighestCRIndex(oCreature, AI_RANGE_MELEE)); + // If not then lets go find someone to attack! + else + { + // Get the weakest combat rated enemy. + sIndex = IntToString(ai_GetHighestCRIndexNotInAOE(oCreature, AI_RANGE_PERCEPTION)); + /* Lets stay out of bad AOE's. + // If we didn't get a target then get any target within range. + if(sIndex == "0") sIndex = IntToString(ai_GetHighestCRIndex(oCreature)); + */ + } + object oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("0i_combat", "2070", GetName(oTarget) + " is the strongest target for melee combat!"); + return oTarget; +} +object ai_GetEnemyAttackingMe(object oCreature, float fMaxRange = AI_RANGE_MELEE) +{ + int nCtr = 1; + float fDistance; + string sCtr = "1"; + object oAttacked; + object oEnemy = GetLocalObject(oCreature, AI_ENEMY + "1"); + while(oEnemy != OBJECT_INVALID) + { + if(!ai_Disabled(oEnemy)) + { + fDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + sCtr); + if(AI_DEBUG) ai_Debug("0i_combat", "2084", "Getting Enemy Attacking Me: " + sCtr + " " + + GetName(oEnemy) + " fTargetRange: " + FloatToString(fDistance, 0, 2) + + " fMaxRange: " + FloatToString(fMaxRange, 0, 2) + " Attacking: " + + GetName(ai_GetAttackedTarget(oEnemy))); + if(fDistance <= fMaxRange) + { + oAttacked = ai_GetAttackedTarget(oEnemy); + // If an enemy isn't attacking someone we must assume we are next! + if(oAttacked == oCreature || oAttacked == OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "2095", "Enemy attacking me: " + GetName(oEnemy) + " has attacked: " + GetName(ai_GetAttackedTarget(oEnemy))); + return oEnemy; + } + } + } + sCtr = IntToString(++nCtr); + oEnemy = GetLocalObject(oCreature, AI_ENEMY + sCtr); + } + return OBJECT_INVALID; +} +object ai_GetEnemyAttackingMyAlly(object oCreature, object oAlly, float fMaxRange = AI_RANGE_MELEE) +{ + int nCtr = 1, nIndex, nDIndex; + int bIngnoreAssociates = ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES); + float fEnemyRange, fNearestEnemyRange = fMaxRange + 1.0; + float fNearestDEnemyRange = fMaxRange + 1.0; + string sCtr = "1"; + object oAttacked; + object oEnemy = GetLocalObject(oCreature, AI_ENEMY + "1"); + while(oEnemy != OBJECT_INVALID) + { + fEnemyRange = GetLocalFloat(oCreature, AI_ENEMY_RANGE + sCtr); + if(AI_DEBUG) ai_Debug("0i_combat", "2117", "Getting Enemy Attacking Ally:" + + GetName(oAlly) + ": " + sCtr + " InMelee:" + + GetName(oEnemy) + " fEnemyRange: " + FloatToString(fEnemyRange, 0, 2) + + " fMaxRange: " + FloatToString(fMaxRange, 0, 2) + " Attacking: " + + GetName(ai_GetAttackedTarget(oEnemy))); + if(fEnemyRange <= fMaxRange) + { + oAttacked = ai_GetAttackedTarget(oEnemy); + if(AI_DEBUG) ai_Debug("0i_combat", "2125", "Enemy attacking " + + GetName(oAlly) + ": " + GetName(oEnemy) + + " has attacked: " + GetName(ai_GetAttackedTarget(oEnemy))); + // If an enemy isn't attacking someone we must assume we are next! + if(oAttacked == oAlly) + { + // Lets put any disabled targets in its own group, if we + // ignore associates lets put them here as well. + if(GetLocalInt(oCreature, AI_ENEMY_DISABLED + sCtr) || + (bIngnoreAssociates && GetAssociateType(oEnemy))) + { + if(fEnemyRange < fNearestDEnemyRange) + { + fNearestDEnemyRange = fEnemyRange; + nDIndex = nCtr; + } + } + else if(fEnemyRange < fNearestEnemyRange) + { + fNearestEnemyRange = fEnemyRange; + nIndex = nCtr; + } + } + } + sCtr = IntToString(++nCtr); + oEnemy = GetLocalObject(oCreature, AI_ENEMY + sCtr); + } + // If we do not have a good target then lets see if there are more targets. + if(nIndex == 0 && nDIndex != 0) + { + // If we just checked within melee then lets check what we can see. + if (fMaxRange == AI_RANGE_MELEE) return ai_GetEnemyAttackingMyAlly(oCreature, oAlly, AI_RANGE_PERCEPTION); + else nIndex = nDIndex; + } + return GetLocalObject(oCreature, AI_ENEMY + IntToString(nIndex)); +} +int ai_GetNumOfEnemiesInRange(object oCreature, float fMaxRange = AI_RANGE_MELEE) +{ + int nNumOfEnemies, nCnt = 1; + float fDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + "1"); + while(fDistance != 0.0) + { + if(fDistance < fMaxRange) nNumOfEnemies ++; + fDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + IntToString(++nCnt)); + } + if(AI_DEBUG) ai_Debug("0i_combat", "2459", IntToString (nNumOfEnemies) + " enemies within " + FloatToString(fMaxRange, 0, 2) + " meters."); + return nNumOfEnemies; +} +object ai_GetAllyBuffTarget(object oCreature, int nSpell, float fMaxRange = AI_RANGE_BATTLEFIELD) +{ + // Make sure we don't over extend our movement running across the + // battlefield to cast a spell on someone does not look good. + float fNearestEnemy = GetDistanceBetween(oCreature, GetLocalObject(oCreature, AI_ENEMY_NEAREST)) - 3.0f; + // If we are in melee then extend to melee incase an ally is just past the enemy. + if(fNearestEnemy <= AI_RANGE_MELEE) fNearestEnemy = AI_RANGE_MELEE; + if(fMaxRange > fNearestEnemy) fMaxRange = fNearestEnemy; + // Now lets get the best target based on the spell data in ai_spells.2da + string sBuffTarget = Get2DAString("ai_spells", "Buff_Target", nSpell); + if(AI_DEBUG) ai_Debug("0i_combat", "2596", "sBuffTarget: " + sBuffTarget + " fMaxRange: " + FloatToString(fMaxRange, 0, 2)); + if(sBuffTarget == "0") return oCreature; + if(sBuffTarget == "1") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_STRENGTH, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "2") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_DEXTERITY, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "3") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_CONSTITUTION, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "4") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_INTELLIGENCE, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "5") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_WISDOM, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "6") + return ai_BuffHighestAbilityScoreTarget(oCreature, nSpell, ABILITY_CHARISMA, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "7") + return ai_BuffLowestACTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "8") + return ai_BuffLowestACWithOutACBonus(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "9") + return ai_BuffHighestAttackTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "10") + return ai_BuffMostWoundedTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "11") + return ai_BuffLowestFortitudeSaveTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "12") + return ai_BuffLowestReflexSaveTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "13") + return ai_BuffLowestWillSaveTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + else if(sBuffTarget == "14") + return ai_BuffLowestSaveTarget(oCreature, nSpell, "", fMaxRange, AI_ALLY); + return OBJECT_INVALID; +} + +//****************************************************************************** +//******************** OTHER COMBAT FUNCTIONS ******************************** +//****************************************************************************** + +int ai_GetCurrentRound(object oCreature) +{ + int nRound = GetLocalInt(oCreature, AI_ROUND) + 1; + SetLocalInt(oCreature, AI_ROUND, nRound); + if(AI_DEBUG) ai_Debug("0i_combat", "2471", "nRound: " + IntToString(nRound)); + return nRound; +} +int ai_GetDifficulty(object oCreature) +{ + int nAdjustment = GetLocalInt(oCreature, AI_DIFFICULTY_ADJUSTMENT); + int nDifficulty = GetLocalInt(oCreature, AI_ENEMY_POWER) - GetLocalInt(oCreature, AI_ALLY_POWER) + 13 + nAdjustment; + if(nDifficulty < 1) nDifficulty = 1; + if(AI_DEBUG) ai_Debug("0i_combat", "2474", "(Difficulty: Enemy Power: " + IntToString(GetLocalInt(oCreature, AI_ENEMY_POWER)) + + " - Ally Power: " + IntToString(GetLocalInt(oCreature, AI_ALLY_POWER)) + + ") + 13 + nAdj: " + IntToString(nAdjustment) + + " = " + IntToString(nDifficulty) + "(Min of 1)"); + return nDifficulty; +} +int ai_GetMyCombatRating(object oCreature) +{ + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + int nAtkBonus = GetBaseAttackBonus(oCreature); + if(GetHasFeat(FEAT_WEAPON_FINESSE, oCreature) && ai_GetIsFinesseWeapon(oCreature, oWeapon)) + { + nAtkBonus += GetAbilityModifier(ABILITY_DEXTERITY, oCreature); + } + else nAtkBonus += GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(ai_GetIsMeleeWeapon(oWeapon)) nAtkBonus += ai_GetWeaponAtkBonus(oWeapon); + if(AI_DEBUG) ai_Debug("0i_combat", "2496", "GetMyCombatRating (nAtkBonus: " + IntToString(nAtkBonus) + + " nAC: " + IntToString(GetAC(oCreature)) + " - 10) / 2 = " + + IntToString((nAtkBonus + GetAC(oCreature) - 10) / 2)); + return(nAtkBonus + GetAC(oCreature) - 10) / 2; +} +object ai_GetAttackedTarget(object oCreature, int bPhysical = TRUE, int bSpell = FALSE) +{ + object oTarget = GetAttackTarget(oCreature); + if(!GetIsObjectValid(oTarget) && bPhysical) oTarget = GetLocalObject(oCreature, AI_ATTACKED_PHYSICAL); + if(!GetIsObjectValid(oTarget) && bSpell) oTarget = GetLocalObject(oCreature, AI_ATTACKED_SPELL); + if(!GetIsObjectValid(oTarget) || GetIsDead(oTarget)) return OBJECT_INVALID; + return oTarget; +} +int ai_CheckClassType(object oTarget, int nClassType) +{ + int nCnt = 1, nClass = GetClassByPosition(1, oTarget); + // We check for the group class types. + if(nClassType < 0) + { + while(nCnt <= AI_MAX_CLASSES_PER_CHARACTER) + { + int nCaster = StringToInt(Get2DAString("classes", "SpellCaster", nClass)); + if(nClassType == AI_CLASS_TYPE_WARRIOR && !nCaster) return TRUE; + else if(nClassType == AI_CLASS_TYPE_CASTER && nCaster) return TRUE; + int nSpellType = StringToInt(Get2DAString("classes", "Arcane", nClass)); + if(nClassType == AI_CLASS_TYPE_ARCANE && nSpellType) return TRUE; + else if(nClassType == AI_CLASS_TYPE_DIVINE && !nSpellType) return TRUE; + nClass = GetClassByPosition(++nCnt, oTarget); + } + } + // Checks for normal classes. + else + { + while(nCnt <= AI_MAX_CLASSES_PER_CHARACTER) + { + if(nClass == nClassType) return TRUE; + nClass = GetClassByPosition(++nCnt, oTarget); + } + } + return FALSE; +} +int ai_CheckRacialType(object oTarget, int nRacialType) +{ + int nRace = GetRacialType(oTarget); + if(nRacialType == nRace) return TRUE; + else if(nRacialType == AI_RACIAL_TYPE_ANIMAL_BEAST) + { + if(nRace == RACIAL_TYPE_ANIMAL || + nRace == RACIAL_TYPE_BEAST || + nRace == RACIAL_TYPE_MAGICAL_BEAST) return TRUE; + } + else if(nRacialType == AI_RACIAL_TYPE_HUMANOID) + { + switch (nRace) + { + case RACIAL_TYPE_DWARF : + case RACIAL_TYPE_ELF : + case RACIAL_TYPE_GNOME : + case RACIAL_TYPE_HALFELF : + case RACIAL_TYPE_HALFLING : + case RACIAL_TYPE_HALFORC : + case RACIAL_TYPE_HUMAN : + case RACIAL_TYPE_HUMANOID_GOBLINOID : + case RACIAL_TYPE_HUMANOID_MONSTROUS : + case RACIAL_TYPE_HUMANOID_ORC : + case RACIAL_TYPE_HUMANOID_REPTILIAN : + return TRUE; + } + } + return FALSE; +} +void ai_SetNormalAppearance(object oCreature) +{ + if(!ai_GetHasEffectType(oCreature, EFFECT_TYPE_POLYMORPH)) + { + int nForm = GetAppearanceType(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "2729", GetName(oCreature) + " form: " + IntToString(nForm)); + SetLocalInt(oCreature, AI_NORMAL_FORM, nForm + 1); + } +} +int ai_GetNormalAppearance(object oCreature) +{ + int nForm = GetLocalInt(oCreature, AI_NORMAL_FORM) - 1; + if(nForm == -1) + { + ai_SetNormalAppearance(oCreature); + nForm = GetLocalInt(oCreature, AI_NORMAL_FORM) - 1; + } + return nForm; +} +struct stClasses ai_GetFactionsClasses(object oCreature, int bEnemy = TRUE, float fMaxRange = AI_RANGE_BATTLEFIELD) +{ + struct stClasses sCount; + int nCnt = 1, nPosition, nClass, nLevels; + object oTarget; + if(bEnemy) oTarget = ai_GetNearestEnemy(oCreature, 1, 7, 7); + else oTarget = ai_GetNearestAlly(oCreature, 1, 7, 7); + while(oTarget != OBJECT_INVALID && GetDistanceBetween(oTarget, oCreature) <= fMaxRange) + { + for(nPosition = 1; nPosition <= AI_MAX_CLASSES_PER_CHARACTER; nPosition++) + { + nClass = GetClassByPosition(nPosition, oTarget); + nLevels = GetLevelByPosition(nPosition, oTarget); + if(nClass == CLASS_TYPE_ANIMAL || + nClass == CLASS_TYPE_BARBARIAN || + nClass == CLASS_TYPE_COMMONER || + nClass == CLASS_TYPE_CONSTRUCT || + nClass == CLASS_TYPE_ELEMENTAL || + nClass == CLASS_TYPE_FIGHTER || + nClass == CLASS_TYPE_GIANT || + nClass == CLASS_TYPE_HUMANOID || + nClass == CLASS_TYPE_MONSTROUS || + nClass == CLASS_TYPE_PALADIN || + nClass == CLASS_TYPE_RANGER || + nClass == CLASS_TYPE_ROGUE || + nClass == CLASS_TYPE_VERMIN || + nClass == CLASS_TYPE_MONK || + nClass == CLASS_TYPE_SHAPECHANGER) + { + sCount.FIGHTERS += 1; + sCount.FIGHTER_LEVELS += nLevels; + } + else if(nClass == CLASS_TYPE_CLERIC || + nClass == CLASS_TYPE_DRUID) + { + sCount.CLERICS += 1; + sCount.CLERIC_LEVELS += nLevels; + } + else if(nClass == CLASS_TYPE_BARD || + nClass == CLASS_TYPE_FEY || + nClass == CLASS_TYPE_SORCERER || + nClass == CLASS_TYPE_WIZARD) + { + sCount.MAGES += 1; + sCount.MAGE_LEVELS += nLevels; + } + else if(nClass == CLASS_TYPE_ABERRATION || + nClass == CLASS_TYPE_DRAGON || + nClass == 29 || //oozes + nClass == CLASS_TYPE_MAGICAL_BEAST || + nClass == CLASS_TYPE_OUTSIDER) + { + sCount.MONSTERS += 1; + sCount.MONSTER_LEVELS += nLevels; + } + sCount.TOTAL_LEVELS += nLevels; + } + sCount.TOTAL += 1; + if(bEnemy) oTarget = ai_GetNearestEnemy(oCreature, ++nCnt, 7, 7); + else oTarget = ai_GetNearestAlly(oCreature, ++nCnt, 7, 7); + } + if(AI_DEBUG) ai_Debug("0i_combat", "2627", "Enemy: " + IntToString(bEnemy) + " fMaxRange: " + FloatToString(fMaxRange, 0, 2) + + " CLERICS: " + IntToString(sCount.CLERICS) + "(" + IntToString(sCount.CLERIC_LEVELS) + + ") FIGHTERS: " +IntToString(sCount.FIGHTERS) + "(" + IntToString(sCount.FIGHTER_LEVELS) + + ") MAGES: " +IntToString(sCount.MAGES) + "(" + IntToString(sCount.MAGE_LEVELS) + + ") MONSTERS: " +IntToString(sCount.MONSTERS) + "(" + IntToString(sCount.MONSTER_LEVELS) + + ") TOTALS: " +IntToString(sCount.TOTAL) + "(" + IntToString(sCount.TOTAL_LEVELS)); + return sCount; +} +string ai_GetMostDangerousClass(struct stClasses stCount) +{ + string sClass; + // Lets weight the fighter levels 30% higher. + int nFighter =((stCount.FIGHTER_LEVELS) * 13)/10; + if(nFighter >= stCount.CLERIC_LEVELS) + { + if(nFighter >= stCount.MAGE_LEVELS) + { + if(nFighter >= stCount.MONSTER_LEVELS) return "FIGHTER"; + else return "MONSTER"; + } + else if(stCount.MAGE_LEVELS >= stCount.MONSTER_LEVELS) return "MAGE"; + else return "MONSTER"; + } + else if(stCount.CLERIC_LEVELS >= stCount.MAGE_LEVELS) + { + if(stCount.CLERIC_LEVELS >= stCount.MONSTER_LEVELS) return "CLERIC"; + else return "MONSTER"; + } + else if(stCount.MAGE_LEVELS >= stCount.MONSTER_LEVELS) return "MAGE"; + else return "MONSTER"; + return ""; +} +void ai_EquipBestWeapons(object oCreature, object oTarget = OBJECT_INVALID) +{ + // Lets not check for weapons on creatures that can't use them! + int nRacialType = GetRacialType(oCreature); + if(nRacialType == RACIAL_TYPE_ANIMAL || + nRacialType == RACIAL_TYPE_DRAGON || + nRacialType == RACIAL_TYPE_MAGICAL_BEAST || + nRacialType == RACIAL_TYPE_OOZE || + nRacialType == RACIAL_TYPE_VERMIN) return; + //if(Polymorphed()) return; + if(AI_DEBUG) ai_Debug("0i_combat", "2669", GetName(OBJECT_SELF) + " is equiping best weapon!"); + // Determine if I am wielding a ranged weapon, melee weapon, or none. + int bIsWieldingRanged = ai_HasRangedWeaponWithAmmo(oCreature); + int bIsWieldingMelee = ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)); + if(AI_DEBUG) ai_Debug("0i_combat", "2673", "bIsWieldingRanged: " + IntToString(bIsWieldingRanged) + + " bIsWieldingMelee: " + IntToString(bIsWieldingMelee)); + // If we are hidden then change to a melee weapon so we can move in to attack. + if(ai_GetIsHidden(oCreature)) + { + // Equip a melee weapon unless we already have one. + if(!bIsWieldingMelee) ai_EquipBestMeleeWeapon(oCreature, oTarget); + return; + } + // Equip the appropriate weapon for the distance of the enemy. + int nEnemyGroup = ai_GetNumOfEnemiesInGroup(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "2684", GetName(oCreature) + " has " + IntToString(nEnemyGroup) + " enemies within 5.0f them! PointBlank: " + + IntToString(GetHasFeat(FEAT_POINT_BLANK_SHOT, oCreature))); + // We are in melee combat. + if(nEnemyGroup > 0) + { + if(bIsWieldingRanged) + { + // We have the point blank shot feat or there are more than one enemy on us. + // Note: Point Blank shot feat is bad once we have more than one enemy on us. + if(!GetHasFeat(FEAT_POINT_BLANK_SHOT, oCreature) || nEnemyGroup > 1) + { + // If I'm not using a melee weapon. + if(!bIsWieldingMelee) + { + ai_EquipBestMeleeWeapon(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "2699", GetName(oCreature) + " is equiping melee weapon due to close enemies!"); + } + } + } + } + // We are not in melee range. + else + { + if(AI_DEBUG) ai_Debug("0i_combat", "2707", GetName(oCreature) + " is not in melee combat with an enemy!"); + // If are at range with the enemy then equip a ranged weapon. + if(!bIsWieldingRanged) + { + ai_EquipBestRangedWeapon(oTarget); + // Make sure that they equiped a range weapon. + bIsWieldingRanged = ai_HasRangedWeaponWithAmmo(oCreature); + bIsWieldingMelee = ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature)); + if(AI_DEBUG) ai_Debug("0i_combat", "2719", GetName(oCreature) + " is attempting to equip a ranged weapon: " + IntToString(bIsWieldingRanged)); + // If we equiped a ranged weapon then drop out. + } + } + // We don't have a weapon out so equip one! We are in combat! + if(!bIsWieldingRanged && !bIsWieldingMelee) ai_EquipBestMeleeWeapon(OBJECT_INVALID); +} +int ai_EquipBestMeleeWeapon(object oCreature, object oTarget = OBJECT_INVALID) +{ + if(ai_GetAIMode(oCreature, AI_MODE_EQUIP_WEAPON_OFF)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_combat", "3049", GetName(oCreature) + " is equiping best melee weapon!"); + float fItemPower, fOffItemPower, fRightPower, fLeftPower, f2HandedPower; + int nItemPower, nShieldPower, nShieldValue, nItemValue, nRightValue; + int n2HandedValue, nLeftValue, bTwoWeaponUser; + int nMaxItemValue = ai_GetMaxItemValueThatCanBeEquiped(GetHitDice(oCreature)); + if(AI_DEBUG) ai_Debug("0i_combat", "3054", "nMaxItemValue: " + IntToString(nMaxItemValue)); + bTwoWeaponUser = GetHasFeat(374/*FEAT_DUAL_WIELD*/, oCreature) || GetHasFeat(FEAT_TWO_WEAPON_FIGHTING, oCreature); + object oShield = OBJECT_INVALID; + object oRight = OBJECT_INVALID; + object oLeft = OBJECT_INVALID; + object o2Handed = OBJECT_INVALID; + object o2HandedHand = OBJECT_INVALID; + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND); + if(oRightHand != OBJECT_INVALID) + { + // Setup the item in our right hand's avg dmg and gold value as our base. + if(ai_GetIsTwoHandedWeapon(oRightHand, oCreature)) + { + if(ai_GetIsDoubleWeapon(oRightHand)) + { + f2HandedPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRightHand, TRUE, FALSE, oRightHand); + } + else f2HandedPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRightHand, TRUE); + n2HandedValue = GetGoldPieceValue(oRightHand); + if(AI_DEBUG) ai_Debug("0i_combat", "3073", " 2Handed oRightHand: " + GetName(oRightHand) + + " f2HandPower: " + FloatToString(f2HandedPower, 0, 2) + + " n2HandedValue: " + IntToString(n2HandedValue)); + } + else if(ai_GetIsSingleHandedWeapon(oRightHand, oCreature)) + { + fRightPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRightHand); + nRightValue = GetGoldPieceValue(oRightHand); + if(AI_DEBUG) ai_Debug("0i_combat", "3081", " 1Handed oRightHand: " + GetName(oRightHand) + + " fRightPower: " + FloatToString(fRightPower, 0, 2) + + " nRightValue: " + IntToString(nRightValue)); + } + } + object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature); + if(oLeftHand != OBJECT_INVALID) + { + // Setup the item in our left hand's Shield AC and gold value as our base. + if(ai_GetIsShield(oLeftHand)) + { + nShieldPower = ai_SetShieldAC(oCreature, oLeftHand); + nShieldValue = GetGoldPieceValue(oLeftHand); + if(AI_DEBUG) ai_Debug("0i_combat", "3098", " Shield oLeftHand: " + GetName(oLeftHand) + + " fShieldPower: " + IntToString(nShieldPower) + + " nShieldValue: " + IntToString(nShieldValue)); + } + // Setup the item in our left hand's avg dmg and gold value as our base. + else + { + fLeftPower = ai_GetMeleeWeaponAvgDmg(oCreature, oLeftHand, FALSE, TRUE); + nLeftValue = GetGoldPieceValue(oLeftHand); + if(AI_DEBUG) ai_Debug("0i_combat", "3103", " 1Handed oLeftHand: " + GetName(oLeftHand) + + " fLeftPower: " + FloatToString(fLeftPower, 0, 2) + + " nLeftValue: " + IntToString(nLeftValue)); + } + } + int nWeaponSize, nType, nCreatureSize = GetCreatureSize(oCreature); + // Get the best weapons they have in their inventory. + object oItem = GetFirstItemInInventory(oCreature); + // If they don't have any items then lets stop, we can't equip a weapon/shield. + if(oItem == OBJECT_INVALID) return FALSE; + while(oItem != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3114", GetName(oItem) + " MeleeWeapon: " + + IntToString(ai_GetIsMeleeWeapon(oItem)) + " Proficient: " + + IntToString(ai_GetIsProficientWith(oCreature, oItem)) + + " Identified: " + IntToString(GetIdentified(oItem))); + if(ai_GetIsProficientWith(oCreature, oItem) && + GetIdentified(oItem) && ai_CheckIfCanUseItem(oCreature, oItem)) + { + nItemValue = GetGoldPieceValue(oItem); + if(AI_DEBUG) ai_Debug("0i_combat", "3122", " nItemValue: " + IntToString(nItemValue)); + if(!GetLocalInt(GetModule(), AI_RULE_ILR) || nMaxItemValue >= nItemValue) + { + if(ai_GetIsShield(oItem)) + { + nItemPower = ai_SetShieldAC(oCreature, oItem); + if(nItemPower > nShieldPower || + (nItemPower == nShieldPower && nItemValue > nShieldValue)) + { oShield = oItem; nShieldPower = nItemPower; nShieldValue = nItemValue; } + } + else if(ai_GetIsMeleeWeapon(oItem)) + { + // Make sure the creature and weapon are close enough in size. + // Can wield a weapon up to one size larger than their size. + // Can wield a weapon down to two sizes smaller than their size. + nType = GetBaseItemType(oItem); + nWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nType)); + if(nWeaponSize >= nCreatureSize - 2 && nWeaponSize <= nCreatureSize + 1) + { + // Get item avg damage based on if it is 2handed or 1handed. + if(ai_GetIsSingleHandedWeapon(oItem, oCreature)) + { + fItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oItem); + fOffItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oItem, FALSE, TRUE); + // If the new weapon is better than the weapon in our right hand. + if(fItemPower > fRightPower || + (fItemPower == fRightPower && nItemValue > nRightValue)) + { + // We need to check if the weapon in the right hand is + // better than the weapon in the left hand since we are + // replacing our right hand weapon. + // Note: we must find out if we have selected a weapon for the + // right hand i.e. oRight or the best weapon is in our + // right hand i.e. oRightHand! + fOffItemPower = 0.0; + if(oRight != OBJECT_INVALID && ai_GetIsSingleHandedWeapon(oRight, oCreature)) + { + fOffItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRight, FALSE, TRUE); + } + else if(oRightHand != OBJECT_INVALID && ai_GetIsSingleHandedWeapon(oRightHand, oCreature)) + { + fOffItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRightHand, FALSE, TRUE); + } + // If the right hand weapon is better than the weapon in our left hand. + if(fOffItemPower > fLeftPower || (fOffItemPower > 0.0 && + fOffItemPower == fLeftPower && nRightValue > nLeftValue)) + { + if(oRight != OBJECT_INVALID) oLeft = oRight; + else oLeft = oRightHand; + fLeftPower = fOffItemPower; + nLeftValue = nRightValue; + } + oRight = oItem; + fRightPower = fItemPower; + nRightValue = nItemValue; + } + // If the new weapon is better than the weapon in our left hand. + else if(fOffItemPower > fLeftPower || + (fOffItemPower == fLeftPower && nItemValue > nLeftValue)) + { oLeft = oItem; fLeftPower = fOffItemPower; nLeftValue = nItemValue; } + } + else if(ai_GetIsTwoHandedWeapon(oItem, oCreature)) + { + if(ai_GetIsDoubleWeapon(oItem)) + { + fItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oItem, TRUE, FALSE, oItem); + } + else fItemPower = ai_GetMeleeWeaponAvgDmg(oCreature, oItem, TRUE); + // If the new weapon is better than the selected weapon. + if(fItemPower > f2HandedPower || + (fItemPower == f2HandedPower && nItemValue > n2HandedValue)) + { + o2Handed = oItem; + f2HandedPower = fItemPower; + n2HandedValue = nItemValue; + } + } + } + } + } + } + oItem = GetNextItemInInventory(); + } + if(AI_DEBUG) ai_Debug("0i_combat", "3197", "oRight: " + GetName(oRight) + " oLeft:" + + GetName(oLeft) + " oShield: " + GetName(oShield) + + "o2Handed: " + GetName(o2Handed)); + // First check for two weapons first. + if(bTwoWeaponUser && oRight != OBJECT_INVALID && oLeft != OBJECT_INVALID) + { + fRightPower = ai_GetMeleeWeaponAvgDmg(oCreature, oRight, FALSE, FALSE, oLeft); + fRightPower += ai_GetMeleeWeaponAvgDmg(oCreature, oLeft, FALSE, TRUE); + if(AI_DEBUG) ai_Debug("0i_combat", "3205", " Right/Left Power: " + + FloatToString(fRightPower, 0, 2) + " 2HandedPower: " + + FloatToString(f2HandedPower, 0, 2)); + if(fRightPower > f2HandedPower) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3210", GetName(oCreature) + " is equiping " + + GetName(oRight) + " in the right hand and " + GetName(oLeft) + + " in the left hand."); + ActionEquipItem(oRight, INVENTORY_SLOT_RIGHTHAND); + ActionEquipItem(oLeft, INVENTORY_SLOT_LEFTHAND); + return TRUE; + } + } + if(f2HandedPower > fRightPower && o2Handed != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3220", GetName(oCreature) + " is equiping " + + GetName(o2Handed) + " in both hands."); + ActionEquipItem(o2Handed, INVENTORY_SLOT_RIGHTHAND); + return TRUE; + } + // Now lets just equip the best weapon for the right hand. + if(oRight != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3228", GetName(oCreature) + " is equiping " + + GetName(oRight) + " in the right hand. "); + ActionEquipItem(oRight, INVENTORY_SLOT_RIGHTHAND); + } + // Make sure we are not equiping a 2handed weapon and + // If not can we equip a shield? + if((oRight == OBJECT_INVALID || ai_GetIsSingleHandedWeapon(oRight, oCreature) || + !ai_GetIsTwoHandedWeapon(oRightHand, oCreature)) && + oShield != OBJECT_INVALID && GetHasFeat(FEAT_SHIELD_PROFICIENCY, oCreature)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3238", GetName(oCreature) + " is equiping " + + GetName(oShield) + " in the left hand."); + ActionEquipItem(oShield, INVENTORY_SLOT_LEFTHAND); + return TRUE; + } + // Finally if we don't have a weapon to equip so check to see if we are + // holding a bow. + else if(oRight == OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3247", GetName(oCreature) + " did not equip a melee weapon"); + // We couldn't find a melee weapon but we are looking to go into melee + // I'm holding a ranged weapon! We better put it up. + if(GetWeaponRanged(oRightHand)) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3252", GetName(oCreature) + " is unequiping " + GetName(oRightHand)); + ActionUnequipItem(oRightHand); + return TRUE; + } + } + if(AI_DEBUG) ai_Debug("0i_combat", "3257", GetName(oCreature) + " is not equiping a weapon!"); + return FALSE; +} +int ai_EquipBestRangedWeapon(object oCreature, object oTarget = OBJECT_INVALID) +{ + if(ai_GetAIMode(oCreature, AI_MODE_EQUIP_WEAPON_OFF)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_combat", "3267", GetName(oCreature) + " is looking for best ranged weapon!"); + int nAmmo, nAmmoSlot, nBestType1, nBestType2, nType, nFeat, nItemValue, nRangedValue; + int nMaxItemValue = ai_GetMaxItemValueThatCanBeEquiped(GetHitDice(oCreature)); + string sAmmo; + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + if(oRightHand != OBJECT_INVALID && ai_GetIsRangeWeapon(oRightHand)) + { + // Setup the item in our right hand as our base gold value to check against. + if(ai_GetIsRangeWeapon(oRightHand)) nRangedValue = GetGoldPieceValue(oRightHand); + } + object oRanged = OBJECT_INVALID, oAmmo = OBJECT_INVALID; + // Find the best type of ranged weapon for this player. + if(GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW, oCreature)) + { nBestType1 = BASE_ITEM_LONGBOW; nAmmo = BASE_ITEM_ARROW; nAmmoSlot = INVENTORY_SLOT_ARROWS; sAmmo = "arrow";} + else if(GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW, oCreature)) + { nBestType1 = BASE_ITEM_SHORTBOW; nAmmo = BASE_ITEM_ARROW; nAmmoSlot = INVENTORY_SLOT_ARROWS; sAmmo = "arrow";} + else if(GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_CROSSBOW, oCreature)) + { nBestType1 = BASE_ITEM_HEAVYCROSSBOW; nAmmo = BASE_ITEM_BOLT; nAmmoSlot = INVENTORY_SLOT_BOLTS; sAmmo = "bolt";} + else if(GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_CROSSBOW, oCreature)) + { nBestType1 = BASE_ITEM_LIGHTCROSSBOW; nAmmo = BASE_ITEM_BOLT; nAmmoSlot = INVENTORY_SLOT_BOLTS; sAmmo = "bolt";} + else if(GetHasFeat(FEAT_WEAPON_FOCUS_SLING, oCreature)) + { nBestType1 = BASE_ITEM_SLING; nAmmo = BASE_ITEM_BULLET; nAmmoSlot = INVENTORY_SLOT_BULLETS; sAmmo = "bullet";} + else if(GetHasFeat(FEAT_WEAPON_FOCUS_DART, oCreature)) + { nBestType1 = BASE_ITEM_DART; } + else if(GetHasFeat(FEAT_WEAPON_FOCUS_SHURIKEN, oCreature)) + { nBestType1 = BASE_ITEM_SHURIKEN; } + else if(GetHasFeat(FEAT_WEAPON_FOCUS_THROWING_AXE, oCreature)) + { nBestType1 = BASE_ITEM_THROWINGAXE; } + // These feats require a bow. + else if(GetHasFeat(FEAT_RAPID_SHOT, oCreature)) + { nBestType1 = BASE_ITEM_LONGBOW; nBestType2 = BASE_ITEM_SHORTBOW; + nAmmo = BASE_ITEM_ARROW; nAmmoSlot = INVENTORY_SLOT_ARROWS; sAmmo = "arrow"; } + // This feat requires a xbow. + else if(GetHasFeat(FEAT_RAPID_RELOAD, oCreature)) + { nBestType1 = BASE_ITEM_HEAVYCROSSBOW; nBestType2 = BASE_ITEM_LIGHTCROSSBOW; + nAmmo = BASE_ITEM_BOLT; nAmmoSlot = INVENTORY_SLOT_BOLTS; sAmmo = "bolt"; } + if(AI_DEBUG) ai_Debug("0i_combat", "3262", "nBestType1: " + IntToString(nBestType1) + " nBestType2: " + IntToString(nBestType2) + + " nAmmo: " + IntToString(nAmmo)); + int nCreatureSize = GetCreatureSize(oCreature) + 1; + // Cycle through the inventory looking for a ranged weapon. + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + nType = GetBaseItemType(oItem); + if(AI_DEBUG) ai_Debug("0i_combat", "3269", "oItem: " + GetName(oItem) + + " Identified: " + IntToString(GetIdentified(oItem)) + + " Ranged Weapon: " + Get2DAString("baseitems", "RangedWeapon", nType)); + // Make sure it is identified and it is a ranged weapon. + if(GetIdentified(oItem) && Get2DAString("baseitems", "RangedWeapon", nType) != "") + { + if(AI_DEBUG) ai_Debug("0i_combat", "3278", " Proficient: " + + IntToString(ai_GetIsProficientWith(oCreature, oItem)) + + " nMaxItemValue: " + IntToString(nMaxItemValue)); + if(ai_GetIsProficientWith(oCreature, oItem)) + { + if(ai_CheckIfCanUseItem(oCreature, oItem)) + { + nItemValue = GetGoldPieceValue(oItem); + if(AI_DEBUG) ai_Debug("0i_combat", "3284", "nItemValue: " + IntToString(nItemValue)); + if(!GetLocalInt(GetModule(), AI_RULE_ILR) || nMaxItemValue >= nItemValue) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3287", " Creature Size: " + IntToString(nCreatureSize) + + " Weapon Size: " + Get2DAString("baseitems", "WeaponSize", nType)); + // Make sure they are large enough to use it. + if(StringToInt(Get2DAString("baseitems", "WeaponSize", nType)) <= nCreatureSize) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3292", "nItemValue: " + IntToString(nItemValue) + + " nRangedValue: " + IntToString(nRangedValue) + " nType: " + IntToString(nType)); + // Is it of the best range weapon type? 0 is any range weapon. + // Also grab any range weapon until we have a best type. + if(nType == nBestType1 || nType == nBestType2 || + nBestType1 == 0 || oRanged == OBJECT_INVALID) + { + if(nItemValue > nRangedValue) + { + if(ai_GetHasItemProperty(oItem, ITEM_PROPERTY_UNLIMITED_AMMUNITION)) + { + oRanged = oItem; nRangedValue = nItemValue; + if(AI_DEBUG) ai_Debug("0i_combat", "3304", "Selecting oRanged: " + GetName(oRanged) + + " nRangedValue: " + IntToString(nRangedValue) + " and doesn't need ammo!"); + } + else + { + if(nBestType1 == 0) + { + if(nType == BASE_ITEM_LONGBOW || nType == BASE_ITEM_SHORTBOW) + { nAmmo = BASE_ITEM_ARROW; sAmmo = "arrow"; nAmmoSlot = INVENTORY_SLOT_ARROWS; } + else if(nType == BASE_ITEM_HEAVYCROSSBOW || nType == BASE_ITEM_LIGHTCROSSBOW) + { nAmmo = BASE_ITEM_BOLT; sAmmo = "bolt"; nAmmoSlot = INVENTORY_SLOT_BOLTS; } + else if(nType == BASE_ITEM_SLING) + { nAmmo = BASE_ITEM_BULLET; sAmmo = "bullet"; nAmmoSlot = INVENTORY_SLOT_BULLETS; } + else nAmmo = 0; + } + // Now do we have ammo for it? + if(AI_DEBUG) ai_Debug("0i_combat", "3320", "nAmmo: " + IntToString(nAmmo)); + if(nAmmo > 0) + { + if(nAmmo == BASE_ITEM_ARROW || + nAmmo == BASE_ITEM_BOLT || + nAmmo == BASE_ITEM_BULLET) oAmmo = GetItemInSlot(nAmmoSlot); + if(oAmmo == OBJECT_INVALID) + { + // We don't have ammo equiped so lets see if we have any in our inventory. + oAmmo = GetFirstItemInInventory(); + while(oAmmo != OBJECT_INVALID) + { + if(GetBaseItemType(oAmmo) == nAmmo) break; + oAmmo = GetNextItemInInventory(); + } + if(oAmmo != OBJECT_INVALID) ActionEquipItem(oAmmo, nAmmoSlot); + } + } + if(oAmmo != OBJECT_INVALID) + { + oRanged = oItem; nRangedValue = nItemValue; + if(AI_DEBUG) ai_Debug("0i_combat", "3307", "Selecting oRanged: " + GetName(oRanged) + + " nRangedValue: " + IntToString(nRangedValue)); + } + } + } + } + } + } + } + } + } + oItem = GetNextItemInInventory(oCreature); + } + // They don't have a range weapon so lets break out. + if(oRanged == OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3357", GetName(oCreature) + " did not equip a ranged weapon!"); + return FALSE; + } + ActionEquipItem(oRanged, INVENTORY_SLOT_RIGHTHAND); + return TRUE; +} +int ai_EquipBestMonkMeleeWeapon(object oCreature, object oTarget = OBJECT_INVALID) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "2949", GetName(OBJECT_SELF) + " is equiping best monk melee weapon!"); + int nValue, nRightValue; + int nMaxItemValue = ai_GetMaxItemValueThatCanBeEquiped(GetHitDice(oCreature)); + object oRight = OBJECT_INVALID; + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + if(oRightHand != OBJECT_INVALID) + { + nRightValue = GetGoldPieceValue(oRightHand); + } + // Get the best kama they have in their inventory. + object oItem = GetFirstItemInInventory(oCreature); + // If they don't have any kamas then lets stop, we can't equip a weapon. + if(oItem == OBJECT_INVALID) return FALSE; + while(oItem != OBJECT_INVALID) + { + nValue = GetGoldPieceValue(oItem); + // Make sure they are high enough level to equip this item. + if(nMaxItemValue >= nValue && nValue > 1) + { + // Is it a single handed weapon? + if(GetBaseItemType(oItem) == BASE_ITEM_KAMA) + { + // Replace the lowest value right weapon. + if(nValue > nRightValue) + { + oRight = oItem; nRightValue = nValue; + } + } + } + oItem = GetNextItemInInventory(oCreature); + } + // Finally lets just equip the kama if we have one. + if(oRight == OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "2983", GetName(oCreature) + " did not equip a melee weapon!"); + return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_combat", "2986", GetName(oCreature) + " is equiping " + GetName(oRight) + " in the right hand."); + ActionEquipItem(oRight, INVENTORY_SLOT_RIGHTHAND); + return TRUE; +} +int ai_IsInADangerousAOE(object oCreature, float fMaxRange = AI_RANGE_BATTLEFIELD, int bMove = FALSE) +{ + int bDangerous, nSpell, nCnt = 1; + string sAOEType; + object oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oCreature, nCnt); + float fRadius, fDistance = GetDistanceBetween(oCreature, oAOE); + while(oAOE != OBJECT_INVALID && fDistance <= fMaxRange) + { + // AOE's have the tag set to the "LABEL" in vfx_persistent.2da + // I check vs those labels to see if the AOE is offensive. + // Below is the list of Offensive AOE effects. + sAOEType = GetTag(oAOE); + if(sAOEType == "VFX_PER_WEB") { fRadius = 6.7; nSpell = SPELL_WEB; } + else if(sAOEType == "VFX_PER_ENTANGLE") { fRadius = 5.0; nSpell = SPELL_ENTANGLE; } + else if(sAOEType == "VFX_PER_GREASE") { fRadius = 6.0; nSpell = SPELL_GREASE; } + else if(sAOEType == "VFX_PER_EVARDS_BLACK_TENTACLES") + { fRadius = 5.0; nSpell = SPELL_EVARDS_BLACK_TENTACLES; } + //else if(sAOEType == "VFX_PER_DARKNESS") { fRadius = 6.7; nSpell = SPELL_DARKNESS; } + //else if(sAOEType == "VFX_MOB_SILENCE") { fRadius = 4.0; nSpell = SPELL_SILENCE; } + else if(sAOEType == "VFX_PER_FOGSTINK") { fRadius = 6.7; nSpell = SPELL_STINKING_CLOUD; } + else if(sAOEType == "VFX_PER_FOGFIRE") { fRadius = 5.0; nSpell = SPELL_INCENDIARY_CLOUD; } + else if(sAOEType == "VFX_PER_FOGKILL") { fRadius = 5.0; nSpell = SPELL_CLOUDKILL; } + else if(sAOEType == "VFX_PER_FOGMIND") { fRadius = 5.0; nSpell = SPELL_MIND_FOG; } + else if(sAOEType == "VFX_PER_CREEPING_DOOM") { fRadius = 6.7; nSpell = SPELL_CREEPING_DOOM; } + else if(sAOEType == "VFX_PER_FOGACID") { fRadius = 5.0; nSpell = SPELL_ACID_FOG; } + else if(sAOEType == "VFX_PER_FOGBEWILDERMENT") { fRadius = 5.0; nSpell = SPELL_CLOUD_OF_BEWILDERMENT; } + else if(sAOEType == "VFX_PER_WALLFIRE") { fRadius = 10.0; nSpell = SPELL_WALL_OF_FIRE; } + else if(sAOEType == "VFX_PER_WALLBLADE") { fRadius = 10.0; nSpell = SPELL_BLADE_BARRIER; } + else if(sAOEType == "VFX_PER_DELAY_BLAST_FIREBALL") { fRadius = 2.0; nSpell = SPELL_DELAYED_BLAST_FIREBALL; } + else if(sAOEType == "VFX_PER_GLYPH") { fRadius = 2.5; nSpell = SPELL_GLYPH_OF_WARDING; } + else fRadius = 0.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3088", GetName(oCreature) + " distance from AOE is " + FloatToString(fDistance, 0, 2) + + " AOE Radius: " + FloatToString(fRadius, 0, 2) + + " AOE Type: " + GetTag(oAOE)); + // fRadius > 0.0 keeps them from tiggering that they are in a dangerous + // AOE due to having an AOE on them. + if(fRadius > 0.0 && fDistance <= fRadius && + !ai_CreatureImmuneToEffect(GetAreaOfEffectCreator(oAOE), oCreature, nSpell)) + { + bDangerous = TRUE; + if(nSpell == SPELL_WEB || nSpell == SPELL_ENTANGLE) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) bDangerous = FALSE; + if(GetReflexSavingThrow(oCreature) + GetAbilityModifier(ABILITY_DEXTERITY, oCreature) >= ai_GetCharacterLevels(oCreature)) + bDangerous = FALSE; + } + break; + } + oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oCreature, ++nCnt); + fDistance = GetDistanceBetween(oCreature, oAOE); + } + if(bDangerous && bMove) + { + location lLocation; + object oTarget; + if(ai_GetIsInCombat(oCreature)) + { + object oMaster = GetMaster(oCreature); + // If we have a ranged weapon then backout and use that. + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + lLocation = GetRandomLocation(GetArea(oCreature), oCreature, fRadius + 1.0); + } + else // we must find a target out of the AOE or fight in the AOE. + { + oTarget = ai_GetNearestTargetNotInAOE(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, TRUE); + if(oTarget != OBJECT_INVALID) lLocation = GetLocation(oTarget); + } + } + else lLocation = GetRandomLocation(GetArea(oCreature), oCreature, fRadius + 1.0); + ai_ClearCreatureActions(); + if(AI_DEBUG) ai_Debug("0i_combat", "3035", GetName(oCreature) + " is moving out of area of effect!"); + ActionMoveToLocation(lLocation, TRUE); + return TRUE; + } + else if(bDangerous) return TRUE; + return FALSE; +} +int ai_GetIsHidden(object oHidden) +{ + int nEffectType; + effect eEffect = GetFirstEffect(oHidden); + while(GetIsEffectValid(eEffect)) + { + nEffectType = GetEffectType(eEffect); + if(nEffectType == EFFECT_TYPE_INVISIBILITY) return 1; + else if(nEffectType == EFFECT_TYPE_IMPROVEDINVISIBILITY) return 1; + else if(nEffectType == EFFECT_TYPE_DARKNESS) return 2; + else if(nEffectType == EFFECT_TYPE_SANCTUARY) return 3; + else if(nEffectType == EFFECT_TYPE_ETHEREAL) return 3; + eEffect = GetNextEffect(oHidden); + } + if(GetActionMode(oHidden, ACTION_MODE_STEALTH)) return 4; + return FALSE; +} +int ai_CastOffensiveSpellVsTarget(object oCaster, object oCreature, int nSpell) +{ + // Check saves. + string sSave = Get2DAString("ai_spells", "SaveType", nSpell); + // There is no save! + if(sSave == "") return TRUE; + // Get the level of the spell. + int nSpellLvl = StringToInt(Get2DAString("spells", "Innate", nSpell)); + // Randomize our check. + nSpellLvl += Random(AI_SPELL_CHECK_DIE) + AI_SPELL_CHECK_BONUS; + // Check feats that might increase our DC. + string sSchool = Get2DAString("spells", "School", nSpell); + if(sSchool == "V") + { + if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_EVOCATION, oCaster)) nSpellLvl += 4; + else if(GetHasFeat(FEAT_SPELL_FOCUS_EVOCATION, oCaster)) nSpellLvl += 2; + } + else if(sSchool == "C") + { + if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION, oCaster)) nSpellLvl += 4; + else if(GetHasFeat(FEAT_SPELL_FOCUS_CONJURATION, oCaster)) nSpellLvl += 2; + } + else if(sSchool == "N") + { + if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_NECROMANCY, oCaster)) nSpellLvl += 4; + else if(GetHasFeat(FEAT_SPELL_FOCUS_NECROMANCY, oCaster)) nSpellLvl += 2; + } + else if(sSchool == "E") + { + if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ENCHANTMENT, oCaster)) nSpellLvl += 4; + else if(GetHasFeat(FEAT_SPELL_FOCUS_ENCHANTMENT, oCaster)) nSpellLvl += 2; + } + else if(sSchool == "I") + { + if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ILLUSION, oCaster)) nSpellLvl += 4; + else if(GetHasFeat(FEAT_SPELL_FOCUS_ILLUSION, oCaster)) nSpellLvl += 2; + } + else if(sSave == "Reflex") + { + string sImmunityType = Get2DAString("ai_spells", "ImmunityType", nSpell); + // Give a bonus to our check for half dmg spells unless they can dodge it! + if((sImmunityType == "Fire" || sImmunityType == "Electricity" || sImmunityType == "Acid" || + sImmunityType == "Cold" || sImmunityType == "Sonic") && + !GetHasFeat(FEAT_IMPROVED_EVASION, oCreature)) nSpellLvl += AI_SPELL_CHECK_NO_EVASION_BONUS; + if(AI_DEBUG) ai_Debug("0i_combat", "3050", " nSpellLvl: " + IntToString(nSpellLvl) + + " > nMagic: " + IntToString(GetReflexSavingThrow(oCreature))); + return (nSpellLvl > GetReflexSavingThrow(oCreature)); + } + else if(sSave == "Fortitude") return (nSpellLvl > GetFortitudeSavingThrow(oCreature)); + else if(sSave == "Will") return (nSpellLvl > GetWillSavingThrow(oCreature)); + return TRUE; +} +int ai_GetDragonDC(object oCreature) +{ + int nDC, nHitDice = GetHitDice(oCreature); + if(nHitDice < 4) { nDC = 12; } + else if(nHitDice < 7) { nDC = 13; } + else if(nHitDice < 10) { nDC = 14; } + else if(nHitDice < 13) { nDC = 16; } + else if(nHitDice < 16) { nDC = 18; } + else if(nHitDice < 19) { nDC = 20; } + else if(nHitDice < 22) { nDC = 22; } + else if(nHitDice < 25) { nDC = 24; } + else if(nHitDice < 28) { nDC = 26; } + else if(nHitDice < 31) { nDC = 28; } + else if(nHitDice < 34) { nDC = 30; } + else if(nHitDice < 37) { nDC = 32; } + else if(nHitDice < 39) { nDC = 34; } + else { nDC = 36; } + string sTag = GetTag(oCreature); + if(sTag == "gold_dragon") nDC += 5; + if(sTag == "red_dragon" || sTag == "silver_dragon") return nDC + 4; + else if(sTag == "black_dragon" || sTag == "brass_dragon") return nDC + 3; + else if(sTag == "green_dragon" || sTag == "copper_dragon") return nDC + 2; + else if(sTag == "blue_dragon" || sTag == "bronze_dragon") return nDC + 1; + //else if(sTag == "white_dragon") nDC += 0; + return nDC; +} +void ai_SetCreatureAIScript(object oCreature) +{ + string sCombatAI = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + // Non-Hostile NPC's do not need to use special tactics by default. + if(sCombatAI == "" && GetLocalInt(GetModule(), AI_RULE_AMBUSH) && d100() < 34) + { + // They should have skill ranks equal to their level + 1 to use a special AI. + int nSkillNeeded = GetHitDice(oCreature) + 1; + /*/ Ambusher: requires either Improved Invisibility or Invisibility. + if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oCreature) || + GetHasSpell(SPELL_INVISIBILITY, oCreature)) + { + int bCast = ai_TryToCastSpell(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature); + if(!bCast) bCast = ai_TryToCastSpell(oCreature, SPELL_INVISIBILITY, oCreature); + if(bCast) sCombatAI = "ai_ambusher"; + } */ + if(GetHasFeat(FEAT_SNEAK_ATTACK, oCreature, TRUE)) + { + sCombatAI = "ai_flanker"; + } + // Ambusher: Requires a Hide and Move silently skill equal to your level + 1. + else if(GetSkillRank(SKILL_HIDE, oCreature) >= nSkillNeeded && + GetSkillRank(SKILL_MOVE_SILENTLY, oCreature) >= nSkillNeeded) + { + sCombatAI = "ai_ambusher"; + } + // Defensive : requires Parry skill equal to your level or Expertise. + else if(GetSkillRank(SKILL_PARRY, oCreature) >= nSkillNeeded || + GetHasFeat(FEAT_EXPERTISE, oCreature) || + GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature)) + { + sCombatAI = "ai_defensive"; + } + else if(GetHasSpell(SPELL_LESSER_DISPEL, oCreature) || + GetHasSpell(SPELL_DISPEL_MAGIC, oCreature) || GetHasSpell(SPELL_GREATER_DISPELLING, oCreature)) + { + sCombatAI = "ai_cntrspell"; + } + else if(ai_CheckClassType(oCreature, AI_CLASS_TYPE_ARCANE) && + ai_GetCharacterLevels(oCreature) > 4) sCombatAI = "ai_ranged"; + else if(ai_EquipBestRangedWeapon(oCreature)) sCombatAI = "ai_ranged"; + else if(GetSkillRank(SKILL_TAUNT, oCreature) >= nSkillNeeded) sCombatAI = "ai_taunter"; + } + if(sCombatAI == "") + { + int nAssociateType = GetAssociateType(oCreature); + if (nAssociateType == ASSOCIATE_TYPE_FAMILIAR) + { + sCombatAI = "ai_default"; + } + else + { + // Select the best ai for this henchmen based on class. + int nClass = GetClassByPosition(1, oCreature); + // If they have more than one class use the default ai. + if(GetClassByPosition(2, oCreature) != CLASS_TYPE_INVALID) sCombatAI = "ai_default"; + else if(nClass == CLASS_TYPE_BARBARIAN) sCombatAI = "ai_barbarian"; + else if(nClass == CLASS_TYPE_BARD) sCombatAI = "ai_bard"; + else if(nClass == CLASS_TYPE_CLERIC) sCombatAI = "ai_cleric"; + else if(nClass == CLASS_TYPE_DRUID) sCombatAI = "ai_druid"; + else if(nClass == CLASS_TYPE_FIGHTER) sCombatAI = "ai_fighter"; + else if(nClass == CLASS_TYPE_MONK) sCombatAI = "ai_monk"; + else if(nClass == CLASS_TYPE_PALADIN) sCombatAI = "ai_paladin"; + else if(nClass == CLASS_TYPE_RANGER) sCombatAI = "ai_ranger"; + else if(nClass == CLASS_TYPE_ROGUE) sCombatAI = "ai_rogue"; + else if(nClass == CLASS_TYPE_SORCERER) sCombatAI = "ai_sorcerer"; + else if(nClass == CLASS_TYPE_WIZARD) sCombatAI = "ai_wizard"; + //else if(nClass == CLASS_TYPE_ABERRATION) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_ANIMAL) sCombatAI = "ai_animal"; + //else if(nClass == CLASS_TYPE_CONSTRUCT) sCombatAI = "ai_animal"; + else if(nClass == CLASS_TYPE_DRAGON) sCombatAI = "ai_dragon"; + //else if(nClass == CLASS_TYPE_ELEMENTAL) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_FEY) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_GIANT) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_HUMANOID) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_MAGICAL_BEAST) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_MONSTROUS) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_OOZE) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_OUTSIDER) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_UNDEAD) sCombatAI = "ai_default"; + //else if(nClass == CLASS_TYPE_VERMIN) sCombatAI = "ai_animal"; + else sCombatAI = "ai_default"; + } + } + if(AI_DEBUG) ai_Debug("0i_combat", "3740", GetName(oCreature) + " is setting AI to " + sCombatAI); + SetLocalString(oCreature, AI_DEFAULT_SCRIPT, sCombatAI); + SetLocalString(oCreature, AI_COMBAT_SCRIPT, sCombatAI); +} +int ai_IsImmuneToSneakAttacks(object oCreature, object oTarget) +{ + if(GetHasFeat(FEAT_UNCANNY_DODGE_2, oTarget) && + GetLevelByClass(CLASS_TYPE_ROGUE, oCreature) + 3 < GetLevelByClass(CLASS_TYPE_ROGUE, oTarget)) return TRUE; + if(GetIsImmune(oTarget, IMMUNITY_TYPE_SNEAK_ATTACK)) return TRUE; + object oSkin = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget); + if(ai_GetHasItemProperty(oSkin, ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS, IP_CONST_IMMUNITYMISC_BACKSTAB)) return TRUE; + return FALSE; +} +int ai_IsStrongerThanMe(object oCreature, int nIndex) +{ + int nEnemyCombat = GetLocalInt(oCreature, AI_ENEMY_COMBAT + IntToString(nIndex)); + int nCreatureCombat = ai_GetMyCombatRating(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "3955", "IsStrongerThanMe: nCreatureCombat: " + + IntToString(nCreatureCombat) + " nEnemyCombat: " + IntToString(nEnemyCombat)); + return (nEnemyCombat > nCreatureCombat); +} +int ai_StrongOpponent(object oCreature, object oTarget, int nAdj = 2) +{ + int nLevel = GetHitDice(oCreature); + if(AI_DEBUG) ai_Debug("0i_combat", "3220", "ai_StrongOpponent"); + nAdj = nAdj *((nAdj + nLevel) / 10); + if(AI_DEBUG) ai_Debug("0i_combat", "3222", "Is the opponent strong? Target CR >= Our level - nAdj(" + + FloatToString(GetChallengeRating(oTarget), 0, 2) + " >= " + IntToString(nLevel - nAdj) + ")"); + return (FloatToInt(GetChallengeRating(oTarget)) >= nLevel - nAdj); +} +int ai_PowerAttackGood(object oCreature, object oTarget, float fAdj) +{ + int nAvgDmg = ai_GetWeaponDamage(oCreature, 2); + if(AI_DEBUG) ai_Debug("0i_combat", "3412", "PowerAttack: (nAvgDmg: " + IntToString(nAvgDmg) + + " > Target HP: " + IntToString(GetCurrentHitPoints(oTarget)) + + ") Skip: " + IntToString(nAvgDmg > GetCurrentHitPoints(oTarget))); + if(nAvgDmg > GetCurrentHitPoints(oTarget)) return FALSE; + float fAvgDmg = IntToFloat(nAvgDmg); + float fTargetAC = IntToFloat(GetAC(oTarget)); + float fCreatureAtk = IntToFloat(ai_GetCreatureAttackBonus(oCreature)); + float fNormalChance = (21.0 - (fTargetAC - fCreatureAtk)) / 20.0; + // Our chance to hit is already minimum of 5% so this doesn't hurt our chance! + if(fNormalChance <= 0.05) return TRUE; + float fAdjDamage = (fAvgDmg + fAdj) * ((21.0-(fTargetAC - fCreatureAtk + fAdj))/20); + if(AI_DEBUG) ai_Debug("0i_combat", "3420", "fNormalDamage: " + FloatToString(fNormalChance * fAvgDmg, 0, 2) + + " < fAdjDamage: " + FloatToString(fAdjDamage, 0, 2) + " = " + IntToString(fNormalChance * fAvgDmg < fAdjDamage)); + return fNormalChance * fAvgDmg < fAdjDamage; +} +int ai_AttackPenaltyOk(object oCreature, object oTarget, float fAtkAdj) +{ + float fTargetAC = IntToFloat(GetAC(oTarget)); + float fCreatureAtk = IntToFloat(ai_GetCreatureAttackBonus(oCreature)); + float fNormalChance = (21.0-(fTargetAC - fCreatureAtk))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3431", "Normal Avg Chance: " + FloatToString(fNormalChance, 0, 2) + " <= 0.05"); + // We already need a 20 to hit so this doesn't hurt our chances! + if(fNormalChance <= 0.05) return TRUE; + float fAdjChance = (21.0-(fTargetAC - fCreatureAtk + fAtkAdj))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3435", "Adjusted Avg Chance: " + FloatToString(fAdjChance, 0, 2) + " > 0.55"); + // if our chance is 55% or better to hit then use it. + return fAdjChance > 0.55; +} +int ai_AttackBonusGood(object oCreature, object oTarget, float fAtkAdj) +{ + float fTargetAC = IntToFloat(GetAC(oTarget)); + float fCreatureAtk = IntToFloat(ai_GetCreatureAttackBonus(oCreature)); + float fNormalChance = (21.0-(fTargetAC - fCreatureAtk))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3450", "Normal Avg Chance: " + FloatToString(fNormalChance, 0, 2) + " > 0.99"); + // We already hit them with any roll so this will not help. + if(fNormalChance > 0.99) return FALSE; + float fAdjChance = (21.0-(fTargetAC - fCreatureAtk - fAtkAdj))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3454", "Adjusted Avg Chance: " + FloatToString(fAdjChance, 0, 2) + " < 0.0"); + // if our chance increases our to hit then this is good. + return fAdjChance > 0.0; +} +int ai_ACAdjustmentGood(object oCreature, object oTarget, float fACAdj) +{ + float fCreatureAC = IntToFloat(GetAC(oCreature)); + float fTargetAtk = IntToFloat(ai_GetCreatureAttackBonus(oTarget)); + float fNormalChance = (21.0-(fCreatureAC - fTargetAtk))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3444", "Normal Chance To Hit: " + FloatToString(fNormalChance, 0, 2) + " <= 0.05"); + // They already need a 20 to hit so adding more AC is worthless. + if(fNormalChance <= 0.05) return FALSE; + float fAdjChance = (21.0-(fCreatureAC - fTargetAtk + fACAdj))/20.0; + if(AI_DEBUG) ai_Debug("0i_combat", "3448", "Adjusted Chance To Hit: " + FloatToString(fAdjChance, 0, 2) + " < 1.00"); + // Anything less than 1 helps are AC! + return fAdjChance < 1.00; +} +int ai_CanIMoveInCombat(object oCreature) +{ + // DC 15 tumble check is required to not give attacks of opportunity. + return (GetHasFeat(FEAT_MOBILITY, oCreature) || GetHasFeat(FEAT_SPRING_ATTACK, oCreature) || + GetSkillRank(SKILL_TUMBLE, oCreature) > 9); +} +int ai_CanIUseRangedWeapon(object oCreature, int nInMelee) +{ + return (!nInMelee || ai_GetEnemyAttackingMe(oCreature) == OBJECT_INVALID); +} +int ai_CheckRangedCombatPosition(object oCreature, object oTarget, int nAction) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "3559", "Ranged attack: See oTarget? " + + IntToString(GetObjectSeen(oTarget, oCreature)) + " Line of Sight? " + + IntToString(LineOfSightObject(oCreature, oTarget))); + if(nAction == AI_LAST_ACTION_RANGED_ATK) + { + // Watch the nearest enemy instead of our target as they could move toward us. + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + float fDistance = GetDistanceBetween(oCreature, oNearestEnemy); + if(AI_DEBUG) ai_Debug("0i_combat", "3337", "oNearestEnemy: " + GetName(oNearestEnemy) + + " fDistance: " + FloatToString(fDistance, 0, 2)); + // If we have sneak attack then we want to be within 30'. + if(GetHasFeat(FEAT_SNEAK_ATTACK, oCreature)) + { + if(fDistance > AI_RANGE_CLOSE) + { + // We check this because if the enemy is moving or has not + // started acting then we don't want to move up on them as they + // might move towards us. Just attack! Only sneak attack if they are busy. + int nAction = GetCurrentAction(oNearestEnemy); + if(AI_DEBUG) ai_Debug("0i_combat", "3353", GetName(oNearestEnemy) + " current action: " + IntToString(nAction)); + if(nAction == ACTION_MOVETOPOINT || + nAction == ACTION_INVALID || + nAction == ACTION_RANDOMWALK) return FALSE; + // If they are attacking make sure it is in melee? + // If not then don't move since they might be moving toward us. + if(nAction == ACTION_ATTACKOBJECT) + { + if(!ai_GetNumOfEnemiesInRange(oNearestEnemy)) return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_combat", "3355", GetName(oCreature) + " is moving closer [8.0] to " + + GetName(oNearestEnemy) + " to sneak attack with a ranged weapon."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + ActionMoveToObject(oNearestEnemy, TRUE, AI_RANGE_CLOSE); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + } + else if(fDistance < AI_RANGE_LONG) + { + // Lets move back a little, too far and we miss attacks! + if(AI_DEBUG) ai_Debug("0i_combat", "3374", GetName(oCreature) + " is moving away from " + + GetName(oNearestEnemy) + "[2.0] to use a ranged weapon."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + ActionMoveAwayFromObject(oNearestEnemy, TRUE, 2.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + } + // If we are casting a hostile spell then check positioning. + else if(nAction > -1 && Get2DAString("ai_spells", "HostileSetting", nAction) == "1") + { + // We are out of melee and casting a spell on an ally so don't move. + if(GetReputation(oCreature, oTarget) > 89) return FALSE; + float fSpellRange = ai_GetSpellRange(nAction); + float fTargetRange = GetDistanceBetween(oCreature, oTarget); + if(AI_DEBUG) ai_Debug("0i_combat", "3389", "fSpellRange: " + FloatToString(fSpellRange, 0, 2) + + " fTargetRange: " + FloatToString(fTargetRange, 0, 2)); + // Adjust the ranges to see if we are too close. + if(fSpellRange == 5.0) fSpellRange = 4.5f; + //else if(fSpellRange == 8.0) fSpellRange = 8.0f; + else if(fSpellRange > 10.0f) fSpellRange = 10.0f; + if(AI_DEBUG) ai_Debug("0i_combat", "3395", "Adjusted spell range is " + + FloatToString(fSpellRange, 0, 2) + " : " + GetName(oTarget) + " range is " + + FloatToString(fTargetRange, 0, 2) + "."); + // We are closer than we have to be to cast our spell. + if(fTargetRange < fSpellRange) + { + // Lets move back a little, too far and we miss attacks! + if(AI_DEBUG) ai_Debug("0i_combat", "3402", GetName(oCreature) + " is moving away from " + + GetName(oTarget) + "[2.0] to cast a spell."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + ActionMoveAwayFromObject(oTarget, FALSE, 2.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } +} + return FALSE; +} +int ai_CheckMeleeCombatPosition(object oCreature, object oTarget, int nAction, int nBaseItemType = 0) +{ + // If we are not being attacked then we might want to back out of combat. + if(ai_GetEnemyAttackingMe(oCreature) != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3417", "I am being attacked so stand my ground!"); + return FALSE; + } + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + float fDistance = GetDistanceBetween(oCreature, oNearestEnemy); + if(AI_DEBUG) ai_Debug("0i_combat", "3422", "oNearestEnemy: " + GetName(oNearestEnemy) + " fDistance " + FloatToString(fDistance, 0, 2)); + if(nAction == AI_LAST_ACTION_RANGED_ATK) + { + if(AI_DEBUG) ai_Debug("0i_combat", "3425", GetName(oCreature) + " is moving away from " + GetName(oNearestEnemy) + + "[" + FloatToString(AI_RANGE_MELEE - fDistance + 1.0, 0, 2) + "]" + " to use a ranged weapon."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + // Lets move just out of melee range! + int bRun = ai_CanIMoveInCombat(oCreature); + ActionMoveAwayFromObject(oNearestEnemy, bRun, AI_RANGE_MELEE - fDistance + 1.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + // If we want to cast a spell this round then back away! + else if(nAction > -1) + { + // Some items we don't need to move on such as wands, staves, and rods. + if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == BASE_ITEM_MAGICSTAFF || + nBaseItemType == BASE_ITEM_MAGICROD) return FALSE; + float fSpellRange = ai_GetSpellRange(nAction); + // A Touch spell means we should not move if we are not the target. + if(fSpellRange <= 5.0 && oCreature != oTarget) return FALSE; + if(AI_DEBUG) ai_Debug("0i_combat", "3446", GetName(oCreature) + " is moving away from " + + GetName(oTarget) + "[" + FloatToString(AI_RANGE_MELEE - fDistance + 1.0, 0, 2) + "] to cast a spell."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + SetActionMode(oCreature, ACTION_MODE_DEFENSIVE_CAST, FALSE); + // Lets move just out of melee range! + int bRun = ai_CanIMoveInCombat(oCreature); + ActionMoveAwayFromObject(oNearestEnemy, bRun, AI_RANGE_MELEE - fDistance + 1.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return TRUE; + } + return FALSE; +} +int ai_CheckCombatPosition(object oCreature, object oTarget, int nInMelee, int nAction, int nBaseItemType = 0) +{ + if(AI_DEBUG) ai_Debug("0i_combat", "3460", "|-----> Checking position in combat: " + + GetName(oCreature) + " nMelee: " + IntToString(nInMelee) + + " Action: " + IntToString(nAction) + + " Hold mode: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND)) + + " Use Advanced Movement: " + IntToString(GetLocalInt(GetModule(), AI_RULE_ADVANCED_MOVEMENT))); + // We don't want to move around in combat if we were told to hold. + if(ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND)) return FALSE; + if(!GetLocalInt(GetModule(), AI_RULE_ADVANCED_MOVEMENT)) return FALSE; + if(ai_CompareLastAction(oCreature, AI_LAST_ACTION_MOVE)) return FALSE; + // We are not in melee combat so lets see how close we should get. + if(!nInMelee) return ai_CheckRangedCombatPosition(oCreature, oTarget, nAction); + // If we are in melee we might need to move out of combat. + return ai_CheckMeleeCombatPosition(oCreature, oTarget, nAction, nBaseItemType); +} diff --git a/_module/nss/0i_constants.nss b/_module/nss/0i_constants.nss new file mode 100644 index 00000000..5413ac4d --- /dev/null +++ b/_module/nss/0i_constants.nss @@ -0,0 +1,667 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Name: 0i_constants +// Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Include script for handling all constants for the ai. + These constants are static and can only be changed in the toolset. + Changes to any constants will not take effect until the scripts are recompiled. +*/////////////////////////////////////////////////////////////////////////////// + +const string PHILOS_VERSION = "Philos' Enhancing Player System (PEPS) version:07.12.25"; +// The following constants are designed to be changed to allow the AI to work +// differently based on what a developer wants. +// If you change these constants make sure the database has been removed +// so the ai_SetAIRules() will rewrite the new server rule values. +// File Name: peps_database.sqlite3 +//********************************** SERVER *********************************** +// Turn On/Off Debug. You can only use the debug with the pi_debug/pe_debug scripts. +// This will only work if you are using the PEPS menu system. +const int AI_DEBUG = FALSE; +// Defines if we are compiling for single player or a server. Always on for servers! +const int AI_SERVER = FALSE; +// The number of classes allowed for a creature to take in the server/module. +const int AI_MAX_CLASSES_PER_CHARACTER = 8; +// Taunts cool down time before the AI attemps another Taunt. +const int AI_TAUNT_COOLDOWN = 3; +// Animal Empathy cool down time before the AI attemps another check. +const int AI_EMPATHY_COOLDOWN = 3; +// Arcane Spell failure% or less than, for a caster to still try to cast a spell. +const int AI_ASF_WILL_USE = 15; +// Monsters chance to heal while in combat per round. +const int AI_MONSTER_HEAL_IN_COMBAT_CHANCE = 70; +// Monsters chance to heal when out of combat per heart beat. +const int AI_MONSTER_HEAL_OUT_COMBAT_CHANCE = 70; +// Allows Henchman to have a widget if using the henchman AI. +const int AI_HENCHMAN_WIDGET = TRUE; +// Change the Custom token number if it conflicts with your server. +const int AI_BASE_CUSTOM_TOKEN = 1000; +// Delay between creatures casting Buff spells. Must be minimum of 0.1 seconds. +const float AI_HENCHMAN_BUFF_DELAY = 0.2; + +//******************* These can be changed within the game ******************* +// Moral checks on or off. If wounded they will make Will saves, if they fail the flee. +const int AI_MORAL_CHECKS = FALSE; +// Allows monsters to prebuff before combat starts. +const int AI_PREBUFF = TRUE; +// Allows monsters cast summons spells when prebuffing. +const int AI_PRESUMMONS = TRUE; +// Allows monsters to use tactical AI scripts such as ambush, flanker, ranged. +const int AI_TACTICAL = TRUE; +// Enemies may summon familiars and Animal companions and will be randomized. +const int AI_SUMMON_COMPANIONS = FALSE; +// Allow the AI to move during combat base on the situation and action taking. +const int AI_ADVANCED_MOVEMENT = TRUE; +// Follow Item Level Restrictions for AI. +const int AI_ITEM_LEVEL_RESTRICTIONS = FALSE; +// Allow the AI to use Use Magic Device. +const int AI_USE_MAGIC_DEVICE = TRUE; +// Allow the AI to use healing kits. +const int AI_HEALING_KITS = TRUE; +// Associates are permanent and don't get removed when the master dies. +const int AI_COMPANIONS_PERMANENT = FALSE; +// Monster AI's chance (0 to 100) to attack the weakest target instead of the nearest. +// The higher the number the harder the encounter with monsters! +const int AI_TARGET_WEAKEST = 0; +// Variable that can change the distance creatures will come and attack after +// hearing a shout from an ally that sees or hears an enemy. +// Or when searching for an invisible, heard enemy. +// 10.0 Short, 30.0 Average, 40.0 Long, 60.0 Huge. +const float AI_SEARCH_DISTANCE = 30.0; +// Enemy corpses remain on the floor instead of dissappearing. +const int AI_CORPSE_REMAIN = FALSE; +// Monsters will wander around when not in combat. +const int AI_WANDER = FALSE; +// Variable distance monsters can wander away from their spawn point. +const float AI_WANDER_DISTANCE = 0.0; +// Variable that allows monsters to open doors when wandering around out of combat. +const int AI_OPEN_DOORS = FALSE; +// Monster's actual perception distance. +// 8 Short(10 sight/listen) 9 Medium(20 sight/listen) 10 Long(35 sight/20 listen) +// 11 Default(Based on appearance.2da Most creatures use 9, bosses use 10). +const int AI_MONSTER_PERCEPTION = 11; +// Should the AI auto adjust the XP scale to remove party size penalty? +const int AI_PARTY_SCALE = FALSE; + +//**************************** DM Based Constants **************************** +// The constant the server wants set to allow players to use specific widgets buttons. +// 0 Allows all buttons. See ASSOCIATE_WIDGET_BUTTONS below for values needed to be +// added to block those buttons. +// Example: BTN_CMD_GHOST_MODE = 0x00000800; To remove you would put 2048 below. +// Since Hex 800 is Decimal 2048. +const int AI_DM_WIDGET_ACCESS_BUTTONS = 0; +// The constant the server wants set to allow players to use specific AI buttons. +// 0 Allows all buttons. See ASSOCIATE_AI_BUTTONS below for values needed to be +// added to block those buttons. +// Example: BTN_AI_MAGIC_LEVEL = 0x00000040; To remove you would put 64 below. +// Since Hex 40 is Decimal 64. Adding BTN_AI_LOOT = 0x00001000; to that would be +// 64 + 4096 = 4160 to Block Magic Level and Auto Looting. +const int AI_DM_AI_ACCESS_BUTTONS = 0; +//************************** CONVERSATION CONSTANTS ************************** +// Player's can tell their associates to ignore enemy associates. +const int AI_IGNORE_ASSOCIATES_ON = TRUE; +// Associates with a Taunt skill higher than their level can be told to taunt. +const int AI_TAUNTING_ON = TRUE; +// Associates that cast spells can be told to use counterspell. +const int AI_COUNTERSPELLING_ON = TRUE; +// Associates with lore skill higher than the master can identify items. +const int AI_IDENTIFY_ON = TRUE; +// Associates can be called upon to scout ahead for monsters. +const int AI_SCOUT_AHEAD_ON = TRUE; +// A player can open a henchmen's inventory. +const int AI_OPEN_INVENTORY = TRUE; +// Allows players to have associates pickup loot. +const int AI_PICKUP_LOOT = TRUE; +// Allows players to remove a henchman. +const int AI_REMOVE_HENCHMAN_ON = FALSE; +//***************************** Health Constants ***************************** +// % of health for when a creature is considered wounded. +const int AI_HEALTH_WOUNDED = 50; +// % of health when creature is considered badly wounded. +const int AI_HEALTH_BLOODY = 25; +//***************************** MORAL CONSTANTS ****************************** +// Moral checks are only made once a creature is below AI_HEALTH_WOUNDED. +// The moral DC is AI_MORAL_DC - the number of Allies. Default: 5 +const int AI_WOUNDED_MORAL_DC = 5; +// Once a creature goes below AI_HEALTHY_BLOODY then it uses this moral DC. Default: 15 +const int AI_BLOODY_MORAL_DC = 15; +//******************************* WINDOW CONSTANTS ***************************** +const string AI_MAIN_NUI = "ai_main_nui"; +const string AI_COMMAND_NUI = "_command_nui"; +const string AI_NUI = "_ai_nui"; +const string AI_WIDGET_NUI = "_widget_nui"; +const string AI_LOOTFILTER_NUI = "_lootfilter_nui"; +const string AI_COPY_NUI = "_copy_nui"; +const string AI_PLUGIN_NUI = "ai_plugin_nui"; +const string AI_QUICK_WIDGET_NUI = "_quick_widget_nui"; +const string AI_SPELL_MEMORIZE_NUI = "_spell_memorize_nui"; +const string AI_SPELL_KNOWN_NUI = "_spell_known_nui"; +const string AI_SPELL_DESCRIPTION_NUI = "ai_spell_desc_nui"; +const string AI_EFFECT_ICON_NUI = "ai_effect_icon_nui"; +//******************************* CORE CONSTANTS ******************************* +// The following constants are core constants and changing any of these without +// understanding the whole system could cause unforseen results. +// CHANGE AT YOUR OWN RISK. +// Variable used to asave a monster object for changing. +const string AI_MONSTER_OBJECT = "AI_MONSTER_OBJECT"; +// Variable used to save a monsters json for changing. +const string AI_MONSTER_JSON = "AI_MONSTER_JSON"; +// Variable used to let PEPS know that a monster plugin changed the monster. +const string AI_MONSTER_CHANGED = "AI_MONSTER_CHANGED"; +// Variable used to save an associates class list to change known list json. +const string AI_CLASS_LIST_JSON = "AI_CLASS_LIST_JSON"; +// Startup variable to tell plugins that we have started. +const string AI_STARTING_UP = "AI_STARTING_UP"; +// Add plugin variable to tell plugins that we are adding them to PEPS. +const string AI_ADD_PLUGIN = "AI_ADD_PLUGIN"; +// Startup variable to tell plugins what json array to add their plugin to. +const string AI_JSON_PLUGINS = "AI_JSON_PLUGINS"; +// Plugin variable to have plugins return if they setup the plugin in the json for PEPS. +const string AI_PLUGIN_SET = "AI_PLUGIN_SET"; +// Monster modification variable to let PEPS know what mods are available. +const string AI_MONSTER_MOD_JSON = "AI_MONSTER_MOD_JSON"; +// The maximum number of henchman the code works with. +const int AI_MAX_HENCHMAN = 12; +// Delay between Henchman casting Healing spells. Must be minimum of 0.5 seconds. +const float AI_HENCHMAN_HEALING_DELAY = 6.0; +// A variable that can be set on creatures to stop mobile animations. +const string AI_NO_ANIMATION = "AI_NO_ANIMATION"; +// How many seconds in a combat round. +const int AI_COMBAT_ROUND_IN_SECONDS = 6; +// Used for actions that take x seconds but don't have an action constant. +const string AI_COMBAT_WAIT_IN_SECONDS = "AI_COMBAT_WAIT_IN_SECONDS"; +// Constants used to define the difficulty of the battle for associates. +// 20+ : Impossible - Cannot win. +// 17 to 19 : Overpowering - Use all of our powers. +// 15 to 16 : Very Difficult - Use all of our power (Highest level spells). +// 11 to 14 : Challenging - Use most of our power (Higher level powers). +// 8 to 10 : Moderate - Use half of our power (Mid level powers and less). +// 5 to 7 : Easy - Use our weaker powers (Lowest level powers). +// 2 to 4 : Effortless - Don't waste spells and powers on this. +// 1 or less: Pointless - We probably should ignore these dangers. +const int AI_COMBAT_IMPOSSIBLE = 21; +const int AI_COMBAT_OVERPOWERING = 17; +const int AI_COMBAT_VERY_DIFFICULT = 15; +const int AI_COMBAT_CHALLENGING = 11; +const int AI_COMBAT_MODERATE = 10; +const int AI_COMBAT_EASY = 7; +const int AI_COMBAT_EFFORTLESS = 4; +// Variables used to keep track of enemies in combat. +const string AI_ENEMY = "AI_ENEMY"; // The enemy objects. +const string AI_ENEMY_DISABLED = "AI_ENEMY_DISABLED"; // Int if they are disabled. +const string AI_ENEMY_PERCEIVED = "AI_ENEMY_PERCEIVED"; // TRUE if we have seen or heard them, FALSE if not. +const string AI_ENEMY_RANGE = "AI_ENEMY_RANGE"; // The range from OBJECT_SELF. +const string AI_ENEMY_COMBAT = "AI_ENEMY_COMBAT"; // Combat rating: (BAB + AC - 10) / 2 +const string AI_ENEMY_MELEE = "AI_ENEMY_MELEE"; // Enemies within 5 meters - Allies within 5 meters. +const string AI_ENEMY_HEALTH = "AI_ENEMY_HEALTH"; // % of hitpoints. +const string AI_ENEMY_NUMBERS = "AI_ENEMY_NUM"; // Number of enemies in combat. +const string AI_ENEMY_POWER = "AI_ENEMY_POWER"; // (Level * Health %) / 100 added for each enemy to this. +const string AI_ENEMY_NEAREST = "AI_ENEMY_NEAREST"; // Nearest enemy to OBJECT_SELF. +// Variables used to keep track of allies in combat. +const string AI_ALLY = "AI_ALLY"; // All friendly creatures +const string AI_ALLY_DISABLED = "AI_ALLY_DISABLED"; // Int if they are disabled. +const string AI_ALLY_PERCEIVED = "AI_ALLY_PERCEIVED"; // All allies are set to be seen and heard. +const string AI_ALLY_RANGE = "AI_ALLY_RANGE"; // The range from OBJECT_SELF. +const string AI_ALLY_COMBAT = "AI_ALLY_COMBAT"; // Combat rating: (BAB + AC - 10) / 2 +const string AI_ALLY_MELEE = "AI_ALLY_MELEE"; // Enemies within 5 meters - Allies within 5 meters. +const string AI_ALLY_HEALTH = "AI_ALLY_HEALTH"; // % of hitpoints. +const string AI_ALLY_NUMBERS = "AI_ALLY_NUM"; // Number of allies in combat. +const string AI_ALLY_POWER = "AI_ALLY_POWER"; // (Level * Health %) / 100 added for each enemy to this. +// Variable name used to define the ai scripts being used by creatures. +const string AI_DEFAULT_SCRIPT = "AI_DEFAULT_SCRIPT"; +const string AI_COMBAT_SCRIPT = "AI_COMBAT_SCRIPT"; +// Constants used in a creatures listening patterns. +const string AI_I_SEE_AN_ENEMY = "AI_I_SEE_AN_ENEMY"; +const string AI_I_HEARD_AN_ENEMY = "AI_I_HEARD_AN_ENEMY"; +const string AI_ATKED_BY_WEAPON = "AI_ATK_BY_WEAPON"; +const string AI_ATKED_BY_SPELL = "AI_ATK_BY_SPELL"; +const string AI_I_AM_WOUNDED = "AI_I_AM_WOUNDED"; +const string AI_I_AM_DEAD = "AI_I_AM_DEAD"; +const string AI_I_AM_DISEASED = "AI_I_AM_DISEASED"; +const string AI_I_AM_POISONED = "AI_I_AM_POISONED"; +const string AI_I_AM_WEAK = "AI_I_AM_WEAK"; +const int AI_ALLY_SEES_AN_ENEMY = 1; +const int AI_ALLY_HEARD_AN_ENEMY = 2; +const int AI_ALLY_ATKED_BY_WEAPON = 3; +const int AI_ALLY_ATKED_BY_SPELL = 4; +const int AI_ALLY_IS_WOUNDED = 5; +const int AI_ALLY_IS_DEAD = 6; +const int AI_ALLY_IS_DISEASED = 7; +const int AI_ALLY_IS_POISONED = 8; +const int AI_ALLY_IS_WEAK = 9; +const string AI_MY_TARGET = "AI_MY_TARGET"; +// Constant used by monsters to reduce checks while searching for unseen targets. +const string AI_AM_I_SEARCHING = "AI_AM_I_SEARCHING"; +// Used to keep track of oCreature attempting to hide. +const string AI_TRIED_TO_HIDE = "AI_TRIED_TO_HIDE"; +// Constant used by creatures to keep track of invisible creatures. +const string AI_IS_INVISIBLE = "AI_IS_INVISIBLE"; +// Constants used in combat to keep track of a creatures last action. +// 0+ is the last spell cast from the line number in Spells.2da. +const string sLastActionVarname = "AI_LAST_ACTION"; +const int AI_LAST_ACTION_CAST_SPELL = -1; +const int AI_LAST_ACTION_NONE = -2; +const int AI_LAST_ACTION_MELEE_ATK = -3; +const int AI_LAST_ACTION_RANGED_ATK = -4; +const int AI_LAST_ACTION_USED_FEAT = -5; +const int AI_LAST_ACTION_USED_ITEM = -6; +const int AI_LAST_ACTION_USED_SKILL = -7; +const int AI_LAST_ACTION_MOVE = -8; +// Variable name used to keep track of Action Modes. +const string AI_CURRENT_ACTION_MODE = "AI_CURRENT_ACTION_MODE"; +// Variable name used to keep track of object usage by the AI. +const string AI_OBJECT_IN_USE = "AI_OBJECT_IN_USE"; +// Variable name used to keep a creatures attacked targets. +const string AI_ATTACKED_PHYSICAL = "AI_ATTACKED_PHYSICAL"; +const string AI_ATTACKED_SPELL = "AI_ATTACKED_SPELL"; +// Variable name used to keep track of a creatures normal polymorph form. +const string AI_NORMAL_FORM = "AI_NORMAL_FORM"; +// Variable name used to keep track if a creature has been buffed yet. +const string AI_CASTER_BUFFS_SET = "AI_CASTER_BUFFS_SET"; +// Variable name used to keep track of rounds in combat for a custom ai script. +const string AI_ROUND = "AI_ROUND"; +// Combat Ranges +const float AI_RANGE_MELEE = 5.0f; // Anyone within this is considered to be in melee. +const float AI_RANGE_CLOSE = 8.0f; // For anything requiring to be within 30'. +const float AI_RANGE_LONG = 15.0f; // Mainly used for distance ranged attacks. +const float AI_RANGE_PERCEPTION = 35.0f; // This is the distance for perception in battle. +const float AI_RANGE_BATTLEFIELD = 40.0f; // This is the size of the battlefield area. +// Spell ranges. +const float AI_SHORT_DISTANCE = 8.0f; +const float AI_MEDIUM_DISTANCE = 20.0f; +const float AI_LONG_DISTANCE = 40.0f; +// When computer checks if a creature should cast a specific spell at a target. +// Computer makes a spell check vs the targets saving throw. +// Spell check roll for the caster is +// [Innate spell Level + Random (AI_SPELL_CHECK_DIE) + AI_SPELL_CHECK_BONUS] +// If the spell gives a save for half (i.e. FireBall) and the target does not have +// Evasion then they get an additional bonus of AI_SPELL_CHECK_NO_EVASION_BONUS. +const int AI_SPELL_CHECK_DIE = 6; +const int AI_SPELL_CHECK_BONUS = 3; +const int AI_SPELL_CHECK_NO_EVASION_BONUS = 10; +// When the computer checks if a creature should use defensive casting it looks +// at the spell level + AI_DEFENSIVE_CASTING_DC vs casters concentration +// and feat bonuses (i.e. COMBAT_CASTING) + Random (AI_DEFENSIVE_CASTING_ROLL). +const int AI_DEFENSIVE_CASTING_DC = 19; // 19 will allow them to use it at 50% effectiveness. +const int AI_DEFENSIVE_CASTING_DIE = 10; +// When the computer checks to see if it should cast in melee combat it looks +// at CASTING_IN_MELEE_DC + SpellLevel + (Num of creatures in melee * GetHitDice (NearestEnemy)); +// vs the casters concentration + Random (AI_CASTING_IN_MELEE_ROLL). +const int AI_CASTING_IN_MELEE_DC = 10; +const int AI_CASTING_IN_MELEE_ROLL = 10; +// For getting a specific class the following constants were added to flesh out +// the CLASS_TYPE_* +const int AI_CLASS_TYPE_CASTER = -1; +const int AI_CLASS_TYPE_DIVINE = -2; +const int AI_CLASS_TYPE_ARCANE = -3; +const int AI_CLASS_TYPE_WARRIOR = -4; +// For getting a specific race the following constants were added to flesh out +// the RACIAL_TYPE_* +const int AI_RACIAL_TYPE_ANIMAL_BEAST = -1; +const int AI_RACIAL_TYPE_HUMANOID = -2; +// Bitwise constants for negative conditions we might want to try to cure +const int AI_CONDITION_POISON = 0x00000001; +const int AI_CONDITION_DISEASE = 0x00000002; +const int AI_CONDITION_BLINDDEAF = 0x00000004; +const int AI_CONDITION_ATK_DECREASE = 0x00000008; +const int AI_CONDITION_DMG_DECREASE = 0x00000010; +const int AI_CONDITION_DMG_I_DECREASE = 0x00000020; +const int AI_CONDITION_SKILL_DECREASE = 0x00000040; +const int AI_CONDITION_SAVE_DECREASE = 0x00000080; +const int AI_CONDITION_SR_DECREASE = 0x00000100; +const int AI_CONDITION_AC_DECREASE = 0x00000200; +const int AI_CONDITION_SLOW = 0x00000400; +const int AI_CONDITION_ABILITY_DRAIN = 0x00000800; +const int AI_CONDITION_LEVEL_DRAIN = 0x00001000; +const int AI_CONDITION_CHARMED = 0x00002000; +const int AI_CONDITION_DAZED = 0x00004000; +const int AI_CONDITION_STUNNED = 0x00008000; +const int AI_CONDITION_FRIGHTENED = 0x00010000; +const int AI_CONDITION_CONFUSED = 0x00020000; +const int AI_CONDITION_CURSE = 0x00040000; +const int AI_CONDITION_PARALYZE = 0x00080000; +const int AI_CONDITION_DOMINATED = 0x00100000; +// Database constants for Associate modes. +const string AI_MODE_DB_TABLE = "AI_MODE_DB_TABLE"; +// Bitwise constants for Associate modes that are used with Get/SetAssociateMode(). +const string sAIModeVarname = "ASSOCIATE_MODES"; +//const int AI_MODE_DISTANCE_CLOSE = 0x00000001; // Stays within AI_DISTANCE_CLOSE of master. +//const int AI_MODE_DISTANCE_MEDIUM = 0x00000002; // Stays within AI_DISTANCE_MEDIUM of master. +const int AI_MODE_ACTION_GHOST = 0x00000004; // Defines if the player is using Ghost mode when using associate actions. +const int AI_MODE_SELF_HEALING_OFF = 0x00000008; // Creature will not use healing items or spells on self. +const int AI_MODE_PARTY_HEALING_OFF = 0x00000010; // Creature will not use healing items or spells on party. +const int AI_MODE_GHOST = 0x00000020; // Creature can move through other creatures. +const int AI_MODE_OPEN_DOORS = 0x00000040; // Creature will attempted to open all doors. +const int AI_MODE_EQUIP_WEAPON_OFF = 0x00000080; // The AI will not equip weapons. +const int AI_MODE_BASH_LOCKS = 0x00000100; // Will bash locks if cannot open door/placeable. +const int AI_MODE_AGGRESSIVE_SEARCH = 0x00000200; // Sets associate to continuous search mode. +const int AI_MODE_AGGRESSIVE_STEALTH = 0x00000400; // Sets associate to continuous stealth mode. +const int AI_MODE_PICK_LOCKS = 0x00000800; // Will pick locks if possible. +const int AI_MODE_DISARM_TRAPS = 0x00001000; // Will disarm traps. +const int AI_MODE_SCOUT_AHEAD = 0x00002000; // Will move ahead of master and scout. +const int AI_MODE_DEFEND_MASTER = 0x00004000; // Will attack enemies attacking our master. +const int AI_MODE_STAND_GROUND = 0x00008000; // Will stay in one place until new command. +const int AI_MODE_STOP_RANGED = 0x00010000; // Will not use ranged weapons. +const int AI_MODE_FOLLOW = 0x00020000; // Keeps associate following master ignoring combat. +const int AI_MODE_PICKUP_ITEMS = 0x00040000; // Will pickup up all items for master. +const int AI_MODE_COMMANDED = 0x00080000; // In Command mode then don't follow, search, etc. +const int AI_MODE_IGNORE_TRAPS = 0x00100000; // Creature will ignore traps on the floor. +const int AI_MODE_NO_STEALTH = 0x00200000; // Will not cast invisibilty or use stealth. +const int AI_MODE_DO_NOT_SPEAK = 0x00400000; // Tells the henchmen to be silent and not talk. +const int AI_MODE_CHECK_ATTACK = 0x00800000; // Will only engage in combats they think they can win. +const int AI_MODE_IGNORE_ASSOCIATES = 0x01000000; // Will ignore associates in combat. +//const int AI_MODE_ = 0x02000000; // Not used. +//const int AI_MODE_ = 0x04000000; // Not used. +//const int AI_MODE_ = 0x08000000; // Not used. +//const int AI_MODE_ = 0x10000000; // Not used. +//const int AI_MODE_ = 0x20000000; // Not used. +//const int AI_MODE_ = 0x40000000; // Not used. +//const int AI_MODE_ = 0x80000000; // Not used. +// Bitwise constants for Associate magic modes that are used with Get/SetAssociateMagicMode(). +const string sMagicModeVarname = "ASSOCIATE_MAGIC_MODES"; +const int AI_MAGIC_BUFF_MASTER = 0x00000001; // Buffs master before other allies. +const int AI_MAGIC_NO_MAGIC = 0x00000002; // Will not use any magic (Spells, abilities). +const int AI_MAGIC_DEFENSIVE_CASTING = 0x00000004; // Will only cast defensive spells. +const int AI_MAGIC_OFFENSIVE_CASTING = 0x00000008; // Will only cast offensive spells. +const int AI_MAGIC_STOP_DISPEL = 0x00000010; // Will not cast dispel type spells. +const int AI_MAGIC_BUFF_AFTER_REST = 0x00000020; // Will buff the party after resting. +const int AI_MAGIC_NO_MAGIC_ITEMS = 0x00000040; // Will not use magic items in combat. +const int AI_MAGIC_CURE_SPELLS_OFF = 0x00000080; // Will not cast cure spells. +const int AI_MAGIC_EFFECT_ICON_REPORT = 0x00000100; // Sets each player to report Effect Icons to chat. +//const int = 0x00000200; // Not used. +//const int = 0x00000400; // Not used. +const int AI_MAGIC_NO_SPONTANEOUS_CURE = 0x00000800; // Caster will stop using spontaneous cure spells. +//const int AI_MAGIC_ = 0x00001000; // Not used. +//const int AI_MAGIC_ = 0x00002000; // Not used. +//const int AI_MAGIC_ = 0x00004000; // Not used. +//const int AI_MAGIC_ = 0x00008000; // Not used. +//const int AI_MAGIC_ = 0x00010000; // Not used. +//const int AI_MAGIC_ = 0x00020000; // Not used. +//const int AI_MAGIC_ = 0x00040000; // Not used. +//const int AI_MAGIC_ = 0x00080000; // Not used. +//const int AI_MAGIC_ = 0x00100000; // Not used. +//const int AI_MAGIC_ = 0x00200000; // Not used. +//const int AI_MAGIC_ = 0x00400000; // Not used. +//const int AI_MAGIC_ = 0x00800000; // Not used. +//const int AI_MAGIC_ = 0x01000000; // Not used. +//const int AI_MAGIC_ = 0x02000000; // Not used. +//const int AI_MAGIC_ = 0x04000000; // Not used. +//const int AI_MAGIC_ = 0x08000000; // Not used. +//const int AI_MAGIC_ = 0x10000000; // Not used. +//const int AI_MAGIC_ = 0x20000000; // Not used. +//const int AI_MAGIC_ = 0x40000000; // Not used. +//const int AI_MAGIC_ = 0x80000000; // Not used. +// Use by NUI windows to stop saving move states while loading. +const string AI_NO_NUI_SAVE = "AI_NO_NUI_SAVE"; +// Bitwise menu constants for Widget buttons that are used with Get/SetAssociateWidgetButtons(). +const string sWidgetButtonsVarname = "ASSOCIATE_WIDGET_BUTTONS"; +const int BTN_WIDGET_OFF = 0x00000001; // Removes the widget from the screen, For PC it removes all associates. +const int BTN_WIDGET_LOCK = 0x00000002; // Locks the widget to the current coordinates. +const int BTN_CMD_GUARD = 0x00000004; // Command associates to Guard Me. PC widget only. +const int BTN_CMD_FOLLOW = 0x00000008; // Command associates to Follow. PC widget only. +const int BTN_CMD_HOLD = 0x00000010; // Command associates to Stand Ground. PC widget only. +const int BTN_CMD_ATTACK = 0x00000020; // Command associates to Attack Nearest. PC widget only. +const int BTN_BUFF_REST = 0x00000040; // Buffs with long duration spells after resting. Associate widget only. +const int BTN_BUFF_SHORT = 0x00000080; // Buffs with short duration spells. +const int BTN_BUFF_LONG = 0x00000100; // Buffs with long duration spells. +const int BTN_BUFF_ALL = 0x00000200; // Buffs with all spells. +const int BTN_CMD_ACTION = 0x00000400; // Command associate to do an action. +const int BTN_CMD_GHOST_MODE = 0x00000800; // Toggle's associates ghost mode. +const int BTN_CMD_AI_SCRIPT = 0x00001000; // Toggle's special tactics ai scripts. +const int BTN_CMD_PLACE_TRAP = 0x00002000; // A trapper may place traps. +const int BTN_CMD_CAMERA = 0x00004000; // Places camera view on associate. +const int BTN_CMD_INVENTORY = 0x00008000; // Opens inventory of associate. +const int BTN_CMD_FAMILIAR = 0x00010000; // Summons familiar. +const int BTN_CMD_COMPANION = 0x00020000; // Summons Companion. +const int BTN_CMD_SEARCH = 0x00040000; // Command all associates to use search mode. PC widget only. +const int BTN_CMD_STEALTH = 0x00080000; // Command all associates to use stealth mode. PC widget only. +const int BTN_CMD_SCOUT = 0x00100000; // Command associate to scout ahead of the part. +const int BTN_CMD_SPELL_WIDGET = 0x00200000; // Allows adding or removing spells from Spell Widget. +const int BTN_CMD_JUMP_TO = 0x00400000; // Player can make associates jump to them. +const int BTN_WIDGET_VERTICAL = 0x80000000; // Widget will be displayed vertical. +// Bitwise menu constants for Associate AI buttons that are used with Get/SetAssociateAIButtons(). +const string sAIButtonsVarname = "ASSOCIATE_AI_BUTTONS"; +const int BTN_AI_FOR_PC = 0x00000001; // PC use AI. PC widget only. +const int BTN_AI_USE_RANGED = 0x00000002; // AI uses ranged attacks. +const int BTN_AI_USE_SEARCH = 0x00000004; // AI uses Search. +const int BTN_AI_USE_STEALTH = 0x00000008; // AI uses Stealth. +const int BTN_AI_REMOVE_TRAPS = 0x00000010; // AI seeks out and removes traps. +const int BTN_AI_PICK_LOCKS = 0x00000020; // AI will attempt to pick locks. +const int BTN_AI_MAGIC_LEVEL = 0x00000040; // Increase chance to use magic in battle. +const int BTN_AI_NO_SPONTANEOUS = 0x00000080; // Stops the use of spontaneous spells. +const int BTN_AI_NO_MAGIC_USE = 0x00000100; // Will not use magic in battle. +const int BTN_AI_NO_MAGIC_ITEM_USE = 0x00000200; // Will not use magic items in battle. +const int BTN_AI_DEF_MAGIC_USE = 0x00000400; // Will use Defensive spells only in battle. +const int BTN_AI_OFF_MAGIC_USE = 0x00000800; // Will use Offensive spells only in battle. +const int BTN_AI_LOOT = 0x00001000; // Auto picking up loot on/off. +const int BTN_AI_FOLLOW_TARGET = 0x00002000; // Selects a target to follow. +const int BTN_AI_HEAL_OUT = 0x00004000; // Increase minimum hp required before ai heals out of combat. +const int BTN_AI_PERC_RANGE = 0x00008000; // Adjust the perception range of the henchman. +const int BTN_AI_HEAL_IN = 0x00010000; // Increase minimum hp required before ai heals in combat. +const int BTN_AI_OPEN_DOORS = 0x00020000; // AI will open all closed doors. +const int BTN_AI_STOP_SELF_HEALING = 0x00040000; // Stops AI from using any healing on self. +const int BTN_AI_STOP_PARTY_HEALING = 0x00080000; // Stops AI from using any healing on party. +const int BTN_AI_IGNORE_ASSOCIATES = 0x00100000; // AI will deprioritize enemy associates. +const int BTN_AI_STOP_CURE_SPELLS = 0x00200000; // AI uses cure spells. +const int BTN_AI_STOP_WEAPON_EQUIP = 0x00400000; // AI can equip different weapons. +const int BTN_AI_IGNORE_TRAPS = 0x00800000; // AI will ignore traps on the floor. +//const int BTN_AI = 0x01000000; // Not used. +//const int BTN_AI = 0x02000000; // Not used. +const int BTN_AI_BASH_LOCKS = 0x04000000; // AI will attempt to bash any locks they can't get past. +const int BTN_AI_REDUCE_SPEECH = 0x08000000; // Reduce the associates speaking. +// Bitwise menu constants for DM access for players Widget buttons uses BTN_CMD and BTN_BUFF bitwise see above. +const string sDMWidgetAccessVarname = "AI_RULES_WIDGET_BUTTONS_ACCESS"; +// Bitwise menu constants for DM access for players AI buttons uses BTN_AI bitwise see above. +const string sDMAIAccessVarname = "AI_RULES_AI_BUTTONS_ACCESS"; +// Variable name for DM widget buttons. +const string sDMWidgetButtonVarname = "DM_WIDGET_BUTTONS"; +// DM Widget buttons states. +const int BTN_DM_WIDGET_OFF = 0x00000001; // Removes the widget from the screen, For PC it removes all associates. +const int BTN_DM_WIDGET_LOCK = 0x00000002; // Locks the widget to the current coordinates. +const int BTN_DM_CMD_GROUP1 = 0x00000004; // Does all the group 1 commands. +const int BTN_DM_CMD_GROUP2 = 0x00000008; // Does all the group 2 commands. +const int BTN_DM_CMD_GROUP3 = 0x00000010; // Does all the group 3 commands. +const int BTN_DM_CMD_GROUP4 = 0x00000020; // Does all the group 4 commands. +const int BTN_DM_CMD_GROUP5 = 0x00000040; // Does all the group 5 commands. +const int BTN_DM_CMD_GROUP6 = 0x00000080; // Does all the group 6 commands. +const int BTN_DM_CMD_CAMERA = 0x00000100; // Selects new object to hold the camera view. +const int BTN_DM_CMD_INVENTORY = 0x00000200; // Selects a creature to open the inventory of. +const int BTN_DM_CMD_MEMORIZE = 0x00000400; // Allows associate to change memorized spells. +// Bitwise constants for Associate loot options that are used with Get/SetAssociateLootMode(). +const string sLootFilterVarname = "ASSOCIATE_LOOT_MODES"; +const int AI_LOOT_PLOT = 0x00000001; +const int AI_LOOT_WEAPONS = 0x00000002; +const int AI_LOOT_ARMOR = 0x00000004; +const int AI_LOOT_SHIELDS = 0x00000008; +const int AI_LOOT_HEADGEAR = 0x00000010; +const int AI_LOOT_BELTS = 0x00000020; +const int AI_LOOT_BOOTS = 0x00000040; +const int AI_LOOT_CLOAKS = 0x00000080; +const int AI_LOOT_GLOVES = 0x00000100; +const int AI_LOOT_JEWELRY = 0x00000200; +const int AI_LOOT_POTIONS = 0x00000400; +const int AI_LOOT_SCROLLS = 0x00000800; +const int AI_LOOT_WANDS_RODS_STAVES = 0x00001000; +const int AI_LOOT_GEMS = 0x00002000; +const int AI_LOOT_MISC = 0x00004000; +const int AI_LOOT_ARROWS = 0x00008000; +const int AI_LOOT_BOLTS = 0x00010000; +const int AI_LOOT_BULLETS = 0x00020000; +const int AI_LOOT_GIVE_TO_PC = 0x80000000; +// Default value for all loot filters to be on. +const int AI_LOOT_ALL_ON = 262143; +// Variable to keep track of who is in ghost mode. +const string sGhostModeVarname = "AI_GHOST_MODE_ON"; +// Variables for gold piece value to pickup items. +const string AI_MIN_GOLD_ = "AI_MIN_GOLD_"; +// Variable used to limit the spamming of NUI buttons. +const string AI_DELAY_NUI_USE = "AI_DELAY_NUI_USE"; +// Variable for maximum weight to pickup from looting. +const string AI_MAX_LOOT_WEIGHT = "AI_MAX_LOOT_WEIGHT"; +// Variable to change the size of the widget buttons. +const string AI_WIDGET_BUTTON_SIZE = "AI_WIDGET_BUTTON_SIZE"; +// Variable to change the difficulty so a player can adjust spell usage. +const string AI_DIFFICULTY_ADJUSTMENT = "AI_DIFFICULTY_ADJUSTMENT"; +// Variable to change the Healing % limit for out of combat. +const string AI_HEAL_OUT_OF_COMBAT_LIMIT = "AI_HEAL_OUT_OF_COMBAT_LIMIT"; +// Variable to change the Healing % limit for in combat. +const string AI_HEAL_IN_COMBAT_LIMIT = "AI_HEAL_IN_COMBAT_LIMIT"; +// Variable to change the looting range. +const string AI_LOOT_CHECK_RANGE = "AI_LOOT_CHECK_RANGE"; +// Variable to change the lock checking range. +const string AI_LOCK_CHECK_RANGE = "AI_LOCK_CHECK_RANGE"; +// Variable to change the trap checking range. +const string AI_TRAP_CHECK_RANGE = "AI_TRAP_CHECK_RANGE"; +// Variable to change the range an associate follows the pc. +const string AI_FOLLOW_RANGE = "AI_FOLLOW_RANGE"; +// Variable that holds the target for an associate to follow. +const string AI_FOLLOW_TARGET = "AI_FOLLOW_TARGET"; +// Variable that holds the perception range of associates i.e. 8, 9, 10, 11. +const string AI_ASSOCIATE_PERCEPTION = "AI_PERCEPTION_RANGE"; +// Variable that holds the perception distance of associates i.e. 30.0 meters. +const string AI_ASSOC_PERCEPTION_DISTANCE = "AI_ASSOC_PERCEPTION_DISTANCE"; +// Variable that holds the open doors range of the henchman. +const string AI_OPEN_DOORS_RANGE = "AI_OPEN_DOORS_RANGE"; +// Variable that holds the Spell widgets json data. +const string AI_SPELLS_WIDGET = "AI_SPELLS_WIDGET"; +// The number of Buff Groups +const int AI_BUFF_GROUPS = -17; +// Variable name used to keep track if we have set our talents. +const string AI_TALENTS_SET = "AI_TALENTS_SET"; +// New talent categories +const string AI_TALENT_ENHANCEMENT = "E"; +const string AI_TALENT_PROTECTION = "P"; +const string AI_TALENT_SUMMON = "S"; +const string AI_TALENT_HEALING = "H"; +const string AI_TALENT_CURE = "C"; +const string AI_TALENT_INDISCRIMINANT_AOE = "I"; +const string AI_TALENT_DISCRIMINANT_AOE = "D"; +const string AI_TALENT_RANGED = "R"; +const string AI_TALENT_TOUCH = "T"; +// Talent types. +const int AI_TALENT_TYPE_SPELL = 1; +const int AI_TALENT_TYPE_SP_ABILITY = 2; +const int AI_TALENT_TYPE_FEAT = 3; +const int AI_TALENT_TYPE_ITEM = 4; +// Variable name used to have associates fight the pc's selected target. +const string AI_PC_LOCKED_TARGET = "AI_PC_LOCKED_TARGET"; +// Variable name of json talent immunity. +const string AI_TALENT_IMMUNITY = "AI_TALENT_IMMUNITY"; +// Variables keeps track of the maximum level for the talent category. +const string AI_MAX_TALENT = "AI_MAX_TALENT_"; +// Backward compatability constants. +const int X2_EVENT_CONCENTRATION_BROKEN = 12400; +// Variable set on the module if the module is using PRC. +const string AI_USING_PRC = "AI_USING_PRC"; +// Variable that sets if the rules have been added to the module. +const string AI_RULES_SET = "AI_RULES_SET"; +// Variable that tells us that oCreature has run our OnSpawn event. +const string AI_ONSPAWN_EVENT = "AI_ONSPAWN_EVENT"; +// Variable used to define a creatures unique Tag for widgets. +const string AI_TAG = "AI_TAG"; +// Variable that saves any module target event script so we can pass it along. +const string AI_MODULE_TARGET_EVENT = "AI_MODULE_TARGET_EVENT"; +// Variable for plugins to inject Targeting mode code into PEPS. +const string AI_PLUGIN_TARGET_SCRIPT = "AI_PLUGIN_TARGET_SCRIPT"; +// Variable for PEPS to inject effect icons NUI information. +const string AI_MODULE_GUI_EVENT = "AI_MODULE_GUI_EVENT"; +// Variable used on the player to define the targeting action in the OnPlayerTarget event script. +const string AI_TARGET_MODE = "AI_TARGET_MODE"; +// Variable used on the player to define which associate triggered the OnPlayer Target. +const string AI_TARGET_ASSOCIATE = "AI_TARGET_ASSOCIATE"; +// Bitwise constants for immune damage item properties that is used with Get/SetItemProperty(). +const string sIPImmuneVarname = "AI_IP_IMMUNE"; +// Bitwise constants for resisted damage item properties that is used with Get/SetItemProperty(). +const string sIPResistVarname = "AI_IP_RESIST"; +// Variable name for the Int constant for reduced damage item property set to the bonus of the weapon required. +const string sIPReducedVarname = "AI_IP_REDUCED"; +// Variable name for the Int (Bool) constant for the haste item property. +const string sIPHasHasteVarname = "AI_IP_HAS_HASTE"; +// Variable name used to hold the party xp base needed to adjust party xp. +const string AI_BASE_PARTY_SCALE_XP = "AI_BASE_PARTY_SCALE_XP"; +//***************************** AI RULES CONSTANTS ***************************** +// Variable name set to a creatures full name to set debugging on. +const string AI_RULE_DEBUG_CREATURE = "AI_RULE_DEBUG_CREATURE"; +// Moral checks on or off. +const string AI_RULE_MORAL_CHECKS = "AI_RULE_MORAL_CHECKS"; +// Allows monsters to prebuff before combat starts. +const string AI_RULE_BUFF_MONSTERS = "AI_RULE_BUFF_MONSTERS"; +// Allows monsters to use the ambush AI scripts. +const string AI_RULE_AMBUSH = "AI_RULE_AMBUSH"; +// Enemies may summon familiars and Animal companions and will be randomized. +const string AI_RULE_SUMMON_COMPANIONS = "AI_RULE_SUMMON_COMPANIONS"; +// Allows monsters cast summons spells when prebuffing. +const string AI_RULE_PRESUMMON = "AI_RULE_PRESUMMON"; +// Allow the AI move during combat base on the situation and action taking. +const string AI_RULE_ADVANCED_MOVEMENT = "AI_RULE_ADVANCED_MOVEMENT"; +// Follow Item Level Restrictions for monsters/associates. +// Usually off in Single player and on in Multi player. +const string AI_RULE_ILR = "AI_RULE_ILR"; +// Allow the AI to use Use Magic Device. +const string AI_RULE_ALLOW_UMD = "AI_RULE_ALLOW_UMD"; +// Allow the AI to use healing kits. +const string AI_RULE_HEALERSKITS = "AI_RULE_HEALERSKITS"; +// Summoned associates are permanent and don't disappear when the caster dies. +const string AI_RULE_PERM_ASSOC = "AI_RULE_PERM_ASSOC"; +// Monster AI's chance to attack the weakest target instead of the nearest. +const string AI_RULE_AI_DIFFICULTY = "AI_RULE_AI_DIFFICULTY"; +// Variable that can change the distance creatures will come and attack after +// hearing a shout from an ally that sees or hears an enemy. +// Or when searching for an invisible, heard enemy. +// 10.0 Short, 30.0 Average, 40.0 Long, 60.0 Huge. +const string AI_RULE_PERCEPTION_DISTANCE = "AI_RULE_PERCEPTION_DISTANCE"; +// Enemy corpses remain on the floor instead of dissappearing. +const string AI_RULE_CORPSES_STAY = "AI_RULE_CORPSES_STAY"; +// Monsters will wander around when not in combat. +const string AI_RULE_WANDER = "AI_RULE_WANDER"; +// Increase the number of encounter creatures. +const string AI_INCREASE_ENC_MONSTERS = "AI_INCREASE_ENC_MONSTERS"; +// Increase all monsters hitpoints by this percentage. +const string AI_INCREASE_MONSTERS_HP = "AI_INCREASE_MONSTERS_HP"; +// Variable that can change the distance monsters can hear and see. +const string AI_RULE_MON_PERC_DISTANCE = "AI_RULE_MON_PERC_DISTANCE"; +// Variable name set to hold the maximum number of henchman the player wants. +const string AI_RULE_MAX_HENCHMAN = "AI_RULE_MAX_HENCHMAN"; +// Variable name set to hold the distance monsters can wander away. +const string AI_RULE_WANDER_DISTANCE = "AI_RULE_WANDER_DISTANCE"; +// Variable name set to allow wandering monsters to open doors. +const string AI_RULE_OPEN_DOORS = "AI_RULE_OPEN_DOORS"; +// Variable name set to hold the modules default xp scale for use later. +const string AI_RULE_DEFAULT_XP_SCALE = "AI_RULE_DEFAULT_XP_SCALE"; +// Variable name set to allow the game to regulate experience based on party size. +const string AI_RULE_PARTY_SCALE = "AI_RULE_PARTY_SCALE"; +// Variable name set to restrict the AI's use of Darkness. +const string AI_RULE_RESTRICTED_SPELLS = "AI_RULE_RESTRICTED_SPELLS"; +/*/ Special behavior constants from x0_i0_behavior +const int NW_FLAG_BEHAVIOR_SPECIAL = 0x00000001; +//Will always attack regardless of faction +const int NW_FLAG_BEHAVIOR_CARNIVORE = 0x00000002; +//Will only attack if approached +const int NW_FLAG_BEHAVIOR_OMNIVORE = 0x00000004; +//Will never attack. Will alway flee. +const int NW_FLAG_BEHAVIOR_HERBIVORE = 0x00000008; +// This is the name of the local variable that holds the spawn-in conditions +const string sSpawnCondVarname = "NW_GENERIC_MASTER"; +// The available spawn-in conditions from x0_i0_spawncond +const int NW_FLAG_ESCAPE_RETURN = 0x00000020; //Failed +const int NW_FLAG_ESCAPE_LEAVE = 0x00000040; +const int NW_FLAG_TELEPORT_RETURN = 0x00000080; //Failed +const int NW_FLAG_TELEPORT_LEAVE = 0x00000100; +const int NW_FLAG_END_COMBAT_ROUND_EVENT = 0x00004000; +const int NW_FLAG_ON_DIALOGUE_EVENT = 0x00008000; +const int NW_FLAG_AMBIENT_ANIMATIONS = 0x00080000; +const int NW_FLAG_HEARTBEAT_EVENT = 0x00100000; +const int NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS = 0x00200000; +const int NW_FLAG_DAY_NIGHT_POSTING = 0x00400000; +const int NW_FLAG_AMBIENT_ANIMATIONS_AVIAN = 0x00800000; +const string sWalkwayVarname = "NW_WALK_CONDITION"; +// If set, the creature's waypoints have been initialized. +const int NW_WALK_FLAG_INITIALIZED = 0x00000001; +// If set, the creature will walk its waypoints constantly, +// moving on in each OnHeartbeat event. Otherwise, +// it will walk to the next only when triggered by an +// OnPerception event. +const int NW_WALK_FLAG_CONSTANT = 0x00000002; +// Set when the creature is walking day waypoints. +const int NW_WALK_FLAG_IS_DAY = 0x00000004; +// Set when the creature is walking back +const int NW_WALK_FLAG_BACKWARDS = 0x00000008; diff --git a/_module/nss/0i_gui_events.nss b/_module/nss/0i_gui_events.nss new file mode 100644 index 00000000..4628cf3d --- /dev/null +++ b/_module/nss/0i_gui_events.nss @@ -0,0 +1,1032 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_gui_events +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts for all gui events. See also 0e_gui_events + + GUI Events: + GUIEVENT_EFFECTICON_CLICK: For displaying icon information. + + This was built by DAZ all credit to him. + I just changed it from PostString to a NUI menu. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_constants" +#include "0i_nui" +void ai_SetupModuleGUIEvents(object oCreature) +{ + object oModule = GetModule(); + string sModuleGUIEvents = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT); + if(sModuleGUIEvents != "" || sModuleGUIEvents != "0e_gui_events") + { + SetLocalString(oModule, AI_MODULE_GUI_EVENT, sModuleGUIEvents); + } + SetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT, "0e_gui_events"); +} +int EffectIconToEffectType(int nEffectIcon) +{ + switch (nEffectIcon) + { + case EFFECT_ICON_INVALID: return EFFECT_TYPE_INVALIDEFFECT; + + // *** No Extra Stats + case EFFECT_ICON_BLIND: return EFFECT_TYPE_BLINDNESS; + case EFFECT_ICON_CHARMED: return EFFECT_TYPE_CHARMED; + case EFFECT_ICON_CONFUSED: return EFFECT_TYPE_CONFUSED; + case EFFECT_ICON_FRIGHTENED: return EFFECT_TYPE_FRIGHTENED; + case EFFECT_ICON_DOMINATED: return EFFECT_TYPE_DOMINATED; + case EFFECT_ICON_PARALYZE: return EFFECT_TYPE_PARALYZE; + case EFFECT_ICON_DAZED: return EFFECT_TYPE_DAZED; + case EFFECT_ICON_STUNNED: return EFFECT_TYPE_STUNNED; + case EFFECT_ICON_SLEEP: return EFFECT_TYPE_SLEEP; + case EFFECT_ICON_SILENCE: return EFFECT_TYPE_SILENCE; + case EFFECT_ICON_TURNED: return EFFECT_TYPE_TURNED; + case EFFECT_ICON_HASTE: return EFFECT_TYPE_HASTE; + case EFFECT_ICON_SLOW: return EFFECT_TYPE_SLOW; + case EFFECT_ICON_ENTANGLE: return EFFECT_TYPE_ENTANGLE; + case EFFECT_ICON_DEAF: return EFFECT_TYPE_DEAF; + case EFFECT_ICON_DARKNESS: return EFFECT_TYPE_DARKNESS; + case EFFECT_ICON_POLYMORPH: return EFFECT_TYPE_POLYMORPH; + case EFFECT_ICON_SANCTUARY: return EFFECT_TYPE_SANCTUARY; + case EFFECT_ICON_TRUESEEING: return EFFECT_TYPE_TRUESEEING; + case EFFECT_ICON_SEEINVISIBILITY: return EFFECT_TYPE_SEEINVISIBLE; + case EFFECT_ICON_ETHEREALNESS: return EFFECT_TYPE_ETHEREAL; + case EFFECT_ICON_PETRIFIED: return EFFECT_TYPE_PETRIFY; + // *** + + case EFFECT_ICON_DAMAGE_RESISTANCE: return EFFECT_TYPE_DAMAGE_RESISTANCE; + case EFFECT_ICON_REGENERATE: return EFFECT_TYPE_REGENERATE; + case EFFECT_ICON_DAMAGE_REDUCTION: return EFFECT_TYPE_DAMAGE_REDUCTION; + case EFFECT_ICON_TEMPORARY_HITPOINTS: return EFFECT_TYPE_TEMPORARY_HITPOINTS; + case EFFECT_ICON_IMMUNITY: return EFFECT_TYPE_IMMUNITY; + case EFFECT_ICON_POISON: return EFFECT_TYPE_POISON; + case EFFECT_ICON_DISEASE: return EFFECT_TYPE_DISEASE; + case EFFECT_ICON_CURSE: return EFFECT_TYPE_CURSE; + case EFFECT_ICON_ATTACK_INCREASE: return EFFECT_TYPE_ATTACK_INCREASE; + case EFFECT_ICON_ATTACK_DECREASE: return EFFECT_TYPE_ATTACK_DECREASE; + case EFFECT_ICON_DAMAGE_INCREASE: return EFFECT_TYPE_DAMAGE_INCREASE; + case EFFECT_ICON_DAMAGE_DECREASE: return EFFECT_TYPE_DAMAGE_DECREASE; + case EFFECT_ICON_AC_INCREASE: return EFFECT_TYPE_AC_INCREASE; + case EFFECT_ICON_AC_DECREASE: return EFFECT_TYPE_AC_DECREASE; + case EFFECT_ICON_MOVEMENT_SPEED_INCREASE: return EFFECT_TYPE_MOVEMENT_SPEED_INCREASE; + case EFFECT_ICON_MOVEMENT_SPEED_DECREASE: return EFFECT_TYPE_MOVEMENT_SPEED_DECREASE; + case EFFECT_ICON_SAVING_THROW_DECREASE: return EFFECT_TYPE_SAVING_THROW_DECREASE; + case EFFECT_ICON_SPELL_RESISTANCE_INCREASE: return EFFECT_TYPE_SPELL_RESISTANCE_INCREASE; + case EFFECT_ICON_SPELL_RESISTANCE_DECREASE: return EFFECT_TYPE_SPELL_RESISTANCE_DECREASE; + case EFFECT_ICON_SKILL_INCREASE: return EFFECT_TYPE_SKILL_INCREASE; + case EFFECT_ICON_SKILL_DECREASE: return EFFECT_TYPE_SKILL_DECREASE; + case EFFECT_ICON_ELEMENTALSHIELD: return EFFECT_TYPE_ELEMENTALSHIELD; + case EFFECT_ICON_LEVELDRAIN: return EFFECT_TYPE_NEGATIVELEVEL; + case EFFECT_ICON_SPELLLEVELABSORPTION: return EFFECT_TYPE_SPELLLEVELABSORPTION; + case EFFECT_ICON_SPELLIMMUNITY: return EFFECT_TYPE_SPELL_IMMUNITY; + case EFFECT_ICON_CONCEALMENT: return EFFECT_TYPE_CONCEALMENT; + case EFFECT_ICON_EFFECT_SPELL_FAILURE: return EFFECT_TYPE_SPELL_FAILURE; + + case EFFECT_ICON_INVISIBILITY: + case EFFECT_ICON_IMPROVEDINVISIBILITY: return EFFECT_TYPE_INVISIBILITY; + + case EFFECT_ICON_ABILITY_INCREASE_STR: + case EFFECT_ICON_ABILITY_INCREASE_DEX: + case EFFECT_ICON_ABILITY_INCREASE_CON: + case EFFECT_ICON_ABILITY_INCREASE_INT: + case EFFECT_ICON_ABILITY_INCREASE_WIS: + case EFFECT_ICON_ABILITY_INCREASE_CHA: return EFFECT_TYPE_ABILITY_INCREASE; + + case EFFECT_ICON_ABILITY_DECREASE_STR: + case EFFECT_ICON_ABILITY_DECREASE_CHA: + case EFFECT_ICON_ABILITY_DECREASE_DEX: + case EFFECT_ICON_ABILITY_DECREASE_CON: + case EFFECT_ICON_ABILITY_DECREASE_INT: + case EFFECT_ICON_ABILITY_DECREASE_WIS: return EFFECT_TYPE_ABILITY_DECREASE; + + case EFFECT_ICON_IMMUNITY_ALL: + case EFFECT_ICON_IMMUNITY_MIND: + case EFFECT_ICON_IMMUNITY_POISON: + case EFFECT_ICON_IMMUNITY_DISEASE: + case EFFECT_ICON_IMMUNITY_FEAR: + case EFFECT_ICON_IMMUNITY_TRAP: + case EFFECT_ICON_IMMUNITY_PARALYSIS: + case EFFECT_ICON_IMMUNITY_BLINDNESS: + case EFFECT_ICON_IMMUNITY_DEAFNESS: + case EFFECT_ICON_IMMUNITY_SLOW: + case EFFECT_ICON_IMMUNITY_ENTANGLE: + case EFFECT_ICON_IMMUNITY_SILENCE: + case EFFECT_ICON_IMMUNITY_STUN: + case EFFECT_ICON_IMMUNITY_SLEEP: + case EFFECT_ICON_IMMUNITY_CHARM: + case EFFECT_ICON_IMMUNITY_DOMINATE: + case EFFECT_ICON_IMMUNITY_CONFUSE: + case EFFECT_ICON_IMMUNITY_CURSE: + case EFFECT_ICON_IMMUNITY_DAZED: + case EFFECT_ICON_IMMUNITY_ABILITY_DECREASE: + case EFFECT_ICON_IMMUNITY_ATTACK_DECREASE: + case EFFECT_ICON_IMMUNITY_DAMAGE_DECREASE: + case EFFECT_ICON_IMMUNITY_DAMAGE_IMMUNITY_DECREASE: + case EFFECT_ICON_IMMUNITY_AC_DECREASE: + case EFFECT_ICON_IMMUNITY_MOVEMENT_SPEED_DECREASE: + case EFFECT_ICON_IMMUNITY_SAVING_THROW_DECREASE: + case EFFECT_ICON_IMMUNITY_SPELL_RESISTANCE_DECREASE: + case EFFECT_ICON_IMMUNITY_SKILL_DECREASE: + case EFFECT_ICON_IMMUNITY_KNOCKDOWN: + case EFFECT_ICON_IMMUNITY_NEGATIVE_LEVEL: + case EFFECT_ICON_IMMUNITY_SNEAK_ATTACK: + case EFFECT_ICON_IMMUNITY_CRITICAL_HIT: + case EFFECT_ICON_IMMUNITY_DEATH_MAGIC: return EFFECT_TYPE_IMMUNITY; + + case EFFECT_ICON_SAVING_THROW_INCREASE: + case EFFECT_ICON_REFLEX_SAVE_INCREASED: + case EFFECT_ICON_FORT_SAVE_INCREASED: + case EFFECT_ICON_WILL_SAVE_INCREASED: return EFFECT_TYPE_SAVING_THROW_INCREASE; + + case EFFECT_ICON_DAMAGE_IMMUNITY_INCREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC: + case EFFECT_ICON_DAMAGE_IMMUNITY_ACID: + case EFFECT_ICON_DAMAGE_IMMUNITY_COLD: + case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE: + case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL: + case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE: + case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE: + case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE: + case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC: return EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE; + + case EFFECT_ICON_DAMAGE_IMMUNITY_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_ACID_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_COLD_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE_DECREASE: + case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC_DECREASE: return EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE; + + //case EFFECT_ICON_INVULNERABLE: return EFFECT_TYPE_INVULNERABLE; + //case EFFECT_ICON_WOUNDING: return EFFECT_TYPE_INVALIDEFFECT; + //case EFFECT_ICON_TAUNTED: return EFFECT_TYPE_INVALIDEFFECT; + //case EFFECT_ICON_TIMESTOP: return EFFECT_TYPE_TIMESTOP; + //case EFFECT_ICON_BLINDNESS: return EFFECT_TYPE_BLINDNESS; + //case EFFECT_ICON_DISPELMAGICBEST: return EFFECT_TYPE_INVALIDEFFECT; + //case EFFECT_ICON_DISPELMAGICALL: return EFFECT_TYPE_INVALIDEFFECT; + //case EFFECT_ICON_ENEMY_ATTACK_BONUS: return EFFECT_TYPE_INVALIDEFFECT; + //case EFFECT_ICON_FATIGUE: return EFFECT_TYPE_INVALIDEFFECT; + } + return EFFECT_TYPE_INVALIDEFFECT; +} +int AbilityTypeFromEffectIconAbility(int nEffectIcon) +{ + switch (nEffectIcon) + { + case EFFECT_ICON_ABILITY_INCREASE_STR: + case EFFECT_ICON_ABILITY_DECREASE_STR: + return ABILITY_STRENGTH; + case EFFECT_ICON_ABILITY_INCREASE_DEX: + case EFFECT_ICON_ABILITY_DECREASE_DEX: + return ABILITY_DEXTERITY; + case EFFECT_ICON_ABILITY_INCREASE_CON: + case EFFECT_ICON_ABILITY_DECREASE_CON: + return ABILITY_CONSTITUTION; + case EFFECT_ICON_ABILITY_INCREASE_INT: + case EFFECT_ICON_ABILITY_DECREASE_INT: + return ABILITY_INTELLIGENCE; + case EFFECT_ICON_ABILITY_INCREASE_WIS: + case EFFECT_ICON_ABILITY_DECREASE_WIS: + return ABILITY_WISDOM; + case EFFECT_ICON_ABILITY_INCREASE_CHA: + case EFFECT_ICON_ABILITY_DECREASE_CHA: + return ABILITY_CHARISMA; + } + return -1; +} +int DamageTypeFromEffectIconDamageImmunity(int nEffectIcon) +{ + switch (nEffectIcon) + { + case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC: + case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC_DECREASE: + return DAMAGE_TYPE_MAGICAL; + case EFFECT_ICON_DAMAGE_IMMUNITY_ACID: + case EFFECT_ICON_DAMAGE_IMMUNITY_ACID_DECREASE: + return DAMAGE_TYPE_ACID; + case EFFECT_ICON_DAMAGE_IMMUNITY_COLD: + case EFFECT_ICON_DAMAGE_IMMUNITY_COLD_DECREASE: + return DAMAGE_TYPE_COLD; + case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE: + case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE_DECREASE: + return DAMAGE_TYPE_DIVINE; + case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL: + case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL_DECREASE: + return DAMAGE_TYPE_ELECTRICAL; + case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE: + case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE_DECREASE: + return DAMAGE_TYPE_FIRE; + case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE: + case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE_DECREASE: + return DAMAGE_TYPE_NEGATIVE; + case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE: + case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE_DECREASE: + return DAMAGE_TYPE_POSITIVE; + case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC: + case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC_DECREASE: + return DAMAGE_TYPE_SONIC; + } + return -1; +} + +int ImmunityTypeFromEffectIconImmunity(int nEffectIcon) +{ + switch (nEffectIcon) + { + case EFFECT_ICON_IMMUNITY_MIND: return IMMUNITY_TYPE_MIND_SPELLS; + case EFFECT_ICON_IMMUNITY_POISON: return IMMUNITY_TYPE_POISON; + case EFFECT_ICON_IMMUNITY_DISEASE: return IMMUNITY_TYPE_DISEASE; + case EFFECT_ICON_IMMUNITY_FEAR: return IMMUNITY_TYPE_FEAR; + case EFFECT_ICON_IMMUNITY_TRAP: return IMMUNITY_TYPE_TRAP; + case EFFECT_ICON_IMMUNITY_PARALYSIS: return IMMUNITY_TYPE_PARALYSIS; + case EFFECT_ICON_IMMUNITY_BLINDNESS: return IMMUNITY_TYPE_BLINDNESS; + case EFFECT_ICON_IMMUNITY_DEAFNESS: return IMMUNITY_TYPE_DEAFNESS; + case EFFECT_ICON_IMMUNITY_SLOW: return IMMUNITY_TYPE_SLOW; + case EFFECT_ICON_IMMUNITY_ENTANGLE: return IMMUNITY_TYPE_ENTANGLE; + case EFFECT_ICON_IMMUNITY_SILENCE: return IMMUNITY_TYPE_SILENCE; + case EFFECT_ICON_IMMUNITY_STUN: return IMMUNITY_TYPE_STUN; + case EFFECT_ICON_IMMUNITY_SLEEP: return IMMUNITY_TYPE_SLEEP; + case EFFECT_ICON_IMMUNITY_CHARM: return IMMUNITY_TYPE_CHARM; + case EFFECT_ICON_IMMUNITY_DOMINATE: return IMMUNITY_TYPE_DOMINATE; + case EFFECT_ICON_IMMUNITY_CONFUSE: return IMMUNITY_TYPE_CONFUSED; + case EFFECT_ICON_IMMUNITY_CURSE: return IMMUNITY_TYPE_CURSED; + case EFFECT_ICON_IMMUNITY_DAZED: return IMMUNITY_TYPE_DAZED; + case EFFECT_ICON_IMMUNITY_ABILITY_DECREASE: return IMMUNITY_TYPE_ABILITY_DECREASE; + case EFFECT_ICON_IMMUNITY_ATTACK_DECREASE: return IMMUNITY_TYPE_ATTACK_DECREASE; + case EFFECT_ICON_IMMUNITY_DAMAGE_DECREASE: return IMMUNITY_TYPE_DAMAGE_DECREASE; + case EFFECT_ICON_IMMUNITY_DAMAGE_IMMUNITY_DECREASE: return IMMUNITY_TYPE_DAMAGE_IMMUNITY_DECREASE; + case EFFECT_ICON_IMMUNITY_AC_DECREASE: return IMMUNITY_TYPE_AC_DECREASE; + case EFFECT_ICON_IMMUNITY_MOVEMENT_SPEED_DECREASE: return IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE; + case EFFECT_ICON_IMMUNITY_SAVING_THROW_DECREASE: return IMMUNITY_TYPE_SAVING_THROW_DECREASE; + case EFFECT_ICON_IMMUNITY_SPELL_RESISTANCE_DECREASE: return IMMUNITY_TYPE_SPELL_RESISTANCE_DECREASE; + case EFFECT_ICON_IMMUNITY_SKILL_DECREASE: return IMMUNITY_TYPE_SKILL_DECREASE; + case EFFECT_ICON_IMMUNITY_KNOCKDOWN: return IMMUNITY_TYPE_KNOCKDOWN; + case EFFECT_ICON_IMMUNITY_NEGATIVE_LEVEL: return IMMUNITY_TYPE_NEGATIVE_LEVEL; + case EFFECT_ICON_IMMUNITY_SNEAK_ATTACK: return IMMUNITY_TYPE_SNEAK_ATTACK; + case EFFECT_ICON_IMMUNITY_CRITICAL_HIT: return IMMUNITY_TYPE_CRITICAL_HIT; + case EFFECT_ICON_IMMUNITY_DEATH_MAGIC: return IMMUNITY_TYPE_DEATH; + } + return -1; +} +void ClearLines(object oPlayer) +{ + int nLine, nLines = GetLocalInt(oPlayer, "BUFFINFO_LAST_NUM_LINES"); + for (nLine = 1; nLine <= nLines; nLine++) + { + PostString(oPlayer, "", 10, nLine + 3, SCREEN_ANCHOR_TOP_RIGHT, 0.1f, 0xFFFFFF00, 0xFFFFFF00, nLine); + } +} +void DisplayLine(object oPlayer, int nLine, string sText, int nColor) +{ + PostString(oPlayer, sText, 10, nLine + 3, SCREEN_ANCHOR_TOP_RIGHT, 10.0f, nColor, 0xFFFFFF00, nLine); +} +string SecondsToTimestamp(int nSeconds) +{ + sqlquery sql; + if (nSeconds > 86400) sql = SqlPrepareQueryObject(GetModule(), "SELECT (@seconds / 3600) || ':' || strftime('%M:%S', @seconds / 86400.0);"); + else sql = SqlPrepareQueryObject(GetModule(), "SELECT time(@seconds, 'unixepoch');"); + SqlBindInt(sql, "@seconds", nSeconds); + SqlStep(sql); + return SqlGetString(sql, 0); +} +string Get2DAStrRef(string s2DA, string sColumn, int nRow) +{ + return GetStringByStrRef(StringToInt(Get2DAString(s2DA, sColumn, nRow))); +} +string GetVersusRacialTypeAndAlignment(int nRacialType, int nLawfulChaotic, int nGoodEvil) +{ + string sRacialType = nRacialType == RACIAL_TYPE_INVALID ? "" : Get2DAStrRef("racialtypes", "NamePlural", nRacialType); + string sLawfulChaotic = nLawfulChaotic == ALIGNMENT_LAWFUL ? "Lawful" : nLawfulChaotic == ALIGNMENT_CHAOTIC ? "Chaotic" : ""; + string sGoodEvil = nGoodEvil == ALIGNMENT_GOOD ? "Good" : nGoodEvil == ALIGNMENT_EVIL ? "Evil" : ""; + string sAlignment = sLawfulChaotic + (sLawfulChaotic == "" ? sGoodEvil : (sGoodEvil == "" ? "" : " " + sGoodEvil)); + return (sRacialType != "" || sAlignment != "") ? (" vs. " + sAlignment + (sAlignment == "" ? sRacialType : (sRacialType == "" ? "" : " " + sRacialType))) : ""; +} +string GetModifierType(int nEffectType, int nPlus, int nMinus) +{ + return nEffectType == nPlus ? "+" : nEffectType == nMinus ? "-" : ""; +} +string ACTypeToString(int nACType) +{ + switch (nACType) + { + case AC_DODGE_BONUS: return "Dodge"; + case AC_NATURAL_BONUS: return "Natural"; + case AC_ARMOUR_ENCHANTMENT_BONUS: return "Armor"; + case AC_SHIELD_ENCHANTMENT_BONUS: return "Shield"; + case AC_DEFLECTION_BONUS: return "Deflection"; + } + return ""; +} + +string SavingThrowToString(int nSavingThrow) +{ + switch (nSavingThrow) + { + case SAVING_THROW_ALL: return "All"; + case SAVING_THROW_FORT: return "Fortitude"; + case SAVING_THROW_REFLEX: return "Reflex"; + case SAVING_THROW_WILL: return "Will"; + } + return ""; +} +string SavingThrowTypeToString(int nSavingThrowType) +{ + switch (nSavingThrowType) + { + case SAVING_THROW_TYPE_MIND_SPELLS: return "Mind Spells"; + case SAVING_THROW_TYPE_POISON: return "Poison"; + case SAVING_THROW_TYPE_DISEASE: return "Disease"; + case SAVING_THROW_TYPE_FEAR: return "Fear"; + case SAVING_THROW_TYPE_SONIC: return "Sonic"; + case SAVING_THROW_TYPE_ACID: return "Acid"; + case SAVING_THROW_TYPE_FIRE: return "Fire"; + case SAVING_THROW_TYPE_ELECTRICITY: return "Electricity"; + case SAVING_THROW_TYPE_POSITIVE: return "Positive"; + case SAVING_THROW_TYPE_NEGATIVE: return "Negative"; + case SAVING_THROW_TYPE_DEATH: return "Death"; + case SAVING_THROW_TYPE_COLD: return "Cold"; + case SAVING_THROW_TYPE_DIVINE: return "Divine"; + case SAVING_THROW_TYPE_TRAP: return "Traps"; + case SAVING_THROW_TYPE_SPELL: return "Spells"; + case SAVING_THROW_TYPE_GOOD: return "Good"; + case SAVING_THROW_TYPE_EVIL: return "Evil"; + case SAVING_THROW_TYPE_LAW: return "Lawful"; + case SAVING_THROW_TYPE_CHAOS: return "Chaotic"; + } + return ""; +} +string AbilityToString(int nAbility) +{ + switch (nAbility) + { + case ABILITY_STRENGTH: return "Strength"; + case ABILITY_DEXTERITY: return "Dexterity"; + case ABILITY_CONSTITUTION: return "Constitution"; + case ABILITY_INTELLIGENCE: return "Intelligence"; + case ABILITY_WISDOM: return "Wisdom"; + case ABILITY_CHARISMA: return "Charisma"; + } + return ""; +} +string DamageTypeToString(int nDamageType) +{ + switch (nDamageType) + { + case DAMAGE_TYPE_BLUDGEONING: return "Bludgeoning"; + case DAMAGE_TYPE_PIERCING: return "Piercing"; + case DAMAGE_TYPE_SLASHING: return "Slashing"; + case DAMAGE_TYPE_MAGICAL: return "Magical"; + case DAMAGE_TYPE_ACID: return "Acid"; + case DAMAGE_TYPE_COLD: return "Cold"; + case DAMAGE_TYPE_DIVINE: return "Divine"; + case DAMAGE_TYPE_ELECTRICAL: return "Electrical"; + case DAMAGE_TYPE_FIRE: return "Fire"; + case DAMAGE_TYPE_NEGATIVE: return "Negative"; + case DAMAGE_TYPE_POSITIVE: return "Positive"; + case DAMAGE_TYPE_SONIC: return "Sonic"; + case DAMAGE_TYPE_BASE_WEAPON: return "Base Weapon"; + } + return ""; +} +string SpellSchoolToString(int nSpellSchool) +{ + switch (nSpellSchool) + { + case SPELL_SCHOOL_GENERAL: return "General"; + case SPELL_SCHOOL_ABJURATION: return "Abjuration"; + case SPELL_SCHOOL_CONJURATION: return "Conjuration"; + case SPELL_SCHOOL_DIVINATION: return "Divination"; + case SPELL_SCHOOL_ENCHANTMENT: return "Enchantment"; + case SPELL_SCHOOL_EVOCATION: return "Evocation"; + case SPELL_SCHOOL_ILLUSION: return "Illusion"; + case SPELL_SCHOOL_NECROMANCY: return "Necromancy"; + case SPELL_SCHOOL_TRANSMUTATION: return "Transmutation"; + } + return ""; +} +string MissChanceToString(int nMissChance) +{ + switch (nMissChance) + { + case MISS_CHANCE_TYPE_VS_RANGED: return "vs. Ranged"; + case MISS_CHANCE_TYPE_VS_MELEE: return "vs. Melee"; + } + return ""; +} +void ai_CreateEffectChatReport(object oPlayer, int nEffectIconID) +{ + int nIconEffectType = EffectIconToEffectType(nEffectIconID); + if(nIconEffectType == EFFECT_TYPE_INVALIDEFFECT) return; + int nLine, nIndex, nEffectIndex; + string sColor = AI_COLOR_YELLOW; + int bSkipDisplay, bHasEffect; + int nEffectType, bIsSpellLevelAbsorptionPretendingToBeSpellImmunity; + string sText; + json jEffectID = JsonArray(); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 27 + sText = Get2DAStrRef("effecticons", "StrRef", nEffectIconID); + ai_SendMessages(sText, AI_COLOR_YELLOW, oPlayer); + effect eEffect = GetFirstEffect(oPlayer); + while(GetIsEffectValid(eEffect)) + { + bSkipDisplay = FALSE; + nEffectType = GetEffectType(eEffect); + // Unlimited EffectSpellLevelAbsorption has a SpellImmunity Icon + if (nIconEffectType == EFFECT_TYPE_SPELL_IMMUNITY && GetEffectInteger(eEffect, 3)) + { + bIsSpellLevelAbsorptionPretendingToBeSpellImmunity = TRUE; + nIconEffectType = EFFECT_TYPE_SPELLLEVELABSORPTION; + } + if (nEffectType == nIconEffectType) + { + bHasEffect = TRUE; + int nSpellID = GetEffectSpellId(eEffect); + string sSpellName = nSpellID == -1 ? "" : Get2DAStrRef("spells", "Name", nSpellID); + int bIsPermanentEffect = GetEffectDurationType(eEffect) == DURATION_TYPE_PERMANENT; + int nDurationRemaining = GetEffectDurationRemaining(eEffect); + string sDurationRemaining = bIsPermanentEffect ? "(Permanent)" : "(" + SecondsToTimestamp(nDurationRemaining) + ")"; + if(bIsPermanentEffect) sColor = AI_COLOR_WHITE; + else + { + if(nDurationRemaining < 61) sColor = AI_COLOR_RED; + else if(nDurationRemaining < 300) sColor = AI_COLOR_YELLOW; + else sColor = AI_COLOR_GREEN; + } + string sStats = ""; + string sRacialTypeAlignment = ""; + switch (nEffectType) + { + case EFFECT_TYPE_AC_INCREASE: + case EFFECT_TYPE_AC_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_AC_INCREASE, EFFECT_TYPE_AC_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + ACTypeToString(GetEffectInteger(eEffect, 0)) + " AC"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_ATTACK_INCREASE: + case EFFECT_TYPE_ATTACK_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ATTACK_INCREASE, EFFECT_TYPE_ATTACK_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) +" AB"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_SAVING_THROW_INCREASE: + case EFFECT_TYPE_SAVING_THROW_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SAVING_THROW_INCREASE, EFFECT_TYPE_SAVING_THROW_DECREASE); + string sSavingThrow = SavingThrowToString(GetEffectInteger(eEffect, 1)); + string sSavingThrowType = SavingThrowTypeToString(GetEffectInteger(eEffect, 2)); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " " + sSavingThrow + (sSavingThrowType == "" ? "" : " (vs. " + sSavingThrowType + ")"); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4), GetEffectInteger(eEffect, 5)); + break; + } + case EFFECT_TYPE_ABILITY_INCREASE: + case EFFECT_TYPE_ABILITY_DECREASE: + { + int nAbility = AbilityTypeFromEffectIconAbility(nEffectIconID); + + if (nAbility != GetEffectInteger(eEffect, 0)) + bSkipDisplay = TRUE; + else + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ABILITY_INCREASE, EFFECT_TYPE_ABILITY_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + AbilityToString(nAbility); + } + break; + } + case EFFECT_TYPE_DAMAGE_INCREASE: + case EFFECT_TYPE_DAMAGE_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_INCREASE, EFFECT_TYPE_DAMAGE_DECREASE); + sStats = sModifier + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 0)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 1)) + ")"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_SKILL_INCREASE: + case EFFECT_TYPE_SKILL_DECREASE: + { + int nSkill = GetEffectInteger(eEffect, 0); + string sSkill = nSkill == 255 ? "All Skills" : Get2DAStrRef("skills", "Name", nSkill); + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SKILL_INCREASE, EFFECT_TYPE_SKILL_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + sSkill; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_TEMPORARY_HITPOINTS: + { + sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HitPoints"; + break; + } + case EFFECT_TYPE_DAMAGE_REDUCTION: + { + int nAmount = GetEffectInteger(eEffect, 0); + int nDamagePower = GetEffectInteger(eEffect, 1); + nDamagePower = nDamagePower > 6 ? --nDamagePower : nDamagePower; + int nRemaining = GetEffectInteger(eEffect, 2); + sStats = IntToString(nAmount) + "/+" + IntToString(nDamagePower) + " (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")"; + break; + } + case EFFECT_TYPE_DAMAGE_RESISTANCE: + { + int nAmount = GetEffectInteger(eEffect, 1); + int nRemaining = GetEffectInteger(eEffect, 2); + sStats = IntToString(nAmount) + "/- " + DamageTypeToString(GetEffectInteger(eEffect, 0)) + " Resistance (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")"; + break; + } + case EFFECT_TYPE_IMMUNITY: + { + int nImmunity = ImmunityTypeFromEffectIconImmunity(nEffectIconID); + + if (nImmunity != GetEffectInteger(eEffect, 0)) + bSkipDisplay = TRUE; + else + { + sStats = Get2DAStrRef("effecticons", "StrRef", nEffectIconID); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + } + break; + } + case EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE: + case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE: + { + int nDamageType = GetEffectInteger(eEffect, 0); + int nDamageTypeFromIcon = DamageTypeFromEffectIconDamageImmunity(nEffectIconID); + + if (nDamageTypeFromIcon != -1 && nDamageType != nDamageTypeFromIcon) + bSkipDisplay = TRUE; + + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE, EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + "% " + DamageTypeToString(nDamageType) + " Damage Immunity"; + break; + } + case EFFECT_TYPE_SPELL_IMMUNITY: + { + sStats = "Spell Immunity: " + Get2DAStrRef("spells", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_SPELLLEVELABSORPTION: + { + int nMaxSpellLevelAbsorbed = GetEffectInteger(eEffect, 0); + int bUnlimited = GetEffectInteger(eEffect, 3); + string sSpellLevel; + switch (nMaxSpellLevelAbsorbed) + { + case 0: sSpellLevel = "Cantrip"; break; + case 1: sSpellLevel = "1st"; break; + case 2: sSpellLevel = "2nd"; break; + case 3: sSpellLevel = "3rd"; break; + default: sSpellLevel = IntToString(nMaxSpellLevelAbsorbed) + "th"; break; + } + sSpellLevel += " Level" + (nMaxSpellLevelAbsorbed == 0 ? "" : " and Below"); + string sSpellSchool = SpellSchoolToString(GetEffectInteger(eEffect, 2)); + string sRemainingSpellLevels = bUnlimited ? "" : "(" + IntToString(GetEffectInteger(eEffect, 1)) + " Spell Levels Remaining)"; + sStats = sSpellLevel + " " + sSpellSchool + " Spell Immunity " + sRemainingSpellLevels; + + if (bIsSpellLevelAbsorptionPretendingToBeSpellImmunity) + nIconEffectType = EFFECT_TYPE_SPELL_IMMUNITY; + else if (bUnlimited && !bIsSpellLevelAbsorptionPretendingToBeSpellImmunity) + bSkipDisplay = TRUE; + + break; + } + case EFFECT_TYPE_REGENERATE: + { + sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HP / " + FloatToString((GetEffectInteger(eEffect, 1) / 1000.0f), 0, 2) + "s"; + break; + } + case EFFECT_TYPE_POISON: + { + sStats = "Poison: " + Get2DAStrRef("poison", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_DISEASE: + { + sStats = "Disease: " + Get2DAStrRef("disease", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_CURSE: + { + int nAbility; + string sAbilityDecrease; + for (nAbility = 0; nAbility < 6; nAbility++) + { + int nAbilityMod = GetEffectInteger(eEffect, nAbility); + if (nAbilityMod > 0) + { + string sAbility = GetStringLeft(AbilityToString(nAbility), 3); + sAbilityDecrease += "-" + IntToString(nAbilityMod) + " " + sAbility + ", "; + } + } + sAbilityDecrease = GetStringLeft(sAbilityDecrease, GetStringLength(sAbilityDecrease) - 2); + sStats = sAbilityDecrease; + break; + } + case EFFECT_TYPE_MOVEMENT_SPEED_INCREASE: + case EFFECT_TYPE_MOVEMENT_SPEED_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_MOVEMENT_SPEED_INCREASE, EFFECT_TYPE_MOVEMENT_SPEED_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + "% Movement Speed"; + break; + } + case EFFECT_TYPE_ELEMENTALSHIELD: + { + sStats = IntToString(GetEffectInteger(eEffect, 0)) + " + " + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 1)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 2)) + ")"; + break; + } + case EFFECT_TYPE_NEGATIVELEVEL: + { + sStats = "-" + IntToString(GetEffectInteger(eEffect, 0)) + " Levels"; + break; + } + case EFFECT_TYPE_CONCEALMENT: + { + string sMissChance = MissChanceToString(GetEffectInteger(eEffect, 4) - 1); + sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Concealment" + (sMissChance == "" ? "" : " (" + sMissChance + ")"); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + break; + } + case EFFECT_TYPE_SPELL_RESISTANCE_INCREASE: + case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SPELL_RESISTANCE_INCREASE, EFFECT_TYPE_SPELL_RESISTANCE_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " Spell Resistance"; + break; + } + case EFFECT_TYPE_SPELL_FAILURE: + { + sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Spell Failure (Spell School: " + SpellSchoolToString(GetEffectInteger(eEffect, 1)) + ")"; + break; + } + case EFFECT_TYPE_INVISIBILITY: + { + int nInvisibilityType = GetEffectInteger(eEffect, 0); + if (nEffectIconID == EFFECT_ICON_INVISIBILITY) + bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_NORMAL; + else if (nEffectIconID == EFFECT_ICON_IMPROVEDINVISIBILITY) + bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_IMPROVED; + if (!bSkipDisplay) + { + sStats = (nInvisibilityType == INVISIBILITY_TYPE_IMPROVED ? "Improved " : "") + "Invisibility"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + } + break; + } + case EFFECT_TYPE_HASTE: + { + sStats = "Hasted"; + } + } + if(!bSkipDisplay) + { + sText = sSpellName + " " + sDurationRemaining + (sStats == "" ? "" : " -> " + sStats + sRacialTypeAlignment); + if(sText != "") + { + ai_SendMessages(sText, sColor, oPlayer); + object oSource = GetEffectCreator(eEffect); + if(GetIsObjectValid(oSource)) + { + sText = GetObjectType(oSource) ? GetName(oSource) : ""; + sText = " Creator: " + sText; + float fLength = IntToFloat(GetStringLength(sText) * 8); + ai_SendMessages(sText, AI_COLOR_YELLOW, oPlayer); + } + } + } + } + nIndex++; + eEffect = GetNextEffect(oPlayer); + } +} +void ai_CreateEffectIconMenu(object oPlayer, int nEffectIconID) +{ + int nIconEffectType = EffectIconToEffectType(nEffectIconID); + if(nIconEffectType == EFFECT_TYPE_INVALIDEFFECT) return; + int nLine, nColor, nIndex, nEffectIndex; + int bSkipDisplay, bHasEffect; + int nEffectType, bIsSpellLevelAbsorptionPretendingToBeSpellImmunity; + string sText; + json jEffectID = JsonArray(); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 27 + sText = Get2DAStrRef("effecticons", "StrRef", nEffectIconID); + json jRow = CreateLabel(JsonArray(), "Effect: " + sText, "lbl_buff_name", 700.0f, 15.0f, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + float fHeight = 27.0; + effect eEffect = GetFirstEffect(oPlayer); + while(GetIsEffectValid(eEffect)) + { + bSkipDisplay = FALSE; + nEffectType = GetEffectType(eEffect); + // Unlimited EffectSpellLevelAbsorption has a SpellImmunity Icon + if (nIconEffectType == EFFECT_TYPE_SPELL_IMMUNITY && GetEffectInteger(eEffect, 3)) + { + bIsSpellLevelAbsorptionPretendingToBeSpellImmunity = TRUE; + nIconEffectType = EFFECT_TYPE_SPELLLEVELABSORPTION; + } + if (nEffectType == nIconEffectType) + { + bHasEffect = TRUE; + int nSpellID = GetEffectSpellId(eEffect); + string sSpellName = nSpellID == -1 ? "" : Get2DAStrRef("spells", "Name", nSpellID); + int bIsPermanentEffect = GetEffectDurationType(eEffect) == DURATION_TYPE_PERMANENT; + int nDurationRemaining = GetEffectDurationRemaining(eEffect); + string sDurationRemaining = bIsPermanentEffect ? "(Permanent)" : "(" + SecondsToTimestamp(nDurationRemaining) + ")"; + if(bIsPermanentEffect) nColor = 0x0000FFFF; + else + { + float fPercentage = IntToFloat(nDurationRemaining) / IntToFloat(GetEffectDuration(eEffect)); + if(fPercentage > 0.5f) nColor = 0x00FF00FF; + else if(fPercentage < 0.25f) nColor = 0xFF0000FF; + else nColor = 0xFFFF00FF; + } + string sStats = ""; + string sRacialTypeAlignment = ""; + switch (nEffectType) + { + case EFFECT_TYPE_AC_INCREASE: + case EFFECT_TYPE_AC_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_AC_INCREASE, EFFECT_TYPE_AC_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + ACTypeToString(GetEffectInteger(eEffect, 0)) + " AC"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_ATTACK_INCREASE: + case EFFECT_TYPE_ATTACK_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ATTACK_INCREASE, EFFECT_TYPE_ATTACK_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) +" AB"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_SAVING_THROW_INCREASE: + case EFFECT_TYPE_SAVING_THROW_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SAVING_THROW_INCREASE, EFFECT_TYPE_SAVING_THROW_DECREASE); + string sSavingThrow = SavingThrowToString(GetEffectInteger(eEffect, 1)); + string sSavingThrowType = SavingThrowTypeToString(GetEffectInteger(eEffect, 2)); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " " + sSavingThrow + (sSavingThrowType == "" ? "" : " (vs. " + sSavingThrowType + ")"); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4), GetEffectInteger(eEffect, 5)); + break; + } + case EFFECT_TYPE_ABILITY_INCREASE: + case EFFECT_TYPE_ABILITY_DECREASE: + { + int nAbility = AbilityTypeFromEffectIconAbility(nEffectIconID); + + if (nAbility != GetEffectInteger(eEffect, 0)) + bSkipDisplay = TRUE; + else + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ABILITY_INCREASE, EFFECT_TYPE_ABILITY_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + AbilityToString(nAbility); + } + break; + } + case EFFECT_TYPE_DAMAGE_INCREASE: + case EFFECT_TYPE_DAMAGE_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_INCREASE, EFFECT_TYPE_DAMAGE_DECREASE); + sStats = sModifier + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 0)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 1)) + ")"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_SKILL_INCREASE: + case EFFECT_TYPE_SKILL_DECREASE: + { + int nSkill = GetEffectInteger(eEffect, 0); + string sSkill = nSkill == 255 ? "All Skills" : Get2DAStrRef("skills", "Name", nSkill); + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SKILL_INCREASE, EFFECT_TYPE_SKILL_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + sSkill; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4)); + break; + } + case EFFECT_TYPE_TEMPORARY_HITPOINTS: + { + sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HitPoints"; + break; + } + case EFFECT_TYPE_DAMAGE_REDUCTION: + { + int nAmount = GetEffectInteger(eEffect, 0); + int nDamagePower = GetEffectInteger(eEffect, 1); + nDamagePower = nDamagePower > 6 ? --nDamagePower : nDamagePower; + int nRemaining = GetEffectInteger(eEffect, 2); + sStats = IntToString(nAmount) + "/+" + IntToString(nDamagePower) + " (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")"; + break; + } + case EFFECT_TYPE_DAMAGE_RESISTANCE: + { + int nAmount = GetEffectInteger(eEffect, 1); + int nRemaining = GetEffectInteger(eEffect, 2); + sStats = IntToString(nAmount) + "/- " + DamageTypeToString(GetEffectInteger(eEffect, 0)) + " Resistance (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")"; + break; + } + case EFFECT_TYPE_IMMUNITY: + { + int nImmunity = ImmunityTypeFromEffectIconImmunity(nEffectIconID); + + if (nImmunity != GetEffectInteger(eEffect, 0)) + bSkipDisplay = TRUE; + else + { + sStats = Get2DAStrRef("effecticons", "StrRef", nEffectIconID); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + } + break; + } + case EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE: + case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE: + { + int nDamageType = GetEffectInteger(eEffect, 0); + int nDamageTypeFromIcon = DamageTypeFromEffectIconDamageImmunity(nEffectIconID); + + if (nDamageTypeFromIcon != -1 && nDamageType != nDamageTypeFromIcon) + bSkipDisplay = TRUE; + + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE, EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + "% " + DamageTypeToString(nDamageType) + " Damage Immunity"; + break; + } + case EFFECT_TYPE_SPELL_IMMUNITY: + { + sStats = "Spell Immunity: " + Get2DAStrRef("spells", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_SPELLLEVELABSORPTION: + { + int nMaxSpellLevelAbsorbed = GetEffectInteger(eEffect, 0); + int bUnlimited = GetEffectInteger(eEffect, 3); + string sSpellLevel; + switch (nMaxSpellLevelAbsorbed) + { + case 0: sSpellLevel = "Cantrip"; break; + case 1: sSpellLevel = "1st"; break; + case 2: sSpellLevel = "2nd"; break; + case 3: sSpellLevel = "3rd"; break; + default: sSpellLevel = IntToString(nMaxSpellLevelAbsorbed) + "th"; break; + } + sSpellLevel += " Level" + (nMaxSpellLevelAbsorbed == 0 ? "" : " and Below"); + string sSpellSchool = SpellSchoolToString(GetEffectInteger(eEffect, 2)); + string sRemainingSpellLevels = bUnlimited ? "" : "(" + IntToString(GetEffectInteger(eEffect, 1)) + " Spell Levels Remaining)"; + sStats = sSpellLevel + " " + sSpellSchool + " Spell Immunity " + sRemainingSpellLevels; + + if (bIsSpellLevelAbsorptionPretendingToBeSpellImmunity) + nIconEffectType = EFFECT_TYPE_SPELL_IMMUNITY; + else if (bUnlimited && !bIsSpellLevelAbsorptionPretendingToBeSpellImmunity) + bSkipDisplay = TRUE; + + break; + } + case EFFECT_TYPE_REGENERATE: + { + sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HP / " + FloatToString((GetEffectInteger(eEffect, 1) / 1000.0f), 0, 2) + "s"; + break; + } + case EFFECT_TYPE_POISON: + { + sStats = "Poison: " + Get2DAStrRef("poison", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_DISEASE: + { + sStats = "Disease: " + Get2DAStrRef("disease", "Name", GetEffectInteger(eEffect, 0)); + break; + } + case EFFECT_TYPE_CURSE: + { + int nAbility; + string sAbilityDecrease; + for (nAbility = 0; nAbility < 6; nAbility++) + { + int nAbilityMod = GetEffectInteger(eEffect, nAbility); + if (nAbilityMod > 0) + { + string sAbility = GetStringLeft(AbilityToString(nAbility), 3); + sAbilityDecrease += "-" + IntToString(nAbilityMod) + " " + sAbility + ", "; + } + } + sAbilityDecrease = GetStringLeft(sAbilityDecrease, GetStringLength(sAbilityDecrease) - 2); + sStats = sAbilityDecrease; + break; + } + case EFFECT_TYPE_MOVEMENT_SPEED_INCREASE: + case EFFECT_TYPE_MOVEMENT_SPEED_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_MOVEMENT_SPEED_INCREASE, EFFECT_TYPE_MOVEMENT_SPEED_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + "% Movement Speed"; + break; + } + case EFFECT_TYPE_ELEMENTALSHIELD: + { + sStats = IntToString(GetEffectInteger(eEffect, 0)) + " + " + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 1)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 2)) + ")"; + break; + } + case EFFECT_TYPE_NEGATIVELEVEL: + { + sStats = "-" + IntToString(GetEffectInteger(eEffect, 0)) + " Levels"; + break; + } + case EFFECT_TYPE_CONCEALMENT: + { + string sMissChance = MissChanceToString(GetEffectInteger(eEffect, 4) - 1); + sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Concealment" + (sMissChance == "" ? "" : " (" + sMissChance + ")"); + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + break; + } + case EFFECT_TYPE_SPELL_RESISTANCE_INCREASE: + case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE: + { + string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SPELL_RESISTANCE_INCREASE, EFFECT_TYPE_SPELL_RESISTANCE_DECREASE); + sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " Spell Resistance"; + break; + } + case EFFECT_TYPE_SPELL_FAILURE: + { + sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Spell Failure (Spell School: " + SpellSchoolToString(GetEffectInteger(eEffect, 1)) + ")"; + break; + } + case EFFECT_TYPE_INVISIBILITY: + { + int nInvisibilityType = GetEffectInteger(eEffect, 0); + if (nEffectIconID == EFFECT_ICON_INVISIBILITY) + bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_NORMAL; + else if (nEffectIconID == EFFECT_ICON_IMPROVEDINVISIBILITY) + bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_IMPROVED; + if (!bSkipDisplay) + { + sStats = (nInvisibilityType == INVISIBILITY_TYPE_IMPROVED ? "Improved " : "") + "Invisibility"; + sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3)); + } + break; + } + case EFFECT_TYPE_HASTE: + { + sStats = "Hasted"; + } + } + if(!bSkipDisplay) + { + sText = sSpellName + " " + sDurationRemaining + (sStats == "" ? "" : " -> " + sStats + sRacialTypeAlignment); + if(sText != "") + { + jRow = CreateLabel(JsonArray(), " " + sText, "lbl_buff_info" + IntToString(nIndex), 700.0f, 10.0f, NUI_HALIGN_LEFT, NUI_VALIGN_TOP, 0.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 10.0; + object oSource = GetEffectCreator(eEffect); + if(GetIsObjectValid(oSource)) + { + sText = GetObjectType(oSource) ? GetName(oSource) : ""; + sText = " Creator: " + sText; + float fLength = IntToFloat(GetStringLength(sText) * 8); + jRow = CreateLabel(JsonArray(), sText, "lbl_buff_source" + IntToString(nIndex), fLength, 15.0f, NUI_HALIGN_LEFT, NUI_VALIGN_BOTTOM, 0.0); + if(oSource == oPlayer) + { + CreateButton(jRow, "Remove", "btn_remove_effect_" + IntToString(nEffectIndex++), 70.0f, 20.0f, 0.0); + jEffectID = JsonArrayInsert(jEffectID, JsonString(GetEffectLinkId(eEffect))); + fHeight += 20.0; + } + else fHeight += 15.0; + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + } + } + } + } + nIndex++; + eEffect = GetNextEffect(oPlayer); + } + float fScale = IntToFloat(GetPlayerDeviceProperty(oPlayer, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0; + float fX = IntToFloat(GetPlayerDeviceProperty(oPlayer, PLAYER_DEVICE_PROPERTY_GUI_WIDTH)); + fX = fX - (700.0 * fScale); + float fY = 50 * fScale; + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPlayer, jLayout, AI_EFFECT_ICON_NUI, "Effect Icon Menu", + fX, fY, 700.0, fHeight * fScale, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui"); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPlayer))); + jData = JsonArrayInsert(jData, JsonInt(nEffectIconID)); + jData = JsonArrayInsert(jData, jEffectID); + NuiSetUserData(oPlayer, nToken, jData); + NuiSetBind(oPlayer, nToken, "lbl_buff_name_event", JsonBool(TRUE)); + while(nIndex >= 0) + { + NuiSetBind(oPlayer, nToken, "lbl_buff_info" + IntToString(nIndex) + "_event", JsonBool(TRUE)); + NuiSetBind(oPlayer, nToken, "lbl_buff_source" + IntToString(nIndex) + "_event", JsonBool(TRUE)); + nIndex--; + } + while(nEffectIndex >= 0) + { + NuiSetBind(oPlayer, nToken, "btn_remove_effect_" + IntToString(nEffectIndex) + "_event", JsonBool(TRUE)); + NuiSetBind(oPlayer, nToken, "btn_remove_effect_" + IntToString(nEffectIndex), JsonInt(TRUE)); + nEffectIndex--; + } +} diff --git a/_module/nss/0i_items.nss b/_module/nss/0i_items.nss new file mode 100644 index 00000000..87d3ce7e --- /dev/null +++ b/_module/nss/0i_items.nss @@ -0,0 +1,1243 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +Script Name: 0i_items +Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts for use with items. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +//#include "0i_main" +#include "0i_messages" +// Returns TRUE if oItem is a weapon. +int ai_GetIsWeapon(object oItem); +// Returns TRUE if oItem is a melee weapon. +int ai_GetIsMeleeWeapon(object oItem); +// Returns TRUE if oItem is a slashing weapon. +int ai_GetIsSlashingWeapon(object oItem); +// Returns TRUE if oItem is a piercing weapon. +int ai_GetIsPiercingWeapon(object oItem); +// Returns TRUE if oItem is a bludgeoning weapon. +int ai_GetIsBludgeoningWeapon(object oItem); +// Returns TRUE if oItem is an ammo. +int ai_GetIsAmmo(object oItem); +// Returns TRUE if oItem is a thrown weapon. +int ai_GetIsThrownWeapon(object oItem); +// Returns TRUE if oItem is able to be used single handed by oCreature. +int ai_GetIsSingleHandedWeapon(object oItem, object oCreature); +// Returns TRUE if oItem is a light weapon for oCreature. +int ai_GetIsLightWeapon(object oItem, object oCreature); +// Returns TRUE if oItem is able to be used two handed by oCreature. +int ai_GetIsTwoHandedWeapon(object oItem, object oCreature); +// Returns TRUE if oItem is a double weapon. +int ai_GetIsDoubleWeapon(object oItem); +// Returns TRUE if oCreature has a ranged weapon equiped and has ammo for it. +int ai_HasRangedWeaponWithAmmo(object oCreature); +// Returns TRUE if oItem is a ranged weapon. +int ai_GetIsRangeWeapon(object oItem); +// Returns the amount of damage the weapon oCreature is holding. +// nDamageAmount tells the function the amount of damage to return; +// 1 - Minimum, 2- Average, 3 Maximum. +// bMelee If it is not a melee weapon then return 0; +int ai_GetWeaponDamage(object oCreature, int nDamageAmount = 3, int bMelee = FALSE); +// Returns TRUE if oItem is a shield. +int ai_GetIsShield(object oItem); +// Returns the size of oItem using 1 = small to 6 = large. +int ai_GetItemSize(object oItem); +// Returns TRUE if the caller has a potion that is identified of nSpell. +int ai_CheckPotionIsIdentified(object oCreature, int nSpell); +// Returns an item from oCreature's inventory with sTag. +// bCheckEquiped will also look through the creatures equiped items. +// Returns OBJECT_INVALID if the items does not exist with sTag. +object ai_GetCreatureHasItem(object oCreature, string sTag, int bCheckEquiped = FALSE); +// Returns TRUE if oCreature can identify oItem based on the file SkillVsItemCost.2da +// Reports the findings to oPC unless oPC = OBJECT_INVALID. +// If the item can be identified by oCreature then it will be identified. +int ai_IdentifyItemVsKnowledge(object oCreature, object oItem, object oPC = OBJECT_INVALID); +// Identifies all items on oObject based on the file SkillVsItemCost.2da +// Reports the findings to oPC unless oPC = OBJECT_INVALID +// bIdentifyAll ignores the chart and does what it says! +void ai_IdentifyAllVsKnowledge(object oCreature, object oContainer, object oPC = OBJECT_INVALID); +// Will (Un)Identify all items on oCreature. +// If bIdentify is TRUE they will all be Identified, FALSE Unidentifies them. +void ai_SetIdentifyAllItems(object oCreature, int bIdentify = TRUE); +// Returns oWeapons attack bonus from either Enhancment or Attack bonus. +int ai_GetWeaponAtkBonus(object oWeapon); +// Returns oArmors armor bonus. +int ai_GetArmorBonus(object oArmor); +// Returns the maximum gold value that an item can have to be equiped. +int ai_GetMaxItemValueThatCanBeEquiped(int nLevel); +// Returns the minimum level that is required to equip this item. +int ai_GetMinimumEquipLevel(object oItem); +// Returns oCreatures total attack bonus with melee weapon (Mostly). +int ai_GetCreatureAttackBonus(object oCreature); +// Returns TRUE if oCreature can use oItem based on Class, Race, and Alignment +// restrictions. Also checks UseMagicDevice of oCreature. +int ai_CheckIfCanUseItem(object oCreature, object oItem); +// Returns TRUE if oCreature can use oItem due to feats. +int ai_GetIsProficientWith(object oCreature, object oItem); +// Gets the Average Damage on the weapon for Main and Off Hand to allow +// us to check which weapon is better for oCreature to equip. +// b2Handed set to TRUE returns only checks main avg damage. +// bOffHand set to TRUE returns the OffHand avg damage. +// if b2Handed & bOffHand are set to TRUE it returns main & offhand added together. +// if oOffWeapon is Set then it will return the Avg Damage assuming oItem is +// the Main weapon and oOffWeapon is in the Offhand. +float ai_GetMeleeWeaponAvgDmg(object oCreature, object oItem, int b2Handed = FALSE, int bOffHand = FALSE, object oOffWeapon = OBJECT_INVALID); +// Sets shield AC on the shield to allow us to check which shield is better +// for oCreature to equip. +int ai_SetShieldAC(object oCreature, object oItem); +// Returns TRUE if oItem has nItemPropertyType. +// nItemPropertySubType will not be used if its below 0. +int ai_GetHasItemProperty(object oItem, int nItemPropertyType, int nItemPropertySubType = -1); +// Returns the highest bonus Lock Picks needed to unlock nLockDC in oCreatures inventory. +object ai_GetBestPicks(object oCreature, int nLockDC); +// Removes all items from oCreature. +void ai_RemoveInventory(object oCreature); +// Copies all equiped and inventory items from oOldHenchman to oNewHenchman. +void ai_MoveInventory(object oOldHenchman, object oNewHenchman); +// Returns if oCreature is proficient with nBaseItem. +// PRC lets the creature use any weapon, but gives -4 penalty if not proficient. +int prc_IsProficient(object oCreature, int nBaseItem); + +int ai_GetIsWeapon(object oItem) +{ + int nType = GetBaseItemType(oItem); + int nWeaponType = StringToInt(Get2DAString("baseitems", "WeaponType", nType)); + if(nWeaponType) return TRUE; + return FALSE; +} +int ai_GetIsMeleeWeapon(object oItem) +{ + int nType = GetBaseItemType(oItem); + if(StringToInt(Get2DAString("baseitems", "WeaponType", nType)) > 0) + { + if(StringToInt(Get2DAString("baseitems", "RangedWeapon", nType)) == 0) return TRUE; + } + return FALSE; +} +int ai_GetIsSingleHandedWeapon(object oItem, object oCreature) +{ + if(!ai_GetIsMeleeWeapon(oItem)) return FALSE; + int nBaseItemType = GetBaseItemType(oItem); + // Weapon Size in the baseitems.2da is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nBaseItemType)); + // Creature size is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nCreatureSize = GetCreatureSize(oCreature); + return nWeaponSize <= nCreatureSize; +} +int ai_GetIsLightWeapon(object oItem, object oCreature) +{ + if(!ai_GetIsMeleeWeapon(oItem)) return FALSE; + int nBaseItemType = GetBaseItemType(oItem); + // Weapon Size in the baseitems.2da is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nBaseItemType)); + // Creature size is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nCreatureSize = GetCreatureSize(oCreature); + return nWeaponSize < nCreatureSize; +} +int ai_GetIsTwoHandedWeapon(object oItem, object oCreature) +{ + if(!ai_GetIsMeleeWeapon(oItem)) return FALSE; + int nBaseItemType = GetBaseItemType(oItem); + // Weapon Size in the baseitems.2da is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nBaseItemType)); + // Ranged weapons have a value greater than 0 in this field. So melee weapons have 0. + int nWeaponMelee = StringToInt(Get2DAString("baseitems", "RangedWeapon", nBaseItemType)); + // Creature size is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nCreatureSize = GetCreatureSize(oCreature); + return (nWeaponMelee == 0 && nWeaponSize > nCreatureSize); +} +int ai_GetIsDoubleWeapon(object oItem) +{ + int iType = GetBaseItemType(oItem); + switch(iType) + { + case BASE_ITEM_DIREMACE: + case BASE_ITEM_DOUBLEAXE: + case BASE_ITEM_TWOBLADEDSWORD: return TRUE; + } + return FALSE; +} +int ai_GetIsSlashingWeapon(object oItem) +{ + int iBaseItemType = GetBaseItemType(oItem); + int iWeaponType = StringToInt(Get2DAString("baseitems", "WeaponType", iBaseItemType)); + // Weapon Type in the baseitems.2da is 1 = Piercing, 2 = Bludgeoning, 3 = Slashing. + return (iWeaponType == 3); +} +int ai_GetIsPiercingWeapon(object oItem) +{ + int iBaseItemType = GetBaseItemType(oItem); + int iWeaponType = StringToInt(Get2DAString("baseitems", "WeaponType", iBaseItemType)); + // Weapon Type in the baseitems.2da is 1 = Piercing, 2 = Bludgeoning, 3 = Slashing. + return (iWeaponType == 1); +} +int ai_GetIsBludgeoningWeapon(object oItem) +{ + int iBaseItemType = GetBaseItemType(oItem); + int iWeaponType = StringToInt(Get2DAString("baseitems", "WeaponType", iBaseItemType)); + // Weapon Type in the baseitems.2da is 1 = Piercing, 2 = Bludgeoning, 3 = Slashing. + return (iWeaponType == 2); +} +int ai_GetIsAmmo(object oItem) +{ + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_ARROW: return TRUE; + case BASE_ITEM_BOLT: return TRUE; + case BASE_ITEM_BULLET: return TRUE; + } + return FALSE; +} +int ai_GetIsThrownWeapon(object oItem) +{ + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_DART: return TRUE; + case BASE_ITEM_SHURIKEN: return TRUE; + case BASE_ITEM_THROWINGAXE: return TRUE; + } + return FALSE; +} +int ai_HasRangedWeaponWithAmmo(object oCreature) +{ + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + if(!GetWeaponRanged(oWeapon)) return FALSE; + int nAmmoType, nWeaponType = GetBaseItemType(oWeapon); + object oAmmo = OBJECT_INVALID; + if(nWeaponType == BASE_ITEM_LONGBOW || nWeaponType == BASE_ITEM_SHORTBOW) + { + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_UNLIMITED_AMMUNITION)) return TRUE; + if(GetItemInSlot(INVENTORY_SLOT_ARROWS, oCreature) != OBJECT_INVALID) return TRUE; + nAmmoType = BASE_ITEM_ARROW; + } + else if(nWeaponType == BASE_ITEM_LIGHTCROSSBOW || nWeaponType == BASE_ITEM_HEAVYCROSSBOW) + { + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_UNLIMITED_AMMUNITION)) return TRUE; + if(GetItemInSlot(INVENTORY_SLOT_BOLTS, oCreature) != OBJECT_INVALID) return TRUE; + nAmmoType = BASE_ITEM_BOLT; + } + else if(nWeaponType == BASE_ITEM_SLING) + { + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_UNLIMITED_AMMUNITION)) return TRUE; + if(GetItemInSlot(INVENTORY_SLOT_BULLETS, oCreature) != OBJECT_INVALID) return TRUE; + nAmmoType = BASE_ITEM_BULLET; + } + else if(nWeaponType == BASE_ITEM_THROWINGAXE) return TRUE; + else if(nWeaponType == BASE_ITEM_SHURIKEN) return TRUE; + else if(nWeaponType == BASE_ITEM_DART) return TRUE; + // They don't have any ammo in the slot, but do they have ammo in the inventory? + oAmmo = GetFirstItemInInventory(oCreature); + while(oAmmo != OBJECT_INVALID) + { + if(GetBaseItemType(oAmmo) == nAmmoType) + { + if(nAmmoType == BASE_ITEM_ARROW) ActionEquipItem(oAmmo, INVENTORY_SLOT_ARROWS); + else if(nAmmoType == BASE_ITEM_BOLT) ActionEquipItem(oAmmo, INVENTORY_SLOT_BOLTS); + else if(nAmmoType == BASE_ITEM_BULLET) ActionEquipItem(oAmmo, INVENTORY_SLOT_BULLETS); + return TRUE; + } + oAmmo = GetNextItemInInventory(oCreature); + } + //ai_Debug("0i_items", "254", "They are out of ammo!"); + return FALSE; +} +int ai_GetIsRangeWeapon(object oItem) +{ + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_DART: return TRUE; + case BASE_ITEM_HEAVYCROSSBOW: return TRUE; + case BASE_ITEM_LIGHTCROSSBOW: return TRUE; + case BASE_ITEM_LONGBOW: return TRUE; + case BASE_ITEM_SHORTBOW: return TRUE; + case BASE_ITEM_SHURIKEN: return TRUE; + case BASE_ITEM_SLING: return TRUE; + case BASE_ITEM_THROWINGAXE: return TRUE; + } + return FALSE; +} +int ai_GetIsFinesseWeapon(object oCreature, object oItem) +{ + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_DAGGER: return TRUE; + case BASE_ITEM_HANDAXE: return TRUE; + case BASE_ITEM_KAMA: return TRUE; + case BASE_ITEM_KUKRI: return TRUE; + case BASE_ITEM_LIGHTHAMMER: return TRUE; + case BASE_ITEM_LIGHTMACE: return TRUE; + case BASE_ITEM_RAPIER: + { + if(GetCreatureSize(oCreature) > CREATURE_SIZE_SMALL) return TRUE; + return FALSE; + } + case BASE_ITEM_SHORTSWORD: return TRUE; + case BASE_ITEM_SICKLE: return TRUE; + case BASE_ITEM_WHIP: return TRUE; + } + return FALSE; +} +int ai_GetWeaponDamage(object oCreature, int nDamageAmount = 3, int bMelee = FALSE) +{ + object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + if(bMelee && ai_GetIsRangeWeapon(oItem)) return 0; + int nWeaponDamage = GetLocalInt(oItem, "AI_WEAPON_DAMAGE"); + if(!nWeaponDamage) + { + if(ai_GetIsMeleeWeapon(oItem)) + { + nWeaponDamage = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(ai_GetIsTwoHandedWeapon(oItem, oCreature)) nWeaponDamage += nWeaponDamage / 2; + } + int nWeaponDice = StringToInt(Get2DAString("baseitems", "NumDice", GetBaseItemType(oItem))); + int nWeaponDie = StringToInt(Get2DAString("baseitems", "DieToRoll", GetBaseItemType(oItem))); + if(nDamageAmount == 1) + { + nWeaponDamage += nWeaponDice; + } + else if(nDamageAmount == 2) + { + nWeaponDamage += nWeaponDice * nWeaponDie / 2; + } + else + { + nWeaponDamage += nWeaponDice * nWeaponDie; + } + SetLocalInt(oItem, "AI_WEAPON_DAMAGE", nWeaponDamage); + } + return nWeaponDamage; +} +int ai_GetIsShield(object oItem) +{ + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_SMALLSHIELD: return TRUE; + case BASE_ITEM_LARGESHIELD: return TRUE; + case BASE_ITEM_TOWERSHIELD: return TRUE; + } + return FALSE; + } +int ai_GetItemSize(object oItem) +{ + int nBaseItemType = GetBaseItemType(oItem); + int nWidth = StringToInt(Get2DAString("baseitems", "InvSlotWidth", nBaseItemType)); + int nHeight = StringToInt(Get2DAString("baseitems", "InvSlotHeight", nBaseItemType)); + return nWidth + nHeight - 1; +} +int ai_CheckPotionIsIdentified(object oCreature, int nSpell) +{ + int nPotionSpell; + itemproperty ipPotion; + object oPotion = GetFirstItemInInventory(oCreature); + while(oPotion != OBJECT_INVALID) + { + if(GetIdentified(oPotion)) + { + ipPotion = GetFirstItemProperty(oPotion); + nPotionSpell = GetItemPropertySubType(ipPotion); + nPotionSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nPotionSpell)); + //ai_Debug("0i_talents", "318", "Potion ID'ed? nSpell: " + IntToString(nSpell) + " nPotionSpell: " + IntToString(nPotionSpell)); + if(nSpell == nPotionSpell) return TRUE; + } + oPotion = GetNextItemInInventory(oCreature); + } + return FALSE; +} +object ai_GetCreatureHasItem(object oCreature, string sTag, int bCheckEquiped = FALSE) +{ + // Cycle through the creatures unequiped items. + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetTag(oItem) == sTag) return oItem; + oItem = GetNextItemInInventory(oCreature); + } + // Should we check the creatures equiped items. + // If we have already found it then stop looking. + int nSlot = 0; + if(bCheckEquiped) + { + // Check all of the creatures slots(0 - 17). + while(nSlot <= 17) + { + oItem = GetItemInSlot(nSlot, oCreature); + if(GetTag(oItem) == sTag) return oItem; + nSlot ++; + } + } + return OBJECT_INVALID; +} +int ai_IdentifyItemVsKnowledge(object oCreature, object oItem, object oPC = OBJECT_INVALID) +{ + if(GetIdentified(oItem)) return FALSE; + int nKnowledge = GetSkillRank(SKILL_LORE, oCreature); + int nItemValue; // gold value of item + string sBaseName; + string sMaxValue = Get2DAString("SkillVsItemCost", "DeviceCostMax", nKnowledge); + int nMaxValue = StringToInt(sMaxValue); + // * Handle overflow(November 2003 - BK) + if(sMaxValue == "") nMaxValue = 0; + // Setting TRUE to get the true value of the item. + SetIdentified(oItem, TRUE); + nItemValue = GetGoldPieceValue(oItem); + if(nMaxValue <= nItemValue) + { + SetIdentified(oItem, FALSE); + if(oPC != OBJECT_INVALID) + { + sBaseName = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "name", GetBaseItemType(oItem)))); + ai_SendMessages(GetName(oCreature) + " cannot identify " + sBaseName, AI_COLOR_RED, oPC); + } + } + else + { + if(oPC != OBJECT_INVALID) ai_SendMessages(GetName(oCreature) + " has identified " + GetName(oItem), AI_COLOR_GREEN, oPC); + return TRUE; + } + return FALSE; +} +void ai_IdentifyAllVsKnowledge(object oCreature, object oContainer, object oPC = OBJECT_INVALID) +{ + // SkillVsItemCost 2da starts 1 at 0 ... go figure! + int nKnowledge = GetSkillRank(SKILL_LORE, oCreature) - 1; + int nItemValue; // gold value of item + string sBaseName; + string sMaxValue = Get2DAString("SkillVsItemCost", "DeviceCostMax", nKnowledge); + int nMaxValue = StringToInt(sMaxValue); + // * Handle overflow(November 2003 - BK) + if(sMaxValue == "") nMaxValue = 0; + object oItem = GetFirstItemInInventory(oContainer); + while(oItem != OBJECT_INVALID) + { + if(!GetIdentified(oItem)) + { + // setting TRUE to get the true value of the item. + SetIdentified(oItem, TRUE); + nItemValue = GetGoldPieceValue(oItem); + if(nMaxValue < nItemValue) + { + SetIdentified(oItem, FALSE); + sBaseName = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "name", GetBaseItemType(oItem)))); + if(oPC != OBJECT_INVALID) ai_SendMessages(GetName(oCreature) + " cannot identify " + sBaseName, AI_COLOR_RED, oPC); + } + else if(oPC != OBJECT_INVALID) ai_SendMessages(GetName(oCreature) + " has identified " + GetName(oItem), AI_COLOR_GREEN, oPC); + } + oItem = GetNextItemInInventory(oContainer); + } +} +void ai_SetIdentifyAllItems(object oCreature, int bIdentify = TRUE) +{ + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(!GetIdentified(oItem)) SetIdentified(oItem, bIdentify); + oItem = GetNextItemInInventory(oCreature); + } + int nSlot; + oItem = GetItemInSlot(nSlot, oCreature); + while(nSlot < 11) + { + if(!GetIdentified(oItem)) SetIdentified(oItem, bIdentify); + oItem = GetItemInSlot(++nSlot, oCreature); + } +} +int ai_GetWeaponAtkBonus(object oWeapon) +{ + int nCounter = 1, nPropertyType, nBonus; + // Get first property + itemproperty ipProperty = GetFirstItemProperty(oWeapon); + while(GetIsItemPropertyValid(ipProperty)) + { + // Check to see if the property type matches. + nPropertyType = GetItemPropertyType(ipProperty); + if(nPropertyType == 6/*ITEMPROPERTY_ENHANCEMENT*/ || + nPropertyType == 56/*ITEMPROPERTY_ATTACKBONUS*/) + { + nBonus += GetItemPropertyCostTableValue(ipProperty); + } + // Get the next property. + ipProperty = GetNextItemProperty(oWeapon); + } + //ai_Debug("0i_items", "438", GetName(oWeapon) + " attack bonus is " + IntToString(nBonus)); + return nBonus; +} +int ai_GetArmorBonus(object oArmor) +{ + int nTorsoValue = GetItemAppearance(oArmor, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_TORSO); + //ai_Debug("0i_items", "444", "Armor Bonus: " + Get2DAString("parts_chest.2da", "ACBONUS", nTorsoValue)); + return StringToInt(Get2DAString("parts_chest", "ACBONUS", nTorsoValue)); +} +int ai_GetMaxItemValueThatCanBeEquiped(int nLevel) +{ + return StringToInt(Get2DAString("itemvalue", "MAXSINGLEITEMVALUE", nLevel - 1)); +} +int ai_GetMinimumEquipLevel(object oItem) +{ + int nIndex, nUnIdentified; + if(!GetIdentified(oItem)) + { + nUnIdentified = TRUE; + SetIdentified(oItem, TRUE); + } + int nGoldValue = GetGoldPieceValue(oItem); + if(nUnIdentified) SetIdentified(oItem, FALSE); + int n2daMaxRow = Get2DARowCount("itemvalue"); + while(nIndex < n2daMaxRow) + { + if(nGoldValue <= StringToInt(Get2DAString("itemvalue", "MAXSINGLEITEMVALUE", nIndex))) + { + return nIndex + 1; + } + nIndex++; + } + return nIndex; +} +int ai_GetCreatureAttackBonus(object oCreature) +{ + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); + int nAtkBonus = GetBaseAttackBonus(oCreature); + if((GetHasFeat(FEAT_WEAPON_FINESSE, oCreature) && ai_GetIsFinesseWeapon(oCreature, oWeapon)) || + ai_GetIsRangeWeapon(oWeapon)) + { + nAtkBonus += GetAbilityModifier(ABILITY_DEXTERITY, oCreature); + } + else nAtkBonus += GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(ai_GetIsMeleeWeapon(oWeapon)) nAtkBonus += ai_GetWeaponAtkBonus(oWeapon); + return nAtkBonus; + } +int ai_CheckUseMagicDevice(object oCreature, string sColumn, object oItem) +{ + if(!GetLocalInt(GetModule(), AI_RULE_ALLOW_UMD)) return FALSE; + int nUMD = GetSkillRank(SKILL_USE_MAGIC_DEVICE, oCreature); + //ai_Debug("0i_talents", "1600", GetName(oCreature) + " is check UMD: " + IntToString(nUMD)); + if(nUMD < 1) return FALSE; + int nDC, nIndex, nItemValue = GetGoldPieceValue(oItem); + while(nIndex < 55) + { + //ai_Debug("0i_talents", "1605", GetName(oItem) + " has a value of " + + // Get2DAString("skillvsitemcost", "DeviceCostMax", nIndex) + + // " nIndex: " + IntToString(nIndex)); + if(nItemValue < StringToInt(Get2DAString("skillvsitemcost", "DeviceCostMax", nIndex))) + { + //ai_Debug("0i_talents", "1610", "nUMD >= " + Get2DAString("skillvsitemcost", sColumn, nIndex)); + if(nUMD >= StringToInt(Get2DAString("skillvsitemcost", sColumn, nIndex))) return TRUE; + return FALSE; + } + nIndex++; + } + return FALSE; +} +int ai_CheckIfCanUseItem(object oCreature, object oItem) +{ + int bAlign, bClass, bRace, bAlignLimit, bClassLimit, bRaceLimit; + int nIprpSubType, nItemPropertyType; + // Check to see if this item is limited to a specific alignment, class, or race. + int nAlign1 = GetAlignmentLawChaos(oCreature); + int nAlign2 = GetAlignmentGoodEvil(oCreature); + int nRace = GetRacialType(oCreature); + //ai_Debug("0i_items", "615", "nAlign1: " + IntToString(nAlign1) + + // " nAlign2: " + IntToString(nAlign2) + " nRace: " + IntToString(nRace)); + itemproperty ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + nItemPropertyType = GetItemPropertyType(ipProp); + //ai_Debug("0i_items", "620", "ItempropertyType(62/63/64/65): " + IntToString(nItemPropertyType)); + if(nItemPropertyType == ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP) + { + bAlignLimit = TRUE; + // SubType is the group index for iprp_aligngrp.2da + nIprpSubType = GetItemPropertySubType(ipProp); + //ai_Debug("0i_items", "626", "nIprpSubType: " + IntToString(nIprpSubType)); + if(nIprpSubType == nAlign1 || nIprpSubType == nAlign2) bAlign = TRUE; + } + else if(nItemPropertyType == ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT) + { + bAlignLimit = TRUE; + // SubType is the alignment index for iprp_alignment.2da + nIprpSubType = GetItemPropertySubType(ipProp); + //ai_Debug("0i_items", "634", "nIprpSubType: " + IntToString(nIprpSubType)); + if(nIprpSubType == 0 && nAlign1 == 2 && nAlign2 == 4) bAlign = TRUE; + else if(nIprpSubType == 1 && nAlign1 == 2 && nAlign2 == 1) bAlign = TRUE; + else if(nIprpSubType == 2 && nAlign1 == 2 && nAlign2 == 5) bAlign = TRUE; + else if(nIprpSubType == 3 && nAlign1 == 1 && nAlign2 == 4) bAlign = TRUE; + else if(nIprpSubType == 4 && nAlign1 == 1 && nAlign2 == 1) bAlign = TRUE; + else if(nIprpSubType == 5 && nAlign1 == 1 && nAlign2 == 5) bAlign = TRUE; + else if(nIprpSubType == 6 && nAlign1 == 3 && nAlign2 == 4) bAlign = TRUE; + else if(nIprpSubType == 7 && nAlign1 == 3 && nAlign2 == 1) bAlign = TRUE; + else if(nIprpSubType == 8 && nAlign1 == 3 && nAlign2 == 5) bAlign = TRUE; + } + else if(nItemPropertyType == ITEM_PROPERTY_USE_LIMITATION_CLASS) + { + bClassLimit = TRUE; + // SubType is the class index for classes.2da + nIprpSubType = GetItemPropertySubType(ipProp); + //ai_Debug("0i_items", "650", "nIprpSubType: " + IntToString(nIprpSubType)); + int nClassPosition = 1; + int nClass = GetClassByPosition(nClassPosition, oCreature); + while(nClassPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + if(nIprpSubType == nClass) bClass = TRUE; + nClass = GetClassByPosition(++nClassPosition, oCreature); + } + } + else if(nItemPropertyType == ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE) + { + bRaceLimit = TRUE; + // SubType is the race index for racialtypes.2da + nIprpSubType = GetItemPropertySubType(ipProp); + //ai_Debug("0i_items", "664", "nIprpSubType: " + IntToString(nIprpSubType)); + if(nIprpSubType == nRace) bRace = TRUE; + } + ipProp = GetNextItemProperty(oItem); + } + //ai_Debug("0i_items", "669", "bAlignLimit: " + IntToString(bAlignLimit) + " bAlign: " + IntToString(bAlign) + + // " bClassLimit: " + IntToString(bClassLimit) + " bClass: " + IntToString(bClass) + + // " bRaceLimit: " + IntToString(bRaceLimit) + " bRace: " + IntToString(bRace)); + if(bClassLimit && !bClass && !ai_CheckUseMagicDevice(oCreature, "SkillReq_Class", oItem)) return FALSE; + if(bRaceLimit && !bRace && !ai_CheckUseMagicDevice(oCreature, "SkillReq_Race", oItem)) return FALSE; + if(bAlignLimit && !bAlign && !ai_CheckUseMagicDevice(oCreature, "SkillReq_Align", oItem)) return FALSE; + return TRUE; +} +int ai_GetIsProficientWith(object oCreature, object oItem) +{ + int nWeaponType = GetBaseItemType(oItem); + // In the PRC you can equip any weapon. + if(GetLocalInt(GetModule(), AI_USING_PRC)) return TRUE; + int nFeat = StringToInt(Get2DAString("baseitems", "ReqFeat0", nWeaponType)); + // If it is 0 then it doesn't require a feat or we are at the end of the + // feat requirements. + if(nFeat == 0) return TRUE; + if(GetHasFeat(nFeat, oCreature)) return TRUE; + nFeat = StringToInt(Get2DAString("baseitems", "ReqFeat1", nWeaponType)); + if(nFeat == 0) return FALSE; + if(GetHasFeat(nFeat, oCreature)) return TRUE; + nFeat = StringToInt(Get2DAString("baseitems", "ReqFeat2", nWeaponType)); + if(nFeat == 0) return FALSE; + if(GetHasFeat(nFeat, oCreature)) return TRUE; + nFeat = StringToInt(Get2DAString("baseitems", "ReqFeat3", nWeaponType)); + if(nFeat == 0) return FALSE; + if(GetHasFeat(nFeat, oCreature)) return TRUE; + nFeat = StringToInt(Get2DAString("baseitems", "ReqFeat4", nWeaponType)); + if(nFeat == 0) return FALSE; + if(GetHasFeat(nFeat, oCreature)) return TRUE; + return FALSE; +} +float ai_GetMeleeWeaponAvgDmg(object oCreature, object oItem, int b2Handed = FALSE, int bOffHand = FALSE, object oOffWeapon = OBJECT_INVALID) +{ + // Has this weapon already been calculated for this creature? + if(oCreature == GetLocalObject(oItem, "AI_CREATURE_POSSESSION")) + { + // Return the Main weapons Avg Damage while using a weapon in the off hand. + if(oOffWeapon != OBJECT_INVALID) + { + // We recalculate all OffWeapon avg damage unless its a double weapon. + if(oOffWeapon == oItem) + { + float fMain2WDmg = GetLocalFloat(oItem, "AI_MAIN_2W_HAND_AVG_DMG"); + // If they passed that this is a 2handed weapon then return the total + // Avg Dmg for oItem. Used for double weapons. + if(b2Handed) + { + fMain2WDmg += ai_GetMeleeWeaponAvgDmg(oCreature, oItem, FALSE, TRUE); + } + if(AI_DEBUG) ai_Debug("0i_items", "611", GetName(oItem) + " avg dmg with Offhand weapon (" + GetName(oOffWeapon) + ") " + FloatToString(fMain2WDmg, 0, 2)); + return fMain2WDmg; + } + } + // Return the avg dmg for oItem assuming it is in the OffHand. + else if(bOffHand) + { + float fOffHandDmg = GetLocalFloat(oItem, "AI_OFFHAND_AVG_DMG"); + if(AI_DEBUG) ai_Debug("0i_items", "618", GetName(oItem) + " fOffHandAvgDmg: " + FloatToString(fOffHandDmg, 0, 2)); + return fOffHandDmg; + } + // If we get here then Return the avg dmg for oItem assuming its in the main hand. + else + { + float fMainDmg = GetLocalFloat(oItem, "AI_AVG_DMG"); + if(AI_DEBUG)ai_Debug("0i_items", "623", GetName(oItem) + " fMainDmg: " + FloatToString(fMainDmg, 0, 2)); + return fMainDmg; + } + } + // Set the creature to this item that we are calculationg the avg damages for. + SetLocalObject(oItem, "AI_CREATURE_POSSESSION", oCreature); + int nItemType = GetBaseItemType(oItem); + // Figure average damage for one attack, or two with two weapons. + // We are keeping it simple to reduce time and checks. + // Get the weapons base stats. + int nMinDmg = StringToInt(Get2DAString("baseitems", "NumDice", nItemType)); + int nMaxDmg = nMinDmg * StringToInt(Get2DAString("baseitems", "DieToRoll", nItemType)); + int nThreat = StringToInt(Get2DAString("baseitems", "CritThreat", nItemType)); + int nMultiplier = StringToInt(Get2DAString("baseitems", "CritHitMult", nItemType)); + int nIndex, nBonusMinDmg, nBonusMaxDmg, nItemPropertyType, nNumDice; + // We set ToHit to 10 for a 50% chance to hit without modifiers. + float fCritBonusDmg, fToHit = 10.0; + if(GetLocalInt(GetModule(), AI_USING_PRC)) + { + if(!prc_IsProficient(oCreature, nItemType)) fToHit -= 4.0; + } + // Check oCreature's feats. + if(GetHasFeat(FEAT_WEAPON_FINESSE, oCreature) && + ai_GetIsLightWeapon(oItem, oCreature)) + { + // Add Dexterity modifier to the Attack bonus. + nIndex = GetAbilityModifier(ABILITY_DEXTERITY, oCreature); + } + else + { + // Add Strength modifier to the attack bonus. + nIndex = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + // Add 1/2 strength modifier to damage for 2handed weapons, but not Double weapons. + if(b2Handed && !bOffHand) + { + nMinDmg += nIndex / 2; + nMaxDmg += nIndex / 2; + } + } + fToHit += nIndex; + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "WeaponFocusFeat", nItemType)), oCreature, TRUE)) + { + fToHit += 1.0; + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "WeaponSpecializationFeat", nItemType)), oCreature, TRUE)) + { + nMinDmg += 2; + nMaxDmg += 2; + } + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "EpicWeaponFocusFeat", nItemType)), oCreature, TRUE)) + { + fToHit += 2.0; + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "EpicWeaponSpecializationFeat", nItemType)), oCreature, TRUE)) + { + nMinDmg += 4; + nMaxDmg += 4; + } + } + } + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "WeaponImprovedCriticalFeat", nItemType)), oCreature, TRUE)) + { + nMultiplier += nMultiplier; + if(GetHasFeat(StringToInt(Get2DAString("baseitems", "EpicWeaponOverwhelmingCriticalFeat", nItemType)), oCreature, TRUE)) + { + if(nMultiplier > 3) fCritBonusDmg = 10.5; + else if(nMultiplier == 3) fCritBonusDmg = 7.0; + else fCritBonusDmg = 3.5; + } + } + // Check oItem's properties. + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + nItemPropertyType = GetItemPropertyType(ipProperty); + if(nItemPropertyType == ITEM_PROPERTY_ENHANCEMENT_BONUS) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nBonusMinDmg += nIndex; + nBonusMaxDmg += nIndex; + fToHit += IntToFloat(nIndex); + } + else if(nItemPropertyType == ITEM_PROPERTY_DAMAGE_BONUS) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nNumDice = StringToInt(Get2DAString("iprp_damagecost", "NumDice", nIndex)); + nBonusMinDmg += nNumDice; + nBonusMaxDmg += nNumDice * StringToInt(Get2DAString("iprp_damagecost", "Die", nIndex)); + } + else if(nItemPropertyType == ITEM_PROPERTY_ATTACK_BONUS) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + fToHit += IntToFloat(nIndex); + } + else if(nItemPropertyType == ITEM_PROPERTY_KEEN) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nMultiplier += nMultiplier; + } + else if(nItemPropertyType == ITEM_PROPERTY_HASTE) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nMinDmg += nMinDmg; + nMaxDmg += nMaxDmg; + nBonusMinDmg += nBonusMinDmg; + nBonusMaxDmg += nBonusMaxDmg; + nMultiplier += nMultiplier; + } + else if(nItemPropertyType == ITEM_PROPERTY_MASSIVE_CRITICALS) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nNumDice = StringToInt(Get2DAString("iprp_damagecost", "NumDice", nIndex)); + fCritBonusDmg += IntToFloat(nNumDice) + IntToFloat(nNumDice * StringToInt(Get2DAString("iprp_damagecost", "Die", nIndex))) / 2.0; + } + else if(nItemPropertyType == ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nBonusMinDmg -= nIndex; + nBonusMaxDmg -= nIndex; + fToHit -= IntToFloat(nIndex); + } + else if(nItemPropertyType == ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + fToHit -= IntToFloat(nIndex); + } + else if(nItemPropertyType == ITEM_PROPERTY_DECREASED_DAMAGE) + { + nIndex = GetItemPropertyCostTableValue(ipProperty); + nBonusMinDmg -= nIndex; + nBonusMaxDmg -= nIndex; + } + else if(nItemPropertyType == ITEM_PROPERTY_NO_DAMAGE) + { + // A weapon always does a minimum of 1 pnt of damage. + nMinDmg = 1; + nMaxDmg = 1; + } + ipProperty = GetNextItemProperty(oItem); + } + float fAvgDmg = IntToFloat(nMinDmg + nMaxDmg + nBonusMinDmg + nBonusMaxDmg) / 2; + // Set value for Offhand chance to hit. + float fOffHandToHit = fToHit - 10.0; + float fOffHandAvgDmg = fAvgDmg; + // Set value for Main hand chance to hit with a weapon in Off hand. + float fMain2HandToHit = fToHit - 6.0; + float fMain2HandAvgDmg = fAvgDmg; + // Calculate the avg dmg for oItem used in the main hand with no Off hand weapon. + fToHit = fToHit / 20.0; + float fThreatChance = (IntToFloat(nThreat) / 20.0) * fToHit; + fAvgDmg = (fAvgDmg * fToHit) + ((fAvgDmg * IntToFloat(nMultiplier) + fCritBonusDmg) * fThreatChance); + SetLocalFloat(oItem, "AI_AVG_DMG", fAvgDmg); + if(AI_DEBUG) ai_Debug("0i_items", "768", GetName(oItem) + " fSingleAvgDmg: " + FloatToString(fAvgDmg, 0, 2)); + if(!b2Handed || (b2Handed && oOffWeapon != OBJECT_INVALID)) + { + // Calculate chance to hit based on two weapon feats and main hand vs off hand. + if(GetHasFeat(374/*Dual_Wield*/, oCreature)) + { + if(ai_GetArmorBonus(GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature)) < 4) + { + fMain2HandToHit += 2.0; + fOffHandToHit += 6.0; + } + } + else + { + if(GetHasFeat(FEAT_AMBIDEXTERITY, oCreature)) fOffHandToHit += 4.0; + if(GetHasFeat(FEAT_TWO_WEAPON_FIGHTING, oCreature)) + { + fMain2HandToHit += 2.0; + fOffHandToHit += 2.0; + } + } + if(ai_GetIsLightWeapon(oItem, oCreature)) fOffHandToHit += 2.0; + if(oOffWeapon != OBJECT_INVALID && + (ai_GetIsLightWeapon(oOffWeapon, oCreature) || ai_GetIsDoubleWeapon(oItem))) + { + fMain2HandToHit += 2.0; + } + // Calculate the avg dmg for oItem used in the main hand with an off hand weapon. + fMain2HandToHit = fMain2HandToHit / 20.0; + fThreatChance = (IntToFloat(nThreat) / 20.0) * fMain2HandToHit; + fMain2HandAvgDmg = (fMain2HandAvgDmg * fMain2HandToHit) + ((fMain2HandAvgDmg * IntToFloat(nMultiplier) + fCritBonusDmg) * fThreatChance); + SetLocalFloat(oItem, "AI_MAIN_2W_HAND_AVG_DMG", fMain2HandAvgDmg); + if(AI_DEBUG) ai_Debug("0i_items", "768", GetName(oItem) + " fMain2HandAvgDmg: " + FloatToString(fMain2HandAvgDmg, 0, 2)); + // Calculate the avg dmg for oItem used in the off hand. + fOffHandToHit = fOffHandToHit / 20.0; + fThreatChance = (IntToFloat(nThreat) / 20.0) * fOffHandToHit; + fOffHandAvgDmg = (fOffHandAvgDmg * fOffHandToHit) + ((fOffHandAvgDmg * IntToFloat(nMultiplier) + fCritBonusDmg) * fThreatChance); + SetLocalFloat(oItem, "AI_OFFHAND_AVG_DMG", fOffHandAvgDmg); + if(AI_DEBUG) ai_Debug("0i_items", "790", GetName(oItem) + " fOffHandAvgDmg: " + FloatToString(fOffHandAvgDmg, 0, 2)); + // Return the correct value based on params passed. + if(oOffWeapon != OBJECT_INVALID) + { + // This is used only for double weapons! Must pass b2Handed = TRUE and + // oOffWeapon = the double weapon that was passes as oItem. + if(b2Handed) return fMain2HandAvgDmg + fOffHandAvgDmg; + return fMain2HandAvgDmg; + } + if(bOffHand) return fOffHandAvgDmg; + } + return fAvgDmg; +} +int ai_SetShieldAC(object oCreature, object oItem) +{ + if(oCreature == GetLocalObject(oItem, "AI_CREATURE_POSSESSION")) + { + return GetLocalInt(oItem, "AI_SHIELD_AC"); + } + // Set the creature who has this item for setting the power of. + SetLocalObject(oItem, "AI_CREATURE_POSSESSION", oCreature); + int nItemType = GetBaseItemType(oItem); + int nAC, nItemPropertyType; + if(nItemType == BASE_ITEM_SMALLSHIELD) nAC = 1; + else if(nItemType == BASE_ITEM_LARGESHIELD) nAC = 2; + else if(nItemType == BASE_ITEM_TOWERSHIELD) nAC = 3; + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + nItemPropertyType = GetItemPropertyType(ipProperty); + if(nItemPropertyType == ITEM_PROPERTY_AC_BONUS) + { + nAC += GetItemPropertyCostTableValue(ipProperty); + } + else if(nItemPropertyType == ITEM_PROPERTY_DECREASED_AC) + { + nAC -= GetItemPropertyCostTableValue(ipProperty); + } + else if(nItemPropertyType == ITEM_PROPERTY_HASTE) + { + nAC += 4; + } + ipProperty = GetNextItemProperty(oItem); + } + SetLocalInt(oItem, "AI_SHIELD_AC", nAC); + if(AI_DEBUG) ai_Debug("0i_items", "718", GetName(oItem) + " nAC: " + IntToString(nAC)); + return nAC; +} +int ai_GetHasItemProperty(object oItem, int nItemPropertyType, int nItemPropertySubType = -1) +{ + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(GetItemPropertyType(ipProperty) == nItemPropertyType) + { + if(nItemPropertySubType > -1) + { + if(GetItemPropertySubType(ipProperty) == nItemPropertySubType) return TRUE; + } + else return TRUE; + } + ipProperty = GetNextItemProperty(oItem); + } + return FALSE; +} +object ai_GetBestPicks(object oCreature, int nLockDC) +{ + int nSkill = GetSkillRank(SKILL_OPEN_LOCK, oCreature); + int nBonus, nBestBonus = 99, nNeededBonus = nLockDC - nSkill - 20; + //ai_Debug("0i_items", "651", "nNeededBonus: " + IntToString(nNeededBonus)); + // We don't need to use any picks! + if(nNeededBonus < 1) return OBJECT_INVALID; + object oBestItem = OBJECT_INVALID; + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetBaseItemType(oItem) == BASE_ITEM_THIEVESTOOLS) + { + // Get the tools bonus. + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(GetItemPropertyType(ipProperty) == ITEM_PROPERTY_THIEVES_TOOLS) + { + nBonus = GetItemPropertyCostTableValue(ipProperty); + if(nBonus >= nNeededBonus && nBonus < nBestBonus) + { + nBestBonus = nBonus; + oBestItem = oItem; + SetLocalInt(oBestItem, "AI_BONUS", nBestBonus); + break; + } + } + ipProperty = GetNextItemProperty(oItem); + } + } + oItem = GetNextItemInInventory(oCreature); + } + return oBestItem; +} +void ai_RemoveInventory(object oCreature) +{ + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + DestroyObject(oItem); + oItem = GetNextItemInInventory(oCreature); + } + int nIndex; + for(nIndex = 0; nIndex <= 13; nIndex++) + { + oItem = GetItemInSlot(nIndex, oCreature); + DestroyObject(oItem); + } +} +void ai_MoveInventory(object oOldHenchman, object oNewHenchman) +{ + // Move all inventory items. + object oItem = GetFirstItemInInventory(oOldHenchman); + while(oItem != OBJECT_INVALID) + { + CopyItem(oItem, oNewHenchman, TRUE); + oItem = GetNextItemInInventory(oOldHenchman); + } + // Move all equiped items and equip on oNewHenchman. + int nIndex; + object oNewItem; + for(nIndex = 0; nIndex <= 13; nIndex++) + { + oItem = GetItemInSlot(nIndex, oOldHenchman); + if(oItem != OBJECT_INVALID) + { + oNewItem = CopyItem(oItem, oNewHenchman, TRUE); + if(!GetIdentified(oNewItem)) SetIdentified(oNewItem, TRUE); + ActionEquipItem(oNewItem, nIndex); + } + } +} +int prc_IsProficient(object oCreature, int nBaseItem) +{ + switch(nBaseItem) + { + //special case: counts as simple for chitine + case BASE_ITEM_SHORTSWORD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(3600/*FEAT_MINDBLADE*/, oCreature) + || (GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + && GetRacialType(oCreature) == 76/*RACIAL_TYPE_CHITINE*/) + || GetHasFeat(7901/*FEAT_WEAPON_PROFICIENCY_SHORTSWORD*/, oCreature); + + case BASE_ITEM_LONGSWORD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(3600/*FEAT_MINDBLADE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ELF, oCreature) + || GetHasFeat(7902/*FEAT_WEAPON_PROFICIENCY_LONGSWORD*/, oCreature); + + case BASE_ITEM_BATTLEAXE: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || (GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + && GetRacialType(oCreature) == 216/*RACIAL_TYPE_GNOLL*/) + || GetHasFeat(7903/*FEAT_WEAPON_PROFICIENCY_BATTLEAXE*/, oCreature); + + case BASE_ITEM_BASTARDSWORD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature) + || GetHasFeat(3600/*FEAT_MINDBLADE*/, oCreature) + || GetHasFeat(7904/*FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD*/, oCreature); + + case BASE_ITEM_LIGHTFLAIL: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(7905/*FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL*/, oCreature); + + case BASE_ITEM_WARHAMMER: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(7906/*FEAT_WEAPON_PROFICIENCY_WARHAMMER*/, oCreature); + + case BASE_ITEM_LONGBOW: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ELF, oCreature) + || GetHasFeat(7907/*FEAT_WEAPON_PROFICIENCY_LONGBOW*/, oCreature); + + case BASE_ITEM_LIGHTMACE: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(7908/*FEAT_WEAPON_PROFICIENCY_LIGHT_MACE*/, oCreature); + + case BASE_ITEM_HALBERD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(7909/*FEAT_WEAPON_PROFICIENCY_HALBERD*/, oCreature); + + case BASE_ITEM_SHORTBOW: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ELF, oCreature) + || (GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + && GetRacialType(oCreature) == 216/*RACIAL_TYPE_GNOLL*/) + || GetHasFeat(7910/*FEAT_WEAPON_PROFICIENCY_SHORTBOW*/, oCreature); + + case BASE_ITEM_TWOBLADEDSWORD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature) + || GetHasFeat(7911/*FEAT_WEAPON_PROFICIENCY_TWO_BLADED_SWORD*/, oCreature); + + case BASE_ITEM_GREATSWORD: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(7912/*FEAT_WEAPON_PROFICIENCY_GREATSWORD*/, oCreature); + + case BASE_ITEM_GREATAXE: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(7913/*FEAT_WEAPON_PROFICIENCY_GREATAXE*/, oCreature); + + case BASE_ITEM_DART: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature) + || GetHasFeat(7914/*FEAT_WEAPON_PROFICIENCY_DART*/, oCreature); + + case BASE_ITEM_DIREMACE: + return GetHasFeat(7915/*FEAT_WEAPON_PROFICIENCY_DIRE_MACE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_DOUBLEAXE: + return GetHasFeat(7916/*FEAT_WEAPON_PROFICIENCY_DOUBLE_AXE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_HEAVYFLAIL: + return GetHasFeat(7917/*FEAT_WEAPON_PROFICIENCY_HEAVY_FLAIL*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case BASE_ITEM_LIGHTHAMMER: + return GetHasFeat(7918/*FEAT_WEAPON_PROFICIENCY_LIGHT_HAMMER*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case BASE_ITEM_HANDAXE: + return GetHasFeat(7919/*FEAT_WEAPON_PROFICIENCY_HANDAXE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature); + + case BASE_ITEM_KAMA: + return GetHasFeat(7920/*FEAT_WEAPON_PROFICIENCY_KAMA*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_KATANA: + return GetHasFeat(7921/*FEAT_WEAPON_PROFICIENCY_KATANA*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_KUKRI: + return GetHasFeat(7922/*FEAT_WEAPON_PROFICIENCY_KUKRI*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_MORNINGSTAR: + return GetHasFeat(7923/*FEAT_WEAPON_PROFICIENCY_MORNINGSTAR*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature); + + case BASE_ITEM_QUARTERSTAFF: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oCreature); + + case BASE_ITEM_RAPIER: + return GetHasFeat(7924/*FEAT_WEAPON_PROFICIENCY_RAPIER*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ELF, oCreature); + + case BASE_ITEM_SCIMITAR: + return GetHasFeat(7925/*FEAT_WEAPON_PROFICIENCY_SCIMITAR*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature); + + case BASE_ITEM_SCYTHE: + return GetHasFeat(7926/*FEAT_WEAPON_PROFICIENCY_SCYTHE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case BASE_ITEM_SHORTSPEAR: + return GetHasFeat(7927/*FEAT_WEAPON_PROFICIENCY_SHORTSPEAR*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature); + + case BASE_ITEM_SHURIKEN: + return GetHasFeat(7928/*FEAT_WEAPON_PROFICIENCY_SHURIKEN*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature); + + case BASE_ITEM_SICKLE: + return GetHasFeat(7929/*FEAT_WEAPON_PROFICIENCY_SICKLE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature); + + case BASE_ITEM_SLING: + return GetHasFeat(7930/*FEAT_WEAPON_PROFICIENCY_SLING*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature); + + case BASE_ITEM_THROWINGAXE: + return GetHasFeat(7931/*FEAT_WEAPON_PROFICIENCY_THROWING_AXE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + || GetHasFeat(3600/*FEAT_MINDBLADE*/, oCreature); + + case BASE_ITEM_CSLASHWEAPON: + case BASE_ITEM_CPIERCWEAPON: + case BASE_ITEM_CBLUDGWEAPON: + case BASE_ITEM_CSLSHPRCWEAP: + return GetHasFeat(FEAT_WEAPON_PROFICIENCY_CREATURE, oCreature); + + case BASE_ITEM_TRIDENT: + return GetHasFeat(7932/*FEAT_WEAPON_PROFICIENCY_TRIDENT*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oCreature); + + case 124://BASE_ITEM_DOUBLE_SCIMITAR: + return GetHasFeat(7948/*FEAT_WEAPON_PROFICIENCY_DOUBLE_SCIMITAR*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case 119://BASE_ITEM_FALCHION: + return GetHasFeat(7943/*FEAT_WEAPON_PROFICIENCY_FALCHION*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case 125://BASE_ITEM_GOAD: + return GetHasFeat(7949/*FEAT_WEAPON_PROFICIENCY_GOAD*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature); + + case 122://BASE_ITEM_HEAVY_MACE: + return GetHasFeat(7946/*FEAT_WEAPON_PROFICIENCY_HEAVY_MACE*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oCreature); + + case 115://BASE_ITEM_HEAVY_PICK: + return GetHasFeat(7939/*FEAT_WEAPON_PROFICIENCY_HEAVY_PICK*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case 116://BASE_ITEM_LIGHT_PICK: + return GetHasFeat(7940/*FEAT_WEAPON_PROFICIENCY_LIGHT_PICK*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case 121://BASE_ITEM_KATAR: + return GetHasFeat(7945/*FEAT_WEAPON_PROFICIENCY_KATAR*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case 123://BASE_ITEM_MAUL: + return GetHasFeat(7947/*FEAT_WEAPON_PROFICIENCY_MAUL*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + case 118://BASE_ITEM_NUNCHAKU: + return GetHasFeat(7942/*FEAT_WEAPON_PROFICIENCY_NUNCHAKU*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case 117://BASE_ITEM_SAI: + return GetHasFeat(7941/*FEAT_WEAPON_PROFICIENCY_SAI*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MONK, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case 120://BASE_ITEM_SAP: + return GetHasFeat(7944/*FEAT_WEAPON_PROFICIENCY_SAP*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature); + + //special case: counts as martial for dwarves + case BASE_ITEM_DWARVENWARAXE: + return GetHasFeat(7933/*FEAT_WEAPON_PROFICIENCY_DWARVEN_WARAXE*/, oCreature) + || (GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oCreature) + && GetHasFeat(4710/*FEAT_DWARVEN*/, oCreature)) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + + case BASE_ITEM_WHIP: + return GetHasFeat(7934/*FEAT_WEAPON_PROFICIENCY_WHIP*/, oCreature) + || GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oCreature); + } + return TRUE; +} +int ai_GetItemUses(object oItem, int nItemPropertySubType) +{ + int nUses; + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(GetItemPropertyType(ipProperty) == ITEM_PROPERTY_HEALERS_KIT) return GetItemStackSize(oItem); + if(nItemPropertySubType > -1) + { + if(GetItemPropertySubType(ipProperty) == nItemPropertySubType) + { + // Get how they use the item (charges or uses per day). + nUses = GetItemPropertyCostTableValue(ipProperty); + if(nUses == 1) return GetItemStackSize(oItem); + else if(nUses > 1 && nUses < 7) return GetItemCharges(oItem); + else if(nUses == 7 || nUses == 13) return 999; + else if(nUses > 7 && nUses < 13) return GetItemPropertyUsesPerDayRemaining(oItem, ipProperty); + } + } + else return TRUE; + ipProperty = GetNextItemProperty(oItem); + } + return FALSE; +} + diff --git a/_module/nss/0i_main.nss b/_module/nss/0i_main.nss new file mode 100644 index 00000000..a0a46741 --- /dev/null +++ b/_module/nss/0i_main.nss @@ -0,0 +1,1328 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_main +//////////////////////////////////////////////////////////////////////////////// + Include script for handling main/basic functions not defined by other includes. + + Database structure: Json with indexes. + name (string) - The associatetype to link the data. "pc", "familiar", etc. + modes (jsonarray) - 0-aimodes (int), 1-magicmodes (int) + buttons (jsonarray) - 0-widgetbuttons (int), 1-aibuttons (int) + aidata (jsonarray) - 0-difficulty (int), 1-healoutcombat (int), 2-healincombat (int), + 3-lootrange (float), 4-lockrange (float), 5-traprange (float), + 6-Follow range (float). + lootfilters (jsonarray) - 0-maxweight (int), 1-lootfilters (int), + Item filters in min gold json array; 2-plot, 3-armor, 4-belts, 5-boots, + 6-cloaks, 7-gems, 8-gloves, 9-headgear, 10-jewelry, 11-misc, 12-potions, + 13-scrolls, 14-shields, 15-wands, 16-weapons, 17-arrow, 18-bolt, 19-bullet. + plugins (jsonarray) - 0+ (string). * Only used in the "pc" data. + location (jsonobject) - geometry (json), used in widgets for pc and associates. +*/////////////////////////////////////////////////////////////////////////////// +const string AI_TABLE = "PEPS_TABLE"; +const string AI_CAMPAIGN_DATABASE = "peps_database"; +const string AI_DM_TABLE = "DM_TABLE"; +#include "0i_constants" +#include "0i_messages" +// Sets PEPS RULES from the database to the module. +// Creates default rules if they do not exist. +void ai_SetAIRules(); +// Returns TRUE if oCreature is controlled by a player. +int ai_GetIsCharacter(object oCreature); +// Returns TRUE if oCreature is controlled by a dungeon master. +int ai_GetIsDungeonMaster(object oCreature); +// Returns the Player of oAssociate even if oAssociate is the player. +// If there is no player associated with oAssociate then it returns OBJECT_INVALID. +object ai_GetPlayerMaster(object oAssociate); +// Returns the percentage of hit points oCreature has left. +int ai_GetPercHPLoss(object oCreature); +// Returns a rolled result from sDice string. +// Example: "1d6" will be 1-6 or "3d6" will be 3-18 or 1d6+5 will be 6-11. +int ai_RollDiceString(string sDice); +// Returns the int number of a encoded 0x00000000 hex number from a string. +int ai_HexStringToInt(string sString); +// Returns cosine of the angle between oObject1 and oObject2 +float ai_GetCosAngleBetween(object oObject1, object oObject2); +// Returns a string from sString with only characters in sLegal. +// Used to remove illegal characters for databases. +string ai_RemoveIllegalCharacters(string sString, string sLegal = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); +// Returns the total levels of oCreature. +int ai_GetCharacterLevels(object oCreature); +// Returns a string where sFind is replaced in any occurrence of sSource with sReplace. +string ai_StringReplaceText(string sSource, string sFind, string sReplace); +// Returns a string of characters between the nIndex of predefined markers of +// sSeperator in sText. +// nIndex is the number of the data we are searching for in the array. +// A 0 nIndex is the first item in the text array. +// sSeperator is the character that seperates the array(Usefull for Multiple arrays). +string ai_GetStringArray(string sText, int nIndex, string sSeperator = ":"); +// Returns a string of characters between the nIndex of predefined markers of +// sSeperator in sText where sField has been set. +// sText is the text holding the array. +// nIndex is the array number in the data we are searching for. +// A 0 nIndex is the first item in the text array. +// sField is the field of characters to replace that index. +// sSeperator is the character that seperates the array(Usefull for Multiple arrays). +string ai_SetStringArray(string sText, int nIndex, string sField, string sSeperator = ":"); +// Returns the number of magical properties oItem has. +int ai_GetNumberOfProperties(object oItem); +// Checks if the campaign database table has been created and initialized. +void ai_CheckCampaignDataAndInitialize(); +// Checks if the dm database table and data has been created and initialized of oDM. +void ai_CheckDMDataAndInitialize(object oDM); +// Sets json to a campaign database. +void ai_SetCampaignDbJson(string sDataField, json jData, string sName = "PEPS_DATA", string sTable = AI_TABLE); +// Gets json from a campaign database. +json ai_GetCampaignDbJson(string sDataField, string sName = "PEPS_DATA", string sTable = AI_TABLE); +// Checks if oMaster has the Table created for Associate data. +// If no table found then the table is created and then initialized. +void ai_CheckAssociateDataAndInitialize(object oPlayer, string sAssociateType); +// Returns the associatetype int string format for oAssociate. +// They are pc, familar, companion, summons, henchman is the henchmans tag +string ai_GetAssociateType(object oPlayer, object oAssociate); +// Sets nData to sDataField for sAssociateType that is on oPlayer. +// sDataField can be modes, magicmodes, lootmodes, widgetbuttons, aibuttons, magic, +// healoutcombat, healincombat, mingold*. +void ai_SetAssociateDbInt(object oPlayer, string sAssociateType, string sDataField, int nData, string sTable = AI_TABLE); +// Returns nData from sDataField for sAssociateType that is on oPlayer. +// sDataField can be modes, magicmodes, lootmodes, widgetbuttons, aibuttons, magic, +// healoutcombat, healincombat, mingold*. +int ai_GetAssociateDbInt(object oPlayer, string sAssociateType, string sDataField, string sTable = AI_TABLE); +// Sets fData to sDataField for sAssociateType that is on oPlayer. +// sDataField can be lootrange, lockrange, traprange. +void ai_SetAssociateDbFloat(object oPlayer, string sAssociatetype, string sDataField, float fData, string sTable = AI_TABLE); +// Returns fData from sDataField for sAssociateType that is on oPlayer. +// sDataField can be lootrange, lockrange, traprange. +float ai_GetAssociateDbFloat(object oPlayer, string sAssociateType, string sDataField, string sTable = AI_TABLE); +// sDataField should be one of the data fields for that table. +// jData is the json data to be saved. +void ai_SetAssociateDbJson(object oPlayer, string sAssociateType, string sDataField, json jData, string sTable = AI_TABLE); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +json ai_GetAssociateDbJson(object oPlayer, string sAssociateType, string sDataField, string sTable = AI_TABLE); +// Saves Associate AIModes and MagicModes to the database. +void aiSaveAssociateModesToDb(object oPlayer, object oAssociate); +// Checks Associate local data and if none is found will initialize or load the +// correct data for oAssociate. +void ai_CheckAssociateData(object oPlayer, object oAssociate, string sAssociateType, int bLoad = FALSE); +// Checks DM's local data and if none is found will initizlize or load the +// correct data for oPlayer. +void ai_CheckDMData(object oPlayer); +// Adds to jPlugins functions after checking if the plugin can be installed. +json ai_Plugin_Add(object oPC, json jPlugins, string sPluginScript); +// Updates the players Plugin list and saves to the database. +json ai_UpdatePluginsForPC(object oPC); +// Updates the DM's Plugin list and saves to the database. +json ai_UpdatePluginsForDM (object oPC); +// Runs all plugins that are loaded into the database. +void ai_StartupPlugins(object oPC); +void ai_SetAIRules() +{ + object oModule = GetModule(); + ai_CheckCampaignDataAndInitialize(); + json jRules = ai_GetCampaignDbJson("rules"); + if(JsonGetType(JsonObjectGet(jRules, AI_RULE_MORAL_CHECKS)) == JSON_TYPE_NULL) + { + jRules = JsonObject(); + // Variable name set to a creatures full name to set debugging on. + jRules = JsonObjectSet(jRules, AI_RULE_DEBUG_CREATURE, JsonString("")); + // Moral checks on or off. + SetLocalInt(oModule, AI_RULE_MORAL_CHECKS, AI_MORAL_CHECKS); + jRules = JsonObjectSet(jRules, AI_RULE_MORAL_CHECKS, JsonInt(AI_MORAL_CHECKS)); + // Allows monsters to prebuff before combat starts. + SetLocalInt(oModule, AI_RULE_BUFF_MONSTERS, AI_PREBUFF); + jRules = JsonObjectSet(jRules, AI_RULE_BUFF_MONSTERS, JsonInt(AI_PREBUFF)); + // Allows monsters cast summons spells when prebuffing. + SetLocalInt(oModule, AI_RULE_PRESUMMON, AI_PRESUMMONS); + jRules = JsonObjectSet(jRules, AI_RULE_PRESUMMON, JsonInt(AI_PRESUMMONS)); + // Allows monsters to use tactical AI scripts. + SetLocalInt(oModule, AI_RULE_AMBUSH, AI_TACTICAL); + jRules = JsonObjectSet(jRules, AI_RULE_AMBUSH, JsonInt(AI_TACTICAL)); + // Enemies may summon familiars and Animal companions and will be randomized. + SetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS, AI_SUMMON_COMPANIONS); + jRules = JsonObjectSet(jRules, AI_RULE_SUMMON_COMPANIONS, JsonInt(AI_SUMMON_COMPANIONS)); + // Allow the AI to move during combat base on the situation and action taking. + SetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT, AI_ADVANCED_MOVEMENT); + jRules = JsonObjectSet(jRules, AI_RULE_ADVANCED_MOVEMENT, JsonInt(AI_ADVANCED_MOVEMENT)); + // Follow Item Level Restrictions for monsters/associates. + SetLocalInt(oModule, AI_RULE_ILR, AI_ITEM_LEVEL_RESTRICTIONS); + jRules = JsonObjectSet(jRules, AI_RULE_ILR, JsonInt(AI_ITEM_LEVEL_RESTRICTIONS)); + // Allow the AI to use Use Magic Device. + SetLocalInt(oModule, AI_RULE_ALLOW_UMD, AI_USE_MAGIC_DEVICE); + jRules = JsonObjectSet(jRules, AI_RULE_ALLOW_UMD, JsonInt(AI_USE_MAGIC_DEVICE)); + // Allow the AI to use healing kits. + SetLocalInt(oModule, AI_RULE_HEALERSKITS, AI_HEALING_KITS); + jRules = JsonObjectSet(jRules, AI_RULE_HEALERSKITS, JsonInt(AI_HEALING_KITS)); + // Associates are permanent and don't get removed when the master dies. + SetLocalInt(oModule, AI_RULE_PERM_ASSOC, AI_COMPANIONS_PERMANENT); + jRules = JsonObjectSet(jRules, AI_RULE_PERM_ASSOC, JsonInt(AI_COMPANIONS_PERMANENT)); + // Monster AI's chance to attack the weakest target instead of the nearest. + SetLocalInt(oModule, AI_RULE_AI_DIFFICULTY, AI_TARGET_WEAKEST); + jRules = JsonObjectSet(jRules, AI_RULE_AI_DIFFICULTY, JsonInt(AI_TARGET_WEAKEST)); + // Monster AI's distance they can search for the enemy. + SetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE, AI_SEARCH_DISTANCE); + jRules = JsonObjectSet(jRules, AI_RULE_PERCEPTION_DISTANCE, JsonFloat(AI_SEARCH_DISTANCE)); + // Enemy corpses remain on the floor instead of dissappearing. + SetLocalInt(oModule, AI_RULE_CORPSES_STAY, AI_CORPSE_REMAIN); + jRules = JsonObjectSet(jRules, AI_RULE_CORPSES_STAY, JsonInt(AI_CORPSE_REMAIN)); + // Monsters will wander around when not in combat. + SetLocalInt(oModule, AI_RULE_WANDER, AI_WANDER); + jRules = JsonObjectSet(jRules, AI_RULE_WANDER, JsonInt(AI_WANDER)); + // Increase the number of encounter creatures. + SetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS, 0.0); + jRules = JsonObjectSet(jRules, AI_INCREASE_ENC_MONSTERS, JsonFloat(0.0)); + // Increase all monsters hitpoints by this percentage. + SetLocalInt(oModule, AI_INCREASE_MONSTERS_HP, 0); + jRules = JsonObjectSet(jRules, AI_INCREASE_MONSTERS_HP, JsonInt(0)); + // Monster's perception distance. + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, AI_MONSTER_PERCEPTION); + jRules = JsonObjectSet(jRules, AI_RULE_MON_PERC_DISTANCE, JsonInt(AI_MONSTER_PERCEPTION)); + // Variable name set to hold the maximum number of henchman the player wants. + int nMaxHenchmen = GetMaxHenchmen(); + SetLocalInt(oModule, AI_RULE_MAX_HENCHMAN, nMaxHenchmen); + jRules = JsonObjectSet(jRules, AI_RULE_MAX_HENCHMAN, JsonInt(nMaxHenchmen)); + // Monster AI's distance they can wander away from their spawn point. + SetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE, AI_WANDER_DISTANCE); + jRules = JsonObjectSet(jRules, AI_RULE_WANDER_DISTANCE, JsonFloat(AI_WANDER_DISTANCE)); + // Monsters will open doors when wandering around and not in combat. + SetLocalInt(oModule, AI_RULE_OPEN_DOORS, AI_WANDER); + jRules = JsonObjectSet(jRules, AI_RULE_OPEN_DOORS, JsonInt(AI_OPEN_DOORS)); + // If the modules default XP has not been set then we do it here. + int nDefaultXP = GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE); + if(nDefaultXP == 0) + { + int nValue = GetModuleXPScale(); + if(nValue != 0) SetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE, nValue); + } + // Variable name set to allow the game to regulate experience based on party size. + SetLocalInt(oModule, AI_RULE_PARTY_SCALE, AI_PARTY_SCALE); + jRules = JsonObjectSet(jRules, AI_RULE_PARTY_SCALE, JsonInt(AI_PARTY_SCALE)); + SetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS, JsonArray()); + jRules = JsonObjectSet(jRules, AI_RULE_RESTRICTED_SPELLS, JsonArray()); + // Variable name set to allow access to widget buttons for the players. + SetLocalInt(oModule, sDMWidgetAccessVarname, AI_DM_WIDGET_ACCESS_BUTTONS); + jRules = JsonObjectSet(jRules, sDMWidgetAccessVarname, JsonInt(AI_DM_WIDGET_ACCESS_BUTTONS)); + // Variable name set to allow access to widget buttons for the players. + SetLocalInt(oModule, sDMAIAccessVarname, AI_DM_AI_ACCESS_BUTTONS); + jRules = JsonObjectSet(jRules, sDMAIAccessVarname, JsonInt(AI_DM_AI_ACCESS_BUTTONS)); + ai_SetCampaignDbJson("rules", jRules); + } + else + { + // Variable name set to a creatures full name to set debugging on. + string sValue = JsonGetString(JsonObjectGet(jRules, AI_RULE_DEBUG_CREATURE)); + SetLocalString(oModule, AI_RULE_DEBUG_CREATURE, sValue); + // Moral checks on or off. + int bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_MORAL_CHECKS)); + SetLocalInt(oModule, AI_RULE_MORAL_CHECKS, bValue); + // Allows monsters to prebuff before combat starts. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_BUFF_MONSTERS)); + SetLocalInt(oModule, AI_RULE_BUFF_MONSTERS, bValue); + // Allows monsters cast summons spells when prebuffing. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_PRESUMMON)); + SetLocalInt(oModule, AI_RULE_PRESUMMON, bValue); + // Allows monsters to use ambush AI scripts. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_AMBUSH)); + SetLocalInt(oModule, AI_RULE_AMBUSH, bValue); + // Enemies may summon familiars and Animal companions and will be randomized. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_SUMMON_COMPANIONS)); + SetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS, bValue); + // Allow the AI to move during combat base on the situation and action taking. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_ADVANCED_MOVEMENT)); + SetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT, bValue); + // Follow Item Level Restrictions for monsters/associates. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_ILR)); + SetLocalInt(oModule, AI_RULE_ILR, bValue); + // Allow the AI to use Use Magic Device. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_ALLOW_UMD)); + SetLocalInt(oModule, AI_RULE_ALLOW_UMD, bValue); + // Allow the AI to use healing kits. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_HEALERSKITS)); + SetLocalInt(oModule, AI_RULE_HEALERSKITS, bValue); + // Associates are permanent and don't get removed when the owner dies. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_PERM_ASSOC)); + SetLocalInt(oModule, AI_RULE_PERM_ASSOC, bValue); + // Monster AI's chance to attack the weakest target instead of the nearest. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_AI_DIFFICULTY)); + SetLocalInt(oModule, AI_RULE_AI_DIFFICULTY, bValue); + // Monster AI's perception distance from player. + float fValue = JsonGetFloat(JsonObjectGet(jRules, AI_RULE_PERCEPTION_DISTANCE)); + SetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE, fValue); + // Enemy corpses remain on the floor instead of dissappearing. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_CORPSES_STAY)); + SetLocalInt(oModule, AI_RULE_CORPSES_STAY, bValue); + // Monsters will wander around when not in combat. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_WANDER)); + SetLocalInt(oModule, AI_RULE_WANDER, bValue); + // Increase the number of encounter creatures. + fValue = JsonGetFloat(JsonObjectGet(jRules, AI_INCREASE_ENC_MONSTERS)); + SetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS, fValue); + // Increase all monsters hitpoints by this percentage. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_INCREASE_MONSTERS_HP)); + SetLocalInt(oModule, AI_INCREASE_MONSTERS_HP, bValue); + // Monster's perception distance. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_MON_PERC_DISTANCE)); + if(bValue < 8 || bValue > 11) bValue = 11; + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, bValue); + // Variable name set to hold the maximum number of henchman the player wants. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_MAX_HENCHMAN)); + if(bValue == 0) bValue = GetMaxHenchmen(); + else SetMaxHenchmen(bValue); + SetLocalInt(oModule, AI_RULE_MAX_HENCHMAN, bValue); + // Monster AI's wander distance from their spawn point. + fValue = JsonGetFloat(JsonObjectGet(jRules, AI_RULE_WANDER_DISTANCE)); + SetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE, fValue); + // Monsters will open doors while wandering around and not in combat. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_OPEN_DOORS)); + SetLocalInt(oModule, AI_RULE_OPEN_DOORS, bValue); + // If the modules default XP has not been set then we do it here. + int nDefaultXP = GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE); + if(nDefaultXP == 0) + { + bValue = GetModuleXPScale(); + if(bValue != 0) SetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE, bValue); + } + // Variable name set to allow the game to regulate experience based on party size. + bValue = JsonGetInt(JsonObjectGet(jRules, AI_RULE_PARTY_SCALE)); + if(bValue) + { + int nBasePartyXP = GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP); + if(nBasePartyXP == 0) + { + nDefaultXP = GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE); + SetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP, nDefaultXP); + } + } + SetLocalInt(oModule, AI_RULE_PARTY_SCALE, bValue); + json jRSpells = JsonObjectGet(jRules, AI_RULE_RESTRICTED_SPELLS); + if(JsonGetType(jRSpells) == JSON_TYPE_NULL) + { + jRSpells = JsonArray(); + jRules = JsonObjectSet(jRules, AI_RULE_RESTRICTED_SPELLS, jRSpells); + ai_SetCampaignDbJson("rules", jRules); + } + SetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS, jRSpells); + // Variable name set to allow access to widget buttons for the players. + bValue = JsonGetInt(JsonObjectGet(jRules, sDMWidgetAccessVarname)); + SetLocalInt(oModule, sDMWidgetAccessVarname, bValue); + // Variable name set to allow access to widget buttons for the players. + bValue = JsonGetInt(JsonObjectGet(jRules, sDMAIAccessVarname)); + SetLocalInt(oModule, sDMAIAccessVarname, bValue); + } +} +int ai_GetIsCharacter(object oCreature) +{ + return (GetIsPC(oCreature) && !GetIsDM(oCreature) && !GetIsDMPossessed(oCreature)); +} +int ai_GetIsDungeonMaster(object oCreature) +{ + return (GetIsDM(oCreature) || GetIsDMPossessed(oCreature)); +} +object ai_GetPlayerMaster(object oAssociate) +{ + if(ai_GetIsCharacter(oAssociate)) return oAssociate; + object oMaster = GetMaster(oAssociate); + if(ai_GetIsCharacter(oMaster)) return oMaster; + return OBJECT_INVALID; +} +int ai_GetPercHPLoss(object oCreature) +{ + int nHP = GetCurrentHitPoints(oCreature); + if(nHP < 1) return 0; + return(nHP * 100) / GetMaxHitPoints(oCreature); +} +int ai_RollDiceString(string sDice) +{ + int nNegativePos, nBonus = 0; + string sRight = GetStringRight(sDice, GetStringLength(sDice) - FindSubString(sDice, "d") - 1); + int nPlusPos = FindSubString(sRight, "+"); + if(nPlusPos != -1) + { + nBonus = StringToInt(GetStringRight(sRight, GetStringLength(sRight) - nPlusPos - 1)); + sRight = GetStringLeft(sRight, nPlusPos); + } + else + { + nNegativePos = FindSubString(sRight, "-"); + if(nNegativePos != -1) + { + nBonus = StringToInt(GetStringRight(sRight, GetStringLength(sRight) - nNegativePos - 1)); + sRight = GetStringLeft(sRight, nNegativePos); + nBonus = nBonus * -1; + } + } + int nDie = StringToInt(sRight); + int nNumOfDie = StringToInt(GetStringLeft(sDice, FindSubString(sDice, "d"))); + int nResult; + while(nNumOfDie > 0) + { + nResult += Random(nDie) + 1; + nNumOfDie --; + } + return nResult + nBonus; +} +int ai_HexStringToInt(string sString) +{ + sString = GetStringLowerCase(sString); + int nInt = 0; + int nLength = GetStringLength(sString); + int i; + for(i = nLength - 1; i >= 0; i--) + { + int n = FindSubString("0123456789abcdef", GetSubString(sString, i, 1)); + if(n == -1) return nInt; + nInt |= n << ((nLength - i - 1) * 4); + } + return nInt; +} +float ai_GetCosAngleBetween(object oObject1, object oObject2) +{ + vector v1 = GetPositionFromLocation(GetLocation(oObject1)); + vector v2 = GetPositionFromLocation(GetLocation(oObject2)); + vector v3 = GetPositionFromLocation(GetLocation(OBJECT_SELF)); + + v1.x -= v3.x; v1.y -= v3.y; v1.z -= v3.z; + v2.x -= v3.x; v2.y -= v3.y; v2.z -= v3.z; + + float dotproduct = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z; + + return dotproduct/(VectorMagnitude(v1)*VectorMagnitude(v2)); +} +string ai_RemoveIllegalCharacters(string sString, string sLegal = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") +{ + string sOut, sValue; + sString = ai_StripColorCodes(sString); + int nLength = GetStringLength(sString); + int Cnt; + for(Cnt = 0; Cnt != nLength; ++Cnt) + { + sValue = GetSubString(sString, Cnt, 1); + if(TestStringAgainstPattern("**" + sValue + "**", sLegal)) + sOut += sValue; + } + return sOut; +} +int ai_GetCharacterLevels(object oCreature) +{ + int nLevels, nPosition = 1; + while(nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + nLevels += GetLevelByPosition(nPosition, oCreature); + nPosition++; + } + return nLevels; +} +string ai_StringReplaceText(string sSource, string sFind, string sReplace) +{ + int nFindLength = GetStringLength(sFind); + int nPosition = 0; + string sReturnValue = ""; + // Locate all occurences of sFind. + int nFound = FindSubString(sSource, sFind); + while(nFound >= 0 ) + { + // Build the return string, replacing this occurence of sFind with sReplace. + sReturnValue += GetSubString(sSource, nPosition, nFound - nPosition) + sReplace; + nPosition = nFound + nFindLength; + nFound = FindSubString(sSource, sFind, nPosition); + } + // Tack on the end of sSource and return. + return sReturnValue + GetStringRight(sSource, GetStringLength(sSource) - nPosition); +} +string ai_GetStringArray(string sArray, int nIndex, string sSeperator = ":") +{ + int nCnt = 0, nMark = 0, nStringLength = GetStringLength(sArray); + string sCharacter; + // Search the string. + while(nCnt < nStringLength) + { + sCharacter = GetSubString(sArray, nCnt, 1); + // Look for the mark. + if(sCharacter == sSeperator) + { + // If we have not found it then lets see if this mark is the one. + if(nMark < 1) + { + // If we are down to 0 in the index then we have found the mark. + if(nIndex > 0) nIndex --; + // Mark the start of the string we need. + else nMark = nCnt + 1; + } + else + { + // We have the first mark so the next mark will mean we have the string we need. + // Now pull it and return. + sArray = GetSubString(sArray, nMark, nCnt - nMark); + return sArray; + } + } + nCnt ++; + } + // If we hit the end without finding it then return "" as an error. + return ""; +} +string ai_SetStringArray(string sArray, int nIndex, string sField, string sSeperator = ":") +{ + int nCnt = 1, nMark = 1, nStringLength = GetStringLength(sArray); + int nIndexCounter = 0; + string sCharacter, sNewArray = sSeperator, sText; + // Check to make sure this is not a new array. + // If it is new then set it with 1 slot. + if(nStringLength < 2) + { + sArray = sSeperator + " " + sSeperator; + nStringLength = 3; + } + // Search the string. + while(nCnt <= nStringLength) + { + sCharacter = GetSubString(sArray, nCnt, 1); + // Look for the mark. + if(sCharacter == sSeperator) + { + // First check to see if this is the index we are replacing. + if(nIndex == nIndexCounter) sText = sField; + else + { + // Get the original text for this field. + sText = GetSubString(sArray, nMark, nCnt - nMark); + } + // Add the field to the new index. + sNewArray = sNewArray + sText + sSeperator; + // Now set the marker to the new starting point. + nMark = nCnt + 1; + // Increase the index counter as well. + nIndexCounter ++; + } + nCnt ++; + } + // if we are at the end of the array and still have not set the data + // then add blank data until we get to the correct index. + while(nIndexCounter <= nIndex) + { + // If they match add the field. + if(nIndexCounter == nIndex) sNewArray = sNewArray + sField + sSeperator; + // Otherwise just add a blank field. + else sNewArray = sNewArray + " " + sSeperator; + nIndexCounter ++; + } + // When done return the new array. + return sNewArray; +} +int ai_GetNumberOfProperties(object oItem) +{ + int nNumOfProperties = 0, nPropertyType, nPropertySubType; + // Get first property + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + // Ignore double type properties such as bane. + nPropertyType = GetItemPropertyType(ipProperty); + switch(nPropertyType) + { + // Skip these properties as they don't count. + case 8 : break; // EnhanceAlignmentGroup + case 44 : break; // Light + case 62 : break; // UseLimitationAlignmentGroup + case 63 : break; // UseLimitationClass + case 64 : break; // UseLimitationRacial + case 65 : break; // UseLimitationSpecificAlignment + case 66 : break; // UseLimitationTerrain + case 86 : break; // Quality + case 150 : break; // UseLimitationGender + case 15 : + { + nPropertySubType = GetItemPropertySubType(ipProperty); + if(nPropertySubType == IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY) break; + if(nPropertySubType == IP_CONST_CASTSPELL_UNIQUE_POWER) break; + } + default : nNumOfProperties ++; + } + // Get the next property + ipProperty = GetNextItemProperty(oItem); + } + // Reduce the number of properties by one on whips. + if(GetBaseItemType(oItem) == BASE_ITEM_WHIP) nNumOfProperties --; + return nNumOfProperties; +} +void ai_CreateCampaignDataTable() +{ + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, + "CREATE TABLE IF NOT EXISTS " + AI_TABLE + "(" + + "name TEXT, " + + "plugins TEXT, " + + "rules TEXT, " + + "PRIMARY KEY(name));"); + SqlStep(sql); + //if(AI_DEBUG) ai_Debug("0i_main", "343", We are creating a campaign table [" + + // AI_TABLE + "] in the database."); +} +void ai_CheckCampaignDataTableAndCreateTable() +{ + string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' " + + "AND name =@table;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@table", AI_TABLE); + if(!SqlStep(sql)) ai_CreateCampaignDataTable(); +} +void ai_InitializeCampaignData() +{ + string sQuery = "INSERT INTO " + AI_TABLE + "(name, plugins, rules) " + + "VALUES(@name, @plugins, @rules);"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@name", "PEPS_DATA"); + SqlBindJson(sql, "@plugins", JsonArray()); + SqlBindJson(sql, "@rules", JsonObject()); + SqlStep(sql); +} +void ai_CheckCampaignDataAndInitialize() +{ + ai_CheckCampaignDataTableAndCreateTable(); + string sQuery = "SELECT name FROM " + AI_TABLE + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@name", "PEPS_DATA"); + if(!SqlStep(sql)) ai_InitializeCampaignData(); +} +void ai_CreateDMDataTable() +{ + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, + "CREATE TABLE IF NOT EXISTS " + AI_DM_TABLE + "(" + + "name TEXT, " + + "buttons TEXT, " + + "plugins TEXT, " + + "locations TEXT, " + + "options TEXT, " + + "saveslots TEXT, " + + "PRIMARY KEY(name));"); + SqlStep(sql); +} +void ai_CheckDMDataTableAndCreateTable() +{ + string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' " + + "AND name =@table;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@table", AI_DM_TABLE); + if(!SqlStep(sql)) ai_CreateDMDataTable(); +} +void ai_InitializeDMData(string sName) +{ + string sQuery = "INSERT INTO " + AI_DM_TABLE + "(name, buttons, plugins, " + + "locations, options, saveslots) " + + "VALUES(@name, @buttons, @plugins, @locations, @options, @saveslots);"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindJson(sql, "@buttons", JsonArray()); + SqlBindJson(sql, "@plugins", JsonArray()); + SqlBindJson(sql, "@locations", JsonObject()); + SqlBindJson(sql, "@options", JsonObject()); + SqlBindJson(sql, "@saveslots", JsonObject()); + SqlStep(sql); +} +void ai_CheckDMDataAndInitialize(object oDM) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oDM))); + string sQuery = "SELECT name FROM " + AI_DM_TABLE + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@name", sName); + if(!SqlStep(sql)) + { + ai_CheckDMDataTableAndCreateTable(); + ai_InitializeDMData(sName); + } +} +void ai_SetCampaignDbJson(string sDataField, json jData, string sName = "PEPS_DATA", string sTable = AI_TABLE) +{ + string sQuery = "UPDATE " + sTable + " SET " + sDataField + + " = @data WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindJson(sql, "@data", jData); + SqlBindString(sql, "@name", sName); + SqlStep(sql); +} +json ai_GetCampaignDbJson(string sDataField, string sName = "PEPS_DATA", string sTable = AI_TABLE) +{ + string sQuery = "SELECT " + sDataField + " FROM " + sTable + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryCampaign(AI_CAMPAIGN_DATABASE, sQuery); + SqlBindString(sql, "@name", sName); + json jReturn; + if(SqlStep(sql)) return SqlGetJson (sql, 0); + else return JsonArray(); + return jReturn; +} +void ai_CreateAssociateDataTable(object oPlayer) +{ + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "CREATE TABLE IF NOT EXISTS " + AI_TABLE + "(" + + "name TEXT, " + + "modes TEXT, " + + "buttons TEXT, " + + "aidata TEXT, " + + "lootfilters TEXT, " + + "plugins TEXT, " + + "locations TEXT, " + + "PRIMARY KEY(name));"); + SqlStep(sql); + //ai_Debug("0i_main", "665", GetName(oPlayer) + " is creating a table [" + + // AI_TABLE + "] in the database."); +} +void ai_CheckDataTableAndCreateTable(object oPlayer) +{ + string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' " + + "AND name =@table;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@table", AI_TABLE); + if(!SqlStep(sql)) ai_CreateAssociateDataTable (oPlayer); + //else SendMessageToPC(oPlayer, "0i_main, 675, " + GetName(oPlayer) + " has a database with table [" + AI_TABLE + "]."); +} +void ai_InitializeAssociateData(object oPlayer, string sAssociateType) +{ + string sQuery = "INSERT INTO " + AI_TABLE + "(name, modes, buttons, " + + "aidata, lootfilters, plugins, locations) " + + "VALUES(@name, @modes, @buttons, @aidata, @lootfilters, @plugins, @locations);"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociateType); + SqlBindJson(sql, "@modes", JsonArray()); + SqlBindJson(sql, "@buttons", JsonArray()); + SqlBindJson(sql, "@aidata", JsonArray()); + SqlBindJson(sql, "@lootfilters", JsonArray()); + SqlBindJson(sql, "@plugins", JsonArray()); + SqlBindJson(sql, "@locations", JsonObject()); + //SendMessageToPC(oPlayer, "0i_main, 690, " + GetName(oPlayer) + " is initializing associate " + + // sAssociateType + " data for table [" + AI_TABLE + "]."); + SqlStep(sql); +} +void ai_CheckAssociateDataAndInitialize(object oPlayer, string sAssociateType) +{ + ai_CheckDataTableAndCreateTable(oPlayer); + string sQuery = "SELECT name FROM " + AI_TABLE + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject (oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociateType); + if(!SqlStep(sql)) ai_InitializeAssociateData(oPlayer, sAssociateType); + //else SendMessageToPC(oPlayer, "0i_main, 701, sAssociateType: " + sAssociateType + + // " returns: " + SqlGetString(sql, 0)); +} +string ai_GetAssociateType(object oPlayer, object oAssociate) +{ + if(GetIsPC(oAssociate)) return "pc"; + string sAITag = GetLocalString(oAssociate, AI_TAG); + if(sAITag == "") + { + int nAssociateType = GetAssociateType(oAssociate); + if(nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) sAITag = "companion"; + else if(nAssociateType == ASSOCIATE_TYPE_FAMILIAR) sAITag = "familiar"; + else if(nAssociateType == ASSOCIATE_TYPE_SUMMONED) sAITag = "summons"; + else if(nAssociateType == ASSOCIATE_TYPE_DOMINATED) sAITag = "dominated"; + else if(nAssociateType == ASSOCIATE_TYPE_HENCHMAN) sAITag = GetTag(oAssociate); + string sCurrentAITag; + // Check for duplicate tags and change. + int nIndex; + object oCreature; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oCreature = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPlayer, nIndex); + if(oAssociate != oCreature && sAITag == GetTag(oCreature)) sAITag += IntToString(Random(1000)); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oCreature = GetAssociate(nIndex, oPlayer, 1); + if(oAssociate != oCreature && sAITag == GetTag(oCreature)) sAITag += IntToString(Random(1000)); + } + SetLocalString(oAssociate, AI_TAG, sAITag); + } + return sAITag; +} +void ai_SetAssociateDbInt(object oPlayer, string sAssociatetype, string sDataField, int nData, string sTable = AI_TABLE) +{ + string sQuery = "UPDATE " + sTable + " SET " + sDataField + + " = @data WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociatetype); + SqlBindInt(sql, "@data", nData); + //ai_Debug("0i_main", "368", "SETTING DATA: " + GetName(oPlayer) + " sAssociatetype: " + + // sAssociatetype + " sDataField: " + sDataField + " nData: " + IntToString(nData)); + SqlStep(sql); +} +int ai_GetAssociateDbInt(object oPlayer, string sAssociatetype, string sDataField, string sTable = AI_TABLE) +{ + string sQuery = "SELECT " + sDataField + " FROM " + sTable + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociatetype); + //ai_Debug("0i_main", "377", "GETTING DATA: " + GetName(oPlayer) + " sAssociatetype: " + + // sAssociatetype + " sDataField: " + sDataField); + if(SqlStep(sql)) return SqlGetInt(sql, 0); + else return 0; +} +void ai_SetAssociateDbFloat(object oPlayer, string sAssociatetype, string sDataField, float fData, string sTable = AI_TABLE) +{ + string sQuery = "UPDATE " + sTable + " SET " + sDataField + + " = @data WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociatetype); + SqlBindFloat(sql, "@data", fData); + //ai_Debug("0i_main", "368", "SETTING DATA: " + GetName(oPlayer) + " sAssociatetype: " + + // sAssociatetype + " sDataField: " + sDataField + " fData: " + FloatToString(fData, 0, 0)); + SqlStep(sql); +} +float ai_GetAssociateDbFloat(object oPlayer, string sAssociatetype, string sDataField, string sTable = AI_TABLE) +{ + string sQuery = "SELECT " + sDataField + " FROM " + sTable + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sAssociatetype); + //ai_Debug("0i_main", "377", "GETTING DATA: " + GetName(oPlayer) + " sAssociatetype: " + + // sAssociatetype + " sDataField: " + sDataField); + if(SqlStep(sql)) return SqlGetFloat(sql, 0); + else return 0.0; +} +void ai_SetAssociateDbJson(object oPlayer, string sAssociateType, string sDataField, json jData, string sTable = AI_TABLE) +{ + //SendMessageToPC(oPlayer, "0i_main, 629, Set DbJson - sAssociateType: " + sAssociateType + " sDataField: " + sDataField + " jData: " + JsonDump(jData)); + string sQuery = "UPDATE " + sTable + " SET " + sDataField + + " = @data WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindJson(sql, "@data", jData); + SqlBindString(sql, "@name", sAssociateType); + SqlStep(sql); +} +json ai_GetAssociateDbJson(object oPlayer, string sAssociateType, string sDataField, string sTable = AI_TABLE) +{ + //SendMessageToPC(oPlayer, "0i_main, 638, Get DbJson - sAssociateType: " + sAssociateType + " sDataField: " + sDataField); + string sQuery = "SELECT " + sDataField + " FROM " + sTable + " WHERE name = @name;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString (sql, "@name", sAssociateType); + if(SqlStep(sql)) + { + json jReturn = SqlGetJson(sql, 0); + //SendMessageToPC(oPlayer, "0i_main, 646 jReturn: " + JsonDump(jReturn, 1)); + if(JsonGetType(jReturn) == JSON_TYPE_NULL) return JsonArray(); + return jReturn; + } + else return JsonNull(); +} +void aiSaveAssociateModesToDb(object oPlayer, object oAssociate) +{ + string sAssociateType = ai_GetAssociateType(oPlayer, oAssociate); + json jModes = ai_GetAssociateDbJson(oPlayer, sAssociateType, "modes"); + int nAIMode = GetLocalInt(oAssociate, sAIModeVarname); + jModes = JsonArraySet(jModes, 0, JsonInt(nAIMode)); + int nMagicMode = GetLocalInt(oAssociate, sMagicModeVarname); + jModes = JsonArraySet(jModes, 1, JsonInt(nMagicMode)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "modes", jModes); +} +void ai_SetupModes(object oPlayer, object oAssociate, string sAssociateType) +{ + json jModes = JsonArray(); + jModes = JsonArrayInsert(jModes, JsonInt(0)); // AI Modes. + // Set magic modes to use Normal magic, Bit 256. + jModes = JsonArrayInsert(jModes, JsonInt(256)); // Magic Modes. + SetLocalInt(oAssociate, sMagicModeVarname, 256); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "modes", jModes, AI_TABLE); +} +void ai_SetupButtons(object oPlayer, object oAssociate, string sAssociateType) +{ + json jButtons = JsonArray(); + jButtons = JsonArrayInsert(jButtons, JsonInt(0)); // Command buttons. + jButtons = JsonArrayInsert(jButtons, JsonInt(0)); // AI buttons. + jButtons = JsonArrayInsert(jButtons, JsonInt(0)); // AI buttons 2. + ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons, AI_TABLE); +} +void ai_SetupAIData(object oPlayer, object oAssociate, string sAssociateType) +{ + json jAIData = JsonArray(); + jAIData = JsonArrayInsert(jAIData, JsonInt(0)); // 0 - Difficulty adjustment. + jAIData = JsonArrayInsert(jAIData, JsonInt(70)); // 1 - Heal out of combat. + SetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT, 70); + jAIData = JsonArrayInsert(jAIData, JsonInt(50)); // 2 - Heal in combat. + SetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT, 50); + jAIData = JsonArrayInsert(jAIData, JsonFloat(20.0)); // 3 - Loot check range. + SetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE, 20.0); + jAIData = JsonArrayInsert(jAIData, JsonFloat(20.0)); // 4 - Lock check range. + SetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE, 20.0); + jAIData = JsonArrayInsert(jAIData, JsonFloat(20.0)); // 5 - Trap check range. + SetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE, 20.0); + jAIData = JsonArrayInsert(jAIData, JsonFloat(3.0)); // 6 - Associate Distance. + SetLocalFloat(oAssociate, AI_FOLLOW_RANGE, 3.0); + // This can be replaced as it is not used in the database. + // We keep it for now as we don't want to move other data. + jAIData = JsonArrayInsert(jAIData, JsonInt(11)); // 7 - Associate Perception DistanceDistance. + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, 11); + SetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE, 20.0); + jAIData = JsonArrayInsert(jAIData, JsonString("")); // 8 - Associate Combat Tactics. + jAIData = JsonArrayInsert(jAIData, JsonFloat(20.0)); // 9 - Open Doors check range. + SetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE, 20.0); + json jSpells = JsonArray(); + jAIData = JsonArrayInsert(jAIData, jSpells); // 10 - Castable spells. + ai_SetAssociateDbJson(oPlayer, sAssociateType, "aidata", jAIData, AI_TABLE); +} +void ai_SetupLootFilters(object oPlayer, object oAssociate, string sAssociateType) +{ + json jLootFilters = JsonArray(); + // Maximum weight to pickup an item. + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(200)); + SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, 200); + // Bitwise int for checkbox pickup filter. + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(AI_LOOT_ALL_ON)); + SetLocalInt(oAssociate, sLootFilterVarname, AI_LOOT_ALL_ON); + // Minimum gold value to pickup. + int nIndex; + for(nIndex = 2; nIndex < 20; nIndex++) + { + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(0)); + } + ai_SetAssociateDbJson(oPlayer, sAssociateType, "lootfilters", jLootFilters, AI_TABLE); +} +void ai_SetupLocations(object oPlayer, object oAssociate, string sAssociateType) +{ + json jLocations = JsonObject(); + json jNUI = JsonObject(); + jNUI = JsonObjectSet(jNUI, "x", JsonFloat(-1.0)); + jNUI = JsonObjectSet(jNUI, "y", JsonFloat(-1.0)); + if(ai_GetIsCharacter(oAssociate)) + { + jLocations = JsonObjectSet(jLocations, AI_MAIN_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, AI_PLUGIN_NUI, jNUI); + } + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_COMMAND_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_LOOTFILTER_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_COPY_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_QUICK_WIDGET_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_SPELL_MEMORIZE_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_SPELL_KNOWN_NUI, jNUI); + jNUI = JsonObjectSet(jNUI, "x", JsonFloat(0.0)); + jNUI = JsonObjectSet(jNUI, "y", JsonFloat(0.0)); + jLocations = JsonObjectSet(jLocations, sAssociateType + AI_WIDGET_NUI, jNUI); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "locations", jLocations, AI_TABLE); +} +void ai_SetupAssociateData(object oPlayer, object oAssociate, string sAssociateType) +{ + //ai_Debug("0i_main", "744", GetName(oAssociate) + " is initializing associate data."); + ai_CheckAssociateDataAndInitialize(oPlayer, sAssociateType); + // Default behavior for associates at start. + ai_SetupModes(oPlayer, oAssociate, sAssociateType); + ai_SetupButtons(oPlayer, oAssociate, sAssociateType); + ai_SetupAIData(oPlayer, oAssociate, sAssociateType); + ai_SetupLootFilters(oPlayer, oAssociate, sAssociateType); + // ********** Plugins ************ + // These are pulled straight from the database. + ai_SetupLocations(oPlayer, oAssociate, sAssociateType); +} +void ai_RestoreDatabase(object oPlayer, object oAssociate, string sAssociateType) +{ + // ********** Modes ********** + json jModes = JsonArray(); + // AI Modes (0). + int nValue = GetLocalInt(oAssociate, sAIModeVarname); + jModes = JsonArrayInsert(jModes, JsonInt(nValue)); + // Magic Modes (1). + nValue = GetLocalInt(oAssociate, sMagicModeVarname); + jModes = JsonArrayInsert(jModes, JsonInt(nValue)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "modes", jModes, AI_TABLE); + // ********** Buttons ********** + json jButtons = JsonArray(); + // Command buttons (0). + nValue = GetLocalInt(oAssociate, sWidgetButtonsVarname); + jButtons = JsonArrayInsert(jButtons, JsonInt(nValue)); + // AI buttons Group 1 (1). + nValue = GetLocalInt(oAssociate, sAIButtonsVarname); + jButtons = JsonArrayInsert(jButtons, JsonInt(nValue)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons, AI_TABLE); + // ********** AI Data ********** + json jAIData = JsonArray(); + nValue = GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT); + jAIData = JsonArrayInsert(jAIData, JsonInt(nValue)); + nValue = GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT); + jAIData = JsonArrayInsert(jAIData, JsonInt(nValue)); + nValue = GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT); + jAIData = JsonArrayInsert(jAIData, JsonInt(nValue)); + float fValue = GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE); + jAIData = JsonArrayInsert(jAIData, JsonFloat(fValue)); + fValue = GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE); + jAIData = JsonArrayInsert(jAIData, JsonFloat(fValue)); + fValue = GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE); + jAIData = JsonArrayInsert(jAIData, JsonFloat(fValue)); + fValue = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE); + jAIData = JsonArrayInsert(jAIData, JsonFloat(fValue)); + nValue = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION); + jAIData = JsonArrayInsert(jAIData, JsonInt(nValue)); + float fRange = 20.0; + if(nValue == 8) fRange = 10.0; + else if(nValue == 10) fRange = 35.0; + SetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE, fRange); + string sValue = GetLocalString(oAssociate, AI_DEFAULT_SCRIPT); + jAIData = JsonArrayInsert(jAIData, JsonString(sValue)); + fValue = GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE); + jAIData = JsonArrayInsert(jAIData, JsonFloat(fValue)); + json jValue = GetLocalJson(oPlayer, AI_SPELLS_WIDGET); + if(JsonGetType(jValue) == JSON_TYPE_NULL) + { + jValue = JsonArray(); + jValue = JsonArrayInsert(jValue, JsonInt(1)); // 0 - Class selected. + jValue = JsonArrayInsert(jValue, JsonInt(10)); // 1 - Level selected. + jValue = JsonArrayInsert(jValue, JsonArray()); // Spell list for widget. + SetLocalJson(oPlayer, AI_SPELLS_WIDGET, jValue); + } + jAIData = JsonArrayInsert(jAIData, jValue); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "aidata", jAIData); + // ********** LootFilters ********** + json jLootFilters = JsonArray(); + nValue = GetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT); + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(nValue)); + nValue = GetLocalInt(oAssociate, sLootFilterVarname); + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(nValue)); + int nIndex; + for(nIndex = 2; nIndex < 20; nIndex++) + { + nValue = GetLocalInt(oAssociate, AI_MIN_GOLD_ + IntToString(nIndex)); + jLootFilters = JsonArrayInsert(jLootFilters, JsonInt(nValue)); + } + ai_SetAssociateDbJson(oPlayer, sAssociateType, "lootfilters", jLootFilters, AI_TABLE); + // ********** Plugins ************ + // These are pulled straight from the database. + // ********** Locations ********** + // These are only in the database. +} +void ai_CheckAssociateData(object oPlayer, object oAssociate, string sAssociateType, int bLoad = FALSE) +{ + //ai_Debug("0i_main", "810", "Checking data for oAssociate: " + GetName(oAssociate)); + // Do quick check to see if they have a variable saved if so then exit. + if(GetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE) != 0.0) + { + if(!bLoad) return; + // If the database gets destroyed lets drop an error and restore values + // from the locals. + ai_CheckAssociateDataAndInitialize(oPlayer, sAssociateType); + ai_RestoreDatabase(oPlayer, oAssociate, sAssociateType); + return; + } + ai_CheckAssociateDataAndInitialize(oPlayer, sAssociateType); + // ********** Modes ********** + json jModes = ai_GetAssociateDbJson(oPlayer, sAssociateType, "modes"); + if(JsonGetType(JsonArrayGet(jModes, 0)) == JSON_TYPE_NULL) + { + ai_SetupModes(oPlayer, oAssociate, sAssociateType); + } + else + { + SetLocalInt(oAssociate, sAIModeVarname, JsonGetInt(JsonArrayGet(jModes, 0))); + SetLocalInt(oAssociate, sMagicModeVarname, JsonGetInt(JsonArrayGet(jModes, 1))); + } + // ********** Buttons ********** + json jButtons = ai_GetAssociateDbJson(oPlayer, sAssociateType, "buttons"); + if(JsonGetType(JsonArrayGet(jButtons, 0)) == JSON_TYPE_NULL) + { + ai_SetupButtons(oPlayer, oAssociate, sAssociateType); + } + else + { + // ********** Associate Command Buttons ********** + int nWidgetButtons = JsonGetInt(JsonArrayGet(jButtons, 0)); + if(nWidgetButtons) SetLocalInt(oAssociate, sWidgetButtonsVarname, nWidgetButtons); + // ********** Associate AI Buttons ********** + int nAIButtons = JsonGetInt(JsonArrayGet(jButtons, 1)); + if(nAIButtons) SetLocalInt(oAssociate, sAIButtonsVarname, nAIButtons); + } + // ********** AI Data ********** + json jAIData = ai_GetAssociateDbJson(oPlayer, sAssociateType, "aidata"); + if(JsonGetType(JsonArrayGet(jAIData, 0)) == JSON_TYPE_NULL) + { + ai_SetupAIData(oPlayer, oAssociate, sAssociateType); + } + else + { + SetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT, JsonGetInt(JsonArrayGet(jAIData, 0))); + SetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT, JsonGetInt(JsonArrayGet(jAIData, 1))); + SetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT, JsonGetInt(JsonArrayGet(jAIData, 2))); + SetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE, JsonGetFloat(JsonArrayGet(jAIData, 3))); + SetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE, JsonGetFloat(JsonArrayGet(jAIData, 4))); + SetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE, JsonGetFloat(JsonArrayGet(jAIData, 5))); + SetLocalFloat(oAssociate, AI_FOLLOW_RANGE, JsonGetFloat(JsonArrayGet(jAIData, 6))); + int nPercRange = JsonGetInt(JsonArrayGet(jAIData, 7)); + if(nPercRange < 8 || nPercRange > 11) nPercRange = 11; + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, nPercRange); + float fRange = 20.0; + if(nPercRange == 8) fRange = 10.0; + else if(nPercRange == 10) fRange = 35.0; + SetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE, fRange); + string sScript = JsonGetString(JsonArrayGet(jAIData, 8)); + if(sScript != "") SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); + json jDoorRange = JsonArrayGet(jAIData, 9); + if(JsonGetType(jDoorRange) == JSON_TYPE_NULL) + { + jAIData = JsonArrayInsert(jAIData, JsonFloat(20.0)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "aidata", jAIData); + SetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE, 20.0); + } + else SetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE, JsonGetFloat(jDoorRange)); + json jSpellsWidget = JsonArrayGet(jAIData, 10); + if(JsonGetType(jSpellsWidget) == JSON_TYPE_NULL) + { + jSpellsWidget = JsonArray(); + jSpellsWidget = JsonArrayInsert(jSpellsWidget, JsonInt(0)); // 0 - Class selected. + jSpellsWidget = JsonArrayInsert(jSpellsWidget, JsonInt(0)); // 1 - Level selected. + jAIData = JsonArrayInsert(jAIData, jSpellsWidget); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "aidata", jAIData); + SetLocalJson(oPlayer, AI_SPELLS_WIDGET, jSpellsWidget); + } + } + // ********** LootFilters ********** + json jLootFilters = ai_GetAssociateDbJson(oPlayer, sAssociateType, "lootfilters"); + if(JsonGetType(JsonArrayGet(jLootFilters, 0)) == JSON_TYPE_NULL) + { + ai_SetupLootFilters(oPlayer, oAssociate, sAssociateType); + } + else + { + SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, JsonGetInt(JsonArrayGet(jLootFilters, 0))); + SetLocalInt(oAssociate, sLootFilterVarname, JsonGetInt(JsonArrayGet(jLootFilters, 1))); + int nIndex; + for(nIndex = 2; nIndex < 20; nIndex++) + { + SetLocalInt(oAssociate, AI_MIN_GOLD_ + IntToString(nIndex), JsonGetInt(JsonArrayGet(jLootFilters, nIndex))); + } + } + // ********** Plugins ************ + // These are pulled straight from the database. + // ********** Locations ********** + json jLocations = ai_GetAssociateDbJson(oPlayer, sAssociateType, "locations"); + if(JsonGetType(JsonObjectGet(jLocations, AI_WIDGET_NUI)) == JSON_TYPE_NULL) + { + ai_SetupLocations(oPlayer, oAssociate, sAssociateType); + } + // They are always pulled from the database, so no copies to local variables. +} +void ai_SetupDMData(object oPlayer, string sName) +{ + //ai_Debug("0i_main", "870", GetName(oPlayer) + " is initializing DM data."); + ai_CheckDMDataAndInitialize(oPlayer); + // ********** Buttons ********** + json jButtons = JsonArray(); + jButtons = JsonArrayInsert(jButtons, JsonInt(0)); // DM Widget Buttons. + ai_SetCampaignDbJson("buttons", jButtons, sName, AI_DM_TABLE); + // ********** Plugins ************ + // These are pulled straight from the database. + json jPlugins = JsonArray(); + ai_SetCampaignDbJson("plugins", jPlugins, sName, AI_DM_TABLE); + // ********** Locations ********** + json jLocations = JsonObject(); + json jNUI = JsonObject(); + jNUI = JsonObjectSet(jNUI, "x", JsonFloat(-1.0)); + jNUI = JsonObjectSet(jNUI, "y", JsonFloat(-1.0)); + jLocations = JsonObjectSet(jLocations, AI_MAIN_NUI, jNUI); + jLocations = JsonObjectSet(jLocations, AI_PLUGIN_NUI, jNUI); + jNUI = JsonObjectSet(jLocations, "x", JsonFloat(1.0)); + jNUI = JsonObjectSet(jLocations, "y", JsonFloat(1.0)); + jLocations = JsonObjectSet(jLocations, AI_WIDGET_NUI, jNUI); + ai_SetCampaignDbJson("locations", jLocations, sName, AI_DM_TABLE); + // ********** Options ********** + json jOptions = JsonArray(); + ai_SetCampaignDbJson("options", jOptions, sName, AI_DM_TABLE); + // ********** SaveSlots ********** + json jSaveSlots = JsonObject(); + ai_SetCampaignDbJson("saveslots", jSaveSlots, sName, AI_DM_TABLE); +} +void ai_CheckDMData(object oPlayer) +{ + //ai_Debug("0i_main", "898", "Checking data for DM: " + GetName(oPlayer)); + string sName = ai_RemoveIllegalCharacters(GetName(oPlayer)); + // ********** Buttons ********** + json jButtons = ai_GetCampaignDbJson("buttons", sName, AI_DM_TABLE); + // if there is no saved AImodes then set the defaults. + if(JsonGetType(JsonArrayGet(jButtons, 0)) == JSON_TYPE_NULL) + { + ai_SetupDMData(oPlayer, sName); + } + else + { + //ai_Debug("0i_main", "909", GetName(oPlayer) + " is loading DM data from the database."); + // Get data from the database and place on to the associates and player. + // ********** Buttons ********** + json jButtons = ai_GetCampaignDbJson("buttons", sName, AI_DM_TABLE); + if(JsonGetType(JsonArrayGet(jButtons, 0)) == JSON_TYPE_NULL) + { + ai_SetupDMData(oPlayer, sName); + } + SetLocalInt(oPlayer, sDMWidgetButtonVarname, JsonGetInt(JsonArrayGet(jButtons, 0))); + // ********** Associate Command Buttons ********** + int nWidgetButtons = JsonGetInt(JsonArrayGet(jButtons, 0)); + SetLocalInt(oPlayer, sDMWidgetButtonVarname, nWidgetButtons); + // ********** Plugins ************ + // These are pulled straight from the database. + // ********** Locations ********** + // These are pulled straight from the database. + // ********** Options ********** + // ********** SaveSltos ********** + } +} +json ai_Plugin_Add(object oPC, json jPlugins, string sPluginScript) +{ + if(ResManGetAliasFor(sPluginScript, RESTYPE_NCS) == "") + { + ai_SendMessages("The script (" + sPluginScript + ") was not found by ResMan!", AI_COLOR_RED, oPC); + return jPlugins; + } + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + if(JsonGetString(JsonArrayGet(jPlugin, 0)) == sPluginScript) + { + ai_SendMessages("Plugin (" + sPluginScript + ") is already installed!", AI_COLOR_RED, oPC); + return jPlugins; + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + SetLocalInt(oPC, AI_ADD_PLUGIN, TRUE); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugins); + ExecuteScript(sPluginScript, oPC); + int nPluginSet = GetLocalInt(oPC, AI_PLUGIN_SET); + // Setting AI_PLUGIN_SET to -1 means the plugin failed to load. + if(nPluginSet == -1) return jPlugins; + if(nPluginSet) + { + jPlugin = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + } + else + { + jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString(sPluginScript)); + jPlugin = JsonArrayInsert(jPlugin, JsonBool(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString(sPluginScript)); + int nCount = JsonGetLength(jPlugins) + 1; + string sIcon = "is_summon" + IntToString(nCount); + jPlugin = JsonArrayInsert(jPlugin, JsonString(sIcon)); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + } + DeleteLocalInt(oPC, AI_ADD_PLUGIN); + DeleteLocalInt(oPC, AI_PLUGIN_SET); + DeleteLocalJson(oPC, AI_JSON_PLUGINS); + return jPlugins; +} +// Temporary function to addapt old plugin json to new plugin json. +json ai_CheckOldPluginJson(object oPC) +{ + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + // If the first array is not an array then this is the old version. + if(JsonGetType(jPlugin) != JSON_TYPE_ARRAY) + { + string sScript; + json jNewPlugins = JsonArray(); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sScript = JsonGetString(jPlugin); + if(sScript != "") jNewPlugins = ai_Plugin_Add(oPC, jNewPlugins, sScript); + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + + } + ai_SetAssociateDbJson(oPC, "pc", "plugins", jNewPlugins); + return jNewPlugins; + } + return jPlugins; +} +json ai_UpdatePluginsForPC(object oPC) +{ + // Check if the server is running or single player. + if(!AI_SERVER) return ai_CheckOldPluginJson(oPC); + int nJsonType, nCounter, nIndex, bWidget, bAllow; + string sScript, sName, sIcon; + json jServerPlugins = ai_GetCampaignDbJson("plugins"); + json jPCPlugin, jPCPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + json jNewPCPlugins = JsonArray(); + json jServerPlugin = JsonArrayGet(jServerPlugins, nIndex); + while(JsonGetType(jServerPlugin) != JSON_TYPE_NULL) + { + bAllow = JsonGetInt(JsonArrayGet(jServerPlugin, 1)); + if(bAllow) + { + sName = JsonGetString(JsonArrayGet(jServerPlugin, 0)); + nCounter = 0; + jPCPlugin = JsonArrayGet(jPCPlugins, nCounter); + nJsonType = JsonGetType(jPCPlugin); + while(nJsonType != JSON_TYPE_NULL) + { + if(sName == JsonGetString(JsonArrayGet(jPCPlugin, 0))) + { + // Boolean - Add to widget. + bWidget = JsonGetInt(JsonArrayGet(jPCPlugin, 1)); + jServerPlugin = JsonArraySet(jServerPlugin, 1, JsonBool(bWidget)); + break; + } + jPCPlugin = JsonArrayGet(jPCPlugins, ++nCounter); + nJsonType = JsonGetType(jPCPlugin); + } + if(nJsonType == JSON_TYPE_NULL) + { + jServerPlugin = JsonArraySet(jServerPlugin, 1, JsonBool(FALSE)); + } + jNewPCPlugins = JsonArrayInsert(jNewPCPlugins, jServerPlugin); + } + jServerPlugin = JsonArrayGet(jServerPlugins, ++nIndex); + } + ai_SetAssociateDbJson(oPC, "pc", "plugins", jNewPCPlugins); + return jNewPCPlugins; +} +json ai_UpdatePluginsForDM(object oPC) +{ + int nJsonType, nCounter, nIndex, bWidget, bAllow; + string sName, sIcon, sDbName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jServerPlugins = ai_GetCampaignDbJson("plugins"); + ai_CheckDMDataAndInitialize(oPC); + json jDMPlugin, jDMPlugins = ai_GetCampaignDbJson("plugins", sDbName, AI_DM_TABLE); + json jNewDMPlugins = JsonArray(); + json jServerPlugin = JsonArrayGet(jServerPlugins, nIndex); + while(JsonGetType(jServerPlugin) != JSON_TYPE_NULL) + { + sName = JsonGetString(JsonArrayGet(jServerPlugin, 0)); + nCounter = 0; + jDMPlugin = JsonArrayGet(jDMPlugins, nCounter); + nJsonType = JsonGetType(jDMPlugin); + while(nJsonType != JSON_TYPE_NULL) + { + if(sName == JsonGetString(JsonArrayGet(jDMPlugin, 0))) + { + // Boolean - Add to widget. + bWidget = JsonGetInt(JsonArrayGet(jDMPlugin, 1)); + jServerPlugin = JsonArraySet(jServerPlugin, 1, JsonBool(bWidget)); + break; + } + jDMPlugin = JsonArrayGet(jDMPlugins, ++nCounter); + nJsonType = JsonGetType(jDMPlugin); + } + if(nJsonType == JSON_TYPE_NULL) + { + jServerPlugin = JsonArraySet(jServerPlugin, 1, JsonBool(FALSE)); + } + jNewDMPlugins = JsonArrayInsert(jNewDMPlugins, jServerPlugin); + jServerPlugin = JsonArrayGet(jServerPlugins, ++nIndex); + } + ai_SetCampaignDbJson("plugins", jNewDMPlugins, sDbName, AI_DM_TABLE); + return jNewDMPlugins; +} +void ai_StartupPlugins(object oPC) +{ + SetLocalInt(oPC, AI_STARTING_UP, TRUE); + int bUpdatePlugins; + string sScript; + json jPlugins; + if(GetIsDM(oPC)) jPlugins = ai_UpdatePluginsForDM(oPC); + else jPlugins = ai_UpdatePluginsForPC(oPC); + // We delete this so each mod can be added that legally loads. + DeleteLocalJson(GetModule(), AI_MONSTER_MOD_JSON); + int nIndex; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sScript = JsonGetString(JsonArrayGet(jPlugin, 0)); + ExecuteScript(sScript, oPC); + // -1 means if failed to load so lets make sure to remove it from the list. + if(GetLocalInt(oPC, AI_PLUGIN_SET) == -1) + { + jPlugins = JsonArrayDel(jPlugins, nIndex); + bUpdatePlugins = TRUE; + nIndex--; + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + if(bUpdatePlugins) ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); + DeleteLocalInt(oPC, AI_STARTING_UP); +} diff --git a/_module/nss/0i_menus.nss b/_module/nss/0i_menus.nss new file mode 100644 index 00000000..8d6834ce --- /dev/null +++ b/_module/nss/0i_menus.nss @@ -0,0 +1,4823 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_menus +//////////////////////////////////////////////////////////////////////////////// + Include script for handling NUI menus. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "0i_associates" +// Maximum number of Plugins allowed on the players widget. +const int WIDGET_MAX_PLUGINS = 5; + +// Set one of the BTN_* "Widget" bitwise constants on oPlayer to bValid. +void ai_SetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); +// Return if nButton is set on oPlayer. Uses the BTN_* "Widget" bitwise constants. +int ai_GetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType); +// Set one of the BTN_AI_* bitwise constants on oPlayer to bValid. +void ai_SetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); +// Return if nButton is set on oPlayer. Uses the BTN_AI_* "Widget" bitwise constants. +int ai_GetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType); +// Set one of the BTN2_AI_* bitwise constants on oPlayer to bValid. +void ai_SetAIButton2(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); +// Return if nButton is set on oPlayer. Uses the BTN2_AI_* "Widget" bitwise constants. +int ai_GetAIButton2(object oPlayer, int nButton, object oAssociate, string sAssociateType); +// Creates the json array required to build a companion drop down box for +// Animal Companions or Familiars. +// sCompanion2da should be either "hen_companion" or "hen_familiar". +json ai_CreateCompanionJson(object oPC, string sCompanion2da); +// Return any Metamagic or Domain attributes to place on a spell icon image. +string ai_GetSpellIconAttributes(object oCaster, int nMetaMagic, int nDomain); +// Creates the AI options menu. +void ai_CreateAIMainNUI(object oPC); +// Creates the AI options menu. +void ai_CreateAssociateCommandNUI(object oPC, object oAssociate); +// Creates an associates AI NUI. +void ai_CreateAssociateAINUI(object oPC, object oAssociate); +// Creates a widget for the player or associate. +void ai_CreateWidgetNUI(object oPC, object oAssociate); +// Creates the Loot filter menu. +void ai_CreateLootFilterNUI(object oPC, object oAssociate); +// Creates the Plugin Manager menu. +void ai_CreatePluginNUI(object oPC); +// Creates the Spell menu that selects the spells to go on the Spell Widget. +void ai_CreateQuickWidgetSelectionNUI(object oPC, object oAssociate); +// Creates the Spell menu that lets the player to select the associates castable spells. +void ai_CreateSpellMemorizationNUI(object oPC, object oAssociate); +// Creates the spell description menu so a player can see what a spell does. +// If nSpell > 0 then use that value for the spells description. +void ai_CreateDescriptionNUI(object oPC, json jSpell, int nSpell = 0); + +string ai_GetRandomTip() +{ + int nRoll; + if(AI_SERVER) nRoll = Random(26); + else nRoll = Random(46); + return Get2DAString("ai_messages", "Text", nRoll); +} +void ai_SetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE) +{ + int nWidgetButtons = GetLocalInt(oAssociate, sWidgetButtonsVarname); + json jButtons = ai_GetAssociateDbJson(oPlayer, sAssociateType, "buttons"); + if(bOn) nWidgetButtons = nWidgetButtons | nButton; + else nWidgetButtons = nWidgetButtons & ~nButton; + SetLocalInt(oAssociate, sWidgetButtonsVarname, nWidgetButtons); + jButtons = JsonArraySet(jButtons, 0, JsonInt(nWidgetButtons)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons); +} +int ai_GetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType) +{ + // This is the DM access switch that uses the same bitwise as the players + // to control what widget buttons they can use. + if(ai_GetDMWAccessButton(nButton)) return FALSE; + int nWidgetButtons = GetLocalInt(oAssociate, sWidgetButtonsVarname); + return nWidgetButtons & nButton; +} +void ai_SetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE) +{ + int nAIButtons = GetLocalInt(oAssociate, sAIButtonsVarname); + json jButtons = ai_GetAssociateDbJson(oPlayer, sAssociateType, "buttons"); + if(bOn) nAIButtons = nAIButtons | nButton; + else nAIButtons = nAIButtons & ~nButton; + SetLocalInt(oAssociate, sAIButtonsVarname, nAIButtons); + jButtons = JsonArraySet(jButtons, 1, JsonInt(nAIButtons)); + ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons); +} +int ai_GetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType) +{ + // This is the DM access switch that uses the same bitwise as the players + // to control what AI widget buttons they can use. + if(ai_GetDMAIAccessButton(nButton)) return FALSE; + int nAIButtons = GetLocalInt(oAssociate, sAIButtonsVarname); + return nAIButtons & nButton; +} +json ai_CreateAIScriptJson(object oPC) +{ + json jScript = JsonArrayInsert(JsonArray(), NuiComboEntry("", 0)); + int nNth = 1; + string sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, nNth); + while(sScript != "") + { + jScript = JsonArrayInsert(jScript, NuiComboEntry(sScript, nNth)); + sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, ++nNth); + } + return jScript; +} +json ai_CreateCompanionJson(object oPC, string sCompanion2da) +{ + int nCnt, nMaxRowCount = Get2DARowCount(sCompanion2da); + string sName; + json jCompanion = JsonArray(); + while(nCnt < nMaxRowCount) + { + sName = GetStringByStrRef(StringToInt(Get2DAString(sCompanion2da, "STRREF", nCnt))); + jCompanion = JsonArrayInsert(jCompanion, NuiComboEntry(sName, nCnt++)); + } + return JsonArrayInsert(jCompanion, NuiComboEntry("Random", nCnt)); +} +string ai_GetSpellIconAttributes(object oCaster, int nMetaMagic, int nDomain) +{ + string sAttributeText; + if(nMetaMagic != METAMAGIC_ANY && nMetaMagic != METAMAGIC_NONE) + { + if(nMetaMagic == METAMAGIC_EXTEND) sAttributeText = "X"; + if(nMetaMagic == METAMAGIC_EMPOWER) sAttributeText = "P"; + if(nMetaMagic == METAMAGIC_MAXIMIZE) sAttributeText = "M"; + if(nMetaMagic == METAMAGIC_QUICKEN) sAttributeText = "Q"; + if(nMetaMagic == METAMAGIC_SILENT) sAttributeText = "I"; + if(nMetaMagic == METAMAGIC_STILL) sAttributeText = "T"; + } + else sAttributeText = ""; + if(nDomain > 0) sAttributeText += "D"; + return sAttributeText; +} +void ai_CreateAIMainNUI(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int nMonsterAI = (ResManGetAliasFor("ai_default", RESTYPE_NCS) != ""); + int nAssociateAI = (ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != ""); + string sText = " [Single player]"; + if(AI_SERVER) sText = " [Server]"; + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, PHILOS_VERSION + sText, "lbl_version ", 510.0f, 20.0f, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 101 + jRow = CreateLabel(JsonArray(), "", "lbl_ai_info", 510.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 500 / 129 + jRow = CreateButton(JsonArray(), "Plugin Manager", "btn_plugin_manager", 120.0f, 20.0f, -1.0, "btn_plugin_manager_tooltip"); + if(nAssociateAI) jRow = CreateButtonSelect(jRow, "Associate Widgets", "btn_toggle_assoc_widget", 140.0f, 20.0f, "btn_assoc_widget_tooltip"); + jRow = CreateButtonSelect(jRow, "Action Ghost Mode", "btn_action_ghost", 160.0f, 20.0f, "btn_action_ghost_tooltip"); + jRow = CreateButtonSelect(jRow, "Effect Icons", "btn_effect_icon", 100.0f, 20.0f, "btn_effect_icon_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 500 / 157 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "MODULE RULES", "lbl_ai_rules", 200.0f, 20.0f, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 157.0; + // Row 5 ******************************************************************* 500 / --- (28) + // Make the AI options a Group. + json jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_max_henchman", 2, FALSE, 30.0f, 20.0f, "txt_max_henchman_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "Max number of henchmen that is allowed in your party.", "lbl_max_hench", 416.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_max_henchman_tooltip"); + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_xp_scale", 3, FALSE, 40.0f, 20.0f, "txt_xp_scale_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "Modules experience scale.", "lbl_xp_scale", 175.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_xp_scale_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " scale to party.", "chbx_party_scale", 150.0, 20.0, "chbx_party_scale_tooltip"); + jGroupRow = CreateButton(jGroupRow, "Default", "btn_default_xp", 70.0f, 20.0f, -1.0, "btn_default_xp_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 78.0; + if(nMonsterAI || nAssociateAI) + { + jGroupRow = CreateCheckBox(JsonArray(), " Creatures will use advanced combat movement.", "chbx_advanced_movement", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Use item level restrictions for creatures [Default is off].", "chbx_ilr", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use the skill Use Magic Device.", "chbx_umd", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use Healing kits.", "chbx_use_healingkits", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Moral checks, wounded creatures may flee during combat.", "chbx_moral", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), " Spells the AI will not use:", "lbl_restrict_spells", 190.0, 20.0, NUI_HALIGN_LEFT); + jGroupRow = CreateCheckBox(jGroupRow, " Darkness", "chbx_darkness", 90.0, 20.0, "chbx_darkness_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " Dispels", "chbx_dispels", 90.0, 20.0, "chbx_dispels_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " Time Stop", "chbx_timestop", 90.0, 20.0, "chbx_timestop_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 196.0; + } + if(nMonsterAI) + { + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_ai_difficulty", 3, FALSE, 40.0f, 20.0f, "txt_ai_difficulty_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "% chance monsters will attack the weakest target.", "lbl_ai_difficulty", 406.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_ai_difficulty_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_perception_distance", 2, FALSE, 35.0f, 20.0f, "txt_perception_distance_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "meters is the distance a monster can respond to allies.", "lbl_perception_distance", 411.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "txt_perception_distance_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can prebuff before combat starts.", "chbx_buff_monsters", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use summons before combat starts.", "chbx_buff_summons", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use tactics (ambush, defensive, flanker, etc).", "chbx_ambush_monsters", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "Add ", "lbl_inc_enc", 30.0, 20.0, NUI_HALIGN_LEFT, 0, -1.0); + jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_inc_enc", 4, FALSE, 55.0f, 20.0f, "txt_inc_enc_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "monsters per spawned encounter monster.", "lbl_inc_enc", 357.0, 20.0, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "txt_inc_enc_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_inc_hp", 3, FALSE, 40.0f, 20.0f, "txt_inc_hp_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "% increase in all monster's hitpoints.", "lbl_inc_hp", 406.0, 20.0, NUI_HALIGN_LEFT); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "***** WARNING! The options below may break the module! *****", "lbl_warning", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can wander upto ", "chbx_wander", 220.0, 20.0, "chbx_warning_tooltip"); + jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_wander_distance", 2, FALSE, 35.0f, 20.0f, "chbx_warning_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "meters and ", "lbl_wander_distance", 80.0f, 20.0f, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "chbx_warning_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, "open doors.", "chbx_open_doors", 100.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can summon companions.", "chbx_companions", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Summoned associates to remain after masters death.", "chbx_perm_assoc", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Make enemy corpses remain.", "chbx_corpses_stay", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_perc_dist", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "lbl_perc_dist_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 336.0; + } + jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + json jLocations = ai_GetAssociateDbJson(oPC, "pc", "locations"); + jLocations = JsonObjectGet(jLocations, AI_MAIN_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, AI_MAIN_NUI, sName + " PEPS Main Menu", + fX, fY, 534.0f, fHeight, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArray(); + jData = JsonArrayInsert(jData, JsonString(ObjectToString(oPC))); + NuiSetUserData(oPC, nToken, jData); + object oModule = GetModule(); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 - Version label. + // Row 2 + int nUsing; + // Check the monster AI. + string sLocation = ResManGetAliasFor("ai_default", RESTYPE_NCS); + if(sLocation != "") + { + nUsing = TRUE; + string sLocation = ResManGetAliasFor("nw_c2_default1", RESTYPE_NCS); + if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; + if(nUsing) sText = "Monster AI working"; + else sText = "Monster AI not working"; + } + else sText = "Monster AI not loaded"; + // Check the associate AI. + sLocation = ResManGetAliasFor("ai_a_default", RESTYPE_NCS); + if(sLocation != "") + { + nUsing = TRUE; + string sLocation = ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS); + if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; + if(nUsing) sText += ", Associate AI working"; + else sText += ", Associate AI not working"; + } + else sText += ", Associate AI not loaded"; + // Check for PRC. + sLocation = ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS); + if(sLocation != "") sText += ", PRC loaded."; + else + { + // Check the player AI. + sLocation = ResManGetAliasFor("xx_pc_1_hb", RESTYPE_NCS); + if(sLocation != "") sText += ", Player AI loaded."; + else sText += ", Player AI not loaded."; + } + NuiSetBind(oPC, nToken, "lbl_ai_info_label", JsonString(sText)); + // Row 3 + NuiSetBind(oPC, nToken, "btn_plugin_manager_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_plugin_manager_tooltip", JsonString(" Manages external executable scripts.")); + if(nAssociateAI) + { + NuiSetBind(oPC, nToken, "btn_toggle_assoc_widget_event", JsonBool(TRUE)); + int bWidgetOn = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, OBJECT_INVALID, "pc"); + NuiSetBind(oPC, nToken, "btn_toggle_assoc_widget", JsonBool(bWidgetOn)); + NuiSetBind(oPC, nToken, "btn_assoc_widget_tooltip", JsonString(" Turns On/Off all associate widgets.")); + } + int bActionGhost = ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST); + NuiSetBind(oPC, nToken, "btn_action_ghost", JsonBool (bActionGhost)); + NuiSetBind(oPC, nToken, "btn_action_ghost_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_action_ghost_tooltip", JsonString(" Allows associates to move through creatures while in command mode.")); + int bEffectIcon = ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT); + NuiSetBind(oPC, nToken, "btn_effect_icon", JsonBool (bEffectIcon)); + NuiSetBind(oPC, nToken, "btn_effect_icon_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_effect_icon_tooltip", JsonString(" When on sends effect icon reports to the chat screen.")); + // Row 3 Label for AI RULES + // Row 4 + NuiSetBind(oPC, nToken, "txt_max_henchman", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_MAX_HENCHMAN)))); + NuiSetBindWatch (oPC, nToken, "txt_max_henchman", TRUE); + NuiSetBind(oPC, nToken, "txt_max_henchman_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_max_henchman_tooltip", JsonString(" Set max number of henchman allowed (1-12).")); + NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(IntToString(GetModuleXPScale()))); + NuiSetBindWatch (oPC, nToken, "txt_xp_scale", TRUE); + NuiSetBind(oPC, nToken, "txt_xp_scale_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_xp_scale_tooltip", JsonString(" Set the modules XP scale (0 - 200) Normal D&D is 10.")); + NuiSetBind(oPC, nToken, "chbx_party_scale_check", JsonBool(GetLocalInt(oModule, AI_RULE_PARTY_SCALE))); + NuiSetBindWatch(oPC, nToken, "chbx_party_scale_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_party_scale_event", JsonBool(TRUE)); + sText = IntToString(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); + NuiSetBind(oPC, nToken, "chbx_party_scale_tooltip", JsonString(" PEPS adjusts your XP based on party size from (" + sText + ").")); + NuiSetBind(oPC, nToken, "btn_default_xp_event", JsonBool(TRUE)); + sText = IntToString(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); + NuiSetBind(oPC, nToken, "btn_default_xp_tooltip", JsonString(" Reset the Modules XP to (" + sText + ").")); + NuiSetBind(oPC, nToken, "chbx_warning_tooltip", JsonString(" ** This will break some modules! ** See Readme for issues!")); + if(nMonsterAI) + { + NuiSetBind(oPC, nToken, "txt_ai_difficulty", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_AI_DIFFICULTY)))); + NuiSetBindWatch(oPC, nToken, "txt_ai_difficulty", TRUE); + NuiSetBind(oPC, nToken, "txt_ai_difficulty_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_buff_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_BUFF_MONSTERS))); + NuiSetBindWatch(oPC, nToken, "chbx_buff_monsters_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_monsters_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_buff_summons_check", JsonBool(GetLocalInt(oModule, AI_RULE_PRESUMMON))); + NuiSetBindWatch(oPC, nToken, "chbx_buff_summons_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_summons_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_ambush_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_AMBUSH))); + NuiSetBindWatch(oPC, nToken, "chbx_ambush_monsters_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ambush_monsters_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_companions_check", JsonBool(GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS))); + NuiSetBindWatch(oPC, nToken, "chbx_companions_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_companions_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_perm_assoc_check", JsonBool(GetLocalInt(oModule, AI_RULE_PERM_ASSOC))); + string sModuleName = GetModuleName(); + if(!GetLocalInt(oModule, AI_USING_PRC) && + (sModuleName != "Neverwinter Nights - Infinite Dungeons" || + sModuleName != "Infinite Dungeons [PRC8]")) + { + NuiSetBindWatch(oPC, nToken, "chbx_perm_assoc_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_perm_assoc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_corpses_stay_check", JsonBool(GetLocalInt(oModule, AI_RULE_CORPSES_STAY))); + NuiSetBindWatch(oPC, nToken, "chbx_corpses_stay_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_corpses_stay_event", JsonBool(TRUE)); + } + NuiSetBind(oPC, nToken, "txt_perception_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE), 0, 0))); + NuiSetBindWatch(oPC, nToken, "txt_perception_distance", TRUE); + NuiSetBind(oPC, nToken, "txt_perception_distance_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_perception_distance_tooltip", JsonString(" Range [10 to 60 meters] from the player.")); + NuiSetBindWatch(oPC, nToken, "lbl_perc_dist", TRUE); + int nPercDist = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE); + if(nPercDist < 8 || nPercDist > 11) + { + nPercDist = 11; + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, 11); + } + if(nPercDist == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; + else if(nPercDist == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; + else if(nPercDist == 10) sText = " Monster perception: Long [35 Sight / 20 Listen]"; + else sText = " Monster perception: Default [Monster's default values]"; + NuiSetBind(oPC, nToken, "lbl_perc_dist_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "lbl_perc_dist_tooltip", JsonString(" Use the mouse wheel to change values.")); + int bWander = GetLocalInt(oModule, AI_RULE_WANDER); + NuiSetBind(oPC, nToken, "chbx_wander_check", JsonBool(bWander)); + NuiSetBindWatch(oPC, nToken, "chbx_wander_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_wander_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_wander_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE), 0, 0))); + NuiSetBindWatch(oPC, nToken, "txt_wander_distance", TRUE); + NuiSetBind(oPC, nToken, "txt_wander_distance_event", JsonBool(bWander)); + NuiSetBind(oPC, nToken, "chbx_open_doors_check", JsonBool(GetLocalInt(oModule, AI_RULE_OPEN_DOORS))); + NuiSetBindWatch(oPC, nToken, "chbx_open_doors_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_open_doors_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_open_doors_tooltip", JsonString(" This allows monsters to open doors to hunt you down!")); + NuiSetBind(oPC, nToken, "txt_inc_enc_tooltip", JsonString(" Spawns one extra monster per counter above 1. Adds value to counter per encounter monster spawned.")); + NuiSetBind(oPC, nToken, "txt_inc_enc", JsonString(FloatToString(GetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS), 0, 2))); + NuiSetBindWatch(oPC, nToken, "txt_inc_enc", TRUE); + NuiSetBind(oPC, nToken, "txt_inc_enc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_inc_hp", JsonString(IntToString(GetLocalInt(oModule, AI_INCREASE_MONSTERS_HP)))); + NuiSetBindWatch(oPC, nToken, "txt_inc_hp", TRUE); + NuiSetBind(oPC, nToken, "txt_inc_hp_event", JsonBool(TRUE)); + } + if(nMonsterAI || nAssociateAI) + { + NuiSetBind(oPC, nToken, "chbx_moral_check", JsonBool(GetLocalInt(oModule, AI_RULE_MORAL_CHECKS))); + NuiSetBindWatch (oPC, nToken, "chbx_moral_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_moral_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_advanced_movement_check", JsonBool(GetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT))); + NuiSetBindWatch (oPC, nToken, "chbx_advanced_movement_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_advanced_movement_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_ilr_check", JsonBool(GetLocalInt(oModule, AI_RULE_ILR))); + NuiSetBindWatch (oPC, nToken, "chbx_ilr_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ilr_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_umd_check", JsonBool(GetLocalInt(oModule, AI_RULE_ALLOW_UMD))); + NuiSetBindWatch (oPC, nToken, "chbx_umd_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_umd_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_use_healingkits_check", JsonBool(GetLocalInt(oModule, AI_RULE_HEALERSKITS))); + NuiSetBindWatch (oPC, nToken, "chbx_use_healingkits_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_use_healingkits_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_darkness_check", JsonBool(ai_SpellRestricted(SPELL_DARKNESS))); + NuiSetBindWatch (oPC, nToken, "chbx_darkness_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_darkness_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_darkness_tooltip", JsonString(" AI will not use the Darkness spell in combat.")); + NuiSetBind(oPC, nToken, "chbx_dispels_check", JsonBool(ai_SpellRestricted(SPELL_DISPEL_MAGIC))); + NuiSetBindWatch (oPC, nToken, "chbx_dispels_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_dispels_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_dispels_tooltip", JsonString(" AI will not use any of the Dispel spells in combat.")); + NuiSetBind(oPC, nToken, "chbx_timestop_check", JsonBool(ai_SpellRestricted(SPELL_TIME_STOP))); + NuiSetBindWatch (oPC, nToken, "chbx_timestop_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_timestop_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_timestop_tooltip", JsonString(" AI will not use the Time Stop spell in combat.")); + } +} +void ai_CreateAssociateCommandNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int bRight, bLeft; + int bIsPC = ai_GetIsCharacter(oAssociate); + int bUsingPCAI = ResManGetAliasFor("xx_pc_1_hb", RESTYPE_NCS) != ""; + int bUsingHenchAI = ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS) != ""; + float fHeight = 73.0; + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 73 + json jRow = JsonArray(); + json jCol = JsonArray(); + // If all the AI buttons are blocked then don't load the menu. + if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) + { + if(bIsPC) + { + if(bUsingPCAI || !AI_SERVER) + { + if(bUsingPCAI) + { + jRow = CreateButton(jRow, "AI Menu", "btn_ai_menu", 232.0, 20.0, -1.0, "btn_ai_menu_tooltip"); + } + if(!AI_SERVER) + { + jRow = CreateButton(jRow, "Main Menu", "btn_main_menu", 232.0, 20.0, -1.0, "btn_main_menu_tooltip"); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + } + else + { + if(bUsingHenchAI) + { + jRow = CreateButton(jRow, "AI Menu", "btn_ai_menu", 232.0, 20.0, -1.0, "btn_ai_menu_tooltip"); + } + jRow = CreateButtonSelect(jRow, "", "btn_widget_onoff", 232.0, 20.0, "btn_widget_onoff_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + } + // Row 2 ******************************************************************* 500 / 101 + jRow = JsonArray(); + jRow = CreateButtonSelect(jRow, "Lock Widget", "btn_widget_lock", 154.0, 20.0, "btn_widget_lock_tooltip"); + jRow = CreateButton(jRow, "Copy Settings", "btn_copy_settings", 154.0, 20.0, -1.0, "btn_copy_settings_tooltip"); + jRow = CreateButtonSelect(jRow, "Vertical Widget", "btn_vertical_widget", 154.0, 20.0, "btn_vertical_widget_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 500 / 129 + bRight = !ai_GetDMWAccessButton(BTN_CMD_ACTION); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_GUARD); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "", "btn_cmd_action", 200.0, 20.0, -1.0, "btn_cmd_action_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_action", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "", "btn_cmd_guard", 200.0, 20.0, -1.0, "btn_cmd_guard_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_guard", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 4 ******************************************************************* 500 / 157 + jRow = JsonArray(); + bRight = !ai_GetDMWAccessButton(BTN_CMD_HOLD); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_ATTACK); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "", "btn_cmd_hold", 200.0, 20.0, -1.0, "btn_cmd_hold_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_hold", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "", "btn_cmd_attack", 200.0, 20.0, -1.0, "btn_cmd_attack_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_attack", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 5 ******************************************************************* 500 / 213 + bRight = !ai_GetDMWAccessButton(BTN_CMD_FOLLOW); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_FOLLOW_TARGET); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "", "btn_cmd_follow", 200.0, 20.0, -1.0, "btn_cmd_follow_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_follow", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Select follow target", "btn_follow_target", 200.0, 20.0, -1.0, "btn_follow_target_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_follow_target", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 6 ******************************************************************* 500 / 185 + if(bIsPC) + { + bRight = !ai_GetDMWAccessButton(BTN_CMD_SEARCH); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_STEALTH); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "All Search Mode", "btn_cmd_search", 200.0, 20.0, -1.0, "btn_cmd_search_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_search", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "All Stealth Mode", "btn_cmd_stealth", 200.0, 20.0, -1.0, "btn_cmd_stealth_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_stealth", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + } + // Row 7 ******************************************************************* 500 / 241 + bRight = !ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_PLACE_TRAP); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Combat Tactics", "btn_cmd_ai_script", 200.0, 20.0, -1.0, "btn_cmd_ai_script_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_ai_script", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Place a Trap", "btn_cmd_place_trap", 200.0, 20.0, -1.0, "btn_cmd_place_trap_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_place_trap", 25.0, 20.0); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 8 ******************************************************************* 500 / --- + int bMemorize = ai_GetIsSpellCaster(oAssociate); + int bSpellbook = ai_GetIsSpellBookRestrictedCaster(oAssociate); + bRight = !ai_GetDMWAccessButton(BTN_CMD_SPELL_WIDGET); + bLeft = !ai_GetDMWAccessButton(BTN_DM_CMD_MEMORIZE); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Set Quick Widget", "btn_quick_widget", 200.0, 20.0, -1.0, "btn_quick_widget_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_quick_widget", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) // Memorizes their spells. + { + if(bMemorize == 2 && bSpellbook) + { + jRow = CreateButton(jRow, "Memorize Spells", "btn_spell_memorize", 114.0, 20.0, -1.0, "btn_spell_memorize_tooltip"); + jRow = CreateButton(jRow, "Known Spells", "btn_spell_known", 110.0, 20.0, -1.0, "btn_spell_known_tooltip"); + } + else if(bMemorize == 2) + { + jRow = CreateButton(jRow, "Set Memorize Spells", "btn_spell_memorize", 200.0, 20.0, -1.0, "btn_spell_memorize_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_1", 25.0, 20.0); + } + else if(bSpellbook && !ai_GetIsCharacter(oAssociate)) + { + jRow = CreateButton(jRow, "Set Known Spells", "btn_spell_known", 200.0, 20.0, -1.0, "btn_spell_known_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_1", 25.0, 20.0); + } + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 9 ******************************************************************* 500 / 269 + bRight = !ai_GetDMWAccessButton(BTN_BUFF_SHORT); + bLeft = !ai_GetDMWAccessButton(BTN_BUFF_LONG); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Cast Short Buff spells", "btn_buff_short", 200.0, 20.0, -1.0, "btn_buff_short_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_short", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Cast Long Buff spells", "btn_buff_long", 200.0, 20.0, -1.0, "btn_buff_long_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_long", 25.0, 20.0); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 10 ******************************************************************* 500 / 297 + bRight = !ai_GetDMWAccessButton(BTN_BUFF_ALL); + bLeft = !ai_GetDMWAccessButton(BTN_BUFF_REST); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Cast All Buff spells", "btn_buff_all", 200.0, 20.0, -1.0, "btn_buff_all_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_all", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Buff after resting", "btn_buff_rest", 200.0, 20.0, -1.0, "btn_buff_rest_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_rest", 25.0, 20.0); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 11 ******************************************************************* 500 / 325 + bRight = !ai_GetDMWAccessButton(BTN_CMD_JUMP_TO); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_GHOST_MODE); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "", "btn_jump_to", 200.0, 20.0, -1.0, "btn_jump_to"); + jRow = CreateCheckBox(jRow, "", "chbx_jump_to", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Ghost Mode", "btn_ghost_mode", 200.0, 20.0, -1.0, "btn_ghost_mode_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ghost_mode", 25.0, 20.0); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 12 ****************************************************************** 500 / 353 + bRight = !ai_GetDMWAccessButton(BTN_CMD_CAMERA); + bLeft = !ai_GetDMWAccessButton(BTN_CMD_INVENTORY); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Toggle Camera Focus", "btn_camera", 200.0, 20.0, -1.0, "btn_camera_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_camera", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Open/Close Inventory", "btn_inventory", 200.0, 20.0, -1.0, "btn_inventory_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_inventory", 25.0, 20.0); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 13 ******************************************************************* 500 / --- + int bFamiliar = GetHasFeat(FEAT_SUMMON_FAMILIAR, oAssociate, TRUE); + if(!ai_GetDMWAccessButton(BTN_CMD_FAMILIAR) && bFamiliar) + { + jRow = JsonArray(); + jRow = CreateLabel(jRow, "", "lbl_familiar_type", 225.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "", "lbl_familiar_name", 225.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + // Row 14 ******************************************************************* 500 / --- + jRow = JsonArray(); + jRow = CreateCombo(jRow, ai_CreateCompanionJson(oPC, "hen_familiar"), "cmb_familiar", 200.0, 20.0); + jRow = CreateCheckBox(jRow, "", "chbx_familiar", 25.0, 20.0); + jRow = CreateTextEditBox(jRow, "txtbox", "txt_familiar_name", 50, FALSE, 178.0, 20.0); + jRow = CreateButton(jRow, "", "btn_familiar_name", 55.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 15 ******************************************************************* 500 / --- + int bCompanion = GetHasFeat(FEAT_ANIMAL_COMPANION, oAssociate, TRUE); + if(!ai_GetDMWAccessButton(BTN_CMD_COMPANION) && bCompanion) + { + jRow = JsonArray(); + jRow = CreateLabel(jRow, "", "lbl_companion_type", 225.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "", "lbl_companion_name", 225.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + // Row 16 ******************************************************************* 500 / --- + jRow = JsonArray(); + jRow = CreateCombo(jRow, ai_CreateCompanionJson(oPC, "hen_companion"), "cmb_companion", 200.0, 20.0); + jRow = CreateCheckBox(jRow, "", "chbx_companion", 25.0, 20.0); + jRow = CreateTextEditBox(jRow, "txtbox", "txt_companion_name", 50, FALSE, 178.0, 20.0); + jRow = CreateButton(jRow, "", "btn_companion_name", 55.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + } + // Row 17+ ****************************************************************** 500 / --- + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jPCPlugins; + if(bIsPC) + { + jPCPlugins = ai_UpdatePluginsForPC(oPC); + // Set the plugins the player can use. + int nIndex; + string sButton, sName; + json jPlugin = JsonArrayGet(jPCPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + jRow = JsonArray(); + sButton = IntToString(nIndex); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); + if(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + else + { + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + break; + } + jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); + } + } + // Row 18 ****************************************************************** 500 / --- + jRow = JsonArray(); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "", "lbl_info_1", 475.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_COMMAND_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_COMMAND_NUI, sName + " Command Menu", + fX, fY, 500.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Get which buttons are activated. + int bAIWidgetLock = ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); + int bCmdAction = ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType); + int bCmdGuard = ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType); + int bCmdHold = ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType); + int bCmdSearch = ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType); + int bCmdStealth = ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType); + int bCmdAttack = ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType); + int bCmdFollow = ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType); + int bFollowTarget = ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType); + int bCmdAIScript = ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType); + int bCmdPlacetrap = ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType); + int bSpellWidget = ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType); + int bBuffRest = ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType); + int bBuffShort = ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType); + int bBuffLong = ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType); + int bBuffAll = ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType); + int bJumpTo = ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType); + int bGhostMode = ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType); + int bCamera = ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType); + int bInventory = ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType); + int bBtnFamiliar = ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType); + int bBtnCompanion = ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType); + int bVertical = ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArray(); + jData = JsonArrayInsert(jData, JsonString(ObjectToString(oAssociate))); + NuiSetUserData(oPC, nToken, jData); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + string sText; + // Row 1 + // If all the AI buttons are blocked then don't load the menu. + if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) + { + if(bIsPC) + { + if(bUsingPCAI) + { + NuiSetBind(oPC, nToken, "btn_ai_menu_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_menu_tooltip", JsonString(" " + sName + " AI options")); + } + NuiSetBind(oPC, nToken, "btn_copy_settings_event", JsonBool (TRUE)); + sText = " Copy AI and command settings for one creature to others."; + NuiSetBind(oPC, nToken, "btn_copy_settings_tooltip", JsonString(sText)); + if(!AI_SERVER) + { + NuiSetBind(oPC, nToken, "btn_main_menu_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_main_menu_tooltip", JsonString(" Module Options")); + } + } + else + { + if(bUsingHenchAI) + { + NuiSetBind(oPC, nToken, "btn_ai_menu_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_menu_tooltip", JsonString(" " + sName + " AI options")); + } + NuiSetBind(oPC, nToken, "btn_copy_settings_event", JsonBool (TRUE)); + sText = " Copy AI and command settings for one creature to others."; + NuiSetBind(oPC, nToken, "btn_copy_settings_tooltip", JsonString(sText)); + string sText2; + if(ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType)) + { + sText = "Off"; sText2 = "on"; + NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool(FALSE)); + } + else + { + sText = "On"; sText2 = "off"; + NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool(TRUE)); + } + NuiSetBind(oPC, nToken, "btn_widget_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_onoff_label", JsonString("Widget " + sText)); + NuiSetBind(oPC, nToken, "btn_widget_onoff_tooltip", JsonString( + " Turn " + sName + " widget " + sText2)); + } + } + // Row 2 + NuiSetBind(oPC, nToken, "btn_widget_lock_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_lock", JsonBool(bAIWidgetLock)); + NuiSetBind(oPC, nToken, "btn_widget_lock_tooltip", JsonString( + " Locks " + sName + " widget to the current location.")); + NuiSetBind(oPC, nToken, "btn_widget_size_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_size_tooltip", JsonString( + " Adjusts the size of " + sName + " widget buttons")); + NuiSetBind(oPC, nToken, "btn_vertical_widget_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_vertical_widget", JsonBool(bVertical)); + NuiSetBind(oPC, nToken, "btn_vertical_widget_tooltip", JsonString( + " " + sName + " widget will display vertically")); + // Row 3 + NuiSetBind(oPC, nToken, "chbx_cmd_action_check", JsonBool (bCmdAction)); + NuiSetBindWatch(oPC, nToken, "chbx_cmd_action_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_action_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_action_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_guard_check", JsonBool (bCmdGuard)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_guard_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_guard_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_guard_event", JsonBool (TRUE)); + // Row 4 + NuiSetBind(oPC, nToken, "chbx_cmd_hold_check", JsonBool (bCmdHold)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_hold_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_hold_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_hold_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_attack_check", JsonBool (bCmdAttack)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_attack_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_attack_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_attack_event", JsonBool (TRUE)); + // Row 5 + NuiSetBind(oPC, nToken, "chbx_cmd_follow_check", JsonBool (bCmdFollow)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_follow_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_follow_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_follow_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_follow_target_check", JsonBool (bFollowTarget)); + NuiSetBindWatch (oPC, nToken, "chbx_follow_target_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_follow_target_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_follow_target_event", JsonBool (TRUE)); + // Row 6 + if(bIsPC) + { + NuiSetBind(oPC, nToken, "chbx_cmd_search_check", JsonBool (bCmdSearch)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_search_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_search_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_search_event", JsonBool (TRUE)); + if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_SEARCH)) sText = " leave "; + else sText = " enter "; + NuiSetBind(oPC, nToken, "btn_cmd_search_tooltip", JsonString(" Everyone" + sText + "search mode")); + NuiSetBind(oPC, nToken, "chbx_cmd_stealth_check", JsonBool (bCmdStealth)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_stealth_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_stealth_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_stealth_event", JsonBool (TRUE)); + if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_STEALTH)) sText = " leave "; + else sText = " enter "; + NuiSetBind(oPC, nToken, "btn_cmd_stealth_tooltip", JsonString(" Everyone" + sText + "stealth mode")); + } + // Command labels + if(bIsPC) sText = " All "; + else sText = " "; + NuiSetBind(oPC, nToken, "btn_cmd_action_label", JsonString(sText + "Action")); + NuiSetBind(oPC, nToken, "btn_cmd_guard_label", JsonString(sText + "Guard Mode")); + NuiSetBind(oPC, nToken, "btn_cmd_hold_label", JsonString(sText + "Hold Mode")); + NuiSetBind(oPC, nToken, "btn_cmd_attack_label", JsonString(sText + "Normal Mode")); + NuiSetBind(oPC, nToken, "btn_cmd_follow_label", JsonString(sText + "Follow Mode")); + NuiSetBind(oPC, nToken, "btn_follow_target_label", JsonString(" Follow Target")); + float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); + string sRange = FloatToString(fRange, 0, 0); + if(bIsPC) + { + sText = " All associates"; + NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode")); + } + else + { + sText = " " + GetName(oAssociate); + NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode [" + sRange + " meters]")); + } + NuiSetBind(oPC, nToken, "btn_cmd_action_tooltip", JsonString(sText + " do actions")); + NuiSetBind(oPC, nToken, "btn_cmd_guard_tooltip", JsonString(sText + " enter guard mode")); + NuiSetBind(oPC, nToken, "btn_cmd_hold_tooltip", JsonString(sText + " enter hold mode")); + NuiSetBind(oPC, nToken, "btn_cmd_attack_tooltip", JsonString(sText + " enter normal mode")); + object oTarget = GetLocalObject(oAssociate, AI_FOLLOW_TARGET); + string sTarget; + if(oTarget != OBJECT_INVALID) sTarget = GetName(oTarget); + else + { + if(ai_GetIsCharacter(oAssociate)) sTarget = "nobody"; + else sTarget = GetName(oPC); + } + NuiSetBind(oPC, nToken, "btn_follow_target_tooltip", JsonString(" " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]")); + // Row 7 + NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_check", JsonBool (bCmdAIScript)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_ai_script_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_event", JsonBool (TRUE)); + sText = " Using normal tactics"; + if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != "") + { + string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + if(sScript == "ai_a_ambusher") sText = " Ambusher: Attacks from a hidden position"; + else if(sScript == "ai_a_flanker") sText = " Flanker: Attacks enemies engaged with allies"; + else if(sScript == "ai_a_peaceful") sText = " Peaceful: Avoids attacking any enemies if possible"; + else if(sScript == "ai_a_defensive") sText = " Defensive: Attacks then uses Expertise/Parry"; + else if(sScript == "ai_a_ranged") sText = " Ranged: Attacks from range as much as possible"; + else if(sScript == "ai_a_cntrspell") sText = " Counter Spell: Tries to counter enemy spells"; + } + else + { + if(GetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, oAssociate)) sText = "Using ambush tactics"; + else if(GetCombatCondition(X0_COMBAT_FLAG_COWARDLY, oAssociate)) sText = "Using coward tactics"; + else if(GetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, oAssociate)) sText = "Using defensive tactics"; + else if(GetCombatCondition(X0_COMBAT_FLAG_RANGED, oAssociate)) sText = "Using ranged tactics"; + } + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_tooltip", JsonString(sText)); + if(GetSkillRank(SKILL_SET_TRAP, oAssociate, TRUE) > 0) + { + NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_check", JsonBool (bCmdPlacetrap)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_place_trap_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_tooltip", JsonString ( + " Place a trap at the location selected")); + } + // Row 8 + NuiSetBind(oPC, nToken, "btn_quick_widget_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_quick_widget_tooltip", JsonString( + " Add/Remove abilities and spells from creatures widget")); + NuiSetBind(oPC, nToken, "chbx_quick_widget_check", JsonBool (bSpellWidget)); + NuiSetBindWatch (oPC, nToken, "chbx_quick_widget_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_quick_widget_event", JsonBool(TRUE)); + if(bMemorize == 2) // Memorizes their spells. + { + NuiSetBind(oPC, nToken, "btn_spell_memorize_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_spell_memorize_tooltip", JsonString( + " Change memorized spell list.")); + } + if(bSpellbook) // Change known spells. + { + NuiSetBind(oPC, nToken, "btn_spell_known_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_spell_known_tooltip", JsonString( + " Change known spell list.")); + } + // Row 9 + NuiSetBind(oPC, nToken, "chbx_buff_short_check", JsonBool (bBuffShort)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_short_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_short_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_short_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_buff_short_tooltip", JsonString ( + " Buff the party with short duration spells")); + NuiSetBind(oPC, nToken, "chbx_buff_long_check", JsonBool (bBuffLong)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_long_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_long_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_long_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_long_tooltip", JsonString ( + " Buff the party with long duration spells")); + // Row 10 + NuiSetBind(oPC, nToken, "chbx_buff_all_check", JsonBool (bBuffAll)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_all_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_all_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_all_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_all_tooltip", JsonString ( + " Buff the party with all our defensive spells")); + if(!bIsPC && ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) == "") + { + NuiSetBind(oPC, nToken, "chbx_buff_rest_check", JsonBool (bBuffRest)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_rest_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_rest_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_rest_event", JsonBool (TRUE)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) sText = " [On] Turn buffing after resting off"; + else sText = " [Off] Turn buffing after resting on"; + NuiSetBind (oPC, nToken, "btn_buff_rest_tooltip", JsonString (sText)); + } + // Row 11 + NuiSetBind(oPC, nToken, "chbx_jump_to_check", JsonBool(bJumpTo)); + NuiSetBindWatch (oPC, nToken, "chbx_jump_to_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_jump_to_event", JsonBool(TRUE)); + sText = GetName(oPC); + if(oPC == oAssociate) sName = "everyone"; + else sName = GetName(oAssociate); + NuiSetBind(oPC, nToken, "btn_jump_to_label", JsonString("Jump to " + sText)); + NuiSetBind(oPC, nToken, "btn_jump_to_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_jump_to_tooltip", JsonString ( + " Jump " + sName + " to " + sText)); + + NuiSetBind(oPC, nToken, "chbx_ghost_mode_check", JsonBool (bGhostMode)); + NuiSetBindWatch (oPC, nToken, "chbx_ghost_mode_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ghost_mode_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ghost_mode_event", JsonBool (TRUE)); + sText = "On"; + if(ai_GetAIMode(oAssociate, AI_MODE_GHOST)) sText = "Off"; + NuiSetBind(oPC, nToken, "btn_ghost_mode_tooltip", JsonString ( + " Turn " + sText + " clipping through creatures for " + GetName(oAssociate))); + // Row 12 + NuiSetBind(oPC, nToken, "chbx_camera_check", JsonBool (bCamera)); + NuiSetBindWatch (oPC, nToken, "chbx_camera_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_camera_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString ( + " Toggle camera view for " + sName)); + NuiSetBind(oPC, nToken, "chbx_inventory_check", JsonBool (bInventory)); + NuiSetBindWatch (oPC, nToken, "chbx_inventory_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_inventory_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString ( + " Open " + sName + " inventory")); + // Row 13 & 14 + if(bFamiliar) + { + NuiSetBind(oPC, nToken, "chbx_familiar_check", JsonBool(bBtnFamiliar)); + NuiSetBindWatch (oPC, nToken, "chbx_familiar_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_familiar_event", JsonBool(TRUE)); + int nFamiliar = GetFamiliarCreatureType(oAssociate); + NuiSetBind(oPC, nToken, "cmb_familiar_selected", JsonInt(nFamiliar)); + string sFamiliarName = GetFamiliarName(oAssociate); + NuiSetBind(oPC, nToken, "txt_familiar_name", JsonString(sFamiliarName)); + if(!bIsPC) + { + NuiSetBind(oPC, nToken, "lbl_familiar_type_label", JsonString("Change familiar type")); + NuiSetBind(oPC, nToken, "lbl_familiar_name_label", JsonString("Change familiar name")); + NuiSetBind(oPC, nToken, "cmb_familiar_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "cmb_familiar_selected", TRUE); + NuiSetBind(oPC, nToken, "txt_familiar_name_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "txt_familiar_name", TRUE); + NuiSetBind(oPC, nToken, "btn_familiar_name_label", JsonString("Save")); + } + else + { + NuiSetBind(oPC, nToken, "lbl_familiar_type_label", JsonString("Familiar type")); + NuiSetBind(oPC, nToken, "lbl_familiar_name_label", JsonString("Familiar name")); + } + } + // Row 15 & 16 + if(bCompanion) + { + NuiSetBind(oPC, nToken, "chbx_companion_check", JsonBool(bBtnCompanion)); + NuiSetBindWatch (oPC, nToken, "chbx_companion_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_companion_event", JsonBool(TRUE)); + int nCompanion = GetAnimalCompanionCreatureType(oAssociate); + NuiSetBind(oPC, nToken, "cmb_companion_selected", JsonInt(nCompanion)); + string sCompanionName = GetAnimalCompanionName(oAssociate); + NuiSetBind(oPC, nToken, "txt_companion_name", JsonString(sCompanionName)); + if(!bIsPC) + { + NuiSetBind(oPC, nToken, "lbl_companion_type_label", JsonString("Change Companion type")); + NuiSetBind(oPC, nToken, "lbl_companion_name_label", JsonString("Change Companion name")); + NuiSetBind(oPC, nToken, "cmb_companion_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "cmb_companion_selected", TRUE); + NuiSetBind(oPC, nToken, "txt_companion_name_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "txt_companion_name", TRUE); + NuiSetBind(oPC, nToken, "btn_companion_name_label", JsonString("Save")); + } + else + { + NuiSetBind(oPC, nToken, "lbl_companion_type_label", JsonString("Companion type")); + NuiSetBind(oPC, nToken, "lbl_companion_name_label", JsonString("Companion name")); + } + } + if(bIsPC) + { + // Row 17+ + int nIndex, bWidget; + string sButton, sText; + json jPlugin = JsonArrayGet(jPCPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bWidget < 3) + { + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bWidget)); + NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); + } + sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); + jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); + } + NuiSetBind(oPC, nToken, "chbx_plugin_tooltip", JsonString(" Adds the plugin to your widget.")); + } + // Row 18 + sText = ai_GetRandomTip(); + NuiSetBind(oPC, nToken, "lbl_info_1_label", JsonString(sText)); +} +void ai_CreateAssociateAINUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int bRight, bLeft; + float fHeight = 45.0; + // ************************************************************************* Width / Height + int bIsPC = ai_GetIsCharacter(oAssociate); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jRow = JsonArray(); + json jCol = JsonArray(); + // Row 1 ******************************************************************* 500 / 73 + // If all the AI buttons are blocked then don't load the menu. + if(bIsPC) + { + bRight = GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028; + if(!AI_SERVER || bRight) + { + // If all the Command buttons are blocked then don't load the menu. + if(bRight) + { + jRow = CreateButton(jRow, "Command Menu", "btn_command_menu", 200.0, 20.0, -1.0, "btn_command_menu_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(!AI_SERVER) + { + CreateButton(jRow, "Main Menu", "btn_main_menu", 200.0, 20.0, -1.0, "btn_main_menu_tooltip"); + CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + } + // Row 2 ******************************************************************* 500 / 73 + bRight = !ai_GetDMAIAccessButton(BTN_AI_LOOT); + if(bRight || !bIsPC) + { + jRow = JsonArray(); + if(!bIsPC) + { + jRow = CreateButton(jRow, "Command Menu", "btn_command_menu", 200.0, 20.0, -1.0, "btn_command_menu_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bRight) + { + jRow = CreateButton(jRow, "Loot Filter", "btn_loot_filter", 200.0, 20.0); + jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 3 ******************************************************************* 500 / 101 + bRight = !ai_GetDMAIAccessButton(BTN_AI_FOR_PC); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_REDUCE_SPEECH); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Player AI On/Off", "btn_ai", 200.0, 20.0, -1.0, "btn_ai_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ai", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Reduce Speech", "btn_quiet", 200.0, 20.0, -1.0, "btn_quiet_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_quiet", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 4 ******************************************************************* 500 / 129 + bRight = !ai_GetDMAIAccessButton(BTN_AI_USE_RANGED); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_STOP_WEAPON_EQUIP); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Ranged Combat", "btn_ranged", 200.0, 20.0, -1.0, "btn_ranged_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ranged", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Equip Best Weapons", "btn_equip_weapon", 200.0, 20.0, -1.0, "btn_equip_weapon_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_equip_weapon", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 5 ******************************************************************* 500 / 157 + bRight = !ai_GetDMAIAccessButton(BTN_AI_USE_SEARCH); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_USE_STEALTH); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Search Mode", "btn_search", 200.0, 20.0, -1.0, "btn_search_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_search", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Stealth Mode", "btn_stealth", 200.0, 20.0, -1.0, "btn_stealth_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_stealth", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 6 ******************************************************************* 500 / 185 + bRight = !ai_GetDMAIAccessButton(BTN_AI_OPEN_DOORS); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_REMOVE_TRAPS); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Open Door Mode", "btn_open_door", 200.0, 20.0, -1.0, "btn_open_door_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_open_door", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Disarm Traps Mode", "btn_traps", 200.0, 20.0, -1.0, "btn_traps_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_traps", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 7 ******************************************************************* 500 / 213 + bRight = !ai_GetDMAIAccessButton(BTN_AI_PICK_LOCKS); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_BASH_LOCKS); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Pick Locks Mode", "btn_pick_locks", 200.0, 20.0, -1.0, "btn_pick_locks_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_pick_locks", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Bash Mode", "btn_bash_locks", 200.0, 20.0, -1.0, "btn_bash_locks_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_bash_locks", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 8 ******************************************************************* 500 / 241 + bRight = !ai_GetDMAIAccessButton(BTN_AI_MAGIC_LEVEL); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_NO_SPONTANEOUS); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Magic usage level", "btn_magic_level", 200.0, 20.0f, -1.0, "btn_magic_level_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic_level", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Cleric Spontaneous Casting", "btn_spontaneous", 200.0, 20.0, -1.0, "btn_spontaneous_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_spontaneous", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 9 ******************************************************************* 500 / 269 + bRight = !ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_USE); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_ITEM_USE); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Use Magic", "btn_magic", 200.0, 20.0, -1.0, "btn_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Use Magic Items", "btn_magic_items", 200.0, 20.0, -1.0, "btn_magic_items_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic_items", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 10 ****************************************************************** 500 / 297 + bRight = !ai_GetDMAIAccessButton(BTN_AI_DEF_MAGIC_USE); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_OFF_MAGIC_USE); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Use Defensive Magic Only", "btn_def_magic", 200.0, 20.0, -1.0, "btn_def_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_def_magic", 25.0, 20.0f); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Use Offensive Magic Only", "btn_off_magic", 200.0, 20.0, -1.0, "btn_off_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_off_magic", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 11 ****************************************************************** 500 / 325 + bRight = !ai_GetDMAIAccessButton(BTN_AI_HEAL_OUT); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_HEAL_IN); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Heal % Out of Combat", "btn_heal_out", 200.0, 20.0, -1.0, "btn_heal_out_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heal_out", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Heal % in Combat", "btn_heal_in", 200.0, 20.0, -1.0, "btn_heal_in_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heal_in", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 12 ****************************************************************** 500 / 353 + bRight = !ai_GetDMAIAccessButton(BTN_AI_STOP_SELF_HEALING); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_STOP_PARTY_HEALING); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Self Healing", "btn_heals_onoff", 200.0, 20.0, -1.0, "btn_heals_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heals_onoff", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Party Healing", "btn_healp_onoff", 200.0, 20.0, -1.0, "btn_healp_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_healp_onoff", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 13 ****************************************************************** 500 / 391 + bRight = !ai_GetDMAIAccessButton(BTN_AI_STOP_CURE_SPELLS); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_LOOT); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Cast Cure Spells", "btn_cure_onoff", 200.0, 20.0, -1.0, "btn_cure_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cure_onoff", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + if(sAssociateType != "summons" && sAssociateType != "dominated") + { + jRow = CreateButton(jRow, "Auto Looting", "btn_loot", 200.0, 20.0, -1.0, "btn_loot_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_loot", 25.0, 20.0); + } + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 14 ****************************************************************** 500 / --- + bRight = !ai_GetDMAIAccessButton(BTN_AI_IGNORE_ASSOCIATES); + bLeft = !ai_GetDMAIAccessButton(BTN_AI_IGNORE_TRAPS); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + jRow = CreateButton(jRow, "Ignore Associates", "btn_ignore_assoc", 200.0, 20.0, -1.0, "btn_ignore_assoc_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ignore_assoc", 25.0, 20.0); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + jRow = CreateButton(jRow, "Ignore floor Traps", "btn_ignore_traps", 200.0, 20.0, -1.0, "btn_ignore_traps_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ignore_traps", 25.0, 20.0); + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 15 ****************************************************************** 500 / --- + bRight = !ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE); + bLeft = FALSE; //!ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE); + if(bRight || bLeft) + { + jRow = JsonArray(); + if(bRight) + { + if(GetAssociateType(oAssociate) == ASSOCIATE_TYPE_HENCHMAN) + { + jRow = CreateButton(jRow, "Perception Range", "btn_perc_range", 200.0, 20.0, -1.0, "btn_perc_range_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_perc_range", 25.0, 20.0); + } + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + if(bLeft) + { + } + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 16 ****************************************************************** 500 / --- + bRight = !ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT); + if(bRight) + { + jRow = JsonArray(); + jRow = CreateButton(jRow, "Set Current AI:", "btn_ai_script", 175.0f, 20.0f, -1.0, "btn_ai_script_tooltip"); + jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_ai_script", 16, FALSE, 145.0f, 20.0f, "txt_ai_script_tooltip"); + jRow = CreateCombo(jRow, ai_CreateAIScriptJson(oPC), "cmb_ai_script", 146.0, 20.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + // Row 17 ****************************************************************** 500 / --- + jRow = JsonArray(); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "", "lbl_info", 475.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sText, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_NUI, sName + " AI Menu", + fX, fY, 500.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Get which buttons are activated. + int bAI = ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType); + int bReduceSpeech = ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType); + int bRanged = ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType); + int bEquipWeapons = ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType); + int bSearch = ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType); + int bStealth = ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType); + int bOpenDoors = ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType); + int bTraps = ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType); + int bPickLocks = ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType); + int bBashLocks = ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType); + int bMagicLevel = ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType); + int bSpontaneous = ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType); + int bNoMagic = ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType); + int bNoMagicItems = ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType); + int bDefMagic = ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType); + int bOffMagic = ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType); + int bHealOut = ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType); + int bHealIn = ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType); + int bSelfHealOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType); + int bPartyHealOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType); + int bCureOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType); + int bIgnoreAssociates = ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType); + int bIgnoreTraps = ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType); + int bLoot = ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType); + int bPercRange = ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArray(); + jData = JsonArrayInsert(jData, JsonString(ObjectToString(oAssociate))); + NuiSetUserData(oPC, nToken, jData); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 + // If all the AI buttons are blocked then don't load the menu. + if(bIsPC) + { + bRight = GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028; + if(!AI_SERVER || bRight) + { + // If all the Command buttons are blocked then don't load the menu. + if(bRight) + { + NuiSetBind(oPC, nToken, "btn_command_menu_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_command_menu_tooltip", JsonString(" " + sName + " Command options")); + } + if(!AI_SERVER) + { + NuiSetBind(oPC, nToken, "btn_main_menu_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_main_menu_tooltip", JsonString(" Module Options")); + } + fHeight += 28.0; + } + } + // Row 2 + if(!bIsPC) + { + NuiSetBind(oPC, nToken, "btn_command_menu_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_command_menu_tooltip", JsonString(" " + sName + " Command options")); + } + NuiSetBind(oPC, nToken, "btn_loot_filter_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_filter", JsonInt(TRUE)); + // Row 3 + // Only activate ai on/off if this is for the pc. + if(bIsPC && ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) == "") + { + NuiSetBind(oPC, nToken, "chbx_ai_check", JsonBool(bAI)); + NuiSetBindWatch (oPC, nToken, "chbx_ai_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ai_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_event", JsonBool(TRUE)); + if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") sText = " AI On"; + else sText = " AI Off"; + NuiSetBind(oPC, nToken, "btn_ai_tooltip", JsonString(sText)); + } + NuiSetBind(oPC, nToken, "chbx_quiet_check", JsonBool(bReduceSpeech)); + NuiSetBindWatch (oPC, nToken, "chbx_quiet_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_quiet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_quiet_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) sText = " Reduced Speech On"; + else sText = " Reduces Speech Off"; + NuiSetBind (oPC, nToken, "btn_quiet_tooltip", JsonString(sText)); + // Row 4 + NuiSetBind(oPC, nToken, "chbx_ranged_check", JsonBool(bRanged)); + NuiSetBindWatch(oPC, nToken, "chbx_ranged_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ranged_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ranged_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) sText = " Ranged Off"; + else sText = " Ranged On"; + NuiSetBind (oPC, nToken, "btn_ranged_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "chbx_equip_weapon_check", JsonBool(bEquipWeapons)); + NuiSetBindWatch(oPC, nToken, "chbx_equip_weapon_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_equip_weapon_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_equip_weapon_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF)) sText = " Equiping Best Weapons Off"; + else sText = " Equiping Best Weapons On"; + NuiSetBind (oPC, nToken, "btn_equip_weapon_tooltip", JsonString(sText)); + // Row 5 + if(GetRacialType(oAssociate) != RACIAL_TYPE_ELF) + { + NuiSetBind(oPC, nToken, "chbx_search_check", JsonBool(bSearch)); + NuiSetBindWatch (oPC, nToken, "chbx_search_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_search_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sText = " Search mode On"; + else sText = " Search mode Off"; + NuiSetBind (oPC, nToken, "btn_search_tooltip", JsonString(sText)); + } + NuiSetBind(oPC, nToken, "chbx_stealth_check", JsonBool(bStealth)); + NuiSetBindWatch(oPC, nToken, "chbx_stealth_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_stealth_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sText = " Stealth mode On"; + else sText = " Stealth mode Off"; + NuiSetBind (oPC, nToken, "btn_stealth_tooltip", JsonString(sText)); + // Row 6 + string sRange = FloatToString(GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "chbx_open_door_check", JsonBool(bOpenDoors)); + NuiSetBindWatch (oPC, nToken, "chbx_open_door_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_open_door_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_open_door_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) sText = " Open Doors On [" + sRange + " meters]"; + else sText = " Open Doors Off [" + sRange + " meters]"; + NuiSetBind (oPC, nToken, "btn_open_door_tooltip", JsonString(sText)); + sRange = FloatToString(GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "chbx_traps_check", JsonBool(bTraps)); + NuiSetBindWatch (oPC, nToken, "chbx_traps_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_traps_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_traps_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) sText = " Disable Traps On [" + sRange + " meters]"; + else sText = " Disable Traps Off [" + sRange + " meters]"; + NuiSetBind (oPC, nToken, "btn_traps_tooltip", JsonString(sText)); + // Row 7 + sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "chbx_pick_locks_check", JsonBool(bPickLocks)); + NuiSetBindWatch(oPC, nToken, "chbx_pick_locks_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_pick_locks_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_pick_locks_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) sText = " Pick locks On [" + sRange + " meters]"; + else sText = " Pick Locks Off [" + sRange + " meters]"; + NuiSetBind (oPC, nToken, "btn_pick_locks_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "chbx_bash_locks_check", JsonBool(bBashLocks)); + NuiSetBindWatch(oPC, nToken, "chbx_bash_locks_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_bash_locks_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_bash_locks_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) sText = " Bash On [" + sRange + " meters]"; + else sText = " Bash Off [" + sRange + " meters]"; + NuiSetBind (oPC, nToken, "btn_bash_locks_tooltip", JsonString(sText)); + // Row 8 + string sMagic = IntToString(GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT)); + NuiSetBind(oPC, nToken, "chbx_magic_level_check", JsonBool(bMagicLevel)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_level_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_level_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_level_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_magic_level_tooltip", JsonString(" Magic level [" + sMagic + "]")); + sText = " Spontaneous casting On"; + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE)) sText = " Spontaneous casting Off"; + NuiSetBind(oPC, nToken, "chbx_spontaneous_check", JsonBool(bSpontaneous)); + NuiSetBindWatch (oPC, nToken, "chbx_spontaneous_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_spontaneous_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spontaneous_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spontaneous_tooltip", JsonString(sText)); + // Row 9 + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC)) sText = " Magic Off"; + else sText = " Magic On"; + NuiSetBind(oPC, nToken, "chbx_magic_check", JsonBool(bNoMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_tooltip", JsonString(sText)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) sText = " Magic Items Off"; + else sText = " Magic Items On"; + NuiSetBind(oPC, nToken, "chbx_magic_items_check", JsonBool(bNoMagicItems)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_items_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_items_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_items_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_items_tooltip", JsonString(sText)); + // Row 10 + if(ai_GetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) sText = " Defensive Magic On"; + else sText = " Defensive Magic Off"; + NuiSetBind(oPC, nToken, "chbx_def_magic_check", JsonBool (bDefMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_def_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_def_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_def_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_def_magic_tooltip", JsonString(sText)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) sText = " Offensive Magic On"; + else sText = " Offensive Magic Off"; + NuiSetBind(oPC, nToken, "chbx_off_magic_check", JsonBool(bOffMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_off_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_off_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_off_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_off_magic_tooltip", JsonString(sText)); + // Row 11 + int nHeal = GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT); + NuiSetBind(oPC, nToken, "chbx_heal_out_check", JsonBool(bHealOut)); + NuiSetBindWatch (oPC, nToken, "chbx_heal_out_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heal_out_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_out_event", JsonBool(TRUE)); + sText = " Will heal at or below [" + IntToString(nHeal) + "%] health out of combat"; + NuiSetBind(oPC, nToken, "btn_heal_out_tooltip", JsonString(sText)); + nHeal = GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT); + NuiSetBind(oPC, nToken, "chbx_heal_in_check", JsonBool(bHealIn)); + NuiSetBindWatch (oPC, nToken, "chbx_heal_in_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heal_in_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_in_event", JsonBool (TRUE)); + sText = " Will heal at or below [" + IntToString(nHeal) + "%] health in combat"; + NuiSetBind(oPC, nToken, "btn_heal_in_tooltip", JsonString(sText)); + // Row 12 + NuiSetBind(oPC, nToken, "chbx_heals_onoff_check", JsonBool(bSelfHealOnOff)); + NuiSetBindWatch (oPC, nToken, "chbx_heals_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heals_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heals_onoff_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF)) sText = " Self healing Off"; + else sText = " Self healing On"; + NuiSetBind(oPC, nToken, "btn_heals_onoff_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "chbx_healp_onoff_check", JsonBool(bPartyHealOnOff)); + NuiSetBind(oPC, nToken, "chbx_healp_onoff_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_healp_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "btn_healp_onoff_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF)) sText = " Party healing Off"; + else sText = " Party healing On"; + NuiSetBind(oPC, nToken, "btn_healp_onoff_tooltip", JsonString(sText)); + // Row 13 + NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "chbx_cure_onoff_check", JsonBool(bCureOnOff)); + NuiSetBind(oPC, nToken, "chbx_cure_onoff_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_cure_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cure_onoff_event", JsonBool(TRUE)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF)) sText = " Cast Cure Spells Off"; + else sText = " Cast Cure Spells On"; + NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); + if(sAssociateType != "summons" && sAssociateType != "dominated") + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE), 0, 0); + if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sText = " Looting On [" + sRange + " meters]"; + else sText = " Looting Off [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "chbx_loot_check", JsonBool(bLoot)); + NuiSetBindWatch (oPC, nToken, "chbx_loot_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_tooltip", JsonString(sText)); + } + // Row 14 + NuiSetBind(oPC, nToken, "chbx_ignore_assoc_check", JsonBool(bIgnoreAssociates)); + NuiSetBindWatch(oPC, nToken, "chbx_ignore_assoc_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ignore_assoc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ignore_assoc_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) sText = " Ignore Enemy Associates On"; + else sText = " Ignore Enemy Associates Off"; + NuiSetBind (oPC, nToken, "btn_ignore_assoc_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "chbx_ignore_traps_check", JsonBool(bIgnoreTraps)); + NuiSetBindWatch(oPC, nToken, "chbx_ignore_traps_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ignore_traps_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ignore_traps_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS)) sText = " Ignore Floor Traps On"; + else sText = " Ignore Floor Traps Off"; + NuiSetBind (oPC, nToken, "btn_ignore_traps_tooltip", JsonString(sText)); + // Row 15 + if(!bIsPC) + { + int nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); + if(nRange < 8 || nRange > 11) + { + nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION); + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU", nRange); + } + if(nRange == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; + else if(nRange == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; + else if(nRange == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; + else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; + NuiSetBind(oPC, nToken, "chbx_perc_range_check", JsonBool(bPercRange)); + NuiSetBindWatch (oPC, nToken, "chbx_perc_range_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_perc_range_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_perc_range_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_perc_range_tooltip", JsonString(sText)); + } + // Row 16 + string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + if(sScript == "") sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + NuiSetBind(oPC, nToken, "btn_ai_script_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_script_tooltip", JsonString(" Sets " + GetName(oAssociate) + " to use the ai script in the text box.")); + NuiSetBind(oPC, nToken, "txt_ai_script_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_ai_script", JsonString(sScript)); + NuiSetBind(oPC, nToken, "txt_ai_script_tooltip", JsonString(" Associate AI scripts must start with ai_a_")); + NuiSetBind(oPC, nToken, "cmb_ai_script_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "cmb_ai_script_selected", TRUE); + // Row 17 + sText = ai_GetRandomTip(); + NuiSetBind (oPC, nToken, "lbl_info_label", JsonString(sText)); +} +void ai_SetWidgetBinds(object oPC, object oAssociate, string sAssociateType, int nToken, string sName) +{ + int bBool, bIsPC = ai_GetIsCharacter(oAssociate); + string sText, sRange, sHeal; + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set the buttons to show events. + NuiSetBind(oPC, nToken, "btn_open_main_image", JsonString(GetPortraitResRef(oAssociate) + "s")); + NuiSetBind(oPC, nToken, "btn_open_main_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_open_main_tooltip", JsonString(" " + sName + " widget menu")); + if(bIsPC) sText = " All associates"; + else sText = " " + GetName(oAssociate); + if(ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_action_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_action_tooltip", JsonString(sText + " do actions")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_guard_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_guard_tooltip", JsonString(sText + " enter guard mode")); + bBool = ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER); + NuiSetBind(oPC, nToken, "btn_cmd_guard_encouraged", JsonBool(bBool)); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_hold_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_hold_tooltip", JsonString(sText + " enter hold mode")); + bBool = ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND); + NuiSetBind(oPC, nToken, "btn_cmd_hold_encouraged", JsonBool(bBool)); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_attack_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_attack_tooltip", JsonString(sText + " enter normal mode")); + if(!bIsPC) + { + if(!ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER) && + !ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND) && + !ai_GetAIMode(oAssociate, AI_MODE_FOLLOW)) bBool = TRUE; + else bBool = FALSE; + if(!bIsPC) NuiSetBind(oPC, nToken, "btn_cmd_attack_encouraged", JsonBool(bBool)); + } + } + if(ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_follow_event", JsonBool(TRUE)); + float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); + string sRange = FloatToString(fRange, 0, 0); + if(bIsPC) + { + sText = " All associates"; + NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode")); + } + else + { + sText = " " + GetName(oAssociate); + NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode [" + sRange + " meters]")); + } + bBool = ai_GetAIMode(oAssociate, AI_MODE_FOLLOW); + if(!bIsPC) NuiSetBind(oPC, nToken, "btn_cmd_follow_encouraged", JsonBool(bBool)); + } + if(ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_follow_target_event", JsonBool(TRUE)); + object oTarget = GetLocalObject(oAssociate, AI_FOLLOW_TARGET); + string sTarget; + if(oTarget != OBJECT_INVALID) sTarget = GetName(oTarget); + else + { + if(ai_GetIsCharacter(oAssociate)) sTarget = "nobody"; + else sTarget = GetName(oPC); + } + float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); + string sRange = FloatToString(fRange, 0, 0); + NuiSetBind(oPC, nToken, "btn_follow_target_tooltip", JsonString(" " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_search_event", JsonBool(TRUE)); + if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_SEARCH)) sText = " leave "; + else sText = " enter "; + NuiSetBind(oPC, nToken, "btn_cmd_search_tooltip", JsonString(" Everyone" + sText + "search mode")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_stealth_event", JsonBool(TRUE)); + if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_STEALTH)) sText = " leave "; + else sText = " enter "; + NuiSetBind(oPC, nToken, "btn_cmd_stealth_tooltip", JsonString(" Everyone" + sText + "stealth mode")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType)) + { + sText = " Default tactics: Using the creatures base AI script"; + string sIcon = "ir_scommand"; + if(ResManGetAliasFor("0e_ch_1_hb", RESTYPE_NCS) != "") + { + string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); + if(sScript == "ai_a_ambusher") + { + sText = " Ambusher: Attacks from a hidden position"; + sIcon = "ir_rogue"; + } + else if(sScript == "ai_a_flanker") + { + sText = " Flanker: Attacks enemies engaged with allies"; + sIcon = "ir_invite"; + } + else if(sScript == "ai_a_peaceful") + { + sText = " Peaceful: Avoids attacking any enemies if possible"; + sIcon = "ir_ignore"; + } + else if(sScript == "ai_a_defensive") + { + sText = " Defensive: Attacks then uses Expertise/Parry"; + sIcon = "ir_knockdwn"; + } + else if(sScript == "ai_a_ranged") + { + sText = " Ranged: Attacks from range as much as possible"; + sIcon = "ir_ranger"; + } + else if(sScript == "ai_a_cntrspell") + { + sText = " Counter Spell: Tries to counter enemy spells"; + sIcon = "ir_dcaster"; + } + } + else + { + if(GetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, oAssociate)) sText = "Using ambush tactics"; + if(GetCombatCondition(X0_COMBAT_FLAG_COWARDLY, oAssociate)) sText = "Using coward tactics"; + if(GetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, oAssociate)) sText = "Using defensive tactics"; + if(GetCombatCondition(X0_COMBAT_FLAG_RANGED, oAssociate)) sText = "Using ranged tactics"; + } + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_image", JsonString(sIcon)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_tooltip", JsonString(sText)); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_tooltip", JsonString(" Place a trap at the location selected")); + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_buff_short_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_short_tooltip", JsonString(" Buff the party with short duration spells")); + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_buff_long_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_long_tooltip", JsonString(" Buff the party with long duration spells")); + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_buff_all_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_all_tooltip", JsonString(" Buff the party with all our defensive spells")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_jump_to_event", JsonBool(TRUE)); + sText = GetName(oPC); + if(oPC == oAssociate) sName = "everyone"; + else sName = GetName(oAssociate); + NuiSetBind(oPC, nToken, "btn_jump_to_tooltip", JsonString(" Jump " + sName + " to " + sText)); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_ghost_mode_event", JsonBool (TRUE)); + sText = "On"; + if(ai_GetAIMode(oAssociate, AI_MODE_GHOST)) sText = "Off"; + NuiSetBind(oPC, nToken, "btn_ghost_mode_tooltip", JsonString ( + " Turn " + sText + " clipping through creatures for " + GetName(oAssociate))); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString(" Toggle camera view for " + sName)); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString(" Open " + sName + " inventory")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_familiar_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_familiar_tooltip", JsonString(" Summon " + sName + " familiar.")); + } + if(ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_companion_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_companion_tooltip", JsonString(" Open " + sName + " Animal Companion.")); + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_buff_rest_event", JsonBool(TRUE)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) sText = " Turn buffing after resting off"; + else sText = " Turn buffing after resting on."; + NuiSetBind(oPC, nToken, "btn_buff_rest_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_ai_event", JsonBool(TRUE)); + if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") sText = " AI [On] Turn off"; + else sText = " AI [Off] Turn on"; + NuiSetBind(oPC, nToken, "btn_ai_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_quiet_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) sText = " Reduced Speech On"; + else sText = " Reduced Speech Off"; + NuiSetBind(oPC, nToken, "btn_quiet_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_ranged_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) sText = " Ranged Off"; + else sText = " Ranged On"; + NuiSetBind(oPC, nToken, "btn_ranged_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_equip_weapon_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF)) sText = " Equiping Best Weapons Off"; + else sText = " Equiping Best Weapons On"; + NuiSetBind(oPC, nToken, "btn_equip_weapon_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sText = " Search On"; + else sText = " Search Off"; + NuiSetBind(oPC, nToken, "btn_search_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sText = " Stealth On"; + else sText = " Stealth Off"; + NuiSetBind(oPC, nToken, "btn_stealth_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType)) + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "btn_open_door_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) sText = " Open Doors On [" + sRange + " meters]"; + else sText = " Open Doors Off [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "btn_open_door_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType)) + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "btn_traps_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) sText = " Disable Traps On [" + sRange + " meters]"; + else sText = " Disable Traps Off [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "btn_traps_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType)) + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "btn_pick_locks_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) sText = " Pick locks On [" + sRange + " meters]"; + else sText = " Pick Locks Off [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "btn_pick_locks_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType)) + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); + NuiSetBind(oPC, nToken, "btn_bash_locks_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) sText = " Bash On [" + sRange + " meters]"; + else sText = " Bash Off [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "btn_bash_locks_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_magic_level_event", JsonBool(TRUE)); + string sMagic = IntToString(GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT)); + NuiSetBind(oPC, nToken, "btn_magic_level_tooltip", JsonString(" Magic Level [" + sMagic + "]")); + } + if(ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType)) + { + string sCasting = " Spontaneous casting On"; + if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE)) sCasting = " Spontaneous casting Off"; + NuiSetBind(oPC, nToken, "btn_spontaneous_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spontaneous_tooltip", JsonString(sCasting)); + } + if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType)) + { + if(ai_GetAIMode(oAssociate, AI_MAGIC_NO_MAGIC)) sText = " Magic Off"; + else sText = " Magic On"; + NuiSetBind(oPC, nToken, "btn_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType)) + { + if(ai_GetAIMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) sText = " Magic Items Off"; + else sText = " Magic Items On"; + NuiSetBind(oPC, nToken, "btn_magic_items_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_items_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType)) + { + if(ai_GetAIMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) sText = " Defensive Magic On"; + else sText = " Defensive Magic Off"; + NuiSetBind(oPC, nToken, "btn_def_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_def_magic_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType)) + { + if(ai_GetAIMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) sText = " Offensive Magic On"; + else sText = " Offensive Magic Off"; + NuiSetBind(oPC, nToken, "btn_off_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_off_magic_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_heal_out_event", JsonBool(TRUE)); + sHeal = IntToString(GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT)); + sText = " Will heal at or below [" + sHeal + "%] health out of combat"; + NuiSetBind(oPC, nToken, "btn_heal_out_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_heal_in_event", JsonBool(TRUE)); + sHeal = IntToString(GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT)); + sText = " Will heal at or below [" + sHeal + "%] health in combat"; + NuiSetBind(oPC, nToken, "btn_heal_in_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_heals_onoff_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF)) sText = " Self healing Off"; + else sText = " Self healing On"; + NuiSetBind(oPC, nToken, "btn_heals_onoff_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_healp_onoff_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF)) sText = " Party healing Off"; + else sText = " Party healing On"; + NuiSetBind(oPC, nToken, "btn_healp_onoff_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_cure_onoff_event", JsonBool(TRUE)); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF)) sText = " Cast Cure Spells Off"; + else sText = " Cast Cure Spells On"; + NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType)) + { + sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE), 0, 0); + string sLoot = " Looting Off [" + sRange + " meters]"; + if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sLoot = " Looting On [" + sRange + " meters]"; + NuiSetBind(oPC, nToken, "btn_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_tooltip", JsonString(sLoot)); + } + if(ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_ignore_assoc_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) sText = " Ignore Enemy Associates On"; + else sText = " Ignore Enemy Associates Off"; + NuiSetBind(oPC, nToken, "btn_ignore_assoc_tooltip", JsonString(sText)); + } + if(ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_ignore_traps_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS)) sText = " Ignore Floor Traps On"; + else sText = " Ignore Floor Traps Off"; + NuiSetBind(oPC, nToken, "btn_ignore_traps_tooltip", JsonString(sText)); + } + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + if(ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType)) + { + int nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION); + if(nRange < 8 || nRange > 11) + { + nRange = 11; + SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, 11); + jAIData = JsonArraySet(jAIData, 7, JsonInt(11)); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + if(nRange == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; + if(nRange == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; + if(nRange == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; + else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; + NuiSetBind(oPC, nToken, "btn_perc_range_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_perc_range_tooltip", JsonString(sText)); + } + if(bIsPC) + { + int nIndex, bWidget; + string sButton, sName, sText, sScript; + json jPCPlugins = ai_UpdatePluginsForPC(oPC); + json jPlugin = JsonArrayGet(jPCPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bWidget) + { + sButton = IntToString(nIndex); + sScript = JsonGetString(JsonArrayGet(jPlugin, 0)); + if(ResManGetAliasFor(sScript, RESTYPE_NCS) == "") + { + sText = " " + sScript + " not found by ResMan!"; + } + else sName = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_tooltip", JsonString(sName)); + } + jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); + } + } + if(ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType)) + { + NuiSetBind(oPC, nToken, "btn_update_widget_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_update_widget_tooltip", JsonString(" Updates Quick Use Widget")); + json jSpell, jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + object oItem; + if(JsonGetType(jWidget) != JSON_TYPE_NULL) + { + int nLevel, nSpell, nIndex, nClass, nMetaMagic, nDomain, nSubSpell, nFeat; + string sSpellIcon, sMetaMagicText, sSubSpell, sClass, sIndex; + while(nIndex < 10) + { + jSpell = JsonArrayGet(jWidget, nIndex); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + sIndex = IntToString(nIndex); + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + if(nClass == -1) // This is an Item. + { + string sBaseName; + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); + int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); + if(nSpell == SPELL_HEALINGKIT) + { + sName = "Healer's Kit +" + IntToString(nIprpSubType); + sSpellIcon = "isk_heal"; + sBaseName = "Healer's Kit"; + } + else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL) + { + sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); + sBaseName = "Scroll"; + } + else + { + if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; + else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; + else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + int nUses = ai_GetItemUses(oItem, nIprpSubType); + if(nUses) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(nUses == 999) sText = "Unlimited"; + else sText = IntToString(nUses); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + else + { + nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nFeat) // This is a feat. + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + sSpellIcon = ""; + if(nSpell) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + if(sSpellIcon == "" || sSpellIcon == "IR_USE") + { + sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + sSpellIcon = Get2DAString("feat", "ICON", nFeat); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + if(GetHasFeat(nFeat, oAssociate)) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + else // This is a spell. + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); + nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + if(GetSpellUsesLeft(oAssociate, nClass, nSpell, nMetaMagic, nDomain)) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + } + } + else break; + ++nIndex; + } + while(nIndex < 20) + { + jSpell = JsonArrayGet(jWidget, nIndex); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + sIndex = IntToString(nIndex); + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nClass == -1) // This is an Item. + { + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + if(oItem != OBJECT_INVALID) + { + string sBaseName; + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); + int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); + if(nSpell == SPELL_HEALINGKIT) + { + sName = "Healer's Kit +" + IntToString(nIprpSubType); + sSpellIcon = "isk_heal"; + sBaseName = "Healer's Kit"; + } + else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL) + { + sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); + sBaseName = "Scroll"; + } + else + { + if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; + else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; + else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + int nUses = ai_GetItemUses(oItem, nIprpSubType); + if(nUses) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(nUses == 999) sText = "Unlimited"; + else sText = IntToString(nUses); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + else jWidget = JsonArrayDel(jWidget, nIndex--); + } + else if(nFeat) // This is a feat. + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + sSpellIcon = ""; + if(nSpell) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + if(sSpellIcon == "" || sSpellIcon == "IR_USE") + { + sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + sSpellIcon = Get2DAString("feat", "ICON", nFeat); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + if(GetHasFeat(nFeat, oAssociate)) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + else // This is a spell. + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + //SendMessageToPC(oPC, GetName(oAssociate) + " nSpell: " + IntToString(nSpell) + + // " nClass: " + IntToString(nClass) + " nMetaMagic: " + IntToString(nMetaMagic) + + // " nDomain: " + IntToString(nDomain) + " nLevel: " + IntToString(nLevel)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + sSubSpell = Get2DAString("spells", "Master", nSpell); + if(sSubSpell != "") nSpell = StringToInt(sSubSpell); + if(nDomain == -1 || GetSpellUsesLeft(oAssociate, nClass, nSpell, nMetaMagic, nDomain)) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(nDomain == -1) NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); + else + { + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + } + } + else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + } + else break; + ++nIndex; + } + } + } +} +void ai_CreateWidgetNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + if(sAssociateType == "") return; + int bAIWidgetLock = ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); + int bVertical = ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); + float fButtons; + // ************************************************************************* Width / Height + // Row 1 (buttons)********************************************************** + // Setup the main associate button to use their portrait. + json jButton = NuiEnabled(NuiId (NuiButtonImage(NuiBind("btn_open_main_image")), "btn_open_main"), NuiBind("btn_open_main_event")); + jButton = NuiWidth(jButton, 35.0); + jButton = NuiHeight(jButton, 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind ("btn_open_main_tooltip")); + jButton = NuiImageRegion(jButton, NuiRect(0.0, 0.0, 32.0, 35.0)); + json jRow = JsonArrayInsert(JsonArray(), jButton); + if(ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_action", "btn_cmd_action", 35.0f, 35.0f, 0.0, "btn_cmd_action_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_guard", "btn_cmd_guard", 35.0f, 35.0f, 0.0, "btn_cmd_guard_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_standground", "btn_cmd_hold", 35.0f, 35.0f, 0.0, "btn_cmd_hold_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_attacknearest", "btn_cmd_attack", 35.0f, 35.0f, 0.0, "btn_cmd_attack_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_follow", "btn_cmd_follow", 35.0f, 35.0f, 0.0, "btn_cmd_follow_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_follow_target", 35.0f, 35.0f, 0.0, "btn_follow_target_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ife_foc_search", "btn_cmd_search", 35.0f, 35.0f, 0.0, "btn_cmd_search_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ife_foc_hide", "btn_cmd_stealth", 35.0f, 35.0f, 0.0, "btn_cmd_stealth_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "", "btn_cmd_ai_script", 35.0f, 35.0f, 0.0, "btn_cmd_ai_script_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_settrap", "btn_cmd_place_trap", 35.0f, 35.0f, 0.0, "btn_cmd_place_trap_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_cantrips", "btn_buff_short", 35.0f, 35.0f, 0.0, "btn_buff_short_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_cast", "btn_buff_long", 35.0f, 35.0f, 0.0, "btn_buff_long_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_level789", "btn_buff_all", 35.0f, 35.0f, 0.0, "btn_buff_all_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_rest", "btn_buff_rest", 35.0f, 35.0f, 0.0, "btn_buff_rest_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType)) + { + string sImage; + if(oPC == oAssociate) sImage = "dm_jumpall"; + else sImage = "dm_jump"; + jRow = CreateButtonImage(jRow, sImage, "btn_jump_to", 35.0f, 35.0f, 0.0, "btn_jump_to_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "dm_limbo", "btn_ghost_mode", 35.0f, 35.0f, 0.0, "btn_ghost_mode_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_examine", "btn_camera", 35.0f, 35.0f, 0.0, "btn_camera_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_pickup", "btn_inventory", 35.0f, 35.0f, 0.0, "btn_inventory_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ife_familiar", "btn_familiar", 35.0f, 35.0f, 0.0, "btn_familiar_tooltip"); + fButtons += 1.0; + } + if(ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ife_animal", "btn_companion", 35.0f, 35.0f, 0.0, "btn_companion_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "dm_ai", "btn_ai", 35.0f, 35.0f, 0.0, "btn_ai_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_movsilent", "btn_quiet", 35.0f, 35.0f, 0.0, "btn_quiet_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_archer", "btn_ranged", 35.0f, 35.0f, 0.0, "btn_ranged_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "dm_takeitem", "btn_equip_weapon", 35.0f, 35.0f, 0.0, "btn_equip_weapon_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_search", "btn_search", 35.0f, 35.0f, 0.0, "btn_search_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_hide", "btn_stealth", 35.0f, 35.0f, 0.0, "btn_stealth_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_open", "btn_open_door", 35.0f, 35.0f, 0.0, "btn_open_door_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_distrap", "btn_traps", 35.0f, 35.0f, 0.0, "btn_traps_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_olock", "btn_pick_locks", 35.0f, 35.0f, 0.0, "btn_pick_locks_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_bash", "btn_bash_locks", 35.0f, 35.0f, 0.0, "btn_bash_locks_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "dm_control", "btn_magic_level", 35.0f, 35.0f, 0.0, "btn_magic_level_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_xability", "btn_spontaneous", 35.0f, 35.0f, 0.0, "btn_spontaneous_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_cntrspell", "btn_magic", 35.0f, 35.0f, 0.0, "btn_magic_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_moreattacks", "btn_magic_items", 35.0f, 35.0f, 0.0, "btn_magic_items_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_orisons", "btn_def_magic", 35.0f, 35.0f, 0.0, "btn_def_magic_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_metamagic", "btn_off_magic", 35.0f, 35.0f, 0.0, "btn_off_magic_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "isk_heal", "btn_heal_out", 35.0f, 35.0f, 0.0, "btn_heal_out_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "dm_heal", "btn_heal_in", 35.0f, 35.0f, 0.0, "btn_heal_in_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_heal", "btn_heals_onoff", 35.0f, 35.0f, 0.0, "btn_heals_onoff_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_party", "btn_healp_onoff", 35.0f, 35.0f, 0.0, "btn_healp_onoff_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_accept", "btn_cure_onoff", 35.0f, 35.0f, 0.0, "btn_cure_onoff_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_barter", "btn_loot", 35.0f, 35.0f, 0.0, "btn_loot_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_ignore", "btn_ignore_assoc", 35.0f, 35.0f, 0.0, "btn_ignore_assoc_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_abort", "btn_ignore_traps", 35.0f, 35.0f, 0.0, "btn_ignore_traps_tooltip"); + fButtons += 1.0; + } + if(ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType)) + { + jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_perc_range", 35.0f, 35.0f, 0.0, "btn_perc_range_tooltip"); + fButtons += 1.0; + } + int bIsPC = ai_GetIsCharacter(oAssociate); + if(bIsPC) + { + json jPCPlugins = ai_UpdatePluginsForPC(oPC); + // Plug in buttons ***************************************************** + int nIndex, bWidget; + string sIcon, sButton; + json jPlugin = JsonArrayGet(jPCPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bWidget == 1) + { + sIcon = JsonGetString(JsonArrayGet(jPlugin, 3)); + sButton = IntToString(nIndex); + jRow = CreateButtonImage(jRow, sIcon, "btn_exe_plugin_" + sButton, 35.0f, 35.0f, 0.0, "btn_exe_plugin_" + sButton + "_tooltip"); + fButtons += 1.0; + } + jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); + } + } + float fHeight, fWidth; + if(bAIWidgetLock) + { + fWidth = 50.0f; + fHeight = 50.0; + } + else if(bVertical) + { + fWidth = 88.0f; + fHeight = 55.0f; + } + else + { + fWidth = 55.0f; + fHeight = 88.0f; + } + // Quick Widget. + int nIndex, nSpell, nLevel, nMetaMagic; + float fQuickWidgetColumns; + string sClass, sLevel, sIndex; + object oItem; + json jSpell; + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jCol = JsonArray(); + if(ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType) && + JsonGetLength(jWidget) > 0) + { + // Row 2 (Widget Row 1)************************************************* + if(JsonGetType(jWidget) != JSON_TYPE_NULL) + { + fQuickWidgetColumns += 1.0; + int bAdd; + float fSpellButtons; + json jButton, jRectangle, jMetaMagic, jDrawList; + // Add row to the column. + if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); + else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + jRow = CreateButtonImage(JsonArray(), "ir_back", "btn_update_widget", 35.0f, 35.0f, 0.0, "btn_update_widget_tooltip"); + //CreateLabel(jRow, "", "blank_label", 35.0, 35.0, 0, 0, 0.0); + while(nIndex < 10) + { + bAdd = TRUE; + jSpell = JsonArrayGet(jWidget, nIndex); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + if(JsonGetInt(JsonArrayGet(jSpell, 1)) == -1) + { + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + if(oItem == OBJECT_INVALID) + { + bAdd = FALSE; + jWidget = JsonArrayDel(jWidget, nIndex--); + jSpells = JsonArrayInsert(jSpells, jWidget, 2); + jAIData = JsonArrayInsert(jAIData, jSpells, 10); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + } + if(bAdd) + { + sIndex = IntToString(nIndex); + jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_widget_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); + jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + fSpellButtons += 1.0; + } + } + else break; + ++nIndex; + } + if(fSpellButtons > fButtons) fButtons = fSpellButtons; + // Row 3 (Widget Row 2)************************************************* + if(nIndex > 9 && JsonGetLength(jWidget) > 10) + { + fQuickWidgetColumns += 1.0; + // Add row to the column. + if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); + else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + jRow = CreateLabel(JsonArray(), "", "blank_label", 35.0, 35.0, 0, 0, 0.0); + while(nIndex < 20) + { + jSpell = JsonArrayGet(jWidget, nIndex); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + if(JsonGetInt(JsonArrayGet(jSpell, 1)) == -1) + { + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + if(oItem == OBJECT_INVALID) + { + bAdd = FALSE; + jWidget = JsonArrayDel(jWidget, nIndex--); + jSpells = JsonArrayInsert(jSpells, jWidget, 2); + jAIData = JsonArrayInsert(jAIData, jSpells, 10); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + } + if(bAdd) + { + sIndex = IntToString(nIndex); + jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_widget_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); + jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + fSpellButtons += 1.0; + } + } + else break; + ++nIndex; + } + } + } + // Add the row to the column. + if(nIndex > 0) + { + if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); + else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + } + } + else + { + // Add the row to the column. + if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); + else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + } + float fScale = GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE) / 100.0; + float fButtonScale; + // 1.1 = 2.5 2.0 = 6.0 Ranges we need for scales to work correctly. + if(fScale > 1.0) fButtonScale = (fScale - 1.1) / (2.0 - 1.1) * 3.5 + 2.5; + else fButtonScale = 1.0; + if(fButtons > 0.0f) + { + if(bVertical) fWidth = fWidth + fButtons * 35.0f + fButtons * fButtonScale; + else fWidth = fWidth + fButtons * 35.0f; + } + if(fQuickWidgetColumns > 0.0f) + { + if(bVertical) fHeight = fHeight + fQuickWidgetColumns * 39.0f; + else fHeight = fHeight + fQuickWidgetColumns * 39.0f + fQuickWidgetColumns * fButtonScale; + } + // Get the window location to restore it from the database. + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + //SendMessageToPC(oPC, "0i_menu, 2124, sAssociateType: " + sAssociateType + " jLocations: " + JsonDump(jLocations, 1)); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) + { + ai_SetupAssociateData(oPC, oAssociate, sAssociateType); + jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + } + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_WIDGET_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Keeps the widgets from bunching up in the top corner. + if(fY == 0.0 && fX == 0.0) + { + if(sAssociateType == "pc") fY = 1.0; + else if(sAssociateType == "familiar") fY = 96.0 * fScale; + else if(sAssociateType == "companion") fY = 192.0 * fScale; + else if(sAssociateType == "summons") fY = 288.0 * fScale; + else if(sAssociateType == "dominated") fY = 384.0 * fScale; + else + { + int nIndex = 1; + string sAssociateName = GetName(oAssociate); + while(nIndex < AI_MAX_HENCHMAN) + { + if(sAssociateName == GetName(GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex))) + { + fY = (88.0 + 88.0 * IntToFloat(nIndex - 1)); + break; + } + nIndex++; + } + } + fY = fY * fScale; + } + if(bAIWidgetLock) + { + fX += 4.0f; + // GUI scales are a mess, I just figured them out per scale to keep the widget from moving. + if(fScale == 1.0) fY += 37.0; + else if(fScale == 1.1) fY += 38.0; + else if(fScale == 1.2) fY += 40.0; + else if(fScale == 1.3) fY += 42.0; + else if(fScale == 1.4) fY += 43.0; + else if(fScale == 1.5) fY += 45.0; + else if(fScale == 1.6) fY += 47.0; + else if(fScale == 1.7) fY += 48.0; + else if(fScale == 1.8) fY += 50.0; + else if(fScale == 1.9) fY += 52.0; + else if(fScale == 2.0) fY += 54.0; + } + // Set the layout of the window. + json jLayout; + int nToken, bBool; + string sHeal, sText, sRange; + string sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + if(bVertical) + { + jLayout = NuiRow(jCol); + if(bAIWidgetLock) nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, "AI Widget", fX, fY, fHeight, fWidth, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui"); + else nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, sName + " Widget", fX, fY, fHeight, fWidth, FALSE, FALSE, FALSE, TRUE, TRUE, "0e_nui"); +} + else + { + jLayout = NuiCol(jCol); + if(bAIWidgetLock) nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, "AI Widget", fX, fY, fWidth, fHeight, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui"); + else nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, sName + " Widget", fX, fY, fWidth, fHeight, FALSE, FALSE, FALSE, TRUE, TRUE, "0e_nui"); + } + // Save the associate to the nui. + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + NuiSetUserData(oPC, nToken, jData); + ai_SetWidgetBinds(oPC, oAssociate, sAssociateType, nToken, sName); +} +json ai_CreateLootFilterRow(json jRow, string sLabel, int nIndex) +{ + string sIndex = IntToString(nIndex); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateTextEditBox(jRow, "plc_hold", "txt_gold_" + sIndex, 9, FALSE, 90.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateCheckBox(jRow, sLabel, "chbx_" + sIndex, 200.0, 20.0); + return JsonArrayInsert(jRow, NuiSpacer()); +} +void ai_SetupLootElements(object oPC, object oAssociate, int nToken, int nLootBit, int nIndex) +{ + string sIndex = IntToString(nIndex); + int bLoot = ai_GetLootFilter(oAssociate, nLootBit); + NuiSetBind(oPC, nToken, "chbx_" + sIndex + "_check", JsonBool(bLoot)); + NuiSetBindWatch (oPC, nToken, "chbx_" + sIndex + "_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_" + sIndex + "_event", JsonBool(TRUE)); + string sGold = IntToString(GetLocalInt(oAssociate, AI_MIN_GOLD_ + sIndex)); + NuiSetBind(oPC, nToken, "txt_gold_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_gold_" + sIndex, JsonString(sGold)); + NuiSetBindWatch (oPC, nToken, "txt_gold_" + sIndex, TRUE); +} +void ai_CreateLootFilterNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 318 / 73 + int bIsPC = ai_GetIsCharacter(oAssociate); + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateCheckBox(jRow, "Give all loot to the player", "chbx_give_loot", 200.0, 20.0, "chbx_give_loot_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 *************************************************************** 388 / 101 + jRow = JsonArray(); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateTextEditBox(jRow, "plc_hold", "txt_max_weight", 9, FALSE, 50.0, 20.0, "txt_max_weight_tooltip"); + jRow = CreateLabel(jRow, "Maximum Weight to pickup", "lbl_weight", 200.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 *************************************************************** 388 / 129 + jRow = JsonArray(); + jRow = CreateButton(jRow, "Set All", "btn_set_all", 110.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear All", "btn_clear_all", 110.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 *************************************************************** 388 / 157 + jRow = JsonArray(); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "Minimum Gold", "lbl_min_gold", 100.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateLabel(jRow, "Items to Pickup", "lbl_pickup", 140.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 *************************************************************** 388 / 185 + jRow = ai_CreateLootFilterRow(JsonArray(), "Plot items", 2); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 6 *************************************************************** 388 / 213 + jRow = ai_CreateLootFilterRow(JsonArray(), "Armor", 3); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 7 *************************************************************** 388 / 241 + jRow = ai_CreateLootFilterRow(JsonArray(), "Belts", 4); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 8 *************************************************************** 388 / 269 + jRow = ai_CreateLootFilterRow(JsonArray(), "Boots", 5); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 9 *************************************************************** 388 / 297 + jRow = ai_CreateLootFilterRow(JsonArray(), "Cloaks", 6); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 10 *************************************************************** 388 / 325 + jRow = ai_CreateLootFilterRow(JsonArray(), "Gems", 7); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 11 *************************************************************** 388 / 353 + jRow = ai_CreateLootFilterRow(JsonArray(), "Gloves and Bracers", 8); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 12 *************************************************************** 388 / 381 + jRow = ai_CreateLootFilterRow(JsonArray(), "Headgear", 9); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 13 *************************************************************** 388 / 409 + jRow = ai_CreateLootFilterRow(JsonArray(), "Jewelry", 10); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 14 *************************************************************** 388 / 437 + jRow = ai_CreateLootFilterRow(JsonArray(), "Miscellaneous items", 11); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 15 *************************************************************** 388 / 465 + jRow = ai_CreateLootFilterRow(JsonArray(), "Potions", 12); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 16 *************************************************************** 388 / 493 + jRow = ai_CreateLootFilterRow(JsonArray(), "Scrolls", 13); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 17 *************************************************************** 388 / 521 + jRow = ai_CreateLootFilterRow(JsonArray(), "Shields", 14); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 18 *************************************************************** 388 / 549 + jRow = ai_CreateLootFilterRow(JsonArray(), "Wands, Rods, and Staves", 15); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 19 ************************************************************** 388 / 577 + jRow = ai_CreateLootFilterRow(JsonArray(), "Weapons", 16); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 20 ************************************************************** 388 / 605 + jRow = ai_CreateLootFilterRow(JsonArray(), "Arrows", 17); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 21 ************************************************************** 388 / 633 + jRow = ai_CreateLootFilterRow(JsonArray(), "Bolts", 18); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 22 ************************************************************** 388 / 661 + jRow = ai_CreateLootFilterRow(JsonArray(), "Bullets", 19); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_LOOTFILTER_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sText, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_LOOTFILTER_NUI, sName + " Loot Filter", + fX, fY, 318.0, 673.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Save the associate to the nui. + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + NuiSetUserData(oPC, nToken, jData); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 + int bGiveLoot = ai_GetLootFilter(oAssociate, AI_LOOT_GIVE_TO_PC); + NuiSetBind(oPC, nToken, "chbx_give_loot_check", JsonBool (bGiveLoot)); + NuiSetBindWatch (oPC, nToken, "chbx_give_loot_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_give_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_give_loot_tooltip", JsonString( + " Check this to make henchman give any loot picked up to the player.")); + // Row 2 + int nWeight = GetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT); + if(nWeight == 0) + { + nWeight = 200; + SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, nWeight); + } + NuiSetBind(oPC, nToken, "txt_max_weight_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_max_weight", JsonString(IntToString(nWeight))); + NuiSetBindWatch (oPC, nToken, "txt_max_weight", TRUE); + NuiSetBind(oPC, nToken, "txt_max_weight_tooltip", JsonString(" Max weighted item you will pickup from 1 to 1,000")); + // Row 3 + NuiSetBind(oPC, nToken, "btn_set_all_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_set_all", JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_all_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_all", JsonInt(TRUE)); + // Row 4 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_PLOT, 2); + // Row 5 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_ARMOR, 3); + // Row 6 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BELTS, 4); + // Row 7 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BOOTS, 5); + // Row 8 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_CLOAKS, 6); + // Row 9 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_GEMS, 7); + // Row 10 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_GLOVES, 8); + // Row 11 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_HEADGEAR, 9); + // Row 12 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_JEWELRY, 10); + // Row 13 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_MISC, 11); + // Row 14 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_POTIONS, 12); + // Row 15 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_SCROLLS, 13); + // Row 16 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_SHIELDS, 14); + // Row 17 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_WANDS_RODS_STAVES, 15); + // Row 18 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_WEAPONS, 16); + // Row 19 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_ARROWS, 17); + // Row 20 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BOLTS, 18); + // Row 21 + ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BULLETS, 19); +} +void ai_CreateCopySettingsNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 244 / 73 + string sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "Copy settings to", "lbl_paste", 220.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 244 / 101 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "All Associates", "btn_paste_all", 220.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 2 ******************************************************************* 244 / 129 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Familiar", "btn_paste_familiar", 220.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 244 / 157 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Companion", "btn_paste_companion", 220.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 244 / 185 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Summons", "btn_paste_summons", 220.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 ******************************************************************* 244 / 213 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Dominated", "btn_paste_dominated", 220.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5+ ****************************************************************** 244 / 241 + float fHeight = 241.0; + int nIndex; + string sAssocName; + object oAssoc; + for(nIndex = 1; nIndex < AI_MAX_HENCHMAN; nIndex++) + { + oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssoc != OBJECT_INVALID) + { + sAssocName = GetName(oAssoc); + if(GetStringRight(sAssocName, 1) == "s") sAssocName = sAssocName + "'"; + else sAssocName = sAssocName + "'s"; + jRow = CreateButton(JsonArray(), sAssocName, "btn_paste_henchman" + IntToString(nIndex), 220.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + else break; + } + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_COPY_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_COPY_NUI, sName + " Copy Settings Menu", + fX, fY, 244.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Save the associate to the nui. + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + NuiSetUserData(oPC, nToken, jData); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 + NuiSetBind(oPC, nToken, "btn_paste_all_event", JsonBool (TRUE)); + oAssoc = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); + NuiSetBind(oPC, nToken, "btn_paste_familiar_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); + oAssoc = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); + NuiSetBind(oPC, nToken, "btn_paste_companion_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); + oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); + NuiSetBind(oPC, nToken, "btn_paste_summons_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); + oAssoc = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); + NuiSetBind(oPC, nToken, "btn_paste_dominated_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); + for(nIndex = 1; nIndex < AI_MAX_HENCHMAN; nIndex++) + { + oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssoc != OBJECT_INVALID) + { + NuiSetBind(oPC, nToken, "btn_paste_henchman" + IntToString(nIndex) + "_event", JsonBool(oAssoc != oAssociate)); + } + else break; + } +} +void ai_CreatePluginNUI(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int nIndex, nButton; + string sButton; + // Row 1 ******************************************************************* 500 / 73 + json jRow = CreateButton(JsonArray(), "Load Plugins", "btn_load_plugins", 150.0f, 20.0f, -1.0, "btn_load_plugins_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Load Monster Mods", "btn_load_m_mods", 150.0f, 20.0f, -1.0, "btn_load_m_mods_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Check All", "btn_check_plugins", 80.0f, 20.0f, -1.0, "btn_check_plugins_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear All", "btn_clear_plugins", 80.0f, 20.0f, -1.0, "btn_clear_plugins_tooltip"); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 101 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Add Plugin", "btn_add_plugin", 150.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_plugin", 16, FALSE, 310.0f, 20.0f, "txt_plugin_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 101.0; + // Row 3+ ****************************************************************** 500 / --- + json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); + nIndex = 0; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + string sName; + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Remove Plugin", "btn_remove_plugin_" + sButton, 150.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 290.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + // Get the window location to restore it from the database. + json jLocations = ai_GetAssociateDbJson(oPC, "pc", "locations"); + float fX, fY; + jLocations = JsonObjectGet(jLocations, AI_PLUGIN_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, AI_PLUGIN_NUI, sName + " PEPS Plugin Manager", + fX, fY, 500.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPC))); + NuiSetUserData(oPC, nToken, jData); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Row 1 + NuiSetBind(oPC, nToken, "btn_load_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_load_plugins_tooltip", JsonString(" Load all known PEPS plugins that are in the game files.")); + NuiSetBind(oPC, nToken, "btn_load_m_mods_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_load_m_mods_tooltip", JsonString(" Load all known PEPS monster mods that are in the game files.")); + NuiSetBind(oPC, nToken, "btn_check_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_check_plugins_tooltip", JsonString(" Add all plugins to the players widget.")); + NuiSetBind(oPC, nToken, "btn_clear_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_plugins_tooltip", JsonString(" Remove all plugins from the players widget.")); + // Row 2 + NuiSetBind(oPC, nToken, "btn_add_plugin_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_plugin_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_plugin_tooltip", JsonString(" Enter an executable script name.")); + // Row 3+ + nIndex = 0; + int bCheck; + string sText; + jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_remove_plugin_" + sButton + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); + bCheck = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bCheck < 3) + { + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bCheck)); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); + } + sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } +} +int ai_SpellNotInList(int nSpell, json jSpellArray) +{ + int nMaxArray = JsonGetLength(jSpellArray); + int nIndex; + while(nIndex < nMaxArray) + { + if(nSpell == JsonGetInt(JsonArrayGet(JsonArrayGet(jSpellArray, nIndex), 0))) return FALSE; + nIndex++; + } + return TRUE; +} +json ai_CheckItemAbilities(json jQuickListArray, object oCreature, object oItem, json jSpell_Icon, json jSpell_Text, int bEquiped = FALSE) +{ + // We have established that we can use the item if it is equiped. + if(!bEquiped && !ai_CheckIfCanUseItem(oCreature, oItem)) return jQuickListArray; + int nPerDay, nCharges, nUses, bSaveTalent, nBaseItemType; + int nIprpSubType, nSpell, nLevel, nIPType, nIndex; + string sSpellIcon, sSpellName; + itemproperty ipProp = GetFirstItemProperty(oItem); + json jSpell; + // Lets skip this if there are no properties. + if(!GetIsItemPropertyValid(ipProp)) return jQuickListArray; + // Check for cast spell property and add them to the talent list. + while(GetIsItemPropertyValid(ipProp)) + { + nIPType = GetItemPropertyType(ipProp); + if(nIPType == ITEM_PROPERTY_CAST_SPELL) + { + bSaveTalent = TRUE; + // Get how they use the item (charges or uses per day). + nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses > 1 && nUses < 7) + { + nCharges = GetItemCharges(oItem); + if((nUses == IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE && nCharges < 1) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE && nCharges < 2) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE && nCharges < 3) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE && nCharges < 4) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE && nCharges < 5)) bSaveTalent = FALSE; + } + else if(nUses > 7 && nUses < 13) + { + nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(AI_DEBUG) ai_Debug("0i_talents", "1676", "Item uses: " + IntToString(nPerDay)); + if(nPerDay == 0) bSaveTalent = FALSE; + } + if(bSaveTalent) + { + // SubType is the ip spell index for iprp_spells.2da + nIprpSubType = GetItemPropertySubType(ipProp); + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + nBaseItemType = GetBaseItemType(oItem); + if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL) + { + sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); + sSpellName = ai_StripColorCodes(GetName(oItem)); + nUses = GetNumStackedItems(oItem); + } + else + { + if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) + { + sSpellName = ai_StripColorCodes(GetName(oItem)); + nUses = GetNumStackedItems(oItem); + } + else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == FEAT_CRAFT_WAND) + { + sSpellName = ai_StripColorCodes(GetName(oItem)); + nUses = nCharges; + } + else + { + sSpellName = ai_StripColorCodes(GetName(oItem)) + ": "; + sSpellName += GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(nCharges) nUses = nCharges; + else nUses = nPerDay; + } + sSpellIcon = Get2DAString("spells", "iConResRef", nSpell); + } + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(-1)); // Class is set to -1 for items + jSpell = JsonArrayInsert(jSpell, JsonInt(nUses)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nBaseItemType)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nIprpSubType)); + jSpell = JsonArrayInsert(jSpell, JsonString(GetObjectUUID(oItem))); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + } + else if(nIPType == ITEM_PROPERTY_HEALERS_KIT) + { + // Must also have ranks in healing kits. + if(GetSkillRank(SKILL_HEAL, oCreature) > 0) + { + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString("isk_heal")); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(ai_StripColorCodes(GetName(oItem)))); + json jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(SPELL_HEALINGKIT)); + jSpell = JsonArrayInsert(jSpell, JsonInt(-1)); // Class is set to -1 for items + jSpell = JsonArrayInsert(jSpell, JsonInt(GetNumStackedItems(oItem))); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jSpell = JsonArrayInsert(jSpell, JsonInt(GetItemPropertyCostTableValue(ipProp))); + jSpell = JsonArrayInsert(jSpell, JsonString(GetObjectUUID(oItem))); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + } + nIndex++; + ipProp = GetNextItemProperty(oItem); + } + SetLocalJson(oCreature, "JSPELL_ICON", jSpell_Icon); + SetLocalJson(oCreature, "JSPELL_NAME", jSpell_Text); + return jQuickListArray; +} +void ai_CreateQuickWidgetSelectionNUI(object oPC, object oAssociate) +{ + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + json jRow = JsonArray(); + // Row 1 Classes************************************************************ 414 / 88 + int nClass, nLevel, nIndex; + string sIndex, sClassIcon, sLevelIcon; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass != CLASS_TYPE_INVALID) + { + // This saves the class position in the button id so we can get it later. + sIndex = IntToString(nIndex); + sClassIcon = Get2DAString("classes", "Icon", nClass); + jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); + } + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Levels) ********************************************************** 414 / 131 + jRow = CreateButtonImage(JsonArray(), "", "btn_level_11" , 35.0f, 35.0f, 0.0, "btn_level_11_tooltip"); + jRow = CreateButtonImage(jRow, "", "btn_level_10" , 35.0f, 35.0f, 0.0, "btn_level_10_tooltip"); + for(nIndex = 0; nIndex <= 9; nIndex++) + { + // This saves the level in the button id so we can get it later. + sIndex = IntToString(nIndex); + jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Spell List)******************************************************* 414 / 433 + json jButton = JsonArray(); + jButton = NuiButton(NuiBind("text_spell")); + jButton = NuiId(jButton, "btn_text_spell"); + json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); + json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); + jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); + jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 345.0, FALSE)); + json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); + jInfo = NuiId(jInfo, "btn_info_spell"); + jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); + jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (Widget Label)***************************************************** 414 / 461 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "Quick Widget List", "lbl_quick_list", 150.0, 20.0, 0, 0, 0.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 (Widget row 1)***************************************************** 414 / 504 + jRow = JsonArray(); + for(nIndex = 0; nIndex < 10; nIndex++) + { + // This saves the index location in the json jWidget in the button id for later use. + sIndex = IntToString(nIndex); + json jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_widget_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); + json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 6 (Widget row 2)***************************************************** 414 / 543 + jRow = JsonArray(); + for(nIndex = 10; nIndex < 20; nIndex++) + { + // This saves the index location in the json jWidget in the button id for later use. + sIndex = IntToString(nIndex); + json jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_widget_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); + json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_QUICK_WIDGET_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sText, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_QUICK_WIDGET_NUI, sName + " Quick Widget Menu", + fX, fY, 414.0, 543.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Set the Layout of the window. + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + json jSpells; + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + // Temporary fix for error! :/ + if(JsonGetLength(jAIData) == 0) + { + ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); + jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(10)); + jAIData = JsonArrayInsert(jAIData, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + nLevel = 10; + } + if(JsonGetLength(jAIData) == 9) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(10)); + jSpells = JsonArrayInsert(jSpells, JsonArray()); + jAIData = JsonArrayInsert(jAIData, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + nLevel = 10; + } + else + { + jSpells = JsonArrayGet(jAIData, 10); + if(JsonGetLength(jSpells) == 0) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(10)); + jSpells = JsonArrayInsert(jSpells, JsonArray()); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + nLevel = 10; + } + else + { + nClass = JsonGetInt(JsonArrayGet(jSpells, 0)); + nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); + } + } + if(nClass < 1 || nClass > AI_MAX_CLASSES_PER_CHARACTER) nClass = 1; + nClass = GetClassByPosition(nClass, oAssociate); + // Row 1 & 2 Class & Level + int nSpellLevel, nLevelIndex, nClassIndex, nMaxSpellLevel; + string sClass, sLevel, sLevelImage, sLevelIndex; + NuiSetBind(oPC, nToken, "btn_level_11_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_11_tooltip", JsonString(" Item Powers")); + NuiSetBind(oPC, nToken, "btn_level_11_image", JsonString("ir_attack")); + NuiSetBind(oPC, nToken, "btn_level_10_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_10_tooltip", JsonString(" Special Abilities")); + NuiSetBind(oPC, nToken, "btn_level_10_image", JsonString("dm_god")); + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClassIndex = GetClassByPosition(nIndex, oAssociate); + if(nClassIndex != CLASS_TYPE_INVALID) + { + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClassIndex))); + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); + if(nClass == nClassIndex) + { + if(StringToInt(Get2DAString("classes", "SpellCaster", nClass))) + { + int nClassLevel = GetLevelByClass(nClass, oAssociate); + string sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); + int nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); + for(nLevelIndex = 0; nLevelIndex <= 9; nLevelIndex++) + { + sLevelIndex = IntToString(nLevelIndex); + if(nLevelIndex < nMaxSpellLevel) + { + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); + if(nLevelIndex == 0) sLevelImage = "ir_cantrips"; + else if(nLevelIndex < 7)sLevelImage = "ir_level" + sLevelIndex; + else sLevelImage = "ir_level789"; + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString(sLevelImage)); + if(nLevelIndex == 0) sLevel = " Cantrips"; + else if(nLevelIndex == 1) sLevel = " First level"; + else if(nLevelIndex == 2) sLevel = " Second level"; + else if(nLevelIndex == 3) sLevel = " Third level"; + else if(nLevelIndex == 4) sLevel = " Fourth level"; + else if(nLevelIndex == 5) sLevel = " Fifth level"; + else if(nLevelIndex == 6) sLevel = " Sixth level"; + else if(nLevelIndex == 7) sLevel = " Seventh level"; + else if(nLevelIndex == 8) sLevel = " Eighth level"; + else if(nLevelIndex == 9) sLevel = " Ninth level"; + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_tooltip", JsonString(" " + sLevel)); + } + else + { + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(FALSE)); + } + } + NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevel) + "_encouraged", JsonBool(TRUE)); + } + // Default to the abilities tab since they are not a caster. + else + { + if(nLevel < 10) nLevel = 10; + for(nLevelIndex = 0; nLevelIndex <= 9; nLevelIndex++) + { + sLevelIndex = IntToString(nLevelIndex); + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(FALSE)); + } + NuiSetBind(oPC, nToken, "btn_level_10_encouraged", JsonBool(TRUE)); + } + NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClass) + "_encouraged", JsonBool(TRUE)); + } + } + } + // Row 3 Items/Abilities/Skills/Spells + int nSpell, nMetaMagic, nDomain, nSubSpell, nSubSpellIndex; + int nSpellSlot, nCounter, nMax2daRow, nFeat; + string sSpellIcon, sSpellName, sMetaMagicText, sClassFeats, sSubSpellIndex; + object oItem; + json jQuickListArray = JsonArray(); + json jSpell; + json jSpell_Icon = JsonArray(); + json jSpell_Text = JsonArray(); + SetLocalJson(oAssociate, "JSPELL_ICON", jSpell_Icon); + SetLocalJson(oAssociate, "JSPELL_NAME", jSpell_Text); + json jMetaMagic_Text = JsonArray(); + // Item powers + if(nLevel == 11) + { + string sSlots; + // Cycle through all the creatures inventory items. + oItem = GetFirstItemInInventory(oAssociate); + while(oItem != OBJECT_INVALID) + { + if(GetIdentified(oItem)) + { + // Does the item need to be equiped to use its powers? + sSlots = Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)); + if(sSlots == "0x00000") + { + jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, FALSE); + jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); + jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); + WriteTimestampedLogEntry("0i_menus, 3643, oAssociate: " + GetName(oAssociate) + + " jSpell_Text: " + JsonDump(jSpell_Text, 4)); + } + } + oItem = GetNextItemInInventory(oAssociate); + } + int nSlot; + // Cycle through all the creatures equiped items. + oItem = GetItemInSlot(nSlot, oAssociate); + while(nSlot < 11) + { + if(oItem != OBJECT_INVALID) + { + jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, TRUE); + jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); + jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); + } + oItem = GetItemInSlot(++nSlot, oAssociate); + } + oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oAssociate); + if(oItem != OBJECT_INVALID) + { + jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, TRUE); + jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); + jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); + } + DeleteLocalJson(oAssociate, "JSPELL_ICON"); + DeleteLocalJson(oAssociate, "JSPELL_NAME"); + } + // Special abilities and skills. + else if(nLevel == 10) + { + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClassIndex = GetClassByPosition(nIndex, oAssociate); + if(nClassIndex != CLASS_TYPE_INVALID) + { + nCounter = 0; + sClassFeats = Get2DAString("classes", "FeatsTable", nClassIndex); + nMax2daRow = Get2DARowCount(sClassFeats); + while(nCounter < nMax2daRow) + { + if(Get2DAString(sClassFeats, "OnMenu", nCounter) != "0") + { + nFeat = StringToInt(Get2DAString(sClassFeats, "FeatIndex", nCounter)); + if(GetHasFeat(nFeat, oAssociate, TRUE)) + { + // Check for subfeats. + nSpell = StringToInt(Get2DAString("feat", "SPELLID", nFeat)); + nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell1", nSpell)); + //SendMessageToPC(oPC, "nFeat: " + IntToString(nFeat) + + // " nSpell: " + IntToString(nSpell) + + // " nSubSpell: " + IntToString(nSubSpell)); + if(nSubSpell) + { + for(nSubSpellIndex = 1; nSubSpellIndex <= 5; nSubSpellIndex++) + { + sSubSpellIndex = IntToString(nSubSpellIndex); + nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell" + sSubSpellIndex, nSpell)); + //SendMessageToPC(oPC, " nSpell: " + IntToString(nSpell) + + // " nSubSpell: " + IntToString(nSubSpell)); + if(nSubSpell != 0) + { + sSpellIcon = Get2DAString("spells", "iConResRef", nSubSpell); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSubSpell))); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSubSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jSpell = JsonArrayInsert(jSpell, JsonInt(255)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nFeat)); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + } + } + else if((nFeat < 71 || nFeat > 81)) + { + sSpellIcon = Get2DAString("feat", "ICON", nFeat); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jSpell = JsonArrayInsert(jSpell, JsonInt(255)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nFeat)); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + } + } + nCounter++; + } + } + } + // Used in the execution script to get the special abilities. + //jData = JsonArrayInsert(jData, jQuickListArray); + } + else // Anything else is for spells. + { + // Search all memorized spells for the spell. + //SendMessageToPC(oPC, GetName(oAssociate) + " nClass: " + IntToString(nClass) + + // " nLevelSelected: " + IntToString(nLevel) + + // " nMemorizesSpells: " + Get2DAString("classes", "MemorizesSpells", nClass)); + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + int nMaxSlot = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevel); + while(nSpellSlot < nMaxSlot) + { + nSpell = GetMemorizedSpellId(oAssociate, nClass, nLevel, nSpellSlot); + if(nSpell != -1 && ai_SpellNotInList(nSpell, jQuickListArray)) + { + nMetaMagic = GetMemorizedSpellMetaMagic(oAssociate, nClass, nLevel, nSpellSlot); + nDomain = GetMemorizedSpellIsDomainSpell(oAssociate, nClass, nLevel, nSpellSlot); + // Check for subspells. + nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell1", nSpell)); + if(nSubSpell) + { + for(nSubSpellIndex = 1; nSubSpellIndex < 6; nSubSpellIndex++) + { + sSubSpellIndex = IntToString(nSubSpellIndex); + nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell" + sSubSpellIndex, nSpell)); + if(nSubSpell && ai_SpellNotInList(nSubSpell, jQuickListArray)) + { + sSpellIcon = Get2DAString("spells", "IconResRef", nSubSpell); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSubSpell))); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSubSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nMetaMagic)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nDomain)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + } + } + else + { + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nMetaMagic)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nDomain)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + //SendMessageToPC(oPC, "nSpell: " + IntToString(nSpell) + + // " sSpellIcon: " + sSpellIcon + + // " sSpellName: " + sSpellName+ + // " nMaxSlot: " + IntToString(nMaxSlot) + + // " nSpellSlot: " + IntToString(nSpellSlot)); + } + } + ++nSpellSlot; + } + } + // Non-memorized spells. + else + { + int nMaxSlot = GetKnownSpellCount(oAssociate, nClass, nLevel); + while(nSpellSlot < nMaxSlot) + { + nSpell = GetKnownSpellId(oAssociate, nClass, nLevel, nSpellSlot); + if(nSpell != -1)// && ai_SpellNotInList(nSpell, jQuickListArray)) + { + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); + jSpell = JsonArrayInsert(jSpell, JsonInt(255)); + jSpell = JsonArrayInsert(jSpell, JsonInt(0)); + jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); + } + ++nSpellSlot; + } + } + } + NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); + NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); + NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); + jData = JsonArrayInsert(jData, jQuickListArray); + NuiSetUserData(oPC, nToken, jData); + // Row 4 Quick widget list label. + // Row 5 Quick widget List 1 + json jWidget = JsonArrayGet(jSpells, 2); + nIndex = 0; + while(nIndex < 10) + { + jSpell = JsonArrayGet(jWidget, nIndex); + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nClass == -1) // This is an Item. + { + string sBaseName; + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); + int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); + if(nSpell == SPELL_HEALINGKIT) + { + sName = "Healer's Kit +" + IntToString(nIprpSubType); + sSpellIcon = "isk_heal"; + sBaseName = "Healer's Kit"; + } + else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL) + { + sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); + sBaseName = "Scroll"; + } + else + { + if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; + else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; + else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + int nUses = ai_GetItemUses(oItem, nIprpSubType); + if(nUses) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(nUses == 999) sText = "Unlimited"; + else sText = IntToString(nUses); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); + } + } + else if(nFeat) // This is a feat. + { + sSpellIcon = ""; + if(nSpell) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + if(sSpellIcon == "" || sSpellIcon == "IR_USE") + { + sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + sSpellIcon = Get2DAString("feat", "ICON", nFeat); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); + } + else // This is a spell. + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); + nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + } + } + else + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + ++nIndex; + } + if(nIndex < 10) return; + // Row 6 Quick widget List2 + while(nIndex < 20) + { + jSpell = JsonArrayGet(jWidget, nIndex); + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nClass == -1) // This is an Item. + { + string sBaseName; + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); + int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); + if(nSpell == SPELL_HEALINGKIT) + { + sName = "Healer's Kit +" + IntToString(nIprpSubType); + sSpellIcon = "isk_heal"; + sBaseName = "Healer's Kit"; + } + else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || + nBaseItemType == BASE_ITEM_SCROLL || + nBaseItemType == BASE_ITEM_SPELLSCROLL) + { + sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); + sBaseName = "Scroll"; + } + else + { + if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; + else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || + nBaseItemType == BASE_ITEM_MAGICWAND || + nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; + else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + int nUses = ai_GetItemUses(oItem, nIprpSubType); + if(nUses) + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); + if(nUses == 999) sText = "Unlimited"; + else sText = IntToString(nUses); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); + } + } + else if(nFeat) // This is a feat. + { + sSpellIcon = ""; + if(nSpell) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + } + if(sSpellIcon == "" || sSpellIcon == "IR_USE") + { + sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + sSpellIcon = Get2DAString("feat", "ICON", nFeat); + } + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); + } + else // This is a spell. + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); + nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); + sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + } + } + else + { + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); + NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); + } + ++nIndex; + } +} +void ai_CreateSpellMemorizationNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jRow = JsonArray(); + // Row 1 Classes************************************************************ 414 / 73 + int nClass, bCaster, nIndex; + string sIndex, sClassIcon, sLevelIcon; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass != CLASS_TYPE_INVALID) + { + if(StringToInt(Get2DAString("classes", "MemorizesSpells", nClass))) + { + // This saves the class position in the button id so we can get it later. + sIndex = IntToString(nIndex); + sClassIcon = Get2DAString("classes", "Icon", nClass); + jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); + } + } + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Levels) ********************************************************** 414 / 116 + jRow = JsonArray(); + for(nIndex = 0; nIndex <= 9; nIndex++) + { + // This saves the level in the button id so we can get it later. + sIndex = IntToString(nIndex); + jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Spell List)******************************************************* 414 / 398 + json jButton = JsonArray(); + jButton = NuiButton(NuiBind("text_spell")); + jButton = NuiId(jButton, "btn_text_spell"); + json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); + json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); + //jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); + //jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 275.0, FALSE)); + json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); + jInfo = NuiId(jInfo, "btn_info_spell"); + jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); + jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (Widget Label)***************************************************** 414 / 426 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + CreateLabel(jRow, "Memorized Spell List", "lbl_spell_list", 150.0, 20.0, 0, 0, 0.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 (Memorize slots)*************************************************** 414 / 469 + // Get the class and level selected from the database. + int nClassSelected, nLevelSelected; + json jSpells; + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + // Temporary fix for error! :/ + if(JsonGetLength(jAIData) == 0) + { + ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); + jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + } + if(JsonGetLength(jAIData) == 9) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(0)); + jAIData = JsonArrayInsert(jAIData, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + else + { + jSpells = JsonArrayGet(jAIData, 10); + if(JsonGetType(jSpells) == JSON_TYPE_NULL) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(0)); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + else + { + nClassSelected = JsonGetInt(JsonArrayGet(jSpells, 0)); + nLevelSelected = JsonGetInt(JsonArrayGet(jSpells, 1)); + } + } + // If we left the Quick Use widget on Special Abilities (10) or Items (11) goto level 0 + if(nLevelSelected == 10 || nLevelSelected == 11) + { + nLevelSelected = 0; + jSpells = JsonArraySet(jSpells, 1, JsonInt(0)); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + if(nClassSelected < 1 || nClassSelected > AI_MAX_CLASSES_PER_CHARACTER) nClassSelected = 1; + nClass = GetClassByPosition(nClassSelected, oAssociate); + int nMaxMemorizationSlots = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevelSelected); + jRow = JsonArray(); + for(nIndex = 0; nIndex < nMaxMemorizationSlots; nIndex++) + { + // This saves the index location of the spell in the list. + sIndex = IntToString(nIndex); + json jButton = NuiButtonImage(NuiBind("btn_memorized_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_memorized_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_memorized_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_memorized_" + sIndex + "_tooltip")); + //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_SPELL_MEMORIZE_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + string sText, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_SPELL_MEMORIZE_NUI, sName + " Spell Memorization Menu", + fX, fY, 375.0, 504.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Set the Layout of the window. + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Row 1 & 2 Class & Level + int nSpellLevel, nIndexLevel, nMaxSpellLevel; + string sClass, sLevel, sLevelImage, sIndexLevel; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass != CLASS_TYPE_INVALID) + { + bCaster = StringToInt(Get2DAString("classes", "SpellCaster", nClass)); + if(bCaster) + { + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); + if(nClassSelected == nIndex) + { + int nClassLevel = GetLevelByClass(nClass, oAssociate); + string sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); + int nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); + for(nIndexLevel = 0; nIndexLevel <= 9; nIndexLevel++) + { + sIndexLevel = IntToString(nIndexLevel); + if(nIndexLevel < nMaxSpellLevel) + { + if(nIndexLevel == 0) sLevelImage = "ir_cantrips"; + else if(nIndexLevel < 7)sLevelImage = "ir_level" + sIndexLevel; + else sLevelImage = "ir_level789"; + if(nIndexLevel == 0) sLevel = " Cantrips"; + else if(nIndexLevel == 1) sLevel = " First level"; + else if(nIndexLevel == 2) sLevel = " Second level"; + else if(nIndexLevel == 3) sLevel = " Third level"; + else if(nIndexLevel == 4) sLevel = " Fourth level"; + else if(nIndexLevel == 5) sLevel = " Fifth level"; + else if(nIndexLevel == 6) sLevel = " Sixth level"; + else if(nIndexLevel == 7) sLevel = " Seventh level"; + else if(nIndexLevel == 8) sLevel = " Eighth level"; + else if(nIndexLevel == 9) sLevel = " Ninth level"; + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_tooltip", JsonString(" " + sLevel)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString(sLevelImage)); + } + else + { + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(FALSE)); + } + } + NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevelSelected) + "_encouraged", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClassSelected) + "_encouraged", JsonBool(TRUE)); + } + } + } + } + // Row 3 Spells + int nSpellSlot, nSpell, nMetamagic; + json jSpell; + json jWidget = JsonArrayGet(jSpells, 2); + nClass = GetClassByPosition(nClassSelected, oAssociate); + string sSpellIcon, sSpellName, sMetaMagicText; + json jSpellArray = JsonArray(); + json jSpell_Icon = JsonArray(); + json jSpell_Text = JsonArray(); + json jMetaMagic_Text = JsonArray(); + // List the spells they know from their spellbook. + if(Get2DAString("classes", "SpellbookRestricted", nClass) == "1") + { + int nMaxSpells = GetKnownSpellCount(oAssociate, nClass, nLevelSelected); + //WriteTimestampedLogEntry("Maxspells: " + IntToString(nMaxSpells) + + // " nClass: " + IntToString(nClass) + + // " nLevelSelected: " + IntToString(nLevelSelected)); + while(nSpellSlot < nMaxSpells) + { + nSpell = GetKnownSpellId(oAssociate, nClass, nLevelSelected, nSpellSlot); + if(nSpell != -1) + { + jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + //SendMessageToPC(oPC, "SpellBook: nSpell: " + IntToString(nSpell) + + // " sSpellIcon: " + sSpellIcon + + // " sSpellName: " + sSpellName+ + // " nMaxSpells: " + IntToString(nMaxSpells) + + // " nSpellSlot: " + IntToString(nSpellSlot)); + //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nClass, nLevelSelected, nSpellSlot); + //jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + } + ++nSpellSlot; + } + } + // List the spells from the spells.2da file (they get to choose from them all!). + else + { + string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); + int nMaxSpells = Get2DARowCount("spells"); + while(nSpell < nMaxSpells) + { + sLevel = Get2DAString("spells", sSpellTableColumn, nSpell); + if(sLevel != "") + { + if(StringToInt(sLevel) == nLevelSelected) + { + jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + } + } + ++nSpell; + } + } + jData = JsonArrayInsert(jData, jSpellArray); + NuiSetUserData(oPC, nToken, jData); + NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); + NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); + NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); + // Row 4 Spell memorized list label. + // Row 5 Spell memorized List + int nMetaMagic, nDomain; + nIndex = 0; + while(nIndex < nMaxMemorizationSlots) + { + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(TRUE)); + if(GetMemorizedSpellId(oAssociate, nClass, nLevelSelected, nIndex) > -1) + { + nSpell = GetMemorizedSpellId(oAssociate, nClass, nLevelSelected, nIndex); + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + //nMetaMagic = 255; + //nDomain = 0; + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevelSelected) + ")")); + //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, -1, -1, -1, nMetaMagic, nDomain); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + } + else + { + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); + NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(FALSE)); + } + ++nIndex; + } +} +void ai_CreateSpellKnownNUI(object oPC, object oAssociate) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jRow = JsonArray(); + // Row 1 Classes************************************************************ 414 / 73 + int nClass, bCaster, nIndex; + string sIndex, sClassIcon, sLevelIcon; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass != CLASS_TYPE_INVALID) + { + if(StringToInt(Get2DAString("classes", "SpellbookRestricted", nClass))) + { + // This saves the class position in the button id so we can get it later. + sIndex = IntToString(nIndex); + sClassIcon = Get2DAString("classes", "Icon", nClass); + jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); + } + } + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Levels) ********************************************************** 414 / 116 + jRow = JsonArray(); + for(nIndex = 0; nIndex <= 9; nIndex++) + { + // This saves the level in the button id so we can get it later. + sIndex = IntToString(nIndex); + jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Spell List)******************************************************* 414 / 398 + json jButton = JsonArray(); + jButton = NuiButton(NuiBind("text_spell")); + jButton = NuiId(jButton, "btn_text_spell"); + json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); + json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); + //jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); + //jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); + jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 275.0, FALSE)); + json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); + jInfo = NuiId(jInfo, "btn_info_spell"); + jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); + jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (Widget Label)***************************************************** 414 / 426 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + CreateLabel(jRow, "Known Spell List", "lbl_spell_list", 150.0, 20.0, 0, 0, 0.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 (Memorize slots)*************************************************** 414 / 469 + // Get the class and level selected from the database. + int nClassSelected, nLevelSelected; + json jSpells; + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + // Temporary fix for error! :/ + if(JsonGetLength(jAIData) == 0) + { + ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); + jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + } + if(JsonGetLength(jAIData) == 9) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(0)); + jAIData = JsonArrayInsert(jAIData, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + else + { + jSpells = JsonArrayGet(jAIData, 10); + if(JsonGetType(jSpells) == JSON_TYPE_NULL) + { + jSpells = JsonArray(); + jSpells = JsonArrayInsert(jSpells, JsonInt(1)); + jSpells = JsonArrayInsert(jSpells, JsonInt(0)); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + else + { + nClassSelected = JsonGetInt(JsonArrayGet(jSpells, 0)); + nLevelSelected = JsonGetInt(JsonArrayGet(jSpells, 1)); + } + } + // If we left the Quick Use widget on Special Abilities (10) or Items (11) goto level 0 + if(nLevelSelected == 10 || nLevelSelected == 11) + { + nLevelSelected = 0; + jSpells = JsonArraySet(jSpells, 1, JsonInt(0)); + jAIData = JsonArraySet(jAIData, 10, jSpells); + ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); + } + if(nClassSelected < 1 || nClassSelected > AI_MAX_CLASSES_PER_CHARACTER) nClassSelected = 1; + nClass = GetClassByPosition(nClassSelected, oAssociate); + jRow = JsonArray(); + for(nIndex = 0; nIndex < 10; nIndex++) + { + // This saves the index location of the spell in the list. + sIndex = IntToString(nIndex); + json jButton = NuiButtonImage(NuiBind("btn_known_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_known_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_known_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_known_" + sIndex + "_tooltip")); + //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Do the second row. + jRow = JsonArray(); + for(nIndex = 10; nIndex < 20; nIndex++) + { + // This saves the index location of the spell in the list. + sIndex = IntToString(nIndex); + json jButton = NuiButtonImage(NuiBind("btn_known_" + sIndex + "_image")); + jButton = NuiEnabled(jButton, NuiBind("btn_known_" + sIndex + "_event")); + jButton = NuiId(jButton, "btn_known_" + sIndex); + jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind("btn_known_" + sIndex + "_tooltip")); + //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); + //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); + //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); + //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); + jRow = JsonArrayInsert(jRow, jButton); + } + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + float fX, fY; + json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); + jLocations = JsonObjectGet(jLocations, sAssociateType + AI_SPELL_KNOWN_NUI); + if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } + else + { + fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + } + string sText, sName = GetName(oAssociate); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_SPELL_KNOWN_NUI, sName + " Spell Known Menu", + fX, fY, 375.0, 539.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + // Set the Layout of the window. + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Row 1 & 2 Class & Level + int nSpellLevel, nIndexLevel, nMaxSpellLevel, nClassLevel; + string sClass, sLevel, sLevelImage, sIndexLevel, sSpellsGained; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass != CLASS_TYPE_INVALID) + { + bCaster = StringToInt(Get2DAString("classes", "SpellbookRestricted", nClass)); + if(bCaster) + { + sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); + if(nClassSelected == nIndex) + { + nClassLevel = GetLevelByClass(nClass, oAssociate); + sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); + nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); + for(nIndexLevel = 0; nIndexLevel <= 9; nIndexLevel++) + { + sIndexLevel = IntToString(nIndexLevel); + if(nIndexLevel < nMaxSpellLevel) + { + if(nIndexLevel == 0) sLevelImage = "ir_cantrips"; + else if(nIndexLevel < 7)sLevelImage = "ir_level" + sIndexLevel; + else sLevelImage = "ir_level789"; + if(nIndexLevel == 0) sLevel = " Cantrips"; + else if(nIndexLevel == 1) sLevel = " First level"; + else if(nIndexLevel == 2) sLevel = " Second level"; + else if(nIndexLevel == 3) sLevel = " Third level"; + else if(nIndexLevel == 4) sLevel = " Fourth level"; + else if(nIndexLevel == 5) sLevel = " Fifth level"; + else if(nIndexLevel == 6) sLevel = " Sixth level"; + else if(nIndexLevel == 7) sLevel = " Seventh level"; + else if(nIndexLevel == 8) sLevel = " Eighth level"; + else if(nIndexLevel == 9) sLevel = " Ninth level"; + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_tooltip", JsonString(" " + sLevel)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString(sLevelImage)); + } + else + { + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(FALSE)); + } + } + NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevelSelected) + "_encouraged", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClassSelected) + "_encouraged", JsonBool(TRUE)); + } + } + } + } + // Row 3 Spells + int nSpellSlot, nSpell, nMetamagic; + json jSpell; + json jWidget = JsonArrayGet(jSpells, 2); + nClass = GetClassByPosition(nClassSelected, oAssociate); + string sSpellIcon, sSpellName, sMetaMagicText; + json jSpellArray = JsonArray(); + json jSpell_Icon = JsonArray(); + json jSpell_Text = JsonArray(); + json jMetaMagic_Text = JsonArray(); + // List the spells from the spells.2da file (they get to choose from them all!). + string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); + int nMaxSpells = Get2DARowCount("spells"); + while(nSpell < nMaxSpells) + { + sLevel = Get2DAString("spells", sSpellTableColumn, nSpell); + if(sLevel != "") + { + if(StringToInt(sLevel) == nLevelSelected) + { + jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); + jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); + } + } + ++nSpell; + } + jData = JsonArrayInsert(jData, jSpellArray); + NuiSetUserData(oPC, nToken, jData); + NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); + NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); + NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); + // Row 4 Spell known list label. + // Row 5 Spell known List + int nMetaMagic, nDomain, nMaxKnownSlots; + json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); + if(JsonGetType(jClassList) == JSON_TYPE_NULL) + { + jClassList = ObjectToJson(oAssociate); + jClassList = GffGetList(jClassList, "ClassList"); + SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); + } + // Get the correct class array. + nIndex = 0; + json jClass = JsonArrayGet(jClassList, nIndex); + while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) + { + jClass = JsonArrayGet(jClassList, ++nIndex); + } + json jKnownList = GffGetList(jClass, "KnownList" + IntToString(nLevelSelected)); + string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); + if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + IntToString(nLevelSelected), nClassLevel - 1)); + else nMaxKnownSlots = 20; + nIndex = 0; + while(nIndex < 20) + { + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(TRUE)); + if(nIndex < nMaxKnownSlots) + { + jSpell = JsonArrayGet(jKnownList, nIndex); + if(JsonGetType(jSpell) == JSON_TYPE_NULL) + { + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" Empty known spell slot")); + } + else + { + nSpell = JsonGetInt(GffGetWord(jSpell, "Spell")); + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + //nMetaMagic = 255; + //nDomain = 0; + sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString(sSpellIcon)); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevelSelected) + ")")); + //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, -1, -1, -1, nMetaMagic, nDomain); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); + } + } + else + { + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); + //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); + NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(FALSE)); + } + ++nIndex; + } +} +void ai_CreateDescriptionNUI(object oPC, json jSpell, int nSpell = 0) +{ + // Row 1 ******************************************************************* 500 / 469 + json jRow = CreateImage(JsonArray(), "", "spell_icon", NUI_ASPECT_FIT, NUI_HALIGN_CENTER, NUI_VALIGN_MIDDLE, 40.0, 40.0); + jRow = CreateTextBox(jRow, "spell_text", 380.0, 400.0, FALSE, NUI_SCROLLBARS_Y); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 1 ******************************************************************* 500 / 522 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "OK", "btn_ok", 150.0f, 45.0f); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sName, sIcon, sDescription; + int nFeat, nDescription; + int nClass; + if(nSpell) nClass = 0; + else + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + } + if(nClass == -1) + { + if(nSpell == SPELL_HEALINGKIT) + { + sName = "Healer's Kit"; + sIcon = "isk_heal"; + sDescription = GetStringByStrRef(1720); + } + else + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sIcon = Get2DAString("spells", "IconResRef", nSpell); + nDescription = StringToInt(Get2DAString("spells", "SpellDesc", nSpell)); + if(nDescription) sDescription = GetStringByStrRef(nDescription); + else + { + object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + sDescription = GetDescription(oItem); + } + } + } + else + { + nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nFeat) + { + if(nSpell) + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sIcon = Get2DAString("spells", "IconResRef", nSpell); + } + else + { + sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); + sIcon = Get2DAString("feat", "ICON", nFeat); + } + sDescription = GetStringByStrRef(StringToInt(Get2DAString("feat", "DESCRIPTION", nFeat))); + } + else + { + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sIcon = Get2DAString("spells", "IconResRef", nSpell); + nDescription = StringToInt(Get2DAString("spells", "SpellDesc", nSpell)); + if(nDescription) sDescription = GetStringByStrRef(nDescription); + else + { + object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + sDescription = GetDescription(oItem); + } + } + } + int nToken = SetWindow(oPC, jLayout, AI_SPELL_DESCRIPTION_NUI, sName, + -1.0, -1.0, 460.0f, 537.0 + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); + json jData = JsonArray(); + jData = JsonArrayInsert(jData, JsonString(ObjectToString(oPC))); + NuiSetUserData(oPC, nToken, jData); + // Row 1 + NuiSetBind(oPC, nToken, "spell_icon_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "spell_icon_image", JsonString(sIcon)); + NuiSetBind(oPC, nToken, "spell_text_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "spell_text", JsonString(sDescription)); + // Row 2 + NuiSetBind(oPC, nToken, "btn_ok_event", JsonBool(TRUE)); +} + diff --git a/_module/nss/0i_menus_dm.nss b/_module/nss/0i_menus_dm.nss new file mode 100644 index 00000000..a2a2cfc8 --- /dev/null +++ b/_module/nss/0i_menus_dm.nss @@ -0,0 +1,1386 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_menus_dm +//////////////////////////////////////////////////////////////////////////////// + Include script for handling NUI menus for DMs. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "0i_associates" +string ai_GetRandomDMTip() +{ + int nRoll = Random(44); + return Get2DAString("ai_messages", "Text", nRoll); +} +void ai_SetDMWidgetButton(object oPlayer, int nButton, int bOn = TRUE) +{ + int nWidgetButtons = GetLocalInt(oPlayer, sDMWidgetButtonVarname); + string sName = ai_RemoveIllegalCharacters(GetName(oPlayer)); + json jButtons = ai_GetCampaignDbJson("buttons", sName, AI_DM_TABLE); + if(nWidgetButtons == 0) nWidgetButtons = JsonGetInt(JsonArrayGet(jButtons, 0)); + if(bOn) nWidgetButtons = nWidgetButtons | nButton; + else nWidgetButtons = nWidgetButtons & ~nButton; + SetLocalInt(oPlayer, sDMWidgetButtonVarname, nWidgetButtons); + jButtons = JsonArraySet(jButtons, 0, JsonInt(nWidgetButtons)); + ai_SetCampaignDbJson("buttons", jButtons, sName, AI_DM_TABLE); +} +int ai_GetDMWidgetButton(object oPlayer, int nButton) +{ + int nWidgetButtons = GetLocalInt(oPlayer, sDMWidgetButtonVarname); + if(nWidgetButtons == 0) + { + string sName = ai_RemoveIllegalCharacters(GetName(oPlayer)); + json jButtons = ai_GetCampaignDbJson("buttons", sName, AI_DM_TABLE); + nWidgetButtons = JsonGetInt(JsonArrayGet(jButtons, 0)); + } + return nWidgetButtons & nButton; +} +void ai_CreateDMWidgetNUI(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int bAIWidgetLock = ai_GetDMWidgetButton(oPC, BTN_DM_WIDGET_LOCK); + int bCmdGroup1 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP1); + int bCmdGroup2 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP2); + int bCmdGroup3 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP3); + int bCmdGroup4 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP4); + int bCmdGroup5 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP5); + int bCmdGroup6 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP6); + int bCmdCamera = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_CAMERA); + int bCmdInventory = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_INVENTORY); + // Get which buttons are activated. + float fHeight = 92.0f; + if(bAIWidgetLock) fHeight = 59.0f; + float fButtons, fWidth = 86.0f; + // ************************************************************************* Width / Height + // Row 1 (buttons)********************************************************** + // Setup the main associate button to use their portrait. + json jButton = NuiEnabled(NuiId (NuiButtonImage(NuiBind("btn_open_main_image")), "btn_open_main"), NuiBind("btn_open_main_event")); + jButton = NuiWidth(jButton, 35.0); + jButton = NuiHeight(jButton, 35.0); + jButton = NuiMargin(jButton, 0.0); + jButton = NuiTooltip(jButton, NuiBind ("btn_open_main_tooltip")); + jButton = NuiImageRegion(jButton, NuiRect(0.0, 0.0, 32.0, 35.0)); + json jRow = JsonArrayInsert(JsonArray(), jButton); + if(bCmdGroup1) + { + jRow = CreateButtonImage(jRow, "ir_level1", "btn_cmd_group1", 35.0f, 35.0f, 0.0, "btn_cmd_group1_tooltip"); + fButtons += 1.0; + } + if(bCmdGroup2) + { + jRow = CreateButtonImage(jRow, "ir_level2", "btn_cmd_group2", 35.0f, 35.0f, 0.0, "btn_cmd_group2_tooltip"); + fButtons += 1.0; + } + if(bCmdGroup3) + { + jRow = CreateButtonImage(jRow, "ir_level3", "btn_cmd_group3", 35.0f, 35.0f, 0.0, "btn_cmd_group3_tooltip"); + fButtons += 1.0; + } + if(bCmdGroup4) + { + jRow = CreateButtonImage(jRow, "ir_level4", "btn_cmd_group4", 35.0f, 35.0f, 0.0, "btn_cmd_group4_tooltip"); + fButtons += 1.0; + } + if(bCmdGroup5) + { + jRow = CreateButtonImage(jRow, "ir_level5", "btn_cmd_group5", 35.0f, 35.0f, 0.0, "btn_cmd_group5_tooltip"); + fButtons += 1.0; + } + if(bCmdGroup6) + { + jRow = CreateButtonImage(jRow, "ir_level6", "btn_cmd_group6", 35.0f, 35.0f, 0.0, "btn_cmd_group6_tooltip"); + fButtons += 1.0; + } + if(bCmdCamera) + { + jRow = CreateButtonImage(jRow, "ir_examine", "btn_camera", 35.0f, 35.0f, 0.0, "btn_camera_tooltip"); + fButtons += 1.0; + } + if(bCmdInventory) + { + jRow = CreateButtonImage(jRow, "ir_pickup", "btn_inventory", 35.0f, 35.0f, 0.0, "btn_inventory_tooltip"); + fButtons += 1.0; + } + // Plug in buttons ********************************************************* + int nIndex, bWidget; + string sButton, sIcon; + json jPlugins = ai_UpdatePluginsForDM(oPC); + json jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bWidget) + { + sIcon = JsonGetString(JsonArrayGet(jPlugin, 3)); + sButton = IntToString(nIndex); + jRow = CreateButtonImage(jRow, sIcon, "btn_exe_plugin_" + sButton, 35.0f, 35.0f, 0.0, "btn_exe_plugin_" + sButton + "_tooltip"); + fButtons += 1.0; + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + if(fButtons > 1.0f) fWidth = fWidth + ((fButtons - 1.0) * 39.0f); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Get the window location to restore it from the database. + string sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + jLocations = JsonObjectGet(jLocations, "dm" + AI_WIDGET_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + if(bAIWidgetLock) + { + fX = fX + 4.0f; + fY = fY + 37.0f; + } + // Set the layout of the window. + json jLayout = NuiCol(jCol); + int nToken; + string sHeal, sText, sRange; + string sDisplayName = GetName(oPC); + if(GetStringRight(sDisplayName, 1) == "s") sDisplayName = sDisplayName + "'"; + else sDisplayName = sDisplayName + "'s"; + if(bAIWidgetLock) nToken = SetWindow(oPC, jLayout, "dm" + AI_WIDGET_NUI, sDisplayName + " Widget", fX, fY, fWidth + 8.0f, fHeight, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui_dm"); + else nToken = SetWindow(oPC, jLayout, "dm" + AI_WIDGET_NUI, sDisplayName + " Widget", fX, fY, fWidth + 12.0f, fHeight, FALSE, FALSE, FALSE, TRUE, TRUE, "0e_nui_dm"); + // Set event watches for window inspector and save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set the buttons to show events. + NuiSetBind(oPC, nToken, "btn_open_main_image", JsonString(GetPortraitResRef(oPC) + "s")); + NuiSetBind(oPC, nToken, "btn_open_main_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_open_main_tooltip", JsonString(" " + sDisplayName + " widget menu")); + string sUUID, sText2, sSpeed; + string sAction = " (Left Action/Right Add)"; + if(bCmdGroup1) + { + NuiSetBind(oPC, nToken, "btn_cmd_group1_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP1"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 1"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group1_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdGroup2) + { + NuiSetBind(oPC, nToken, "btn_cmd_group2_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP2"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 2"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group2_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdGroup3) + { + NuiSetBind(oPC, nToken, "btn_cmd_group3_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP3"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 3"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group3_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdGroup4) + { + NuiSetBind(oPC, nToken, "btn_cmd_group4_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP4"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 4"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group4_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdGroup5) + { + NuiSetBind(oPC, nToken, "btn_cmd_group5_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP5"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 5"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group5_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdGroup6) + { + NuiSetBind(oPC, nToken, "btn_cmd_group6_event", JsonBool(TRUE)); + json jGroup = GetLocalJson(oPC, "DM_GROUP6"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 6"; sText2 = sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group6_tooltip", JsonString(" " + sText + sText2)); + } + if(bCmdCamera) + { + NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString(" Select new object to have the camera view.")); + } + if(bCmdInventory) + { + NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString(" Open selected creatures inventory.")); + } + /*if(bSearch) + { + NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sText = " Search On"; + else sText = " Search Off"; + NuiSetBind(oPC, nToken, "btn_search_tooltip", JsonString(sText)); + } + if(bStealth) + { + NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); + if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sText = " Stealth On"; + else sText = " Stealth Off"; + NuiSetBind(oPC, nToken, "btn_stealth_tooltip", JsonString(sText)); + } */ + nIndex = 0; + string sScript; + jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + if(bWidget) + { + sButton = IntToString(nIndex); + sScript = JsonGetString(JsonArrayGet(jPlugin, 0)); + if(ResManGetAliasFor(sScript, RESTYPE_NCS) == "") + { + sText = " " + sScript + " not found by ResMan!"; + } + else sName = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_tooltip", JsonString(sName)); + } + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } +} +void ai_CreateDMOptionsNUI(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + int nMonsterAI = (ResManGetAliasFor("ai_default", RESTYPE_NCS) != ""); + int nAssociateAI = (ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != ""); + string sText = " [Single player]"; + if(AI_SERVER) sText = " [Server]"; + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, PHILOS_VERSION + sText, "lbl_version ", 510.0f, 20.0f, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 101 + jRow = CreateLabel(JsonArray(), "", "lbl_ai_info", 510.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 500 / 129 + jRow = CreateButton(JsonArray(), "Plugin Manager", "btn_plugin_manager", 160.0f, 20.0f, -1.0, "btn_plugin_manager_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Widget Manager", "btn_widget_manager", 160.0f, 20.0f, -1.0, "btn_widget_manager_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 500 / 157 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "SERVER RULES", "lbl_ai_rules", 100.0f, 20.0f, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 112.0; + // Row 5 ******************************************************************* 500 / --- (28) + // Make the AI options a Group. + json jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_max_henchman", 2, FALSE, 30.0f, 20.0f, "txt_max_henchman_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "Max number of henchmen that is allowed in your party.", "lbl_max_hench", 416.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_max_henchman_tooltip"); + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_xp_scale", 3, FALSE, 40.0f, 20.0f, "txt_xp_scale_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "Modules experience scale.", "lbl_xp_scale", 175.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_xp_scale_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " scale to party.", "chbx_party_scale", 130.0, 20.0, "chbx_party_scale_tooltip"); + jGroupRow = CreateButton(jGroupRow, "Default", "btn_default_xp", 70.0f, 20.0f, -1.0, "btn_default_xp_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 112.0; + if(nMonsterAI || nAssociateAI) + { + jGroupRow = CreateCheckBox(JsonArray(), " Creatures will use advanced combat movement.", "chbx_advanced_movement", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Use item level restrictions for creatures [Default is off].", "chbx_ilr", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use the skill Use Magic Device.", "chbx_umd", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use Healing kits.", "chbx_use_healingkits", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Moral checks, wounded creatures may flee during combat.", "chbx_moral", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), " Spells the AI will not use:", "lbl_restrict_spells", 190.0, 20.0, NUI_HALIGN_LEFT); + jGroupRow = CreateCheckBox(jGroupRow, " Darkness", "chbx_darkness", 90.0, 20.0, "chbx_darkness_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " Dispels", "chbx_dispels", 90.0, 20.0, "chbx_dispels_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, " Time Stop", "chbx_timestop", 90.0, 20.0, "chbx_timestop_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 168.0; + } + if(nMonsterAI) + { + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_ai_difficulty", 3, FALSE, 40.0f, 20.0f, "txt_ai_difficulty_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "% chance monsters will attack the weakest target.", "lbl_ai_difficulty", 406.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_ai_difficulty_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_perception_distance", 2, FALSE, 35.0f, 20.0f, "txt_perception_distance_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "meters is the distance a monster can respond to allies.", "lbl_perception_distance", 411.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "txt_perception_distance_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can prebuff before combat starts.", "chbx_buff_monsters", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use summons before combat starts.", "chbx_buff_summons", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use tactics (ambush, defensive, flanker, etc).", "chbx_ambush_monsters", 450.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "Add ", "lbl_inc_enc", 30.0, 20.0, NUI_HALIGN_LEFT, 0, -1.0); + jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_inc_enc", 4, FALSE, 55.0f, 20.0f, "txt_inc_enc_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "monsters per spawned encounter monster.", "lbl_inc_enc", 357.0, 20.0, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "txt_inc_enc_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_inc_hp", 3, FALSE, 40.0f, 20.0f, "txt_inc_hp_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "% increase in all monster's hitpoints.", "lbl_inc_hp", 406.0, 20.0, NUI_HALIGN_LEFT); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "***** WARNING! The options below may break the module! *****", "lbl_warning", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can wander upto ", "chbx_wander", 220.0, 20.0, "chbx_warning_tooltip"); + jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_wander_distance", 2, FALSE, 35.0f, 20.0f, "chbx_warning_tooltip"); + jGroupRow = CreateLabel(jGroupRow, "meters and ", "lbl_wander_distance", 80.0f, 20.0f, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "chbx_warning_tooltip"); + jGroupRow = CreateCheckBox(jGroupRow, "open doors.", "chbx_open_doors", 100.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Monsters can summon companions.", "chbx_companions", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Summoned associates to remain after masters death.", "chbx_perm_assoc", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateCheckBox(JsonArray(), " Make enemy corpses remain.", "chbx_corpses_stay", 450.0, 20.0, "chbx_warning_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_perc_dist", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "lbl_perc_dist_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight += 364.0; + } + jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + string sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + jLocations = JsonObjectGet(jLocations, "dm" + AI_MAIN_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, "dm" + AI_MAIN_NUI, sName + " PEPS Main Menu", + fX, fY, 534.0f, fHeight, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui_dm"); + // Save the associate to the nui for use in 0e_nui + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPC))); + NuiSetUserData(oPC, nToken, jData); + object oModule = GetModule(); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 - Version label. + // Row 2 + int nUsing; + // Check the monster AI. + string sLocation = ResManGetAliasFor("ai_default", RESTYPE_NCS); + if(sLocation != "") + { + nUsing = TRUE; + string sLocation = ResManGetAliasFor("nw_c2_default1", RESTYPE_NCS); + if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; + if(nUsing) sText = "Monster AI working"; + else sText = "Monster AI not working"; + } + else sText = "Monster AI not loaded"; + // Check the associate AI. + sLocation = ResManGetAliasFor("ai_a_default", RESTYPE_NCS); + if(sLocation != "") + { + nUsing = TRUE; + string sLocation = ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS); + if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; + if(nUsing) sText += ", Associate AI working"; + else sText += ", Associate AI not working"; + } + else sText += ", Associate AI not loaded"; + // Check for PRC. + sLocation = ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS); + if(sLocation != "") sText += ", PRC loaded."; + else + { + // Check the player AI. + sLocation = ResManGetAliasFor("xx_pc_1_hb", RESTYPE_NCS); + if(sLocation != "") sText += ", Player AI loaded."; + else sText += ", Player AI not loaded."; + } + NuiSetBind(oPC, nToken, "lbl_ai_info_label", JsonString(sText)); + // Row 3 + NuiSetBind(oPC, nToken, "btn_plugin_manager_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_plugin_manager_tooltip", JsonString(" Manages external executable scripts.")); + NuiSetBind(oPC, nToken, "btn_widget_manager_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_manager_tooltip", JsonString(" Manages widgets the players have access to.")); + // Row 3 Label for AI RULES + // Row 4 + NuiSetBind(oPC, nToken, "txt_max_henchman_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_max_henchman", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_MAX_HENCHMAN)))); + NuiSetBindWatch (oPC, nToken, "txt_max_henchman", TRUE); + NuiSetBind(oPC, nToken, "txt_max_henchman_tooltip", JsonString(" Set max number of henchman allowed (1-12).")); + NuiSetBind(oPC, nToken, "txt_xp_scale_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(IntToString(GetModuleXPScale()))); + NuiSetBindWatch (oPC, nToken, "txt_xp_scale", TRUE); + NuiSetBind(oPC, nToken, "txt_xp_scale_tooltip", JsonString(" Set the modules XP scale (0 - 200) Normal D&D is 10.")); + NuiSetBind(oPC, nToken, "chbx_party_scale_check", JsonBool(GetLocalInt(oModule, AI_RULE_PARTY_SCALE))); + NuiSetBindWatch(oPC, nToken, "chbx_party_scale_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_party_scale_event", JsonBool(TRUE)); + sText = IntToString(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); + NuiSetBind(oPC, nToken, "chbx_party_scale_tooltip", JsonString(" PEPS adjusts your XP based on party size from (" + sText + ").")); + NuiSetBind(oPC, nToken, "btn_default_xp_event", JsonBool(TRUE)); + sText = IntToString(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); + NuiSetBind(oPC, nToken, "btn_default_xp_tooltip", JsonString(" Reset the Modules XP to (" + sText + ").")); + if(nMonsterAI) + { + NuiSetBind(oPC, nToken, "txt_ai_difficulty_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_ai_difficulty", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_AI_DIFFICULTY)))); + NuiSetBindWatch(oPC, nToken, "txt_ai_difficulty", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_BUFF_MONSTERS))); + NuiSetBindWatch(oPC, nToken, "chbx_buff_monsters_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_monsters_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_buff_summons_check", JsonBool(GetLocalInt(oModule, AI_RULE_PRESUMMON))); + NuiSetBindWatch(oPC, nToken, "chbx_buff_summons_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_summons_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_ambush_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_AMBUSH))); + NuiSetBindWatch(oPC, nToken, "chbx_ambush_monsters_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ambush_monsters_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_companions_check", JsonBool(GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS))); + NuiSetBindWatch(oPC, nToken, "chbx_companions_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_companions_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_companions_tooltip", JsonString(" ** This will break some modules! ** See Readme for issues!")); + NuiSetBind(oPC, nToken, "chbx_perm_assoc_check", JsonBool(GetLocalInt(oModule, AI_RULE_PERM_ASSOC))); + NuiSetBindWatch(oPC, nToken, "chbx_perm_assoc_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_perm_assoc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_corpses_stay_check", JsonBool(GetLocalInt(oModule, AI_RULE_CORPSES_STAY))); + NuiSetBindWatch(oPC, nToken, "chbx_corpses_stay_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_corpses_stay_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_corpses_stay_tooltip", JsonString(" ** This will break some modules! ** See Readme for issues!")); + NuiSetBind(oPC, nToken, "txt_perception_distance_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_perception_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE), 0, 0))); + NuiSetBindWatch(oPC, nToken, "txt_perception_distance", TRUE); + NuiSetBind(oPC, nToken, "txt_perception_distance_tooltip", JsonString(" Range [10 to 60 meters] from the player.")); + NuiSetBindWatch(oPC, nToken, "lbl_perc_dist", TRUE); + int nPercDist = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE); + if(nPercDist < 8 || nPercDist > 11) + { + nPercDist = 11; + SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, 11); + } + if(nPercDist == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; + else if(nPercDist == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; + else if(nPercDist == 10) sText = " Monster perception: Long [35 Sight / 20 Listen]"; + else sText = " Monster perception: Default [Monster's default values]"; + NuiSetBind(oPC, nToken, "lbl_perc_dist_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "lbl_perc_dist_tooltip", JsonString(" Use the mouse wheel to change values.")); + int bWander = GetLocalInt(oModule, AI_RULE_WANDER); + NuiSetBind(oPC, nToken, "chbx_wander_check", JsonBool(bWander)); + NuiSetBindWatch(oPC, nToken, "chbx_wander_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_wander_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_wander_distance_event", JsonBool(bWander)); + NuiSetBind(oPC, nToken, "txt_wander_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE), 0, 0))); + NuiSetBindWatch(oPC, nToken, "txt_wander_distance", TRUE); + NuiSetBind(oPC, nToken, "chbx_wander_tooltip", JsonString(" ** This will break some modules! ** See Readme for issues!")); + NuiSetBind(oPC, nToken, "chbx_open_doors_check", JsonBool(GetLocalInt(oModule, AI_RULE_OPEN_DOORS))); + NuiSetBindWatch(oPC, nToken, "chbx_open_doors_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_open_doors_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_open_doors_tooltip", JsonString(" This allows monsters to open doors to hunt you down!")); + NuiSetBind(oPC, nToken, "txt_inc_enc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_inc_enc_tooltip", JsonString(" Spawns one extra monster per counter above 1. Adds value to counter per encounter monster spawned.")); + NuiSetBind(oPC, nToken, "txt_inc_enc", JsonString(FloatToString(GetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS), 0, 2))); + NuiSetBindWatch(oPC, nToken, "txt_inc_enc", TRUE); + NuiSetBind(oPC, nToken, "txt_inc_hp_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_inc_hp", JsonString(IntToString(GetLocalInt(oModule, AI_INCREASE_MONSTERS_HP)))); + NuiSetBindWatch(oPC, nToken, "txt_inc_hp", TRUE); + } + if(nMonsterAI || nAssociateAI) + { + NuiSetBind(oPC, nToken, "chbx_moral_check", JsonBool(GetLocalInt(oModule, AI_RULE_MORAL_CHECKS))); + NuiSetBindWatch (oPC, nToken, "chbx_moral_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_moral_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_advanced_movement_check", JsonBool(GetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT))); + NuiSetBindWatch (oPC, nToken, "chbx_advanced_movement_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_advanced_movement_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_ilr_check", JsonBool(GetLocalInt(oModule, AI_RULE_ILR))); + NuiSetBindWatch (oPC, nToken, "chbx_ilr_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ilr_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_umd_check", JsonBool(GetLocalInt(oModule, AI_RULE_ALLOW_UMD))); + NuiSetBindWatch (oPC, nToken, "chbx_umd_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_umd_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_use_healingkits_check", JsonBool(GetLocalInt(oModule, AI_RULE_HEALERSKITS))); + NuiSetBindWatch (oPC, nToken, "chbx_use_healingkits_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_use_healingkits_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_darkness_check", JsonBool(ai_SpellRestricted(SPELL_DARKNESS))); + NuiSetBindWatch (oPC, nToken, "chbx_darkness_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_darkness_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_darkness_tooltip", JsonString(" AI will not use the Darkness spell in combat.")); + NuiSetBind(oPC, nToken, "chbx_dispels_check", JsonBool(ai_SpellRestricted(SPELL_DISPEL_MAGIC))); + NuiSetBindWatch (oPC, nToken, "chbx_dispels_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_dispels_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_dispels_tooltip", JsonString(" AI will not use any of the Dispel spells in combat.")); + NuiSetBind(oPC, nToken, "chbx_timestop_check", JsonBool(ai_SpellRestricted(SPELL_TIME_STOP))); + NuiSetBindWatch (oPC, nToken, "chbx_timestop_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_timestop_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_timestop_tooltip", JsonString(" AI will not use the Time Stop spell in combat.")); + } +} +void ai_CreateDMCommandNUI(object oPC) +{ + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 73 + json jRow = CreateButtonSelect(JsonArray(), "Lock Widget", "btn_widget_lock", 200.0, 20.0, "btn_widget_lock_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_1", 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Main Menu", "btn_main_menu", 200.0, 20.0, -1.0, "btn_main_menu_tooltip"); + jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 101 + jRow = CreateButton(JsonArray(), "", "btn_cmd_group1", 200.0, 20.0, -1.0, "btn_cmd_group1_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group1", 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "", "btn_cmd_group2", 200.0, 20.0, -1.0, "btn_cmd_group2_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group2", 25.0, 20.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 500 / 129 + jRow = CreateButton(JsonArray(), "", "btn_cmd_group3", 200.0, 20.0, -1.0, "btn_cmd_group3_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group3", 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "", "btn_cmd_group4", 200.0, 20.0, -1.0, "btn_cmd_group4_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group4", 25.0, 20.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 500 / 157 + jRow = CreateButton(JsonArray(), "", "btn_cmd_group5", 200.0, 20.0, -1.0, "btn_cmd_group5_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group5", 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "", "btn_cmd_group6", 200.0, 20.0, -1.0, "btn_cmd_group6_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_group6", 25.0, 20.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 157.0; + // Row 5 ******************************************************************* 500 / --- + jRow = CreateButton(JsonArray(), "Toggle Camera Focus", "btn_camera", 200.0, 20.0, -1.0, "btn_camera_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_camera", 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Open/Close Inventory", "btn_inventory", 200.0, 20.0, -1.0, "btn_inventory_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_inventory", 25.0, 20.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + // Row 6+ ****************************************************************** 500 / --- + json jDMPlugins = ai_UpdatePluginsForDM(oPC); + // Set the plugins the dm can use. + int nIndex; + string sButton, sName; + json jPlugin = JsonArrayGet(jDMPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(JsonArray(), sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jPlugin = JsonArrayGet(jDMPlugins, ++nIndex); + if(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + } + else + { + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + break; + } + jPlugin = JsonArrayGet(jDMPlugins, ++nIndex); + } + // Row 7 ****************************************************************** 500 / --- + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "", "lbl_info_1", 475.0, 20.0, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight = fHeight + 28.0; + // Get the window location to restore it from the database. + sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + jLocations = JsonObjectGet(jLocations, "dm" + AI_COMMAND_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sDMName = GetName(oPC); + if(GetStringRight(sDMName, 1) == "s") sDMName = sDMName + "'"; + else sDMName = sDMName + "'s"; + int nToken = SetWindow(oPC, jLayout, "dm" + AI_COMMAND_NUI, sDMName + " Command Menu", + fX, fY, 500.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui_dm"); + // Get which buttons are activated. + int bAIWidgetLock = ai_GetDMWidgetButton(oPC, BTN_DM_WIDGET_LOCK); + int bCmdGroup1 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP1); + int bCmdGroup2 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP2); + int bCmdGroup3 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP3); + int bCmdGroup4 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP4); + int bCmdGroup5 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP5); + int bCmdGroup6 = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_GROUP6); + int bCmdCamera = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_CAMERA); + int bCmdInventory = ai_GetDMWidgetButton(oPC, BTN_DM_CMD_INVENTORY); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set all binds, events, and watches. + // Row 1 + NuiSetBind(oPC, nToken, "btn_widget_lock_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_widget_lock", JsonBool(bAIWidgetLock)); + NuiSetBind(oPC, nToken, "btn_widget_lock_tooltip", JsonString( + " Locks widget to the current location.")); + NuiSetBind(oPC, nToken, "btn_main_menu_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_main_menu", JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_main_menu_tooltip", JsonString(" Server menu options")); + NuiSetBind(oPC, nToken, "btn_group_options_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_group_options", JsonInt(TRUE)); + //NuiSetBind(oPC, nToken, "btn_empty_button_event", JsonBool (TRUE)); + //NuiSetBind(oPC, nToken, "btn_empty_button", JsonInt(TRUE)); + //sText = " Copy AI and command settings for one creature to others."; + //NuiSetBind(oPC, nToken, "btn_empty_button_tooltip", JsonString(sText)); + // Row 2 + NuiSetBind(oPC, nToken, "chbx_cmd_group1_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group1_check", JsonBool (bCmdGroup1)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group1_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group1_event", JsonBool (TRUE)); + string sText, sText2, sSpeed; + string sAction = " (Left Action/Right Add)"; + json jGroup = GetLocalJson(oPC, "DM_GROUP1"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + string sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 1"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group1_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group1_tooltip", JsonString(" " + sText2)); + NuiSetBind(oPC, nToken, "chbx_cmd_group2_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group2_check", JsonBool (bCmdGroup2)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group2_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group2_event", JsonBool (TRUE)); + jGroup = GetLocalJson(oPC, "DM_GROUP2"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 2"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group2_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group2_tooltip", JsonString(" " + sText2)); + // Row 3 + NuiSetBind(oPC, nToken, "chbx_cmd_group3_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group3_check", JsonBool (bCmdGroup3)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group3_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group3_event", JsonBool (TRUE)); + jGroup = GetLocalJson(oPC, "DM_GROUP3"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 3"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group3_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group3_tooltip", JsonString(" " + sText2)); + NuiSetBind(oPC, nToken, "chbx_cmd_group4_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group4_check", JsonBool (bCmdGroup4)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group4_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group4_event", JsonBool (TRUE)); + jGroup = GetLocalJson(oPC, "DM_GROUP4"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 4"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group4_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group4_tooltip", JsonString(" " + sText2)); + // Row 4 + NuiSetBind(oPC, nToken, "chbx_cmd_group5_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group5_check", JsonBool (bCmdGroup5)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group5_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group5_event", JsonBool (TRUE)); + jGroup = GetLocalJson(oPC, "DM_GROUP5"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 5"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group5_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group5_tooltip", JsonString(" " + sText2)); + NuiSetBind(oPC, nToken, "chbx_cmd_group6_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_cmd_group6_check", JsonBool (bCmdGroup6)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_group6_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cmd_group6_event", JsonBool (TRUE)); + jGroup = GetLocalJson(oPC, "DM_GROUP6"); + if(JsonGetInt(JsonArrayGet(jGroup, 0)) == 0) sSpeed = " [Walk]"; + else sSpeed = " [Run]"; + sUUID = JsonGetString(JsonArrayGet(jGroup, 1)); + if(sUUID == "") { sText = "Group 6"; sText2 = sText + sAction; } + else { sText = GetName(GetObjectByUUID(sUUID)) + "'s group"; sText2 = sText + sSpeed; } + NuiSetBind(oPC, nToken, "btn_cmd_group6_label", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_cmd_group6_tooltip", JsonString(" " + sText2)); + // Row 5 + NuiSetBind(oPC, nToken, "chbx_camera_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_camera_check", JsonBool (bCmdCamera)); + NuiSetBindWatch (oPC, nToken, "chbx_camera_check", TRUE); + NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString ( + " Toggle camera view for " + sDMName)); + NuiSetBind(oPC, nToken, "chbx_inventory_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "chbx_inventory_check", JsonBool (bCmdInventory)); + NuiSetBindWatch (oPC, nToken, "chbx_inventory_check", TRUE); + NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString ( + " Open " + sDMName + " inventory")); + // Row 6+ + nIndex = 0; + int bWidget; + jPlugin = JsonArrayGet(jDMPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); + bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bWidget)); + NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); + sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); + jPlugin = JsonArrayGet(jDMPlugins, ++nIndex); + } + NuiSetBind(oPC, nToken, "chbx_plugin_tooltip", JsonString(" Adds the plugin to your widget.")); + // Row 7 + sText = ai_GetRandomDMTip(); + NuiSetBind(oPC, nToken, "lbl_info_1_label", JsonString(sText)); +} +void ai_CreateDMPluginManagerNUI(object oPC) +{ + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // Row 1 ******************************************************************* 500 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Load All Plugins", "btn_load_plugins", 150.0f, 20.0f, -1.0, "btn_load_plugins_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Check All", "btn_check_plugins", 150.0f, 20.0f, -1.0, "btn_check_plugins_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear All", "btn_clear_plugins", 150.0f, 20.0f, -1.0, "btn_clear_plugins_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 101 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Add Plugin", "btn_add_plugin", 150.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_plugin", 16, FALSE, 310.0f, 20.0f, "txt_plugin_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 101.0; + // Row 3+ ****************************************************************** 500 / --- + json jPlugins = ai_GetCampaignDbJson("plugins"); + int nIndex = 0; + json jPlugin = JsonArrayGet(jPlugins, nIndex); + string sName, sButton; + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Remove Plugin", "btn_remove_plugin_" + sButton, 150.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + sName = JsonGetString(JsonArrayGet(jPlugin, 2)); + jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 290.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 28.0; + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + // Get the window location to restore it from the database. + sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + jLocations = JsonObjectGet(jLocations, "dm" + AI_PLUGIN_NUI); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, "dm" + AI_PLUGIN_NUI, sName + " PEPS Plugin Manager", + fX, fY, 500.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui_dm"); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Row 1 + NuiSetBind(oPC, nToken, "btn_load_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_load_plugins_tooltip", JsonString(" Load all known PEPS plugins that are in the game files.")); + NuiSetBind(oPC, nToken, "btn_check_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_check_plugins_tooltip", JsonString(" Add all plugins to the players widget.")); + NuiSetBind(oPC, nToken, "btn_clear_plugins_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_plugins_tooltip", JsonString(" Remove all plugins from the players widget.")); + // Row 2 + NuiSetBind(oPC, nToken, "btn_add_plugin_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_plugin_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_plugin_tooltip", JsonString(" Enter an executable script name.")); + // Row 3+ + nIndex = 0; + int bCheck; + string sText; + jPlugin = JsonArrayGet(jPlugins, nIndex); + while(JsonGetType(jPlugin) != JSON_TYPE_NULL) + { + sButton = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_remove_plugin_" + sButton + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); + bCheck = JsonGetInt(JsonArrayGet(jPlugin, 1)); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bCheck)); + NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); + sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); + NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); + jPlugin = JsonArrayGet(jPlugins, ++nIndex); + } + NuiSetBind(oPC, nToken, "chbx_plugin_tooltip", JsonString(" Allows players to use this plugin.")); +} +void ai_CreateDMWidgetManagerNUI(object oPC) +{ + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // Row 1 ******************************************************************* 575 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Check All", "btn_check_buttons", 150.0f, 20.0f, -1.0, "btn_check_buttons_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear All", "btn_clear_buttons", 150.0f, 20.0f, -1.0, "btn_clear_buttons_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 575 / 96 + jRow = CreateLabel(JsonArray(), "This menu manages the PEPS buttons a player may have access to.", "lbl_info1", 636.0, 15.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 575 / 119 + jRow = CreateLabel(JsonArray(), "Having a check next to a button will remove that button from the players menus.", "lbl_info2", 636.0, 15.0); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 575 / 162 + jRow = CreateButtonImage(JsonArray(), "ir_action", "btn_cmd_action", 35.0f, 35.0f, 0.0, "btn_cmd_action_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_action", 25.0, 20.0, "btn_cmd_action_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_guard", "btn_cmd_guard", 35.0f, 35.0f, 0.0, "btn_cmd_guard_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_guard", 25.0, 20.0, "btn_cmd_guard_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_standground", "btn_cmd_hold", 35.0f, 35.0f, 0.0, "btn_cmd_hold_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_hold", 25.0, 20.0, "btn_cmd_hold_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_attacknearest", "btn_cmd_attack", 35.0f, 35.0f, 0.0, "btn_cmd_attack_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_attack", 25.0, 20.0, "btn_cmd_attack_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_follow", "btn_cmd_follow", 35.0f, 35.0f, 0.0, "btn_cmd_follow_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_follow", 25.0, 20.0, "btn_cmd_follow_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_follow_target", 35.0f, 35.0f, 0.0, "btn_follow_target_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_follow_target", 25.0, 20.0, "btn_follow_target_tooltip"); + + jRow = CreateButtonImage(jRow, "ife_foc_search", "btn_cmd_search", 35.0f, 35.0f, 0.0, "btn_cmd_search_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_search", 25.0, 20.0, "btn_cmd_search_tooltip"); + + jRow = CreateButtonImage(jRow, "ife_foc_hide", "btn_cmd_stealth", 35.0f, 35.0f, 0.0, "btn_cmd_stealth_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_stealth", 25.0, 20.0, "btn_cmd_stealth_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_scommand", "btn_cmd_ai_script", 35.0f, 35.0f, 0.0, "btn_cmd_ai_script_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_ai_script", 25.0, 20.0, "btn_cmd_ai_script_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_settrap", "btn_cmd_place_trap", 35.0f, 35.0f, 0.0, "btn_cmd_place_trap_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cmd_place_trap", 25.0, 20.0, "btn_cmd_place_trap_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 ******************************************************************* 575 / 205 + jRow = CreateButtonImage(JsonArray(), "isk_spellcraft", "btn_quick_widget", 35.0f, 35.0f, 0.0, "btn_quick_widget_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_quick_widget", 25.0, 20.0, "btn_quick_widget_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_lore", "btn_spell_memorize", 35.0f, 35.0f, 0.0, "btn_spell_memorize_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_spell_memorize", 25.0, 20.0, "btn_spell_memorize_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_cantrips", "btn_buff_short", 35.0f, 35.0f, 0.0, "btn_buff_short_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_short", 25.0, 20.0, "btn_buff_short_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_cast", "btn_buff_long", 35.0f, 35.0f, 0.0, "btn_buff_long_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_long", 25.0, 20.0, "btn_buff_long_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_level789", "btn_buff_all", 35.0f, 35.0f, 0.0, "btn_buff_all_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_all", 25.0, 20.0, "btn_buff_all_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_rest", "btn_buff_rest", 35.0f, 35.0f, 0.0, "btn_buff_rest_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_buff_rest", 25.0, 20.0, "btn_buff_rest_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_jump", "btn_jump_to", 35.0f, 35.0f, 0.0, "btn_jump_to_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_jump_to", 25.0, 20.0, "btn_jump_to_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_limbo", "btn_ghost_mode", 35.0f, 35.0f, 0.0, "btn_ghost_mode_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ghost_mode", 25.0, 20.0, "btn_ghost_mode_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_examine", "btn_camera", 35.0f, 35.0f, 0.0, "btn_camera_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_camera", 25.0, 20.0, "btn_camera_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_pickup", "btn_inventory", 35.0f, 35.0f, 0.0, "btn_inventory_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_inventory", 25.0, 20.0, "btn_inventory_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 6 ******************************************************************* 575 / 248 + + jRow = CreateButtonImage(JsonArray(), "ife_familiar", "btn_familiar", 35.0f, 35.0f, 0.0, "btn_familiar_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_familiar", 25.0, 20.0, "btn_familiar_tooltip"); + + jRow = CreateButtonImage(jRow, "ife_animal", "btn_companion", 35.0f, 35.0f, 0.0, "btn_companion_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_companion", 25.0, 20.0, "btn_companion_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_ai", "btn_ai", 35.0f, 35.0f, 0.0, "btn_ai_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ai", 25.0, 20.0, "btn_companion_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_movsilent", "btn_quiet", 35.0f, 35.0f, 0.0, "btn_quiet_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_quiet", 25.0, 20.0, "btn_quiet_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_archer", "btn_ranged", 35.0f, 35.0f, 0.0, "btn_ranged_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ranged", 25.0, 20.0, "btn_ranged_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_takeitem", "btn_equip_weapon", 35.0f, 35.0f, 0.0, "btn_equip_weapon_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_equip_weapon", 25.0, 20.0, "btn_equip_weapon_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_search", "btn_search", 35.0f, 35.0f, 0.0, "btn_search_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_search", 25.0, 20.0, "btn_search_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_hide", "btn_stealth", 35.0f, 35.0f, 0.0, "btn_stealth_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_stealth", 25.0, 20.0, "btn_stealth_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_open", "btn_open_door", 35.0f, 35.0f, 0.0, "btn_open_door_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_open_door", 25.0, 20.0, "btn_open_door_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_distrap", "btn_traps", 35.0f, 35.0f, 0.0, "btn_traps_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_traps", 25.0, 20.0, "btn_traps_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 7 ******************************************************************* 575 / 291 + + jRow = CreateButtonImage(JsonArray(), "isk_olock", "btn_pick_locks", 35.0f, 35.0f, 0.0, "btn_pick_locks_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_pick_locks", 25.0, 20.0, "btn_pick_locks_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_bash", "btn_bash_locks", 35.0f, 35.0f, 0.0, "btn_bash_locks_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_bash_locks", 25.0, 20.0, "btn_bash_locks_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_control", "btn_magic_level", 35.0f, 35.0f, 0.0, "btn_magic_level_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic_level", 25.0, 20.0, "btn_magic_level_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_xability", "btn_spontaneous", 35.0f, 35.0f, 0.0, "btn_spontaneous_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_spontaneous", 25.0, 20.0, "btn_spontaneous_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_cntrspell", "btn_magic", 35.0f, 35.0f, 0.0, "btn_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic", 25.0, 20.0, "btn_magic_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_moreattacks", "btn_magic_items", 35.0f, 35.0f, 0.0, "btn_magic_items_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_magic_items", 25.0, 20.0, "btn_magic_items_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_orisons", "btn_def_magic", 35.0f, 35.0f, 0.0, "btn_def_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_def_magic", 25.0, 20.0, "btn_def_magic_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_metamagic", "btn_off_magic", 35.0f, 35.0f, 0.0, "btn_off_magic_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_off_magic", 25.0, 20.0, "btn_off_magic_tooltip"); + + jRow = CreateButtonImage(jRow, "isk_heal", "btn_heal_out", 35.0f, 35.0f, 0.0, "btn_heal_out_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heal_out", 25.0, 20.0, "btn_heal_out_tooltip"); + + jRow = CreateButtonImage(jRow, "dm_heal", "btn_heal_in", 35.0f, 35.0f, 0.0, "btn_heal_in_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heal_in", 25.0, 20.0, "btn_heal_in_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 8 ******************************************************************* 575 / 334 + jRow = CreateButtonImage(JsonArray(), "ir_heal", "btn_heals_onoff", 35.0f, 35.0f, 0.0, "btn_heals_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_heals_onoff", 25.0, 20.0, "btn_heals_onoff_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_party", "btn_healp_onoff", 35.0f, 35.0f, 0.0, "btn_healp_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_healp_onoff", 25.0, 20.0, "btn_healp_onoff_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_accept", "btn_cure_onoff", 35.0f, 35.0f, 0.0, "btn_cure_onoff_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_cure_onoff", 25.0, 20.0, "btn_cure_onoff_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_barter", "btn_loot", 35.0f, 35.0f, 0.0, "btn_loot_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_loot", 25.0, 20.0, "btn_loot_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_ignore", "btn_ignore_assoc", 35.0f, 35.0f, 0.0, "btn_ignore_assoc_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ignore_assoc", 25.0, 20.0, "btn_ignore_assoc_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_abort", "btn_ignore_traps", 35.0f, 35.0f, 0.0, "btn_ignore_traps_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_ignore_traps", 25.0, 20.0, "btn_ignore_traps_tooltip"); + + jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_perc_range", 35.0f, 35.0f, 0.0, "btn_perc_range_tooltip"); + jRow = CreateCheckBox(jRow, "", "chbx_perc_range", 25.0, 20.0, "btn_perc_range_tooltip"); + + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 334.0; + // Get the window location to restore it from the database. + string sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + jLocations = JsonObjectGet(jLocations, "dm_widget_manager_nui"); + float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); + float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, "dm_widget_manager_nui", sName + " PEPS DM Widget Manager", + fX, fY, 660.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui_dm"); + // Set event watches for save window location. + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Row 1 + NuiSetBind(oPC, nToken, "btn_check_buttons_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_check_buttons_tooltip", JsonString(" Check all buttons, removing them for all players.")); + NuiSetBind(oPC, nToken, "btn_clear_buttons_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_buttons_tooltip", JsonString(" Clear all buttons, allowing use for all players.")); + // Row 2 & 3 Labels. + // Load all the buttons states. + //int bAIWidgetLock = ai_GetDMWAccessButton(BTN_WIDGET_LOCK); + int bCmdAction = ai_GetDMWAccessButton(BTN_CMD_ACTION); + int bCmdGuard = ai_GetDMWAccessButton(BTN_CMD_GUARD); + int bCmdHold = ai_GetDMWAccessButton(BTN_CMD_HOLD); + int bCmdSearch = ai_GetDMWAccessButton(BTN_CMD_SEARCH); + int bCmdStealth = ai_GetDMWAccessButton(BTN_CMD_STEALTH); + int bCmdAttack = ai_GetDMWAccessButton(BTN_CMD_ATTACK); + int bCmdFollow = ai_GetDMWAccessButton(BTN_CMD_FOLLOW); + int bCmdAIScript = ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT); + int bCmdPlacetrap = ai_GetDMWAccessButton(BTN_CMD_PLACE_TRAP); + int bSpellWidget = ai_GetDMWAccessButton(BTN_CMD_SPELL_WIDGET); + int bMemorizeSpells = ai_GetDMWAccessButton(BTN_DM_CMD_MEMORIZE); + int bBuffShort = ai_GetDMWAccessButton(BTN_BUFF_SHORT); + int bBuffLong = ai_GetDMWAccessButton(BTN_BUFF_LONG); + int bBuffAll = ai_GetDMWAccessButton(BTN_BUFF_ALL); + int bBuffRest = ai_GetDMWAccessButton(BTN_BUFF_REST); + int bJumpTo = ai_GetDMWAccessButton(BTN_CMD_JUMP_TO); + int bGhostMode = ai_GetDMWAccessButton(BTN_CMD_GHOST_MODE); + int bCamera = ai_GetDMWAccessButton(BTN_CMD_CAMERA); + int bInventory = ai_GetDMWAccessButton(BTN_CMD_INVENTORY); + int bFamiliar = ai_GetDMWAccessButton(BTN_CMD_FAMILIAR); + int bCompanion = ai_GetDMWAccessButton(BTN_CMD_COMPANION); + int bFollowTarget = ai_GetDMAIAccessButton(BTN_AI_FOLLOW_TARGET); + int bAI = ai_GetDMAIAccessButton(BTN_AI_FOR_PC); + int bReduceSpeech = ai_GetDMAIAccessButton(BTN_AI_REDUCE_SPEECH); + int bRanged = ai_GetDMAIAccessButton(BTN_AI_USE_RANGED); + int bEquipWeapons = ai_GetDMAIAccessButton(BTN_AI_STOP_WEAPON_EQUIP); + int bSearch = ai_GetDMAIAccessButton(BTN_AI_USE_SEARCH); + int bStealth = ai_GetDMAIAccessButton(BTN_AI_USE_STEALTH); + int bOpenDoors = ai_GetDMAIAccessButton(BTN_AI_OPEN_DOORS); + int bTraps = ai_GetDMAIAccessButton(BTN_AI_REMOVE_TRAPS); + int bPickLocks = ai_GetDMAIAccessButton(BTN_AI_PICK_LOCKS); + int bBashLocks = ai_GetDMAIAccessButton(BTN_AI_BASH_LOCKS); + int bMagicLevel = ai_GetDMAIAccessButton(BTN_AI_MAGIC_LEVEL); + int bSpontaneous = ai_GetDMAIAccessButton(BTN_AI_NO_SPONTANEOUS); + int bNoMagic = ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_USE); + int bNoMagicItems = ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_ITEM_USE); + int bDefMagic = ai_GetDMAIAccessButton(BTN_AI_DEF_MAGIC_USE); + int bOffMagic = ai_GetDMAIAccessButton(BTN_AI_OFF_MAGIC_USE); + int bHealOut = ai_GetDMAIAccessButton(BTN_AI_HEAL_OUT); + int bHealIn = ai_GetDMAIAccessButton(BTN_AI_HEAL_IN); + int bSelfHealOnOff = ai_GetDMAIAccessButton(BTN_AI_STOP_SELF_HEALING); + int bPartyHealOnOff = ai_GetDMAIAccessButton(BTN_AI_STOP_PARTY_HEALING); + int bCureOnOff = ai_GetDMAIAccessButton(BTN_AI_STOP_CURE_SPELLS); + int bLoot = ai_GetDMAIAccessButton(BTN_AI_LOOT); + int bIgnoreAssociates = ai_GetDMAIAccessButton(BTN_AI_IGNORE_ASSOCIATES); + int bIgnoreTraps = ai_GetDMAIAccessButton(BTN_AI_IGNORE_TRAPS); + int bPercRange = ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE); + int bBtnFamiliar = ai_GetDMWAccessButton(BTN_CMD_FAMILIAR); + int bBtnCompanion = ai_GetDMWAccessButton(BTN_CMD_COMPANION); + SetLocalInt(oPC, "CHBX_SKIP", TRUE); + DelayCommand(2.0, DeleteLocalInt(oPC, "CHBX_SKIP")); + // Row 4 + NuiSetBind(oPC, nToken, "chbx_cmd_action_check", JsonBool (bCmdAction)); + NuiSetBindWatch(oPC, nToken, "chbx_cmd_action_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_action_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_action_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_action_tooltip", JsonString(" Action button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_guard_check", JsonBool (bCmdGuard)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_guard_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_guard_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_guard_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_guard_tooltip", JsonString(" Guard button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_hold_check", JsonBool (bCmdHold)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_hold_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_hold_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_hold_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_hold_tooltip", JsonString(" Hold button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_attack_check", JsonBool (bCmdAttack)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_attack_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_attack_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_attack_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_attack_tooltip", JsonString(" Attack button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_follow_check", JsonBool (bCmdFollow)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_follow_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_follow_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_follow_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(" Follow button")); + + NuiSetBind(oPC, nToken, "chbx_follow_target_check", JsonBool (bFollowTarget)); + NuiSetBindWatch (oPC, nToken, "chbx_follow_target_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_follow_target_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_follow_target_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_follow_target_tooltip", JsonString(" Follow Target button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_search_check", JsonBool (bCmdSearch)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_search_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_search_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_search_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_search_tooltip", JsonString(" Search All button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_stealth_check", JsonBool (bCmdStealth)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_stealth_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_stealth_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_stealth_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_stealth_tooltip", JsonString(" Stealth All button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_check", JsonBool (bCmdAIScript)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_ai_script_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_ai_script_tooltip", JsonString(" Combat Tactics button")); + + NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_check", JsonBool (bCmdPlacetrap)); + NuiSetBindWatch (oPC, nToken, "chbx_cmd_place_trap_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_cmd_place_trap_tooltip", JsonString (" Place Trap button")); + // Row 5 + NuiSetBind(oPC, nToken, "chbx_quick_widget_check", JsonBool (bSpellWidget)); + NuiSetBindWatch (oPC, nToken, "chbx_quick_widget_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_quick_widget_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_quick_widget_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_quick_widget_tooltip", JsonString(" Quick Use button")); + + NuiSetBind(oPC, nToken, "chbx_spell_memorize_check", JsonBool (bMemorizeSpells)); + NuiSetBindWatch (oPC, nToken, "chbx_spell_memorize_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_spell_memorize_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spell_memorize_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_spell_memorize_tooltip", JsonString(" Memorize Spells button")); + + NuiSetBind(oPC, nToken, "chbx_buff_short_check", JsonBool (bBuffShort)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_short_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_short_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_short_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_buff_short_tooltip", JsonString(" Short Buffing button")); + + NuiSetBind(oPC, nToken, "chbx_buff_long_check", JsonBool (bBuffLong)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_long_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_long_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_long_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_long_tooltip", JsonString(" Long Buffing button")); + + NuiSetBind(oPC, nToken, "chbx_buff_all_check", JsonBool (bBuffAll)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_all_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_all_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_all_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_all_tooltip", JsonString(" All Buffing button")); + + NuiSetBind(oPC, nToken, "chbx_buff_rest_check", JsonBool (bBuffRest)); + NuiSetBindWatch (oPC, nToken, "chbx_buff_rest_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_buff_rest_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_rest_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_buff_rest_tooltip", JsonString(" Rest Buffing button")); + + NuiSetBind(oPC, nToken, "chbx_jump_to_check", JsonBool(bJumpTo)); + NuiSetBindWatch (oPC, nToken, "chbx_jump_to_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_jump_to_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_jump_to_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_jump_to_tooltip", JsonString(" Jump Associates button")); + + NuiSetBind(oPC, nToken, "chbx_ghost_mode_check", JsonBool (bGhostMode)); + NuiSetBindWatch (oPC, nToken, "chbx_ghost_mode_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ghost_mode_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ghost_mode_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_ghost_mode_tooltip", JsonString(" Ghost mode button")); + + NuiSetBind(oPC, nToken, "chbx_camera_check", JsonBool (bCamera)); + NuiSetBindWatch (oPC, nToken, "chbx_camera_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_camera_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString(" Change Camera button")); + + NuiSetBind(oPC, nToken, "chbx_inventory_check", JsonBool (bInventory)); + NuiSetBindWatch (oPC, nToken, "chbx_inventory_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_inventory_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString(" Open Inventory button")); + // Row 6 + NuiSetBind(oPC, nToken, "chbx_familiar_check", JsonBool(bBtnFamiliar)); + NuiSetBindWatch (oPC, nToken, "chbx_familiar_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_familiar_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_familiar_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_familiar_tooltip", JsonString(" Change Familiar buttons")); + + NuiSetBind(oPC, nToken, "chbx_companion_check", JsonBool(bBtnCompanion)); + NuiSetBindWatch (oPC, nToken, "chbx_companion_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_companion_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_companion_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_companion_tooltip", JsonString(" Change Animal Companion buttons")); + + NuiSetBind(oPC, nToken, "chbx_ai_check", JsonBool(bAI)); + NuiSetBindWatch (oPC, nToken, "chbx_ai_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ai_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ai_tooltip", JsonString(" Player AI button")); + + NuiSetBind(oPC, nToken, "chbx_quiet_check", JsonBool(bReduceSpeech)); + NuiSetBindWatch (oPC, nToken, "chbx_quiet_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_quiet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_quiet_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_quiet_tooltip", JsonString(" Reduce Speech button")); + + NuiSetBind(oPC, nToken, "chbx_ranged_check", JsonBool(bRanged)); + NuiSetBindWatch(oPC, nToken, "chbx_ranged_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ranged_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ranged_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_ranged_tooltip", JsonString(" Ranged button")); + + NuiSetBind(oPC, nToken, "chbx_equip_weapon_check", JsonBool(bEquipWeapons)); + NuiSetBindWatch(oPC, nToken, "chbx_equip_weapon_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_equip_weapon_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_equip_weapon_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_equip_weapon_tooltip", JsonString(" Auto Equip Weapons button")); + + NuiSetBind(oPC, nToken, "chbx_search_check", JsonBool(bSearch)); + NuiSetBindWatch (oPC, nToken, "chbx_search_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_search_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_search_tooltip", JsonString(" Search button")); + + NuiSetBind(oPC, nToken, "chbx_stealth_check", JsonBool(bStealth)); + NuiSetBindWatch(oPC, nToken, "chbx_stealth_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_stealth_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_stealth_tooltip", JsonString(" Stealth button")); + + NuiSetBind(oPC, nToken, "chbx_open_door_check", JsonBool(bOpenDoors)); + NuiSetBindWatch (oPC, nToken, "chbx_open_door_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_open_door_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_open_door_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_open_door_tooltip", JsonString(" Open Door button")); + + NuiSetBind(oPC, nToken, "chbx_traps_check", JsonBool(bTraps)); + NuiSetBindWatch (oPC, nToken, "chbx_traps_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_traps_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_traps_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_traps_tooltip", JsonString(" Disable Traps button")); + // Row 7 + NuiSetBind(oPC, nToken, "chbx_pick_locks_check", JsonBool(bPickLocks)); + NuiSetBindWatch(oPC, nToken, "chbx_pick_locks_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_pick_locks_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_pick_locks_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_pick_locks_tooltip", JsonString(" Pick Locks button")); + + NuiSetBind(oPC, nToken, "chbx_bash_locks_check", JsonBool(bBashLocks)); + NuiSetBindWatch(oPC, nToken, "chbx_bash_locks_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_bash_locks_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_bash_locks_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_bash_locks_tooltip", JsonString(" Bash button")); + + NuiSetBind(oPC, nToken, "chbx_magic_level_check", JsonBool(bMagicLevel)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_level_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_level_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_level_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_magic_level_tooltip", JsonString(" Magic Level button")); + + NuiSetBind(oPC, nToken, "chbx_spontaneous_check", JsonBool(bSpontaneous)); + NuiSetBindWatch (oPC, nToken, "chbx_spontaneous_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_spontaneous_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spontaneous_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spontaneous_tooltip", JsonString(" Spontaneous Spells button")); + + NuiSetBind(oPC, nToken, "chbx_magic_check", JsonBool(bNoMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_tooltip", JsonString(" Use Magic button")); + + NuiSetBind(oPC, nToken, "chbx_magic_items_check", JsonBool(bNoMagicItems)); + NuiSetBindWatch (oPC, nToken, "chbx_magic_items_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_magic_items_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_items_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_magic_items_tooltip", JsonString(" Use Magic Items button")); + + NuiSetBind(oPC, nToken, "chbx_def_magic_check", JsonBool (bDefMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_def_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_def_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_def_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_def_magic_tooltip", JsonString(" Use Defensive Magic button")); + + NuiSetBind(oPC, nToken, "chbx_off_magic_check", JsonBool(bOffMagic)); + NuiSetBindWatch (oPC, nToken, "chbx_off_magic_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_off_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_off_magic_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_off_magic_tooltip", JsonString(" Use Offensive Magic button")); + + NuiSetBind(oPC, nToken, "chbx_heal_out_check", JsonBool(bHealOut)); + NuiSetBindWatch (oPC, nToken, "chbx_heal_out_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heal_out_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_out_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_out_tooltip", JsonString(" Heal Out of Combat button")); + + NuiSetBind(oPC, nToken, "chbx_heal_in_check", JsonBool(bHealIn)); + NuiSetBindWatch (oPC, nToken, "chbx_heal_in_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heal_in_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_in_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_in_tooltip", JsonString(" Heal In Combat button")); + // Row 8 + NuiSetBind(oPC, nToken, "chbx_heals_onoff_check", JsonBool(bSelfHealOnOff)); + NuiSetBindWatch (oPC, nToken, "chbx_heals_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_heals_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heals_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heals_onoff_tooltip", JsonString(" Heal Self On/Off button")); + + NuiSetBind(oPC, nToken, "chbx_healp_onoff_check", JsonBool(bPartyHealOnOff)); + NuiSetBind(oPC, nToken, "chbx_healp_onoff_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_healp_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "btn_healp_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_healp_onoff_tooltip", JsonString(" Heal Party On/Off button")); + + NuiSetBind(oPC, nToken, "chbx_cure_onoff_check", JsonBool(bCureOnOff)); + NuiSetBind(oPC, nToken, "chbx_cure_onoff_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "chbx_cure_onoff_check", TRUE); + NuiSetBind(oPC, nToken, "btn_cure_onoff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(" Cure Spells On/Off button")); + + NuiSetBind(oPC, nToken, "chbx_loot_check", JsonBool(bLoot)); + NuiSetBindWatch (oPC, nToken, "chbx_loot_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_loot_tooltip", JsonString(" Auto Looting button")); + + NuiSetBind(oPC, nToken, "chbx_ignore_assoc_check", JsonBool(bIgnoreAssociates)); + NuiSetBindWatch(oPC, nToken, "chbx_ignore_assoc_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ignore_assoc_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ignore_assoc_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_ignore_assoc_tooltip", JsonString(" Ignore Associates On/Off button")); + + NuiSetBind(oPC, nToken, "chbx_ignore_traps_check", JsonBool(bIgnoreTraps)); + NuiSetBindWatch(oPC, nToken, "chbx_ignore_traps_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_ignore_traps_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_ignore_traps_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "btn_ignore_traps_tooltip", JsonString(" Ignore Floor Traps On/Off button")); + + NuiSetBind(oPC, nToken, "chbx_perc_range_check", JsonBool(bPercRange)); + NuiSetBindWatch (oPC, nToken, "chbx_perc_range_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_perc_range_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_perc_range_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_perc_range_tooltip", JsonString(" Perception Range button")); +} + diff --git a/_module/nss/0i_messages.nss b/_module/nss/0i_messages.nss new file mode 100644 index 00000000..ff01269a --- /dev/null +++ b/_module/nss/0i_messages.nss @@ -0,0 +1,88 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_messages +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include script for sending messages to files and players on the server. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_constants" +#include "0i_color" +// Sets up a Message on the module to be sent to the log and/or players. +// sTextColor color of text sent to the players and DM's. +// Use AI_COLOR_*. Where * is WHITE, RED, GREEN, BLUE, GRAY, or YELLOW. +// If nLog is TRUE it will send the message to the log file. +// If nToDMs is TRUE it will send the message to all DM's. +// If oPC is set to a player then they will get the message as well. +// Messages delivered by script should be colored as follows. +// _Debug message = COLOR_WHITE +// Generic messages for the player = AI_COLOR_YELLOW +// Negative messages for the player = AI_COLOR_RED +// Positive messages for the player = AI_COLOR_GREEN +// System messages, things that are not part of Dnd = COLOR_GRAY +// Descriptive in game messages = COLOR_BLUE +void ai_SendMessages(string sMessage, string sTextColor = AI_COLOR_YELLOW, object oPC = OBJECT_INVALID, int nToDMs = FALSE, int nLog = FALSE); +// Used for _debugging. Keeps all the information organized. +// Sends info to first pc if true and sends information to log file. +// sScriptName is the name of the script calling this function. +// sLineNumber is the line number of the code calling this function. +// sMessage is the description of the debug being sent. +void ai_Debug(string sScriptName, string sLineNumber, string sMessage); +// A counter to track microseconds in code. Start saves the counter. +void ai_Counter_Start(); +// A counter to track microseconds in code. End displays the time between Start +// and End to the log file. +void ai_Counter_End(string sMessage = ""); + +void ai_SendMessages(string sMessage, string sTextColor = AI_COLOR_YELLOW, object oPC = OBJECT_INVALID, int nToDMs = FALSE, int nLog = FALSE) +{ + // if nLog is TRUE send the message to the log file. + if(nLog) + { + sMessage = ai_StripColorCodes(sMessage); + // Add PC name to log to know who it belongs to. + string sLogPCName; + if(oPC != OBJECT_INVALID) sLogPCName = "(" + GetName(oPC) + ") "; + WriteTimestampedLogEntry("*** MESSAGE: " + sLogPCName + " " + sMessage); + } + sMessage = ai_AddColorToText(sMessage, sTextColor); + if(oPC != OBJECT_INVALID) SendMessageToPC(oPC, sMessage); + // If nToDMs is true send message to the DM's online. + if(nToDMs) SendMessageToAllDMs(sMessage); +} +void ai_Debug(string sScriptName, string sLineNumber, string sMessage) +{ + string sName = GetName(OBJECT_SELF); + if(sName == GetLocalString(GetModule(), AI_RULE_DEBUG_CREATURE) && + sName != "") + { + sMessage = "(((DEBUG)))[" + sScriptName + " - " + sLineNumber + " ]" + sMessage; + sMessage = ai_StripColorCodes(sMessage); + WriteTimestampedLogEntry(sMessage); + return; + } + //sMessage = "(((DEBUG)))[" + sScriptName + " - " + sLineNumber + " ]" + sMessage; + //sMessage = ai_StripColorCodes(sMessage); + //SendMessageToPC(GetFirstPC(), sMessage); + //WriteTimestampedLogEntry(sMessage); + //if(GetLocalInt(OBJECT_SELF, "AI_DEBUG")) WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Kirrin") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Dorna Trapspringer") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Dire Spider") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Shadow Priest") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Tomi Undergallows") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Thello Colds") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Gert Sigers") WriteTimestampedLogEntry(sMessage); + //if(GetName(OBJECT_SELF) == "Zombie") WriteTimestampedLogEntry(sMessage); +} +void ai_Counter_Start() +{ + SetLocalInt(GetModule(), "0_MSCounter", GetMicrosecondCounter()); +} +void ai_Counter_End(string sMessage = "") +{ + int nTime = GetMicrosecondCounter(); + nTime = nTime - GetLocalInt(GetModule(), "0_MSCounter"); + float fTime = nTime / 1000000.0; + if(AI_DEBUG) ai_Debug("MICROSECOND_COUNTER", "", "Seconds: " + FloatToString(fTime, 0, 10) + + " Microseconds: " + IntToString(nTime) + " " + sMessage); +} diff --git a/_module/nss/0i_module.nss b/_module/nss/0i_module.nss new file mode 100644 index 00000000..6d501824 --- /dev/null +++ b/_module/nss/0i_module.nss @@ -0,0 +1,544 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_module +//////////////////////////////////////////////////////////////////////////////// + Include script for handling event scripts for injecting the systems into a + module for either single player or a server. +*/////////////////////////////////////////////////////////////////////////////// +#include "x2_inc_switches" +#include "0i_associates" +#include "0i_menus" +#include "0i_player_target" +#include "0i_gui_events" +// Add to nw_c2_default9 OnSpawn event script of monsters and +int ai_OnMonsterSpawn(object oCreature); +// Add to nw_ch_ac9 OnSpawn event script of henchman. +void ai_OnAssociateSpawn(object oCreature); +// Run all of the players starting scripts. +// If oPC is passed as Invalid then it will get the firt PC in the game. +void ai_CheckPCStart(object oPC = OBJECT_INVALID); +// Checks to see if we should change the monster via Json. +int ai_ChangeMonster(object oCreature, object oModule); +// Checks to see if we should change the associate via Json. +object ai_ChangeAssociate(object oCreature, object oModule); +// Sets the events for oCreature that is a Monster while playing Infinite Dungeons. +void ai_SetIDMonsterEventScripts(object oCreature); +// Sets the events for oCreature that is a monster in while using the PRC and +// playing Infinite Dungeons. +void ai_SetPRCIDMonsterEventScripts(object oCreature); +// Sets the events for oCreature that is an associate while using the PRC. +void ai_SetPRCAssociateEventScripts(object oCreature); +// Reverts single player monster event scripts back to their default. +void ai_ChangeEventScriptsForMonster(object oCreature); +// Reverts single player associates event scripts back to their default. +void ai_ChangeEventScriptsForAssociate(object oCreature); +// If using PRC this will replace some spells with PRC variants. +json ai_ReplaceSpellsWithPRCVariants(object oCreature, json jCreature); + +//****************************************************************************** +//********************* Creature event scripts ********************************* +//****************************************************************************** +int ai_OnMonsterSpawn(object oCreature) +{ + if(GetLocalInt(oCreature, AI_ONSPAWN_EVENT)) return FALSE; + SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); + object oModule = GetModule(); + int nInfiniteDungeons; + int nPRC = GetLocalInt(oModule, AI_USING_PRC); + // If you are running a server this will not affect the module. + if(!AI_SERVER) + { + ai_CheckPCStart(); + string sModuleName = GetModuleName(); + if(sModuleName == "Neverwinter Nights - Infinite Dungeons" || + sModuleName == "Infinite Dungeons [PRC8]") + { + nInfiniteDungeons = TRUE; + if(nPRC) ai_SetPRCIDMonsterEventScripts(oCreature); + else ai_SetIDMonsterEventScripts(oCreature); + // Fix to get plot givers, finishers from getting killed a lot. + if(GetLocalString(oCreature, "sConversation") == "id1_plotgiver " || + GetLocalString(oCreature, "sConversation") == "id1_plotdest") + { + ChangeToStandardFaction(oCreature, STANDARD_FACTION_MERCHANT); + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 50, oCreature); + } + } + } + // PRC and Infinite dungeons has issues with Ondeath script so we just leave it alone. + if(!nPRC && !nInfiniteDungeons) + { + // We change this script so we can setup permanent summons on/off. + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); + SetLocalString(oCreature, "AI_ON_DEATH", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_c2_7_ondeath"); + } + if(GetCreatureFlag(oCreature, CREATURE_VAR_IS_INCORPOREAL)) + { + string sCombatAI = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + if (sCombatAI == "") SetLocalString(oCreature, AI_DEFAULT_SCRIPT, "ai_incorporeal"); + } + ai_SetListeningPatterns(oCreature); + ai_SetCreatureAIScript(oCreature); + ai_SetNormalAppearance(oCreature); + ai_SetAura(oCreature); + SetLocalInt(oCreature, AI_HEAL_IN_COMBAT_LIMIT, AI_MONSTER_HEAL_IN_COMBAT_CHANCE); + SetLocalInt(oCreature, AI_HEAL_OUT_OF_COMBAT_LIMIT, AI_MONSTER_HEAL_OUT_COMBAT_CHANCE); + int nMonsterHpIncrease = GetLocalInt(oModule, AI_INCREASE_MONSTERS_HP); + if(nMonsterHpIncrease) + { + int nHp = GetMaxHitPoints(oCreature); + nHp = (nHp * nMonsterHpIncrease) / 100; + effect eHp = EffectTemporaryHitpoints(nHp); + eHp = SupernaturalEffect(eHp); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHp, oCreature); + } + // Check if the monster should change how they search for targets. + if(d100() <= GetLocalInt(GetModule(), AI_RULE_AI_DIFFICULTY)) + { + SetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY, TRUE); + } + // Do json changes after we have setup the creature. + if(ai_ChangeMonster(oCreature, oModule)) return TRUE; + return FALSE; +} +void ai_OnAssociateSpawn(object oCreature) +{ + if(GetLocalInt(oCreature, AI_ONSPAWN_EVENT)) return; + SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); + int bPRC = GetLocalInt(GetModule(), AI_USING_PRC); + // If you are running a server this will not affect the module. + if(!AI_SERVER) + { + if(bPRC) ai_SetPRCAssociateEventScripts(oCreature); + } + // PRC has issues with Ondeath script so we just leave it alone. + if(!bPRC) + { + // We change this script so we can setup permanent summons on/off. + // If you don't use this you may remove the next three lines. + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); + SetLocalString(oCreature, "AI_ON_DEATH", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_ch_7_ondeath"); + } + // Initialize Associate modes for basic use. + ai_SetListeningPatterns(oCreature); + ai_SetNormalAppearance(oCreature); + ai_SetAssociateAIScript(oCreature, FALSE); + ai_SetAura(oCreature); + if(GetLocalInt(GetModule(), AI_RULE_PARTY_SCALE)) ai_CheckXPPartyScale(oCreature); + // Bioware summoned shadows are not incorporeal, also set the ai code. + if (GetTag(OBJECT_SELF) == "NW_S_SHADOW") + { + SetLocalInt(OBJECT_SELF, "X2_L_IS_INCORPOREAL", TRUE); + SetLocalString(OBJECT_SELF, AI_DEFAULT_SCRIPT, "ai_shadow"); + } +} +void ai_CheckPCStart(object oPC = OBJECT_INVALID) +{ + if(oPC == OBJECT_INVALID) oPC = GetFirstPC(); + // There should always be a PC widget. If it doesn't exist then we assume + // that the module is being loaded or started. + if(!NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI)) + { + object oModule = GetModule(); + // Do PRC check and save variable to the module. + if(ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) != "") + SetLocalInt(oModule, AI_USING_PRC, TRUE); + ai_SetAIRules(); + ai_CheckAssociateData(oPC, oPC, "pc"); + ai_StartupPlugins(oPC); + ai_SetupPlayerTarget(oPC); + ai_SetupModuleGUIEvents(oPC); + ai_CreateWidgetNUI(oPC, oPC); + ai_SetNormalAppearance(oPC); + } +} +void ai_CopyMonster(object oCreature, object oModule) +{ + // After setting the monster lets see if we should copy it. + float fMonsterIncrease = GetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS); + if(GetIsEncounterCreature(oCreature) && fMonsterIncrease > 0.0) + { + int nMonsterIncrease; + float fMonsterCounter = GetLocalFloat(oModule, "AI_MONSTER_COUNTER"); + fMonsterCounter += fMonsterIncrease; + nMonsterIncrease = FloatToInt(fMonsterCounter); + if(nMonsterIncrease > 0) + { + fMonsterCounter = fMonsterCounter - IntToFloat(nMonsterIncrease); + } + SetLocalFloat(oModule, "AI_MONSTER_COUNTER", fMonsterCounter); + while(nMonsterIncrease > 0) + { + CopyObject(oCreature, GetLocation(oCreature), OBJECT_INVALID, "", TRUE); + nMonsterIncrease = nMonsterIncrease - 1; + } + } +} +void ai_CreateMonster(json jCreature, location lLocation, object oModule) +{ + //WriteTimestampedLogEntry("0i_module, 181, " + JsonDump(jCreature, 1)); + object oCreature = JsonToObject(jCreature, lLocation, OBJECT_INVALID, TRUE); + // Lets set the new version as spawned so we skip the initial setup again. + SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); + /*if(GetLocalInt(oModule, AI_RULE_CORPSES_STAY)) + { + SetIsDestroyable(FALSE, FALSE, TRUE, oCreature); + SetLootable(oCreature, TRUE); + } */ + if(AI_DEBUG) ai_Debug("0i_module", "187", GetName(oCreature)); + ai_CopyMonster(oCreature, oModule); + return; +} +json ai_SetCompanionSummoning(object oCreature, json jCreature) +{ + if(GetHasFeat(FEAT_SUMMON_FAMILIAR, oCreature, TRUE)) + { + json jFamiliar = JsonObjectGet(jCreature, "FamiliarName"); + jFamiliar = JsonObjectSet(jFamiliar, "value", JsonString("Summoned Familiar")); + jCreature = JsonObjectSet(jCreature, "FamiliarName", jFamiliar); + jFamiliar = JsonObjectGet(jCreature, "FamiliarType"); + jFamiliar = JsonObjectSet(jFamiliar, "value", JsonInt(Random(11))); + return JsonObjectSet(jCreature, "FamiliarType", jFamiliar); + } + if(GetHasFeat(FEAT_ANIMAL_COMPANION , oCreature, TRUE)) + { + json jCompanion = JsonObjectGet(jCreature, "CompanionName"); + jCompanion = JsonObjectSet(jCompanion, "value", JsonString("Summoned Companion")); + jCreature = JsonObjectSet(jCreature, "CompanionName", jCompanion); + jCompanion = JsonObjectGet(jCreature, "CompanionType"); + jCompanion = JsonObjectSet(jCompanion, "value", JsonInt(Random(9))); + return JsonObjectSet(jCreature, "CompanionType", jCompanion); + } + return jCreature; +} +int ai_ChangeMonster(object oCreature, object oModule) +{ + object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oCreature); + // Lets not mess up the cutscenes with silly RULES. + if(GetCutsceneMode(oPC)) return FALSE; + //float fDistance = GetDistanceBetween(oCreature, oPC); + // Looks bad to see creatures wink in and out plus could cause module errors. + //if(fDistance != 0.0 && fDistance < AI_RANGE_PERCEPTION) return oCreature; + if(IsInConversation(oCreature)) return FALSE; + json jCreature = ObjectToJson(oCreature, TRUE); + // We now use plugins to mod our monsters. + json jMonsterMods = GetLocalJson(oModule, AI_MONSTER_MOD_JSON); + if(JsonGetType(jMonsterMods) != JSON_TYPE_NULL) + { + SetLocalJson(oModule, AI_MONSTER_JSON, jCreature); + SetLocalObject(oModule, AI_MONSTER_OBJECT, oCreature); + int nIndex; + string sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, nIndex)); + while(sMonsterMod != "") + { + ExecuteScript(sMonsterMod, oPC); + sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, ++nIndex)); + } + jCreature = GetLocalJson(oModule, AI_MONSTER_JSON); + } + int nSummon = GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS) && + (GetHasFeat(FEAT_SUMMON_FAMILIAR, oCreature, TRUE)) || + GetHasFeat(FEAT_ANIMAL_COMPANION, oCreature, TRUE); + int nPercDist = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE) != 11 && + GetReputation(oCreature, oPC) < 11; + //WriteTimestampedLogEntry(GetName(oCreature) + ": fDistance: " + FloatToString(fDistance, 0, 2) + " nSummon: " + IntToString(nSummon) + + // " nPercDist: " + IntToString(nPercDist) + " Reputation: " + IntToString(GetReputation(oCreature, oPC))); + if(nSummon || nPercDist) + { + location lLocation = GetLocation(oCreature); + if(nPercDist) + { + json jPerception = JsonObjectGet(jCreature, "PerceptionRange"); + jPerception = JsonObjectSet(jPerception, "value", JsonInt(GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE))); + jCreature = JsonObjectSet(jCreature, "PerceptionRange", jPerception); + } + if(nSummon) jCreature = ai_SetCompanionSummoning(oCreature, jCreature); + SetLocalInt(oModule, AI_MONSTER_CHANGED, TRUE); + } + if(GetLocalInt(oModule, AI_MONSTER_CHANGED)) + { + SetIsDestroyable(TRUE, FALSE, FALSE, oCreature); + location lLocation = GetLocation(oCreature); + DestroyObject(oCreature); + AssignCommand(oModule, DelayCommand(1.0, ai_CreateMonster(jCreature, lLocation, oModule))); + DeleteLocalInt(oModule, AI_MONSTER_CHANGED); + return TRUE; + } + else ai_CopyMonster(oCreature, oModule); + DeleteLocalJson(oModule, AI_MONSTER_JSON); + DeleteLocalObject(oModule, AI_MONSTER_OBJECT); + return FALSE; +} +// Special event scripts for Infinite Dungeons! +void ai_SetIDMonsterEventScripts(object oCreature) +{ + //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts."); + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); + if(sScript == "x2_def_heartbeat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else if(sScript == "nw_c2_default1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_HEARTBEAT SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Perception ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); + SetLocalString(oCreature, "AI_ON_NOTICE", sScript); + if(sScript == "x2_def_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_id_events"); + else if(sScript == "nw_c2_default2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_NOTICE SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On End Combat Round ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); + if(sScript == "x2_def_endcombat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_id_events"); + else if(sScript == "nw_c2_default3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_END_COMBATROUND SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Dialogue ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); + if(sScript == "x2_def_onconv") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_id_events"); + else if(sScript == "nw_c2_default4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DIALOGUE_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Melee Attacked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); + if(sScript == "x2_def_attacked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_id_events"); + else if(sScript == "nw_c2_default5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_MELEE_ATTACKED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Damaged ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); + if(sScript == "x2_def_ondamage") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_id_events"); + else if(sScript == "nw_c2_default6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DAMAGED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + // We don't set OnDeath for Infinite Dungeons! + //********** On Death ********** + //sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); + //SetLocalString(oCreature, "AI_ON_DEATH", sScript); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_id_events"); + //********** On Disturbed ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); + if(sScript == "x2_def_ondisturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_id_events"); + else if(sScript == "nw_c2_default8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DISTURBED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //********** On Rested ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); + SetLocalString(oCreature, "AI_ON_RESTED", sScript); + if(sScript == "x2_def_rested") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_id_events"); + else if(sScript == "nw_c2_defaulta") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_RESTED SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Spell Cast At ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); + if(sScript == "x2_def_spellcast") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_id_events"); + else if(sScript == "nw_c2_defaultb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_SPELLCASTAT_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Blocked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); + if(sScript == "x2_def_onblocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_id_events"); + else if(sScript == "nw_c2_defaulte") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_BLOCKED_BY_DOOR SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); +} +// Special event scripts for Infinite Dungeons with PRC! +void ai_SetPRCIDMonsterEventScripts(object oCreature) +{ + //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts for PRC."); + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); + if(sScript == "x2_def_heartbeat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_id_events"); + else if(sScript == "nw_c2_default1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_HEARTBEAT SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Perception ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); + SetLocalString(oCreature, "AI_ON_NOTICE", sScript); + if(sScript == "x2_def_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_id_events"); + else if(sScript == "nw_c2_default2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_NOTICE SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On End Combat Round ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); + if(sScript == "x2_def_endcombat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_id_events"); + else if(sScript == "nw_c2_default3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_END_COMBATROUND SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Dialogue ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); + if(sScript == "x2_def_onconv") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_id_events"); + else if(sScript == "nw_c2_default4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DIALOGUE_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Melee Attacked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); + if(sScript == "x2_def_attacked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_id_events"); + else if(sScript == "nw_c2_default5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_MELEE_ATTACKED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Damaged ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); + if(sScript == "x2_def_ondamage") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_id_events"); + else if(sScript == "nw_c2_default6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DAMAGED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + // We don't set OnDeath for PRC or Infinite dungeons. + //********** On Death ********** + //sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); + //SetLocalString(oCreature, "AI_ON_DEATH", sScript); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_prc_id_events"); + //********** On Disturbed ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); + if(sScript == "x2_def_ondisturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_id_events"); + else if(sScript == "nw_c2_default8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_DISTURBED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //********** On Rested ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); + SetLocalString(oCreature, "AI_ON_RESTED", sScript); + if(sScript == "x2_def_rested") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_id_events"); + else if(sScript == "nw_c2_defaulta") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_RESTED SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Spell Cast At ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); + if(sScript == "x2_def_spellcast") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_id_events"); + else if(sScript == "nw_c2_defaultb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_SPELLCASTAT_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //********** On Blocked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); + if(sScript == "x2_def_onblocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_id_events"); + else if(sScript == "nw_c2_defaulte") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_id_events"); + else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); + else WriteTimestampedLogEntry("ON_BLOCKED_BY_DOOR SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); +} +// Special event scripts for PRC associates! +void ai_SetPRCAssociateEventScripts(object oCreature) +{ + //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts for PRC."); + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_ch_events"); + //********** On Perception ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); + SetLocalString(oCreature, "AI_ON_NOTICE", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_ch_events"); + //********** On End Combat Round ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_ch_events"); + //********** On Dialogue ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_ch_events"); + //********** On Melee Attacked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_ch_events"); + //********** On Damaged ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_ch_events"); + //********** On Disturbed ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ac8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_ch_events"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //********** On Rested ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); + SetLocalString(oCreature, "AI_ON_RESTED", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_ch_events"); + else if(sScript == "nw_ch_aca") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_ch_events"); + //********** On Spell Cast At ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_ch_events"); + else if(sScript == "nw_ch_acb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_ch_events"); + //********** On Blocked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); + if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_ch_events"); + else if(sScript == "nw_ch_ace") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_ch_events"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); + if(!GetCommandable(oCreature)) SetCommandable(TRUE, oCreature); +} +void ai_ChangeEventScriptsForMonster(object oCreature) +{ + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + if(sScript == "0e_c2_1_hb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_c2_default1"); + //********** On Perception ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); + if(sScript == "0e_c2_2_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_c2_default2"); + //********** On End Combat Round ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + if(sScript == "0e_c2_3_endround") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_c2_default3"); + //********** On Dialogue ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + if(sScript == "0e_c2_4_convers") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_c2_default4"); + //********** On Melee Attacked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + if(sScript == "0e_c2_5_phyatked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_c2_default5"); + //********** On Damaged ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + if(sScript == "0e_c2_6_damaged") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_c2_default6"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "nw_c2_deafult7"); + //********** On Disturbed ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + if(sScript == "0e_c2_8_disturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_c2_default8"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_c2_defaulta"); + //********** On Spell Cast At ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + if(sScript == "0e_c2_b_castat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_c2_defaultb"); + //********** On Blocked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + if(sScript == "0e_c2_e_blocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_c2_defaulte"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "nw_c2_defaulte"); +} +void ai_ChangeEventScriptsForAssociate(object oCreature) +{ + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_ch_ac1"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_ch_ac2"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_ch_ac3"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_ch_ac4"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_ch_ac5"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_ch_ac6"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "nw_ch_ac7"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_ch_ac8"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_ch_aca"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_ch_acb"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_ch_ace"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "nw_ch_acd"); +} diff --git a/_module/nss/0i_nui.nss b/_module/nss/0i_nui.nss new file mode 100644 index 00000000..eab5ee7c --- /dev/null +++ b/_module/nss/0i_nui.nss @@ -0,0 +1,434 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_nui +//////////////////////////////////////////////////////////////////////////////// + Include script for handling window displays. + + Use the following to get/set window information. + string sBind = NuiGetNthBind (oPlayer, nToken, FALSE, #); + json jMenuInfo = NuiGetBind (oPlayer, nToken, sBind); + # Gets json information for window : + 0 - string - "window_title" + 1 - json - "window_geometry" : "h", "w", "x", "y" + 2 - bool - "window_resizable" + 3 - bool - "window_closable" + 4 - bool - "window_transparent" + 5 - bool - "window_border" + + Layout pixel sizes: + Pixel height Title bar 33. + Pixel height Top border 10, between widgets 8, bottom border 10. + Pixel width Left border 10, between widgets 4, right border 10. + + Group outer lines add 12 to the vertical and horizontal lines. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +#include "nw_inc_nui" +struct stComboBox +{ + json jIndex; + json jCombo; + json jRow; + json jResRefArray; + json jWinArray; + json jCanSummon; // Index of all the summons in summons.2da +}; + +// Saves the menu to the campaign database. +void SaveMenuToCampaignDb(object oPC, int nToken, string sWndId); +// Returns the middle of the screen for the x position. +// oPC using the menu. +// fMenuWidth - the width of the menu to display. +float GetGUIWidthMiddle(object oPC, float fMenuWidth); + +// Returns the middle of the screen for the y position. +// oPC using the menu. +// fMenuHeight - the height of the menu to display. +float GetGUIHeightMiddle(object oPC, float fMenuHeight); + +// Checks to see if sWndId is open. +// If the window is open it removes it and returns FALSE +// If the window is closed it returns TRUE +int IsWindowClosed(object oPC, string sWndId); + +// Returns the Window ID (nToken). +// oPC is the PC using the menu. +// jLayout is the Layout of the menu. +// sWinID is the string ID for this window. +// sTitle is the Title of the menu. +// fX is the X position of the menu (-1.0: Centers, -2.0: UpperRight on Mouse, -3.0: Centers top of mouse). +// fY is the Y position of the menu (-1.0: Centers, -2.0: UpperRight on Mouse, -3.0: Centers top of mouse). +// fWidth is the width of the menu. +// fHeight is the height of the menu. +// bResize - TRUE will all it to be resized. +// bCollapse - TRUE will allow the window to be collapsable. +// bClose - TRUE will allow the window to be closed. +// bTransparent - TRUE makes the menu transparent. +// bBorder - TRUE makes the menu have a border. +// sEventScript will fire this event script for this window. +int SetWindow(object oPC, json jLayout, string sWinID, string sTitle, float fX, float fY, float fWidth, float fHeight, int bResize, int bCollapse, int bClose, int bTransparent, int bBorder, string sEventScript = ""); + +// Creates a label element in jRow. +// jRow is the row the label goes into. +// sLabel is the text placed in the label. +// If "" is passed then it will create a bind of sId + "_label". +// fWidth is the width of the label. +// fHeight is the Height of the label. +// nHAlign is horizonal align [NUI_HALING_*]. +// nVAlign is vertial align [NUI_VALING_*]. +// sId is the bind the event uses sId + "_event". +// sTooltip is the tooltip bind value. +json CreateLabel(json jRow, string sLabel, string sId, float fWidth, float fHeight, int nHAlign = 0, int nVAlign = 0, float fMargin = -1.0, string sTooltip = ""); + +// Creates a basic button element in jRow. +// jRow is the row the label goes into. +// sLabel is the text placed in the button. If "" is passed then it will +// create a bind of sId + "_label". +// sId is the binds for the button and the event uses sId + "_event". +// fWidth is the width of the button. +// fHeight is the Height of the button. +// fMargin is the space around the button. +// sTooltip is the tooltip bind value. +json CreateButton(json jRow, string sLabel, string sId, float fWidth, float fHeight, float fMargin = -1.0, string sTooltip = ""); + +// Creates a basic button select element in jRow. +// jRow is the row the label goes into. +// sLabel is the text placed in the button. If "" is passed then it will +// create a bind of sId + "_label". +// sId is the binds for the button and the event uses sId + "_event". +// fWidth is the width of the button. +// fHeight is the Height of the button. +// sTooltip is the tooltip bind value. +json CreateButtonSelect(json jRow, string sLabel, string sId, float fWidth, float fHeight, string sToolTip = ""); + +// Creates a button element with an image in jRow. +// jRow is the row the label goes into. +// sImage is the resref of the image to use. +// If "" is passed then it will create a bind of sId + "_image". +// sId is the binds for the button and the event uses sId + "_event". +// fWidth is the width of the button. +// fHeight is the Height of the button. +// fMargin is the space around the button. +// sTooltip is the tooltip bind value. +json CreateButtonImage(json jRow, string sResRef, string sId, float fWidth, float fHeight, float fMargin = -1.0, string sTooltip = ""); + +// Creates a basic text box that is not editable element in jRow. +// jRow is the row the TextEdit box goes into. +// sId is the bind variable so we can change the text. +// fWidth the width of the box. +// fHeight the height of the box. +// bBorder will add border TRUE or remove it FALSE. +// nScroll use NUI_SCROLLBARS_* +// sTooltip is the tooltip bind value. +json CreateTextBox(json jRow, string sId, float fWidth, float fHeight, int bBorder = TRUE, int nScroll = NUI_SCROLLBARS_AUTO, string sTooltip = ""); + +// Creates a basic text edit box element in jRow. +// jRow is the row the TextEdit box goes into. +// sPlaceHolderBind is the bind for Placeholder. +// sValueBind is the bind variable so we can change the text. +// nMaxLength is the maximum lenght of the text (1 - 65535) +// bMultiline - True or False that is has multiple lines. +// fWidth the width of the box. +// fHeight the height of the box. +// sTooltip is the tooltip bind value. +json CreateTextEditBox(json jRow, string sPlaceHolderBind, string sValueBind, int nMaxLength, int bMultiline, float fWidth, float fHeight, string sToolTip = ""); + +// Creates a combo box element in jRow. +// jRow is the row the combo goes into. +// jCombo is the elements/list for the combo box. Use NuiComboEntry to add. +// sId is the binds for the combo and the event uses sId + "_event" +// sId + "_selected" is the bind for the selection in the combo box. +// fWidth is the width of the combo. +// fHeight is the Height of the combo. +// sTooltip is the tooltip bind value. +json CreateCombo(json jRow, json jCombo, string sId, float fWidth, float fHeight, string sToolTip = ""); + +// Creates an image element in jRow. +// jRow is the row the Image goes into. +// sImage is the resref of the image to use. If "" is passed then it will +// create a bind of sId + "_image". +// nAspect is the aspect of the image NUI_ASPECT_*. +// nHAlign is the horizontal alignment of the image NUI_HALIGN_*. +// nVAlign is the vertical alignment of the image NUI_VALIGN_*. +// fWidth the width of the box. +// fHeight the height of the box. +// sTooltip is the tooltip bind value. +json CreateImage(json jRow, string sResRef, string sId, int nAspect, int nHAlign, int nVAlign, float fWidth, float fHeight, float fMargin = -1.0, string sToolTip = ""); + +// Creates a check box element in jRow. +// jRow is the row the Checkbox box goes into. +// sLabel is the text placed in the label. +// If "" is passed then it will create a bind of sId + "_label". +// sId is the bind variable so we can change the text. +// sId + "_check" is the Bind:bool for if it is checked or not. +// fWidth is the width of the label. +// fHeight is the Height of the label. +// sTooltip is the tooltip bind value. +json CreateCheckBox(json jRow, string sLabel, string sId, float fWidth, float fHeight, string sToolTip = ""); + +// Creates a slider (Int based) element in jRow +// jRow is the row the Check box goes into. +// sId is the bind name. +// The binds are as follows. +// Value: sId + "_value" +// Minimum: sId + "_min" +// Maximum: sId + "_max" +// Step size: sId + "_stepsize" +// fWidth is the width of the slider. +// fHeight is the Height of the slider. +// sTooltip is the tooltip bind value. +json CreateSlider(json jRow, string sId, float fWidth, float fHeight, string sToolTip = ""); + +// Creates an Options element in jRow. +// jRow is the row the Options will start on. +// sId is the bind name. +// The binds are as follows: +// Value: sId + "_value" +// Event is sId + "_event" +// nDirection: NUI_DIRECTION_* +// fWidth is the width of the options labels. +// fHeight is the height of the options labels. +// sTooltip is the tooltip bind value. +json CreateOptions(json jRow, string sId, int nDirection, json jLabels, float fWidth, float fHeight, string sToolTip = ""); + +// Creates a list element in jRow. +// jRow is the row the list will start on. +// jElements is the list of elements in the list. Use NuiListTemplateCell to add. +// sId is the bind name. +// The binds are Event is sId + "_event". +// Row count is bound to sId + "_count". +// fRowHeight is the height of the rendered rows. +// fWidth is the width of the options labels. +// fHeight is the height of the options labels. +// sTooltip is the tooltip bind value. +json CreateList(json jRow, json jElements, string sId, float fRowHeight, float fWidth, float fHeight, string sTooltip = ""); + +// Placed here temporarily until we can clean up our includes! +void ai_SetDMWAccessButton(int nButton, int bOn = TRUE); +int ai_GetDMWAccessButton(int nButton); +void ai_SetDMAIAccessButton(int nButton, int bOn = TRUE); +int ai_GetDMAIAccessButton(int nButton); + +void SaveMenuToCampaignDb(object oPC, int nToken, string sWndId) +{ + json jGeometry = NuiGetBind(oPC, nToken, "window_geometry"); + float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); + float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); + string sName = ai_RemoveIllegalCharacters(GetName(oPC)); + json jLocations = ai_GetCampaignDbJson("locations", sName, AI_DM_TABLE); + json jNUI = JsonObjectGet(jLocations, sWndId); + if(JsonGetType(jNUI) == JSON_TYPE_NULL) jNUI = JsonObject(); + jNUI = JsonObjectSet(jNUI, "x", JsonFloat(fX)); + jNUI = JsonObjectSet(jNUI, "y", JsonFloat(fY)); + jLocations = JsonObjectSet(jLocations, sWndId, jNUI); + ai_SetCampaignDbJson("locations", jLocations, sName, AI_DM_TABLE); +} + +float GetGUIWidthMiddle(object oPC, float fMenuWidth) +{ + // Get players window information. + float fGUI_Width = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_WIDTH)); + float fGUI_Scale = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0; + fMenuWidth = fMenuWidth * fGUI_Scale; + return (fGUI_Width / 2.0) - (fMenuWidth / 2.0); +} +float GetGUIHeightMiddle(object oPC, float fMenuHeight) +{ + // Get players window information. + float fGUI_Height = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_HEIGHT)); + float fGUI_Scale = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0; + fMenuHeight = fMenuHeight * fGUI_Scale; + return (fGUI_Height / 2.0) - (fMenuHeight / 2.0); +} +int IsWindowClosed(object oPC, string sWndId) +{ + int nToken = NuiFindWindow(oPC, sWndId); + if(nToken) + { + NuiDestroy(oPC, nToken); + return FALSE; + } + return TRUE; +} +int SetWindow(object oPC, json jLayout, string sWinID, string sTitle, float fX, float fY, float fWidth, float fHeight, int bResize, int bCollapse, int bClose, int bTransparent, int bBorder, string sEventScript = "") +{ + json jWindow; + if (bCollapse) jWindow = NuiWindow (jLayout, NuiBind ("window_title"), NuiBind ("window_geometry"), + NuiBind ("window_resizable"), JsonNull (), NuiBind ("window_closable"), + NuiBind ("window_transparent"), NuiBind ("window_border")); + + else jWindow = NuiWindow (jLayout, NuiBind ("window_title"), NuiBind ("window_geometry"), + NuiBind ("window_resizable"), JsonBool (FALSE), NuiBind ("window_closable"), + NuiBind ("window_transparent"), NuiBind ("window_border")); + + int nToken = NuiCreate (oPC, jWindow, sWinID, sEventScript); + if(!bCollapse && !bClose && !bBorder) NuiSetBind (oPC, nToken, "window_title", JsonBool (FALSE)); + else NuiSetBind (oPC, nToken, "window_title", JsonString (sTitle)); + if (fX == -1.0) fX = GetGUIWidthMiddle (oPC, fWidth); + if (fY == -1.0) fY = GetGUIHeightMiddle (oPC, fHeight); + int nScale = GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE); + if(nScale != 100) + { + fHeight = fHeight * (IntToFloat(1050 - nScale) / 1000.0); + fWidth = fWidth * (IntToFloat(1200 - nScale) / 1000.0); + } + NuiSetBind (oPC, nToken, "window_geometry", NuiRect (fX, + fY, fWidth, fHeight)); + NuiSetBind (oPC, nToken, "window_resizable", JsonBool (bResize)); + NuiSetBind (oPC, nToken, "window_closable", JsonBool (bClose)); + NuiSetBind (oPC, nToken, "window_transparent", JsonBool (bTransparent)); + NuiSetBind (oPC, nToken, "window_border", JsonBool (bBorder)); + return nToken; +} +json CreateLabel(json jRow, string sLabel, string sId, float fWidth, float fHeight, int nHAlign = 0, int nVAlign = 0, float fMargin = -1.0, string sTooltip = "") +{ + json jLabel; + if(sLabel == "") jLabel = NuiId(NuiLabel(NuiBind(sId + "_label"), JsonInt(nHAlign), JsonInt(nVAlign)), sId); + else jLabel = NuiId(NuiLabel(JsonString(sLabel), JsonInt(nHAlign), JsonInt(nVAlign)), sId); + jLabel = NuiWidth(jLabel, fWidth); + jLabel = NuiHeight(jLabel, fHeight); + if (fMargin > -1.0) jLabel = NuiMargin(jLabel, fMargin); + if(sTooltip != "") jLabel = NuiTooltip (jLabel, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jLabel); +} +json CreateButton(json jRow, string sLabel, string sId, float fWidth, float fHeight, float fMargin = -1.0, string sTooltip = "") +{ + json jButton; + if(sLabel == "") jButton = NuiEnabled(NuiId(NuiButton(NuiBind (sId + "_label")), sId), NuiBind(sId + "_event")); + else jButton = NuiEnabled(NuiId(NuiButton(JsonString(sLabel)), sId), NuiBind(sId + "_event")); + jButton = NuiWidth(jButton, fWidth); + jButton = NuiHeight(jButton, fHeight); + if (fMargin > -1.0) jButton = NuiMargin(jButton, fMargin); + if (sTooltip != "") jButton = NuiTooltip(jButton, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jButton); +} +json CreateButtonSelect(json jRow, string sLabel, string sId, float fWidth, float fHeight, string sTooltip = "") +{ + json jButton; + if(sLabel == "") jButton = NuiEnabled(NuiId(NuiButtonSelect(NuiBind (sId + "_label"), NuiBind(sId)), sId), NuiBind(sId + "_event")); + else jButton = NuiEnabled(NuiId(NuiButtonSelect(JsonString(sLabel), NuiBind(sId)), sId), NuiBind(sId + "_event")); + jButton = NuiWidth(jButton, fWidth); + jButton = NuiHeight(jButton, fHeight); + if(sTooltip != "") jButton = NuiTooltip(jButton, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jButton); +} +json CreateButtonImage(json jRow, string sResRef, string sId, float fWidth, float fHeight, float fMargin = -1.0, string sTooltip = "") +{ + json jButton; + if(sResRef == "") jButton = NuiEnabled(NuiId (NuiButtonImage(NuiBind(sId + "_image")), sId), NuiBind(sId + "_event")); + else jButton = NuiEnabled(NuiId(NuiButtonImage(JsonString(sResRef)), sId), NuiBind(sId + "_event")); + jButton = NuiWidth(jButton, fWidth); + jButton = NuiHeight(jButton, fHeight); + if(fMargin > -1.0) jButton = NuiMargin(jButton, fMargin); + if(sTooltip != "") jButton = NuiTooltip(jButton, NuiBind (sTooltip)); + jButton = NuiEncouraged(jButton, NuiBind(sId + "_encouraged")); + return JsonArrayInsert(jRow, jButton); +} +json CreateTextBox(json jRow, string sId, float fWidth, float fHeight, int bBorder = TRUE, int nScroll = NUI_SCROLLBARS_AUTO, string sTooltip = "") +{ + json jTextBox = NuiEnabled(NuiText(NuiBind(sId), bBorder, nScroll), NuiBind(sId + "_event")); + jTextBox = NuiWidth(jTextBox, fWidth); + jTextBox = NuiHeight(jTextBox, fHeight); + if(sTooltip != "") jTextBox = NuiTooltip(jTextBox, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, JsonObjectSet(jTextBox, "text_color", NuiColor (255, 0, 0))); +} +json CreateTextEditBox(json jRow, string sPlaceHolderBind, string sValueBind, int nMaxLength, int bMultiline, float fWidth, float fHeight, string sTooltip = "") +{ + json jObject = NuiEnabled(NuiTextEdit(NuiBind(sPlaceHolderBind), NuiBind(sValueBind), nMaxLength, bMultiline), NuiBind(sValueBind + "_event")); + jObject = NuiWidth(jObject, fWidth); + jObject = NuiHeight(jObject, fHeight); + if(sTooltip != "") jObject = NuiTooltip(jObject, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jObject); +} +json CreateCombo(json jRow, json jList, string sId, float fWidth, float fHeight, string sTooltip = "") +{ + json jCombo; + if(JsonGetType(jList) == JSON_TYPE_NULL) + { + jCombo = NuiId(NuiCombo(NuiBind(sId + "_list"), NuiBind(sId + "_selected")), sId + "_event"); + } + jCombo = NuiId(NuiCombo(jList, NuiBind (sId + "_selected")), sId); + jCombo = NuiEnabled(jCombo, NuiBind (sId + "_event")); + jCombo = NuiWidth(jCombo, fWidth); + jCombo = NuiHeight(jCombo, fHeight); + if(sTooltip != "") jCombo = NuiTooltip(jCombo, NuiBind(sTooltip)); + return JsonArrayInsert(jRow, jCombo); +} +json CreateImage(json jRow, string sResRef, string sId, int nAspect, int nHAlign, int nVAlign, float fWidth, float fHeight, float fMargin = -1.0, string sTooltip = "") +{ + json jImage; + if(sResRef == "") jImage = NuiEnabled(NuiId(NuiImage(NuiBind(sId + "_image"), JsonInt(nAspect), JsonInt(nHAlign), JsonInt(nVAlign)), sId), NuiBind(sId + "_event")); + else jImage = NuiEnabled(NuiId(NuiImage(JsonString(sResRef), JsonInt(nAspect), JsonInt(nHAlign), JsonInt(nVAlign)), sId), NuiBind(sId + "_event")); + jImage = NuiWidth(jImage, fWidth); + jImage = NuiHeight(jImage, fHeight); + if (fMargin > -1.0) jImage = NuiMargin(jImage, fMargin); + if(sTooltip != "") jImage = NuiTooltip(jImage, NuiBind(sTooltip)); + return JsonArrayInsert(jRow, jImage); +} +json CreateCheckBox(json jRow, string sLabel, string sId, float fWidth, float fHeight, string sTooltip = "") +{ + json jCheckBox; + if(sLabel == "") jCheckBox = NuiEnabled(NuiId(NuiCheck(NuiBind(sId + "_label"), NuiBind(sId + "_check")), sId), NuiBind(sId + "_event")); + else jCheckBox = NuiEnabled(NuiId(NuiCheck(JsonString(sLabel), NuiBind(sId + "_check")), sId), NuiBind(sId + "_event")); + jCheckBox = NuiWidth(jCheckBox, fWidth); + jCheckBox = NuiHeight(jCheckBox, fHeight); + if (sTooltip != "") jCheckBox = NuiTooltip (jCheckBox, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jCheckBox); +} +json CreateSlider(json jRow, string sId, float fWidth, float fHeight, string sTooltip = "") +{ + json jSlider; + jSlider = NuiEnabled(NuiId(NuiSlider(NuiBind(sId + "_value"), NuiBind(sId + "_min"), NuiBind(sId + "_max"), NuiBind(sId + "_stepsize")), sId), NuiBind(sId + "_event")); + jSlider = NuiWidth(jSlider, fWidth); + jSlider = NuiHeight(jSlider, fHeight); + if(sTooltip != "") jSlider = NuiTooltip(jSlider, NuiBind(sTooltip)); + return JsonArrayInsert(jRow, jSlider); +} +json CreateOptions(json jRow, string sId, int nDirection, json jLabels, float fWidth, float fHeight, string sTooltip = "") +{ + json jOption; + jOption = NuiEnabled(NuiId(NuiOptions(nDirection, jLabels, NuiBind(sId + "_value")), sId), NuiBind(sId + "_event")); + jOption = NuiWidth(jOption, fWidth); + jOption = NuiHeight(jOption, fHeight); + if(sTooltip != "") jOption = NuiTooltip (jOption, NuiBind (sTooltip)); + return JsonArrayInsert(jRow, jOption); +} +json CreateList(json jRow, json jElements, string sId, float fRowHeight, float fWidth, float fHeight, string sTooltip = "") +{ + json jList; + jList = NuiId(NuiList(jElements, NuiBind(sId), fRowHeight), sId + "_id"); + jList = NuiWidth(jList, fWidth); + jList = NuiHeight(jList, fHeight); + if (sTooltip != "") jList = NuiTooltip(jList, NuiBind(sTooltip)); + return JsonArrayInsert(jRow, jList); +} +void ai_SetDMWAccessButton(int nButton, int bOn = TRUE) +{ + json jRules = ai_GetCampaignDbJson("rules"); + int nWidgetButtons = JsonGetInt(JsonObjectGet(jRules, sDMWidgetAccessVarname)); + if(bOn) nWidgetButtons = nWidgetButtons | nButton; + else nWidgetButtons = nWidgetButtons & ~nButton; + SetLocalInt(GetModule(), sDMWidgetAccessVarname, nWidgetButtons); + jRules = JsonObjectSet(jRules, sDMWidgetAccessVarname, JsonInt(nWidgetButtons)); + ai_SetCampaignDbJson("rules", jRules); +} +int ai_GetDMWAccessButton(int nButton) +{ + int nWidgetButtons = GetLocalInt(GetModule(), sDMWidgetAccessVarname); + return nWidgetButtons & nButton; +} +void ai_SetDMAIAccessButton(int nButton, int bOn = TRUE) +{ + json jRules = ai_GetCampaignDbJson("rules"); + int nWidgetButtons = JsonGetInt(JsonObjectGet(jRules, sDMAIAccessVarname)); + if(bOn) nWidgetButtons = nWidgetButtons | nButton; + else nWidgetButtons = nWidgetButtons & ~nButton; + SetLocalInt(GetModule(), sDMAIAccessVarname, nWidgetButtons); + jRules = JsonObjectSet(jRules, sDMAIAccessVarname, JsonInt(nWidgetButtons)); + ai_SetCampaignDbJson("rules", jRules); +} +int ai_GetDMAIAccessButton(int nButton) +{ + int nWidgetButtons = GetLocalInt(GetModule(), sDMAIAccessVarname); + return nWidgetButtons & nButton; +} + diff --git a/_module/nss/0i_player_target.nss b/_module/nss/0i_player_target.nss new file mode 100644 index 00000000..bed48348 --- /dev/null +++ b/_module/nss/0i_player_target.nss @@ -0,0 +1,793 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_player_target +//////////////////////////////////////////////////////////////////////////////// + Include script for handling player targeting functions. + +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +#include "0i_menus" +// Setup an AI OnPlayerTarget Event script while allowing any module onplayer +// target event script to still work. +void ai_SetupPlayerTarget(object oCreature); +// Selects a target for oAssocite to follow. +void ai_AllSelectTarget(object oPC, object oAssociate, object oTarget); +// Removes the Cutscene ghosts and variables from all associates. For original AI scripts. +void ai_OriginalRemoveAllActionMode(object oPC); +// Removes the Cutscene ghosts and Command mode from all associates. +void ai_RemoveAllActionMode(object oPC); +// Once a trap has been selected from the associates inventory move to placing the trap. +void ai_SelectTrap(object oPC, object oAssociate, object oItem); +// Place the selected trap at the location selected by the player for OBJECT_SELF. +void ai_PlaceTrap(object oPC, location lLocation); +// Adds a creature to nGroup for oDM +void ai_AddToGroup(object oDM, object oTarget, string sTargetMode); +// Has nGroup perform an action based on the selected target or location. +void ai_DMAction(object oDM, object oTarget, location lLocation, string sTargetMode); +// Get oPC to select a spell target for oAssociate. +void ai_SelectWidgetSpellTarget(object oPC, object oAssociate, string sElem); +// Updates oAssociates widget by destroying the current one and rebuilding. +void ai_UpdateAssociateWidget(object oPC, object oAssociate); +// Sets oAssociates action mode for nFeat from the quick widget menu +int ai_SetActionMode(object oAssociate, int nFeat); + +void ai_SetupPlayerTarget(object oCreature) +{ + object oModule = GetModule(); + string sModuleTargetEvent = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_TARGET); + if(sModuleTargetEvent != "") + { + if(sModuleTargetEvent != "0e_player_target") SetLocalString(oModule, AI_MODULE_TARGET_EVENT, sModuleTargetEvent); + } + SetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_TARGET, "0e_player_target"); +} +void ai_OriginalActionAssociate(object oPC, object oTarget, location lLocation) +{ + object oAssociate = OBJECT_SELF; + if(!GetLocalInt(oAssociate, sGhostModeVarname) && GetLocalInt(oPC, sGhostModeVarname)) + { + effect eGhost = EffectCutsceneGhost(); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oAssociate); + SetLocalInt(oAssociate, sGhostModeVarname, TRUE); + } + int nObjectType = GetObjectType(oTarget); + ai_ClearCreatureActions(TRUE); + if(oTarget == GetArea(oPC)) + { + ActionMoveToLocation(lLocation, TRUE); + if(GetLocalObject(oPC, AI_FOLLOW_TARGET) == oAssociate) + { + float fFollowDistance = 3.0; + AssignCommand(oPC, ai_ClearCreatureActions()); + AssignCommand(oPC, ActionForceFollowObject(oAssociate, fFollowDistance)); + } + } + else if(nObjectType == OBJECT_TYPE_CREATURE) + { + if(oTarget != GetLocalObject(oPC, AI_TARGET_ASSOCIATE)) + { + if(GetMaster(oTarget) == oPC) + { + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_ACTION"); + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oTarget); + ai_SendMessages(GetName(oTarget) + " is now in Action Mode.", AI_COLOR_YELLOW, oPC); + } + else ActionMoveToObject(oTarget, TRUE); + } + } + else if(nObjectType == OBJECT_TYPE_DOOR) + { + if(GetIsTrapped(oTarget) && GetAssociateState(NW_ASC_DISARM_TRAPS, oAssociate)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) + { + bkAttemptToDisarmTrap(oTarget); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + } + if(GetLocked(oTarget)) bkAttemptToOpenLock(oTarget); + if(GetIsOpen(oTarget)) + { + ActionCloseDoor(oTarget, TRUE); + } + else ActionOpenDoor(oTarget, TRUE); + } + else if(nObjectType == OBJECT_TYPE_ITEM) + { + ActionPickUpItem(oTarget); + } + else if(nObjectType == OBJECT_TYPE_PLACEABLE) + { + ActionMoveToObject(oTarget, TRUE); + if(GetHasInventory(oTarget)) + { + if(GetIsTrapped(oTarget) && GetAssociateState(NW_ASC_RETRY_OPEN_LOCKS, oAssociate)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) + { + bkAttemptToDisarmTrap(oTarget); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + if(GetLocked(oTarget)) + { + if(GetAssociateState(NW_ASC_RETRY_OPEN_LOCKS, oAssociate)) + { + bkAttemptToOpenLock(oTarget); + } + else AssignCommand(oAssociate, ai_HaveCreatureSpeak(oAssociate, 0, "This " + GetName(oTarget) + " is locked!")); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE); + } + else if(GetLocked(oTarget)) + { + if(GetAssociateState(NW_ASC_RETRY_OPEN_LOCKS, oAssociate)) + { + bkAttemptToOpenLock(oTarget); + } + else AssignCommand(oAssociate, ai_HaveCreatureSpeak(oAssociate, 0, "This " + GetName(oTarget) + " is locked!")); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE); + } + DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE); + } + else if(nObjectType == OBJECT_TYPE_TRIGGER) + { + if(GetIsTrapped(oTarget) && GetAssociateState(NW_ASC_RETRY_OPEN_LOCKS, oAssociate)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) bkAttemptToDisarmTrap(oTarget); + } + } + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_OriginalActionAllAssociates(object oPC, object oTarget, location lLocation) +{ + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_OriginalActionAssociate(oPC, oTarget, lLocation)); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_OriginalActionAssociate(oPC, oTarget, lLocation)); + } +} +void ai_ActionAssociate(object oPC, object oTarget, location lLocation) +{ + object oAssociate = OBJECT_SELF; + if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST) && + !ai_GetAIMode(oAssociate, AI_MODE_GHOST) && + !GetLocalInt(oAssociate, sGhostModeVarname)) + { + effect eGhost = EffectCutsceneGhost(); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oAssociate); + SetLocalInt(oAssociate, sGhostModeVarname, TRUE); + } + int nObjectType = GetObjectType(oTarget); + ai_SetAIMode(oAssociate, AI_MODE_COMMANDED, TRUE); + ai_ClearCreatureActions(TRUE); + if(oTarget == GetArea(oPC)) + { + ActionMoveToLocation(lLocation, TRUE); + if(GetLocalObject(oPC, AI_FOLLOW_TARGET) == oAssociate) + { + float fFollowDistance = ai_GetFollowDistance(oPC); + if(GetDistanceBetween(oAssociate, oPC) <= fFollowDistance) + { + DelayCommand(fFollowDistance, AssignCommand(oPC, ActionMoveToObject(oAssociate, TRUE, fFollowDistance))); + } + else AssignCommand(oPC, ActionMoveToObject(oAssociate, TRUE, fFollowDistance)); + } + } + else if(nObjectType == OBJECT_TYPE_CREATURE) + { + if(GetIsDead(oTarget)) + { + AssignCommand(oAssociate, ActionDoCommand(ai_SearchObject(oAssociate, oTarget, oPC, TRUE))); + } + else if(GetIsEnemy(oTarget, oAssociate)) + { + // Lock them into attacking this target only. + SetLocalObject(oAssociate, AI_PC_LOCKED_TARGET, oTarget); + // This resets a henchmens failed Moral save in combat. + if(GetLocalString(oAssociate, AI_COMBAT_SCRIPT) == "ai_coward") + { + SetLocalString(oAssociate, AI_COMBAT_SCRIPT, GetLocalString(oAssociate, AI_DEFAULT_SCRIPT)); + } + if(ai_GetIsInCombat(oAssociate)) ai_DoAssociateCombatRound(oAssociate, oTarget); + else + { + ai_HaveCreatureSpeak(oAssociate, 5, ":0:1:2:3:6:"); + ai_StartAssociateCombat(oAssociate, oTarget); + } + ai_SendMessages(GetName(oAssociate) + " is attacking " + GetName(oTarget), AI_COLOR_RED, oPC); + } + else + { + ActionMoveToObject(oTarget, TRUE); + // Player will be stuck with this variable if they are not using the AI. + DeleteLocalInt(oTarget, "AI_I_AM_BEING_HEALED"); + ActionDoCommand(ai_ActionTryHealing(oAssociate, oTarget)); + } + } + else if(nObjectType == OBJECT_TYPE_DOOR) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) + { + int bStopAction = !GetLocalInt(oTarget, "AI_CANNOT_TRAP_" + GetTag(oAssociate)); + if(ai_ReactToTrap(oAssociate, oTarget, TRUE)) bStopAction = TRUE; + if(bStopAction) + { + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + } + } + if(GetLocked(oTarget)) ai_AttemptToByPassLock(oAssociate, oTarget, TRUE); + else if(GetIsOpen(oTarget)) ActionCloseDoor(oTarget, TRUE); + else ActionOpenDoor(oTarget, TRUE); + } + else if(nObjectType == OBJECT_TYPE_ITEM) + { + ActionPickUpItem(oTarget); + } + else if(nObjectType == OBJECT_TYPE_PLACEABLE) + { + ActionMoveToObject(oTarget, TRUE); + if(GetHasInventory(oTarget)) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) + { + if(ai_ReactToTrap(oAssociate, oTarget, TRUE)) + { + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + + } + } + if(GetLocked(oTarget)) ai_AttemptToByPassLock(oAssociate, oTarget, TRUE); + else ActionDoCommand(ai_SearchObject(oAssociate, oTarget, oPC, TRUE)); + } + else + { + if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) + { + AssignCommand(oAssociate, ai_ClearCreatureActions()); + // Check to make sure we are using a melee weapon. + if(ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oAssociate)) || + ai_EquipBestMeleeWeapon(oAssociate)) + { + AssignCommand(oAssociate, ActionWait(1.0)); + AssignCommand(oAssociate, ActionAttack(oTarget)); + } + } + else AssignCommand(oAssociate, DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE)); + } + } + else if(nObjectType == OBJECT_TYPE_TRIGGER) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oPC)) SetTrapDetectedBy(oTarget, oAssociate); + if(GetTrapDetectedBy(oTarget, oAssociate)) ai_ReactToTrap(oAssociate, oTarget, TRUE); + } + } + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_ActionAllAssociates(object oPC, object oTarget, location lLocation) +{ + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_ActionAssociate(oPC, oTarget, lLocation)); + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, ai_ActionAssociate(oPC, oTarget, lLocation)); + } +} +void ai_SelectFollowTarget(object oPC, object oAssociate, object oTarget) +{ + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + int nToken = NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI); + float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); + string sRange = FloatToString(fRange, 0, 0); + if(oAssociate == oTarget) + { + ai_SetAIMode(oAssociate, AI_MODE_FOLLOW, FALSE); + DeleteLocalObject(oAssociate, AI_FOLLOW_TARGET); + string sTarget; + if(ai_GetIsCharacter(oAssociate)) + { + sTarget = "nobody"; + ai_SendMessages(GetName(oAssociate) + " is not following anyone now!", AI_COLOR_YELLOW, oPC); + } + else + { + sTarget = GetName(oPC); + ai_SendMessages(GetName(oAssociate) + " is now following " + sTarget + "!", AI_COLOR_YELLOW, oPC); + } + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_follow_target_tooltip", " " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]"); + } + else + { + ai_SetAIMode(oAssociate, AI_MODE_FOLLOW, TRUE); + SetLocalObject(oAssociate, AI_FOLLOW_TARGET, oTarget); + ai_SendMessages(GetName(oAssociate) + " is now following " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + AssignCommand(oAssociate, ActionMoveToObject(oTarget, TRUE, ai_GetFollowDistance(oAssociate))); + ai_UpdateToolTipUI(oPC, sAssociateType + AI_COMMAND_NUI, sAssociateType + AI_WIDGET_NUI, "btn_follow_target_tooltip", " " + GetName(oAssociate) + " following " + GetName(oTarget) + " [" + sRange + " meters]"); + } + aiSaveAssociateModesToDb(oPC, oAssociate); +} +void ai_OriginalRemoveAllActionMode(object oPC) +{ + if(!ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST)) return; + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID && + !ai_GetAIMode(oAssociate, AI_MODE_GHOST) && + GetLocalInt(oAssociate, sGhostModeVarname)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID && + !ai_GetAIMode(oAssociate, AI_MODE_GHOST) && + GetLocalInt(oAssociate, sGhostModeVarname)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + } +} +void ai_RemoveAllActionMode(object oPC) +{ + object oAssociate; + int nIndex; + for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) + { + ai_SetAIMode(oAssociate, AI_MODE_COMMANDED, FALSE); + if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST) && + !ai_GetAIMode(oAssociate, AI_MODE_GHOST) && + GetLocalInt(oAssociate, sGhostModeVarname)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + ExecuteScript("nw_ch_ac1", oAssociate); + } + } + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) + { + ai_SetAIMode(oAssociate, AI_MODE_COMMANDED, FALSE); + if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST) && + !ai_GetAIMode(oAssociate, AI_MODE_GHOST) && + GetLocalInt(oAssociate, sGhostModeVarname)) + { + ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); + DeleteLocalInt(oAssociate, sGhostModeVarname); + } + ExecuteScript("nw_ch_ac1", oAssociate); + } + } +} +void ai_SelectTrap(object oPC, object oAssociate, object oItem) +{ + if(GetBaseItemType(oItem) != BASE_ITEM_TRAPKIT) + { + ai_SendMessages("A trap kit was not selected.", AI_COLOR_YELLOW, oPC); + return; + } + ai_SendMessages("Now select a location to place the trap.", AI_COLOR_YELLOW, oPC); + SetLocalObject(oAssociate, "AI_TRAP_KIT", oItem); + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_PLACE_TRAP"); + OpenInventory(oAssociate, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_TILE, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_PlaceTrap(object oPC, location lLocation) +{ + object oItem = GetLocalObject(OBJECT_SELF, "AI_TRAP_KIT"); + itemproperty ipTrap = GetFirstItemProperty(oItem); + if(GetItemPropertyType(ipTrap) == ITEM_PROPERTY_TRAP) + { + ActionUseItemAtLocation(oItem, ipTrap, lLocation); + } + else ai_SendMessages("This trap kit does not have a trap property!", AI_COLOR_YELLOW, oPC); +} +void ai_AddToGroup(object oDM, object oTarget, string sTargetMode) +{ + string sGroup = GetStringRight(sTargetMode, 1); + if(oDM == oTarget) + { + ai_SendMessages("Group " + sGroup + " has been cleared.", AI_COLOR_YELLOW, oDM); + string sText = "Group " + sGroup; + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText + " (Left Action/Right Add)")); + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_COMMAND_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText + " (Left Action/Right Add)")); + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_COMMAND_NUI), "btn_cmd_group" + sGroup + "_label", JsonString(sText)); + DeleteLocalJson(oDM, "DM_GROUP" + sGroup); + return; + } + string sName = GetName(oTarget); + json jGroup = GetLocalJson(oDM, "DM_GROUP" + sGroup); + if(JsonGetType(jGroup) == JSON_TYPE_NULL) + { + string sText = sName + "'s group"; + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_WIDGET_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText + " [Run]")); + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_COMMAND_NUI), "btn_cmd_group" + sGroup + "_tooltip", JsonString(sText + " [Run]")); + NuiSetBind(oDM, NuiFindWindow(oDM, "dm" + AI_COMMAND_NUI), "btn_cmd_group" + sGroup + "_label", JsonString(sText)); + jGroup = JsonArrayInsert(JsonArray(), JsonInt(1)); + } + string sUUID = GetObjectUUID(oTarget); + int nIndex = 1; + string sListUUID = JsonGetString(JsonArrayGet(jGroup, nIndex)); + while(sListUUID != "") + { + if(sListUUID == sUUID) + { + ai_SendMessages("This creature is already in the group!", AI_COLOR_RED, oDM); + return; + } + sListUUID = JsonGetString(JsonArrayGet(jGroup, ++nIndex)); + } + jGroup = JsonArrayInsert(jGroup, JsonString(sUUID)); + ai_SendMessages(sName + " has been saved to group" + sGroup, AI_COLOR_YELLOW, oDM); + SetLocalJson(oDM, "DM_GROUP" + sGroup, jGroup); + EnterTargetingMode(oDM, OBJECT_TYPE_CREATURE, MOUSECURSOR_PICKUP, MOUSECURSOR_PICKUP_DOWN); +} +void ai_MonsterAction(object oDM, object oTarget, location lLocation, int bRun, int nIndex) +{ + object oCreature = OBJECT_SELF; + int nObjectType = GetObjectType(oTarget); + ai_ClearCreatureActions(TRUE); + if(oTarget == GetArea(oDM)) + { + ActionMoveToLocation(lLocation, bRun); + } + else if(nObjectType == OBJECT_TYPE_CREATURE) + { + if(GetIsDead(oTarget)) return; + else if(GetIsEnemy(oTarget, oCreature)) + { + // Lock them into attacking this target only. + SetLocalObject(oCreature, AI_PC_LOCKED_TARGET, oTarget); + // This resets a creatures failed Moral save in combat. + if(GetLocalString(oCreature, AI_COMBAT_SCRIPT) == "ai_coward") + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, GetLocalString(oCreature, AI_DEFAULT_SCRIPT)); + } + if(ai_GetIsInCombat(oCreature)) ai_DoMonsterCombatRound(oCreature); + else + { + ai_HaveCreatureSpeak(oCreature, 5, ":0:1:2:3:6:"); + ai_StartMonsterCombat(oCreature); + } + if(nIndex == 1) + { + ai_SendMessages(GetName(oCreature) + "'s group is attacking " + GetName(oTarget), AI_COLOR_RED, oDM); + } + } + else if(oTarget == oDM) + { + if(GetLocalInt(oCreature, "AI_FOLLOWING_DM")) + { + ClearAllActions(FALSE, oCreature); + DeleteLocalInt(oCreature, "AI_FOLLOWING_DM"); + if(nIndex == 1) + { + ai_SendMessages(GetName(oCreature) + "'s group has stopped following you.", AI_COLOR_RED, oDM); + } + } + else + { + ActionForceFollowObject(oDM, 4.0); + SetLocalInt(oCreature, "AI_FOLLOWING_DM", TRUE); + if(nIndex == 1) + { + ai_SendMessages(GetName(oCreature) + "'s group is following you.", AI_COLOR_RED, oDM); + } + } + } + else + { + ActionMoveToObject(oTarget, TRUE); + // Player will be stuck with this variable if they are not using the AI. + DeleteLocalInt(oTarget, "AI_I_AM_BEING_HEALED"); + ActionDoCommand(ai_ActionTryHealing(oCreature, oTarget)); + if(nIndex == 1) + { + ai_SendMessages(GetName(oCreature) + "'s group is moving to and attempting to heal " + GetName(oTarget), AI_COLOR_RED, oDM); + } + } + } + else if(nObjectType == OBJECT_TYPE_DOOR) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oDM)) SetTrapDetectedBy(oTarget, oCreature); + if(GetTrapDetectedBy(oTarget, oCreature)) + { + ai_ReactToTrap(oCreature, oTarget, TRUE); + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + else if(GetLocked(oTarget)) ai_AttemptToByPassLock(oCreature, oTarget); + } + else if(GetLocked(oTarget)) ai_AttemptToByPassLock(oCreature, oTarget); + else if(GetIsOpen(oTarget)) + { + ActionCloseDoor(oTarget, TRUE); + } + else ActionOpenDoor(oTarget, TRUE); + } + else if(nObjectType == OBJECT_TYPE_ITEM) + { + ActionPickUpItem(oTarget); + } + else if(nObjectType == OBJECT_TYPE_PLACEABLE) + { + ActionMoveToObject(oTarget, TRUE); + if(GetHasInventory(oTarget)) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oDM)) SetTrapDetectedBy(oTarget, oCreature); + if(GetTrapDetectedBy(oTarget, oCreature)) + { + ai_ReactToTrap(oCreature, oTarget, TRUE); + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + if(GetLocked(oTarget)) + { + if(!ai_AttemptToByPassLock(oCreature, oTarget)) + { + AssignCommand(oCreature, ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oTarget) + " is locked!")); + } + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE); + } + else if(GetLocked(oTarget)) + { + if(ai_AttemptToByPassLock(oCreature, oTarget)) + { + AssignCommand(oCreature, ai_HaveCreatureSpeak(oCreature, 0, "This " + GetName(oTarget) + " is locked!")); + } + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); + return; + } + ActionDoCommand(ai_SearchObject(oCreature, oTarget, oDM, TRUE)); + } + DoPlaceableObjectAction(oTarget, PLACEABLE_ACTION_USE); + } + else if(nObjectType == OBJECT_TYPE_TRIGGER) + { + if(GetIsTrapped(oTarget)) + { + if(GetTrapDetectedBy(oTarget, oDM)) SetTrapDetectedBy(oTarget, oCreature); + if(GetTrapDetectedBy(oTarget, oCreature)) ai_ReactToTrap(oCreature, oTarget, TRUE); + } + } + EnterTargetingMode(oDM, OBJECT_TYPE_ALL, MOUSECURSOR_ACTION, MOUSECURSOR_NOWALK); +} +void ai_DMAction(object oDM, object oTarget, location lLocation, string sTargetMode) +{ + string sGroup = GetStringRight(sTargetMode, 1); + json jGroup = GetLocalJson(oDM, "DM_GROUP" + sGroup); + int bRun = JsonGetInt(JsonArrayGet(jGroup, 0)); + int nIndex = 1; + string sUUID = JsonGetString(JsonArrayGet(jGroup, nIndex)); + object oCreature; + while(sUUID != "") + { + oCreature = GetObjectByUUID(sUUID); + AssignCommand(oCreature, ai_MonsterAction(oDM, oTarget, lLocation, bRun, nIndex)); + sUUID = JsonGetString(JsonArrayGet(jGroup, ++nIndex)); + } + if(nIndex == 0) ai_SendMessages("Group" + sGroup + " is empty!", AI_COLOR_RED, oDM); +} +void ai_SelectWidgetSpellTarget(object oPC, object oAssociate, string sElem) +{ + int nIndex; + if(GetStringLength(sElem) == 13) nIndex = StringToInt(GetStringRight(sElem, 2)); + else nIndex = StringToInt(GetStringRight(sElem, 1)); + SetLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX", nIndex); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jSpell = JsonArrayGet(jWidget, nIndex); + int nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + int nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + if(nClass == -1) // This is an Item. + { + object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); + int nBaseItemType = GetBaseItemType(oItem); + if(Get2DAString("spells", "Range", nSpell) == "P" || // Self + nBaseItemType == BASE_ITEM_ENCHANTED_POTION || + nBaseItemType == BASE_ITEM_POTIONS) + { + int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(nIprpSubType == GetItemPropertySubType(ipProperty)) break; + ipProperty = GetNextItemProperty(oItem); + } + if(ai_GetIsInCombat(oAssociate)) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + AssignCommand(oAssociate, ActionUseItemOnObject(oItem, ipProperty, oAssociate)); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + return; + } + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_USE_ITEM"); + if(nSpell == SPELL_HEALINGKIT) + { + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_MAGIC, MOUSECURSOR_NOMAGIC); + return; + } + } + else // Feats, Spells, Special Abilities. + { + int nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); + if(nFeat) + { + if(!nSpell || Get2DAString("spells", "Range", nSpell) == "P" || // Self + nFeat == FEAT_SUMMON_FAMILIAR || nFeat == FEAT_ANIMAL_COMPANION || + nFeat == FEAT_TURN_UNDEAD) + { + if(ai_GetIsInCombat(oAssociate)) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + // Adjust the spell used for wild shape and other shape feats. + if(nFeat == FEAT_WILD_SHAPE) nSpell += 607; + if(nFeat == FEAT_ELEMENTAL_SHAPE) + { + if(nSpell == 397) nSpell == SUBFEAT_ELEMENTAL_SHAPE_FIRE; + else if(nSpell == 398) nSpell == SUBFEAT_ELEMENTAL_SHAPE_WATER; + else if(nSpell == 399) nSpell == SUBFEAT_ELEMENTAL_SHAPE_EARTH; + else if(nSpell == 400) nSpell == SUBFEAT_ELEMENTAL_SHAPE_AIR; + } + // Do special targeting for attack feats. + if(nFeat == FEAT_STUNNING_FIST || nFeat == FEAT_DIRTY_FIGHTING || + nFeat == FEAT_WHIRLWIND_ATTACK || nFeat == FEAT_QUIVERING_PALM || + nFeat == FEAT_KNOCKDOWN || nFeat == FEAT_IMPROVED_KNOCKDOWN || + nFeat == FEAT_SAP || nFeat == FEAT_KI_DAMAGE || + nFeat == FEAT_DISARM || nFeat == FEAT_IMPROVED_DISARM || + nFeat == FEAT_SMITE_EVIL || nFeat == FEAT_SMITE_GOOD) + { + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_USE_FEAT"); + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oAssociate); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_ATTACK, MOUSECURSOR_NOATTACK); + } + // Check feat and adjust if it is an action mode feat. + if(ai_SetActionMode(oAssociate, nFeat)) return; + AssignCommand(oAssociate, ActionUseFeat(nFeat, oAssociate, nSpell)); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + return; + } + SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_USE_FEAT"); + } + else SetLocalString(oPC, AI_TARGET_MODE, "ASSOCIATE_CAST_SPELL"); + } + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, oAssociate); + int nObjectType; + string sTarget = Get2DAString("spells", "TargetType", nSpell); + int nTarget = ai_HexStringToInt(sTarget); + //SendMessageToPC(GetFirstPC(), "nTarget: " + IntToString(nTarget)); + if((nTarget & 1) && !(nTarget & 2) &&!(nTarget & 4)) + { + if(ai_GetIsInCombat(oAssociate)) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + ai_CastWidgetSpell(oPC, oAssociate, oAssociate, GetLocation(oAssociate)); + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); + return; + } + if((nTarget & 1) || (nTarget & 2)) nObjectType += OBJECT_TYPE_CREATURE; + if(nTarget & 4) nObjectType += OBJECT_TYPE_TILE; + if(nTarget & 8) nObjectType += OBJECT_TYPE_ITEM; + if(nTarget & 16) nObjectType += OBJECT_TYPE_DOOR; + if(nTarget & 32) nObjectType += OBJECT_TYPE_PLACEABLE; + if(nTarget & 64) nObjectType += OBJECT_TYPE_TRIGGER; + string sShape = Get2DAString("spells", "TargetShape", nSpell); + int nShape, nSetData; + float fRange; + if(oPC == oAssociate) + { + nSetData = TRUE; + fRange = ai_GetSpellRange(nSpell); + if(fRange == 0.1) fRange = 0.0; + } + if(sShape == "sphere") + { + nShape = SPELL_TARGETING_SHAPE_SPHERE; + nSetData = TRUE; + } + else if(sShape == "rectangle") + { + nShape = SPELL_TARGETING_SHAPE_RECT; + nSetData = TRUE; + } + else if(sShape == "hsphere") + { + nShape = SPELL_TARGETING_SHAPE_HSPHERE; + nSetData = TRUE; + } + else if(sShape == "cone") nShape = SPELL_TARGETING_SHAPE_CONE; + else nShape = SPELL_TARGETING_SHAPE_NONE; + if(nSetData) + { + float fSizeX = StringToFloat(Get2DAString("spells", "TargetSizeX", nSpell)); + float fSizeY = StringToFloat(Get2DAString("spells", "TargetSizeY", nSpell)); + int nFlags = StringToInt(Get2DAString("spells", "TargetFlags", nSpell)); + SetEnterTargetingModeData(oPC, nShape, fSizeX, fSizeY, nFlags, fRange); + } + EnterTargetingMode(oPC, nObjectType, MOUSECURSOR_MAGIC, MOUSECURSOR_NOMAGIC); +} +void ai_UpdateAssociateWidget(object oPC, object oAssociate) +{ + int nUIToken = NuiFindWindow(oPC, ai_GetAssociateType(oPC, oAssociate) + AI_WIDGET_NUI); + if(nUIToken) + { + DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); + /* Not sure why I did this? + if(oPC != oAssociate) + { + nUIToken = NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI); + if(nUIToken) + { + DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); + DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); + } + } */ + } +} +int ai_SetActionMode(object oAssociate, int nFeat) +{ + int nMode; + if(nFeat == FEAT_POWER_ATTACK) nMode = ACTION_MODE_POWER_ATTACK; + else if(nFeat == FEAT_RAPID_SHOT) nMode = ACTION_MODE_RAPID_SHOT; + else if(nFeat == FEAT_FLURRY_OF_BLOWS) nMode = ACTION_MODE_FLURRY_OF_BLOWS; + else if(nFeat == FEAT_IMPROVED_POWER_ATTACK) nMode = ACTION_MODE_IMPROVED_POWER_ATTACK; + else if(nFeat == FEAT_EXPERTISE) nMode = ACTION_MODE_EXPERTISE; + else if(nFeat == FEAT_IMPROVED_EXPERTISE) nMode = ACTION_MODE_IMPROVED_EXPERTISE; + else if(nFeat == FEAT_DIRTY_FIGHTING) nMode = ACTION_MODE_DIRTY_FIGHTING; + if(nMode) + { + SetActionMode(oAssociate, nMode, !GetActionMode(oAssociate, nMode)); + return TRUE; + } + return FALSE; +} diff --git a/_module/nss/0i_spells.nss b/_module/nss/0i_spells.nss new file mode 100644 index 00000000..b7b75e2e --- /dev/null +++ b/_module/nss/0i_spells.nss @@ -0,0 +1,2157 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + Script Name: 0i_spells + Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts for base spells. + +Category: + Enhancement E + Protection P +Indiscriminant I + Discriminant D + Range R + Touch T + Summon S + Healing H + Cure C + +Buff Duration: +1 - All +2 - Short +3 - Long + +Buff Target: + 0 - Caster only + 1-6 Str, Dex, Con, Int, Wis, Cha: Highest Ability Score + 7 - Lowest AC + 8 - Lowest AC without AC Bonus + 9 - Highest Atk + 10 - Most Wounded + 11 - Lowest Fortitude + 12 - Lowest Reflex + 13 - Lowest Will + 14 - Lowest total saves + 15 - Buffs an Item + +Buff Groups: +-1 - Elemental Resistances. +-2 - Summons +-3 - AC (Non armor) +-4 - AC (for Armor/Shield) +-5 - Chance to Miss (Invisibility) +-6 - Regeneration +-7 - Globes of Invulnerablitity +-8 - Damage Reduction +-9 - Mantles +-10 - Alignment vs Chaos +-11 - Alignment vs Evil +-12 - Alignment vs Good +-13 - Alignment vs Law +-14 - Atk Bonus (for Weapon) +-15 - Light effects +-16 - Haste effects +-17 - Polymorph effects +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_messages" +#include "0i_states_cond" +#include "0i_items" +#include "X0_I0_POSITION" +struct stSpell +{ + object oPC; + object oCaster; + object oTarget; + int nBuffType; + int nTarget; + int nPosition; + int nClass; + int nLevel; + int nMaxSlots; + int nSlot; +}; +// Returns TRUE if oCreature can cast nSpell from nLevel. +int ai_GetCanCastSpell(object oCreature, int nSpell, int nClass, int nLevel, int nMetaMagic = 0, int nDomain = 0); +// Returns TRUE if oCreature is immune to petrification. +int ai_IsImmuneToPetrification(object oCaster, object oCreature); +// Returns TRUE if oCreature has an effect from a mind affecting spell. +int ai_DoIHaveAMindAffectingSpellOnMe(object oCreature); +// Returns TRUE if nSpell is a cure spell. +int ai_IsCureSpell(int nSpell); +// Returns TRUE if nSpell is an inflict spell. +int ai_IsInflictSpell(int nSpell); +// Returns TRUE if nSpell is an area of effect spell. +int ai_IsAreaOfEffectSpell(int nSpell); +// Returns 1(TRUE) if oAssociate is a spellcaster. +// Rturns 2(TRUE) if oAssociate is a memorizing spellcaster. +int ai_GetIsSpellCaster(object oAssociate); +// Returns TRUE if oCreature is immune to nSpells effects. +int ai_CreatureImmuneToEffect(object oCaster, object oCreature, int nSpell); +// Returns the ranged of nSpell from the spells.2da(Column "Range"). +// S = 8.0f, M = 20.0f, L = 40.0f, T = 5.0f, else = 0.1f; +float ai_GetSpellRange(int nSpell); +// Returns TRUE if oTarget has a spell that we would want to dispel. +// Checks for harmful effects as well as buffing effects. +int ai_CreatureHasDispelableEffect(object oCaster, object oCreature); +// Remove nEffectType of Type specified on oCreature; +// nEffectType uses the constants EFFECT_TYPE_* +void ai_RemoveASpecificEffect(object oCreature, int nEffectType); +// Returns TRUE if oCreature has nEffectType. +// nEffectType uses the constants EFFECT_TYPE_* +int ai_GetHasEffectType(object oCreature, int nEffectType); +// Checks oCreature for special abilities have a long duration. +void ai_CheckCreatureSpecialAbilities(object oCreature); +// Checks oCreature for the silence effect and if the spell only has a somatic component. +int ai_IsSilenced(object oCreature, int nSpell); +// Returns TRUE if ArcaneSpellFailure is too high to chance casting the spell. +int ai_ArcaneSpellFailureTooHigh(object oCreature, int nClass, int nLevel, int nSlot); +// Returns TRUE if oCaster casts nSpell on oTarget. +// This will only cast the spell if oTarget DOES NOT already have the spell +// effect, and the caster has the spell ready. +int ai_TryToCastSpell(object oCaster, int nSpell, object oTarget); +// In "Buff_Target" column the value of 0 in the "ai_spells.2da" references the Caster. +// In "Buff_Target" column this is value 1-6(STR, DEX, CON, INT, WIS, CHA) in the "ai_spells.2da". +object ai_BuffHighestAbilityScoreTarget(object oCaster, int nSpell, int nAbilityScore, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 7 in the "ai_spells.2da". +object ai_BuffLowestACTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 8 in the "ai_spells.2da". +object ai_BuffLowestACWithOutACBonus(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 9 in the "ai_spells.2da". +object ai_BuffHighestAttackTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 10 in the "ai_spells.2da". +object ai_BuffMostWoundedTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 11 in the "ai_spells.2da". +object ai_BuffLowestFortitudeSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 12 in the "ai_spells.2da". +object ai_BuffLowestReflexSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 13 in the "ai_spells.2da". +object ai_BuffLowestWillSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 14 in the "ai_spells.2da". +object ai_BuffLowestSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// In "Buff_Target" column this is value 15 in the "ai_spells.2da". +object ai_BuffItemTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_"); +// Returns a target for nSpell cast by oCaster based on ai_spells.2da file. +object ai_GetBuffTarget(object oCaster, int nSpell); +// Casts a memorized spell from oCaster of nClass, nSpellLevel, nSpellSlot on oTarget. +void ai_CastMemorizedSpell(object oCaster, int nClass, int nSpellLevel, int nSpellSlot, object oTarget, int bInstant, object oPC = OBJECT_INVALID); +// Casts a known spell from oCaster of nClass, nSpell on oTarget. +void ai_CastKnownSpell(object oCaster, int nClass, int nSpell, object oTarget, int bInstant, object oPC = OBJECT_INVALID); +// Returns true if the spell is cast. +// Checks if they have the spell and will cast it if possible. +int ai_CheckAndCastSpell(object oCaster, int nSpell, int nSpellGroup, float fDelay, object oTarget, object oPC = OBJECT_INVALID); +// Setup monsters for oCaster to buff in ai_CastSpells. +void ai_SetupMonsterBuffTargets(object oCaster); +// Setup the targets for an NPC to buff one of the PC's members or the whole group. +void ai_SetupAllyTargets(object oCaster, object oPC); +// Setup the targets for an NPC to heal one of the PC's members. +void ai_SetupAllyHealingTargets(object oCaster, object oPC); +// Clears the casters buff targets. +void ai_ClearBuffTargets(object oCaster, string sVariable); +// Cycles through a casters spells casting all buffs via actions. +void ai_ActionCastMemorizedBuff(struct stSpell stSpell); +// Cycles through a casters spells casting all buffs via actions. +void ai_ActionCastKnownBuff(struct stSpell stSpell); +// Checks oCaster for buffing spells and casts them based on nTarget; +// These are cast as actions and will happen at the speed based on +// AI_HENCHMAN_BUFF_DELAY, but are still actions. +// nTarget is 0-9 where 0 is all targets, 1 is oPC, 2 is the caster +// 3 Familiar, 4 is Animal Companion, 5 is Summons, 6 is Dominated, and 7+ is henchman. +// Targets must be defined in variable AI_ALLY_TARGET_* where * is 1 to #. +// nBuffType is the duration 1 - all, 2 - short, 3 - long. +void ai_CastBuffs(object oCaster, int nBuffType, int nTarget, object oPC); +// Returns TRUE if oCaster cast spontaneous cure spell on oTarget. +// This uses an action and must use AssignCommand or OBJECT_SELF is the caster! +int ai_CastSpontaneousCure(object oCreature, object oTarget, object oPC); +// Returns TRUE if oCaster casts a memorized cure spell on oTarget. +// This uses an action and must use AssignCommand or OBJECT_SELF is the caster! +int ai_CastMemorizedHealing(object oCreature, object oTarget, object oPC, int nClass); +// Returns TRUE if oCaster casts a known cure spell on oTarget. +// This uses an action and must use AssignCommand or OBJECT_SELF is the caster! +int ai_CastKnownHealing(object oCreature, object oTarget, object oPC, int nClass); +// Returns TRUE if oCreature has an effect that will break their concentration. +int ai_ConcentrationCondition(object oCreature); +// Check to see if a spell's concentration has been broken, works for summons as well. +void ai_SpellConcentrationCheck(object oCaster); +// Returns TRUE if oCreature can safely cast nSpell defensively or has a good +// chance of casting while in melee. +int ai_CastInMelee(object oCreature, int nSpell, int nInMelee); +// Returns a float range for the caster to search for a target of an offensive spell. +float ai_GetOffensiveSpellSearchRange(object oCreature, int nSpell); +// Returns TRUE if nSpell is a cure spell and will not over heal for nDamage. +int ai_ShouldWeCastThisCureSpell(int nSpell, int nDamage); +// Casts the spell on the current target for oAssociate. +void ai_CastWidgetSpell(object oPC, object oAssociate, object oTarget, location lLocation); +// Uses the feat on the current target for oAssociate. +void ai_UseWidgetFeat(object oPC, object oAssociate, object oTarget, location lLocation); +// Uses the item on the current target for oAssociate. +void ai_UseWidgetItem(object oPC, object oAssociate, object oTarget, location lLocation); +int ai_GetCanCastSpell(object oCreature, int nSpell, int nClass, int nLevel, int nMetaMagic = 0, int nDomain = 0) +{ + int nIndex, nSpellCount, nClassPosition, nSlot, nMaxSlots, nPosition = 1; + while(nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + nClassPosition = GetClassByPosition(nPosition, oCreature); + if(nClassPosition == CLASS_TYPE_INVALID) return FALSE; + if(nClass = nClassPosition) + { + if(Get2DAString("classes", "SpellCaster", nClass) == "1") + { + nSlot = 0; + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + nMaxSlots = GetMemorizedSpellCountByLevel(oCreature, nClass, nLevel); + while(nSlot < nMaxSlots) + { + if(GetMemorizedSpellId(oCreature, nClass, nLevel, nSlot) == nSpell && + GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot)) return TRUE; + nSlot++; + } + } + else return GetSpellUsesLeft(oCreature, nClass, nSpell, nMetaMagic, nDomain); + } + } + nPosition++; + } + return FALSE; +} +int ai_IsImmuneToPetrification(object oCaster, object oCreature) +{ + int nAppearance = GetAppearanceType(oCreature); + switch(nAppearance) + { + case APPEARANCE_TYPE_BASILISK: + case APPEARANCE_TYPE_COCKATRICE: + case APPEARANCE_TYPE_MEDUSA: + case APPEARANCE_TYPE_ALLIP: + case APPEARANCE_TYPE_ELEMENTAL_AIR: + case APPEARANCE_TYPE_ELEMENTAL_AIR_ELDER: + case APPEARANCE_TYPE_ELEMENTAL_EARTH: + case APPEARANCE_TYPE_ELEMENTAL_EARTH_ELDER: + case APPEARANCE_TYPE_ELEMENTAL_FIRE: + case APPEARANCE_TYPE_ELEMENTAL_FIRE_ELDER: + case APPEARANCE_TYPE_ELEMENTAL_WATER: + case APPEARANCE_TYPE_ELEMENTAL_WATER_ELDER: + case APPEARANCE_TYPE_GOLEM_STONE: + case APPEARANCE_TYPE_GOLEM_IRON: + case APPEARANCE_TYPE_GOLEM_CLAY: + case APPEARANCE_TYPE_GOLEM_BONE: + case APPEARANCE_TYPE_GORGON: + case APPEARANCE_TYPE_HEURODIS_LICH: + case APPEARANCE_TYPE_LANTERN_ARCHON: + case APPEARANCE_TYPE_SHADOW: + case APPEARANCE_TYPE_SHADOW_FIEND: + case APPEARANCE_TYPE_SHIELD_GUARDIAN: + case APPEARANCE_TYPE_SKELETAL_DEVOURER: + case APPEARANCE_TYPE_SKELETON_CHIEFTAIN: + case APPEARANCE_TYPE_SKELETON_COMMON: + case APPEARANCE_TYPE_SKELETON_MAGE: + case APPEARANCE_TYPE_SKELETON_PRIEST: + case APPEARANCE_TYPE_SKELETON_WARRIOR: + case APPEARANCE_TYPE_SKELETON_WARRIOR_1: + case APPEARANCE_TYPE_SPECTRE: + case APPEARANCE_TYPE_WILL_O_WISP: + case APPEARANCE_TYPE_WRAITH: + case APPEARANCE_TYPE_BAT_HORROR: + case 405: // Dracolich: + case 415: // Alhoon + case 418: // shadow dragon + case 420: // mithral golem + case 421: // admantium golem + case 430: // Demi Lich + case 469: // animated chest + case 474: // golems + case 475: // golems + return TRUE; + } + // Petrification immunity can also be granted as an item property. + if(ResistSpell(oCaster, oCreature) == 2 ) return TRUE; + // Prevent people from petrifying DM, resulting in GUI even when effect is not successful. + if(!GetPlotFlag(oCreature) && GetIsDM(oCreature)) return TRUE; + return FALSE; +} +int ai_DoIHaveAMindAffectingSpellOnMe(object oCreature) +{ + if(GetHasSpellEffect(SPELL_SLEEP, oCreature) || + GetHasSpellEffect(SPELL_DAZE, oCreature) || + GetHasSpellEffect(SPELL_HOLD_ANIMAL, oCreature) || + GetHasSpellEffect(SPELL_HOLD_MONSTER, oCreature) || + GetHasSpellEffect(SPELL_HOLD_PERSON, oCreature) || + GetHasSpellEffect(SPELL_CHARM_MONSTER, oCreature) || + GetHasSpellEffect(SPELL_CHARM_PERSON, oCreature) || + GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL, oCreature) || + GetHasSpellEffect(SPELL_MASS_CHARM, oCreature) || + GetHasSpellEffect(SPELL_DOMINATE_ANIMAL, oCreature) || + GetHasSpellEffect(SPELL_DOMINATE_MONSTER, oCreature) || + GetHasSpellEffect(SPELL_DOMINATE_PERSON, oCreature) || + GetHasSpellEffect(SPELL_CONFUSION, oCreature) || + GetHasSpellEffect(SPELL_MIND_FOG, oCreature) || + GetHasSpellEffect(SPELL_CLOUD_OF_BEWILDERMENT, oCreature) || + GetHasSpellEffect(SPELLABILITY_BOLT_DOMINATE,oCreature) || + GetHasSpellEffect(SPELLABILITY_BOLT_CHARM,oCreature) || + GetHasSpellEffect(SPELLABILITY_BOLT_CONFUSE,oCreature) || + GetHasSpellEffect(SPELLABILITY_BOLT_DAZE,oCreature)) return TRUE; + return FALSE; +} +int ai_IsCureSpell(int nSpell) +{ + switch(nSpell) + { + case SPELL_CURE_CRITICAL_WOUNDS: + case SPELL_CURE_LIGHT_WOUNDS: + case SPELL_CURE_MINOR_WOUNDS: + case SPELL_CURE_MODERATE_WOUNDS: + case SPELL_CURE_SERIOUS_WOUNDS: + case SPELL_HEAL: return TRUE; break; + } + return FALSE; +} +int ai_IsInflictSpell(int nSpell) +{ + switch(nSpell) + { + case SPELL_INFLICT_CRITICAL_WOUNDS: + case SPELL_INFLICT_LIGHT_WOUNDS: + case SPELL_INFLICT_MINOR_WOUNDS: + case SPELL_INFLICT_MODERATE_WOUNDS: + case SPELL_INFLICT_SERIOUS_WOUNDS: + case SPELL_HARM: return TRUE; break; + } + return FALSE; +} +int ai_IsAreaOfEffectSpell(int nSpell) +{ + switch(nSpell) + { + case SPELL_ACID_FOG : + case SPELL_MIND_FOG : + case SPELL_STORM_OF_VENGEANCE: + case SPELL_WEB : + case SPELL_GREASE : + case SPELL_CREEPING_DOOM : +// case SPELL_DARKNESS : + case SPELL_SILENCE : + case SPELL_BLADE_BARRIER : + case SPELL_CLOUDKILL : + case SPELL_STINKING_CLOUD : + case SPELL_WALL_OF_FIRE : + case SPELL_INCENDIARY_CLOUD : + case SPELL_ENTANGLE : + case SPELL_EVARDS_BLACK_TENTACLES: + case SPELL_CLOUD_OF_BEWILDERMENT : + case SPELL_STONEHOLD : + case SPELL_VINE_MINE : + case SPELL_SPIKE_GROWTH : + case SPELL_DIRGE : + case 530 : // vine mine + case 531 : // vine mine + case 532 : // vine mine + case 961 : // Prismatic Sphere + return TRUE; + } + return FALSE; +} +int ai_GetIsSpellCaster(object oAssociate) +{ + int nIndex, nSpellCaster, nClass; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass == CLASS_TYPE_INVALID) return nSpellCaster; + if(Get2DAString("classes", "SpellCaster", nClass) == "1") + { + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") return 2; + else nSpellCaster = 1; + } + } + return nSpellCaster; +} +int ai_GetIsSpellBookRestrictedCaster(object oAssociate) +{ + int nIndex, nSpellCaster, nClass; + for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) + { + nClass = GetClassByPosition(nIndex, oAssociate); + if(nClass == CLASS_TYPE_INVALID) return FALSE; + if(Get2DAString("classes", "SpellbookRestricted", nClass) == "1") return TRUE; + } + return FALSE; +} +int ai_CreatureImmuneToEffect(object oCaster, object oCreature, int nSpell) +{ + string sIType = Get2DAString("ai_spells", "ImmunityType", nSpell); + if(sIType != "") + { + if(AI_DEBUG) ai_Debug("0i_spells", "290", "Checking spell immunity type(" + sIType + ")."); + if(sIType == "Death" && GetIsImmune(oCreature, IMMUNITY_TYPE_DEATH)) return TRUE; + else if(sIType == "Level_Drain" && GetIsImmune(oCreature, IMMUNITY_TYPE_NEGATIVE_LEVEL)) return TRUE; + else if(sIType == "Ability_Drain" && GetIsImmune(oCreature, IMMUNITY_TYPE_ABILITY_DECREASE)) return TRUE; + else if(sIType == "Poison" && GetIsImmune(oCreature, IMMUNITY_TYPE_POISON)) return TRUE; + else if(sIType == "Disease" && GetIsImmune(oCreature, IMMUNITY_TYPE_DISEASE)) return TRUE; + else if(sIType == "Curse" && GetIsImmune(oCreature, IMMUNITY_TYPE_CURSED)) return TRUE; + else if(sIType == "Mind_Affecting" && GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS)) return TRUE; + else if(sIType == "Petrification" && ai_IsImmuneToPetrification(oCaster, oCreature)) return TRUE; + else if(sIType == "Fear" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_FEAR) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Sleep" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_SLEEP) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Paralysis" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_PARALYSIS) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Domination" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_DOMINATE) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Confusion" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_CONFUSED) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Blindness" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_BLINDNESS) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Dazed" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_DAZED) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + else if(sIType == "Charm" && + (GetIsImmune(oCreature, IMMUNITY_TYPE_CHARM) || + GetIsImmune(oCreature, IMMUNITY_TYPE_MIND_SPELLS))) return TRUE; + // Check for damage immunities. + // Negative damage does not work on undead! + else if(sIType == "Negative" && GetRacialType(oCreature) == RACIAL_TYPE_UNDEAD) + { + if(AI_DEBUG) ai_Debug("0i_spell", "325", "Undead are immune to Negative energy!"); + return TRUE; + } + // Elemental damage resistances should be checked. + if(sIType == "Acid" || sIType == "Cold" || sIType == "Fire" || + sIType == "Electricty" || sIType == "Sonic") + { + if(ai_GetHasEffectType(oCreature, EFFECT_TYPE_DAMAGE_RESISTANCE)) + { + if(AI_DEBUG) ai_Debug("0i_spell", "334", GetName(oCreature) + " has damage resistance to my " + sIType + " spell!"); + return TRUE; + } + // Check for resistances and immunities. Treat resistance as immune. + int nIPResist = GetLocalInt(oCreature, sIPResistVarname); + if(AI_DEBUG) ai_Debug("0i_spell", "372", "nIPResist:" + IntToString(nIPResist)); + int nIPImmune = GetLocalInt(oCreature, sIPImmuneVarname) | nIPResist; + if(AI_DEBUG) ai_Debug("0i_spell", "374", "nIPImmune:" + IntToString(nIPImmune)); + if(nIPImmune > 0) + { + if(AI_DEBUG) ai_Debug("0i_spell", "391", GetName(oCreature) + " is immune/resistant to my " + sIType + " spell through an item!"); + if(sIType == "Acid" && (nIPImmune & DAMAGE_TYPE_ACID)) return TRUE; + else if(sIType == "Cold" && (nIPImmune & DAMAGE_TYPE_COLD)) return TRUE; + else if(sIType == "Fire" && (nIPImmune & DAMAGE_TYPE_FIRE)) return TRUE; + else if(sIType == "Electricity" && (nIPImmune & DAMAGE_TYPE_ELECTRICAL)) return TRUE; + else if(sIType == "Sonic" && (nIPImmune & DAMAGE_TYPE_SONIC)) return TRUE; + } + } + } + int nLevel = StringToInt(Get2DAString("spells", "Innate", nSpell)); + // Globe spells should be checked... + if((GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY, oCreature) || + GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE, oCreature)) && + nLevel < 4 && d100() < 75) return TRUE; + if(GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY, oCreature) && + nLevel < 5 && d100() < 75) return TRUE; + // Check creatures items for immunity. + int nIndex; + json jSpellImmunity = GetLocalJson(oCreature, AI_TALENT_IMMUNITY); + json jSpell = JsonArrayGet(jSpellImmunity, nIndex); + while(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + if(nSpell == JsonGetInt(jSpell)) + { + if(AI_DEBUG) ai_Debug("0i_spells", "407", GetName(oCreature) + " is immune to the spell via an Item!"); + return TRUE; + } + jSpell = JsonArrayGet(jSpellImmunity, ++nIndex); + } + if(AI_DEBUG) ai_Debug("0i_spell", "347", GetName(oCreature) + " is not immune to the spell."); + return FALSE; +} +float ai_GetSpellRange(int nSpell) +{ + string sRange = Get2DAString("spells", "Range", nSpell); + if(sRange == "S") return AI_SHORT_DISTANCE; + else if(sRange == "M") return AI_MEDIUM_DISTANCE; + else if(sRange == "L") return AI_LONG_DISTANCE; + else if(sRange == "T") return AI_RANGE_MELEE; + return 0.1; +} +int ai_CreatureHasDispelableEffect(object oCaster, object oCreature) +{ + int nSpellID, nLastSpellID, bSpell, nDispelChance; + // Cycle through the targets effects. + effect eEffect = GetFirstEffect(oCreature); + if(AI_DEBUG) ai_Debug("0i_spells", "485", "nSpell: " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", GetEffectSpellId(eEffect)))) + + " oCreature: " + GetName(oCreature)); + while(GetIsEffectValid(eEffect)) + { + nSpellID = GetEffectSpellId(eEffect); + // -1 is not a spell. + if(AI_DEBUG) ai_Debug("0i_spells", "491", "nSpell: (" + IntToString(nSpellID) + ") " + + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpellID)))); + if(nSpellID > -1 && nLastSpellID != nSpellID) + { + // We check if the spell is Hostile(-1) or Helpful(+1). + if(Get2DAString("ai_spells", "HostileSetting", nSpellID) == "1") nDispelChance--; + else nDispelChance++; + if(AI_DEBUG) ai_Debug("0i_spells", "497", "HostileSetting: " + Get2DAString("ai_spells", "HostileSetting", nSpellID) + + " nDispelChance: " + IntToString(nDispelChance)); + } + nLastSpellID = nSpellID; + eEffect = GetNextEffect(oCreature); + } + // if the target has more Helpful spells than harmful spells effecting them + // then use dispel! + if(AI_DEBUG) ai_Debug("0i_spells", "505", "nDispelChance: " + IntToString(nDispelChance)); + return (nDispelChance > 0); +} +void ai_RemoveASpecificEffect(object oCreature, int nEffectType) +{ + effect eEffect = GetFirstEffect(oCreature); + //Search for the effect. + while(GetIsEffectValid(eEffect)) + { + if(GetEffectType(eEffect) == nEffectType) + { + //Remove effect. + RemoveEffect(oCreature, eEffect); + eEffect = GetFirstEffect(oCreature); + } + else eEffect = GetNextEffect(oCreature); + } +} +int ai_GetHasEffectType(object oCreature, int nEffectType) +{ + effect eEffect = GetFirstEffect(oCreature); + while(GetIsEffectValid(eEffect)) + { + if(GetEffectType(eEffect, TRUE) == nEffectType) return TRUE; + eEffect = GetNextEffect(oCreature); + } + return FALSE; +} +void ai_CheckCreatureSpecialAbilities(object oCreature) +{ + int nMaxSpecialAbilities = GetSpellAbilityCount(oCreature); + if(nMaxSpecialAbilities) + { + int nIndex, bCanCast; + // Struct is id, ready, level. + int nSpell; + while(nIndex < nMaxSpecialAbilities) + { + nSpell = GetSpellAbilitySpell(oCreature, nIndex); + if(GetSpellAbilityReady(oCreature, nSpell)) + { + bCanCast = FALSE; + if(GetSpellAbilityCasterLevel(oCreature, nIndex) > 4) + { + // 1 Min/Lvl spell that is too low of level so it must be cast at 5th lvl or greater. + if(nSpell == SPELL_FLAME_WEAPON) bCanCast = TRUE; + else if(nSpell == SPELL_BLESS) bCanCast = TRUE; + else if(nSpell == SPELL_AID) bCanCast = TRUE; + else if(nSpell == SPELL_DEATH_WARD) bCanCast = TRUE; + } + if(nSpell == SPELL_ENERGY_BUFFER) bCanCast = TRUE; + else if(nSpell == SPELL_PROTECTION_FROM_ELEMENTS) bCanCast = TRUE; + else if(nSpell == SPELL_RESIST_ELEMENTS) bCanCast = TRUE; + else if(nSpell == SPELL_ENDURE_ELEMENTS) bCanCast = TRUE; + else if(nSpell == SPELL_MAGE_ARMOR) bCanCast = TRUE; + else if(nSpell == SPELL_MAGIC_VESTMENT) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_MAGIC_WEAPON) bCanCast = TRUE; + else if(nSpell == SPELL_MAGIC_WEAPON) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_IX) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_VIII) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_VII) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_VI) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_V) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_IV) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_III) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_II) bCanCast = TRUE; + else if(nSpell == SPELL_SUMMON_CREATURE_I) bCanCast = TRUE; + else if(nSpell == SPELL_BARKSKIN) bCanCast = TRUE; + else if(nSpell == SPELL_SHIELD) bCanCast = TRUE; + else if(nSpell == SPELL_ENTROPIC_SHIELD) bCanCast = TRUE; + else if(nSpell == SPELL_SHIELD_OF_FAITH) bCanCast = TRUE; + else if(nSpell == SPELL_REMOVE_FEAR) bCanCast = TRUE; + else if(nSpell == SPELL_IRONGUTS) bCanCast = TRUE; + else if(nSpell == SPELL_PREMONITION) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_STONESKIN) bCanCast = TRUE; + else if(nSpell == SPELL_GHOSTLY_VISAGE) bCanCast = TRUE; + else if(nSpell == SPELL_IMPROVED_INVISIBILITY) bCanCast = TRUE; + else if(nSpell == SPELL_INVISIBILITY_SPHERE) bCanCast = TRUE; + else if(nSpell == SPELL_INVISIBILITY) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_BULLS_STRENGTH) bCanCast = TRUE; + else if(nSpell == SPELL_BULLS_STRENGTH) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_CATS_GRACE) bCanCast = TRUE; + else if(nSpell == SPELL_CATS_GRACE) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_EAGLE_SPLENDOR) bCanCast = TRUE; + else if(nSpell == SPELL_EAGLE_SPLEDOR) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_ENDURANCE) bCanCast = TRUE; + else if(nSpell == SPELL_ENDURANCE) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_FOXS_CUNNING) bCanCast = TRUE; + else if(nSpell == SPELL_FOXS_CUNNING) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_OWLS_WISDOM) bCanCast = TRUE; + else if(nSpell == SPELL_OWLS_WISDOM) bCanCast = TRUE; + else if(nSpell == SPELL_KEEN_EDGE) bCanCast = TRUE; + else if(nSpell == SPELL_ANIMATE_DEAD) bCanCast = TRUE; + else if(nSpell == SPELL_INVISIBILITY_PURGE) bCanCast = TRUE; + else if(nSpell == SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE) bCanCast = TRUE; + else if(nSpell == SPELL_DARKFIRE) bCanCast = TRUE; + else if(nSpell == SPELL_NEGATIVE_ENERGY_PROTECTION) bCanCast = TRUE; + else if(nSpell == SPELL_MAGIC_CIRCLE_AGAINST_GOOD) bCanCast = TRUE; + else if(nSpell == SPELL_FREEDOM_OF_MOVEMENT) bCanCast = TRUE; + else if(nSpell == SPELL_NEUTRALIZE_POISON) bCanCast = TRUE; + else if(nSpell == SPELL_MIND_BLANK) bCanCast = TRUE; + else if(nSpell == SPELL_LESSER_MIND_BLANK) bCanCast = TRUE; + else if(nSpell == SPELL_SPELL_RESISTANCE) bCanCast = TRUE; + else if(nSpell == SPELL_PROTECTION_FROM_GOOD) bCanCast = TRUE; + else if(nSpell == SPELL_CREATE_UNDEAD) bCanCast = TRUE; + else if(nSpell == SPELL_PLANAR_ALLY) bCanCast = TRUE; + else if(nSpell == SPELL_LESSER_PLANAR_BINDING) bCanCast = TRUE; + else if(nSpell == SPELL_ETHEREALNESS) bCanCast = TRUE; + else if(nSpell == SPELL_PROTECTION_FROM_SPELLS) bCanCast = TRUE; + else if(nSpell == SPELL_SHADOW_SHIELD) bCanCast = TRUE; + else if(nSpell == SPELL_CREATE_GREATER_UNDEAD) bCanCast = TRUE; + else if(nSpell == SPELL_GREATER_PLANAR_BINDING) bCanCast = TRUE; + if(bCanCast && GetSpellAbilityReady(oCreature, nIndex)) + { + ActionCastSpellAtObject(nSpell, oCreature, 255, 0, 0, 0, TRUE); + } + } + nIndex++; + } + } +} +int ai_IsSilenced(object oCreature, int nSpell) +{ + if(Get2DAString("spells", "VS", nSpell) == "s") return FALSE; + if(ai_GetHasEffectType(oCreature, EFFECT_TYPE_SILENCE)) return TRUE; + return FALSE; +} +int ai_ArcaneSpellFailureTooHigh(object oCreature, int nClass, int nLevel, int nSlot) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "561", "Arcane Spells: " + Get2DAString("classes", "ASF", nClass) + + " Arcane Spell Failure: " + IntToString(GetArcaneSpellFailure(oCreature)) + + " AI_ASF_WILL_USE: " + IntToString(AI_ASF_WILL_USE)); + if(Get2DAString("classes", "ASF", nClass) == "1" && + GetArcaneSpellFailure(oCreature) > AI_ASF_WILL_USE) + { + if(GetMemorizedSpellMetaMagic(oCreature, nClass, nLevel, nSlot) == METAMAGIC_STILL) return FALSE; + return TRUE; + } + return FALSE; +} +int ai_TryToCastSpell(object oCaster, int nSpell, object oTarget) +{ + if(GetHasSpell(nSpell, oCaster) && !GetHasSpellEffect(nSpell, oTarget)) + { + ActionCastSpellAtObject(nSpell, oTarget); + return TRUE; + } + return FALSE; +} +int ai_SpellGroupNotCast(object oCreature, string sBuffGroup) +{ + return !GetLocalInt(oCreature, sBuffGroup); +} +void ai_ClearSpellsCastGroups(object oCreature) +{ + int nCounter; + for(nCounter = -1; nCounter <= AI_BUFF_GROUPS; nCounter--) + { + DeleteLocalInt(oCreature, "AI_USED_SPELL_GROUP_" + IntToString(nCounter)); + } +} +int ai_CanUseSpell(object oCaster, object oTarget, int nSpell, int nTargetType) +{ + // Should we ignore associates? + if(ai_GetAIMode(oCaster, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + // For ability scores we return a bonus to the ability to be checked against + // the target with the highest ability getting the spell first. + if(nTargetType == 1) // Ability score buff for strength. + { + // We don't want to buff the strength for someone using weapon finesse! + if(GetHasFeat(FEAT_WEAPON_FINESSE, oTarget)) return -5; + return TRUE; + } + if(nTargetType == 7) // Lowest AC. + { + // Stone bones only effects the undead. + if(nSpell == SPELL_STONE_BONES) + { + if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD) return FALSE; + } + return TRUE; + } + if(nTargetType == 8) // Lowest AC without AC Bonus. + { + if(nSpell == SPELL_MAGIC_VESTMENT) + { + object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); + if(oArmor == OBJECT_INVALID) return FALSE; + } + return TRUE; + } + if(nTargetType == 9) // Highest Attack. + { + return TRUE; + } + if(nTargetType == 10) // Most wounded, Lowest Hp. + { + return TRUE; + } + if(nTargetType == 11) // Lowest Fortitude save. + { + return TRUE; + } + if(nTargetType == 12) // Lowest Reflex save. + { + return TRUE; + } + if(nTargetType == 13) // Lowest Will save. + { + return TRUE; + } + if(nTargetType == 14) // Lowest Save. + { + return TRUE; + } + if(nSpell == SPELL_MAGIC_FANG) + { + object oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCaster); + if(oTarget != oCompanion) return FALSE; + } + return TRUE; +} +// Used to check if the targets weapon can be buffed by the spells effects. +int ai_CanItemBeBuffed(int nSpell, object oTarget) +{ + object oWeapon, oArmor; + if(nSpell == SPELL_MAGIC_WEAPON || nSpell == SPELL_GREATER_MAGIC_WEAPON || + nSpell == SPELL_BLADE_THIRST) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_ENHANCEMENT_BONUS)) return FALSE; + } + else if(nSpell == SPELL_MAGIC_VESTMENT) + { + oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); + if(oArmor == OBJECT_INVALID) return FALSE; + if(ai_GetHasItemProperty(oArmor, ITEM_PROPERTY_AC_BONUS)) return FALSE; + } + else if(nSpell == SPELL_DARKFIRE) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_ON_HIT_PROPERTIES, 127)) return FALSE; + } + else if(nSpell == SPELL_FLAME_WEAPON) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_ON_HIT_PROPERTIES, 124)) return FALSE; + } + else if(nSpell == SPELL_KEEN_EDGE) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsSlashingWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_KEEN)) return FALSE; + } + else if(nSpell == SPELL_DEAFENING_CLANG) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_ON_HIT_PROPERTIES, 137)) return FALSE; + } + else if(nSpell == SPELL_BLESS_WEAPON) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP, IP_CONST_RACIALTYPE_UNDEAD)) return FALSE; + } + else if(nSpell == SPELL_HOLY_SWORD) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_HOLY_AVENGER)) return FALSE; + } + else if(nSpell == SPELL_BLACKSTAFF) + { + oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(GetBaseItemType(oWeapon) != BASE_ITEM_QUARTERSTAFF) return FALSE; + if(ai_GetHasItemProperty(oWeapon, ITEM_PROPERTY_ON_HIT_PROPERTIES, IP_CONST_ONHIT_DISPELMAGIC)) return FALSE; + } + return TRUE; +} +// In "Buff_Target" column the value of 0 in the "ai_spells.2da" references the Caster. +// In "Buff_Target" column this is value 1-6(STR, DEX, CON, INT, WIS, CHA) in the "ai_spells.2da". +object ai_BuffHighestAbilityScoreTarget(object oCaster, int nSpell, int nAbilityScore, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup)) return oMaster; + } + int nCntr = 1, nAB, nHighAB, nTarget, nUseSpell; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange) + { + nUseSpell = ai_CanUseSpell(oCaster, oTarget, nSpell, nAbilityScore + 1); + if(nUseSpell == 0) {} + else + { + nAB = GetAbilityScore(oTarget, nAbilityScore) + nUseSpell; + if(nAB > nHighAB) + {nHighAB = nAB; nTarget = nCntr; } + } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 7 in the "ai_spells.2da". +object ai_BuffLowestACTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + object oMaster = GetMaster(); + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 7)) return oMaster; + } + int nCntr = 1, nAC, nLowAC = 100, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nAC = GetAC(oTarget); + if(nAC < nLowAC && ai_CanUseSpell(oCaster, oTarget, nSpell, 7)) + {nLowAC = nAC; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); + return oTarget; +} +// In "Buff_Target" column this is value 8 in the "ai_spells.2da". +object ai_BuffLowestACWithOutACBonus(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 8)) return oMaster; + } + int nCntr = 1, nAC, nLowAC = 50, nTarget; + object oItem, oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nAC = GetAC(oTarget); + oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); + if(nAC < nLowAC && ai_CanUseSpell(oCaster, oTarget, nSpell, 8) && + !GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS)) + { + nLowAC = nAC; + nTarget = nCntr; + } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 9 in the "ai_spells.2da". +object ai_BuffHighestAttackTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 9)) return oMaster; + } + int nCntr = 1, nAtk, nHighAtk, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nAtk = GetBaseAttackBonus(oTarget); + if(nAtk > nHighAtk && ai_CanUseSpell(oCaster, oTarget, nSpell, 9)) + {nHighAtk = nAtk; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); + return oTarget; +} +// In "Buff_Target" column this is value 10 in the "ai_spells.2da". +object ai_BuffMostWoundedTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 9)) return oMaster; + } + int nCntr = 1, nDmg, nMostDmg, nHp, nLowHp = 10000, nTarget, nHpTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && + ai_SpellGroupNotCast(oTarget, sBuffGroup) && + ai_CanUseSpell(oCaster, oTarget, nSpell, 10)) + { + nHp = GetCurrentHitPoints(oTarget); + nDmg = GetMaxHitPoints(oTarget) - nHp; + if(nDmg > nMostDmg) { nMostDmg = nDmg; nTarget = nCntr; } + if(nHp < nLowHp) { nLowHp = nHp; nHpTarget = nCntr; } + } + // If no one is damage then put regeneration on the lowest hp target. + if(nMostDmg == 0) nTarget = nHpTarget; + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 11 in the "ai_spells.2da". +object ai_BuffLowestFortitudeSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 11)) return oMaster; + } + int nCntr = 1, nSave, nLowSave = 100, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nSave = GetFortitudeSavingThrow(oTarget); + if(nSave < nLowSave && ai_CanUseSpell(oCaster, oTarget, nSpell, 11)) + {nLowSave = nSave; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 12 in the "ai_spells.2da". +object ai_BuffLowestReflexSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 12)) return oMaster; + } + int nCntr = 1, nSave, nLowSave = 100, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nSave = GetReflexSavingThrow(oTarget); + if(nSave < nLowSave && ai_CanUseSpell(oCaster, oTarget, nSpell, 12)) + {nLowSave = nSave; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 13 in the "ai_spells.2da". +object ai_BuffLowestWillSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 13)) return oMaster; + } + int nCntr = 1, nSave, nLowSave = 100, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nSave = GetWillSavingThrow(oTarget); + if(nSave < nLowSave && ai_CanUseSpell(oCaster, oTarget, nSpell, 13)) + {nLowSave = nSave; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 14 in the "ai_spells.2da". +object ai_BuffLowestSaveTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(!GetHasSpellEffect(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup) && + ai_CanUseSpell(oCaster, oMaster, nSpell, 14)) return oMaster; + } + int nCntr = 1, nSave, nLowSave = 200, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && !GetHasSpellEffect(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nSave = GetFortitudeSavingThrow(oTarget) + GetReflexSavingThrow(oTarget) + GetWillSavingThrow(oTarget); + if(nSave < nLowSave && ai_CanUseSpell(oCaster, oTarget, nSpell, 14)) + {nLowSave = nSave; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + else return GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); +} +// In "Buff_Target" column this is value 15 in the "ai_spells.2da". +object ai_BuffItemTarget(object oCaster, int nSpell, string sBuffGroup, float fRange, string sTargetType = "AI_ALLY_TARGET_") +{ + if(ai_GetMagicMode(oCaster, AI_MAGIC_BUFF_MASTER)) + { + object oMaster = GetMaster(); + if(ai_CanItemBeBuffed(nSpell, oMaster) && + ai_SpellGroupNotCast(oMaster, sBuffGroup)) return oMaster; + } + int nCntr = 1, nAtk, nHighAtk = -9999, nTarget; + object oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nCntr)); + while (nCntr < 10) + { + if(oTarget != OBJECT_INVALID && ai_CanItemBeBuffed(nSpell, oTarget) && + GetDistanceBetween(oCaster, oTarget) <= fRange && ai_SpellGroupNotCast(oTarget, sBuffGroup)) + { + nAtk = GetBaseAttackBonus(oTarget); + if(nAtk > nHighAtk) + { nHighAtk = nAtk; nTarget = nCntr; } + } + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(++nCntr)); + } + if(nTarget == 0) return OBJECT_INVALID; + oTarget = GetLocalObject(oCaster, sTargetType + IntToString(nTarget)); + return oTarget; +} +object ai_GetBuffTarget(object oCaster, int nSpell) +{ + object oTarget = OBJECT_INVALID; + string sGroup = Get2DAString("ai_spells", "Buff_Group", nSpell); + if(sGroup == "") sGroup = IntToString(nSpell); + string sBuffGroup = "AI_USED_SPELL_GROUP_" + sGroup; + string sBuffTarget = Get2DAString("ai_spells", "Buff_Target", nSpell); + if(AI_DEBUG) ai_Debug("0i_spells", "769", "BuffTarget: " + sBuffTarget); + if(sBuffTarget == "0") + { + if(ai_SpellGroupNotCast(oCaster, sBuffGroup) && + !GetHasSpellEffect(nSpell, oCaster) && + ai_CanUseSpell(oCaster, oTarget, nSpell, 0)) + { + oTarget = oCaster; + } + } + else if(sBuffTarget == "1") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_STRENGTH, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "2") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_DEXTERITY, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "3") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_CONSTITUTION, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "4") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_INTELLIGENCE, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "5") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_WISDOM, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "6") + oTarget = ai_BuffHighestAbilityScoreTarget(oCaster, nSpell, ABILITY_CHARISMA, "", AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "7") + oTarget = ai_BuffLowestACTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "8") + oTarget = ai_BuffLowestACWithOutACBonus(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "9") + oTarget = ai_BuffHighestAttackTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "10") + oTarget = ai_BuffMostWoundedTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "11") + oTarget = ai_BuffLowestFortitudeSaveTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "12") + oTarget = ai_BuffLowestReflexSaveTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "13") + oTarget = ai_BuffLowestWillSaveTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "14") + oTarget = ai_BuffLowestSaveTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + else if(sBuffTarget == "15") + oTarget = ai_BuffItemTarget(oCaster, nSpell, sBuffGroup, AI_RANGE_BATTLEFIELD); + if(oTarget != OBJECT_INVALID) + { + SetLocalInt(oTarget, sBuffGroup, TRUE); + DelayCommand(6.0, DeleteLocalInt(oTarget, sBuffGroup)); + } + if(AI_DEBUG) ai_Debug("0i_spells", "939", GetName(oCaster) + " is targeting " + GetName(oTarget) + + " with " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))) + " spell" + + " sBuffGroup: " + sBuffGroup + "."); + return oTarget; +} +void ai_CastMemorizedSpell(object oCaster, int nClass, int nSpellLevel, int nSpellSlot, object oTarget, int bInstant, object oPC = OBJECT_INVALID) +{ + int nDomain; + int nSpell = GetMemorizedSpellId(oCaster, nClass, nSpellLevel, nSpellSlot); + if(GetMemorizedSpellIsDomainSpell(oCaster, nClass, nSpellLevel, nSpellSlot) == 1) nDomain = nSpellLevel; + else nDomain = 0; + int nMetaMagic = GetMemorizedSpellMetaMagic(oCaster, nClass, nSpellLevel, nSpellSlot); + if(AI_DEBUG) ai_Debug("0i_spells", "951", "nSpell: " + IntToString(nSpell) + " oTarget: " + GetName(oTarget) + + " nMetaMagic: " + IntToString(nMetaMagic) + " nDomain: " + IntToString(nDomain) + + " bInstant: " + IntToString(bInstant) + " nClass: " + IntToString(nClass)); + ActionCastSpellAtObject(nSpell, oTarget, nMetaMagic, FALSE, nDomain, 0, bInstant); + // Right now I cannot get nClass to work here... + //DelayCommand(fDelay, ActionCastSpellAtObject(nSpell, oTarget, nMetaMagic, FALSE, nDomain, 0, TRUE, nClass)); + if(oPC != OBJECT_INVALID) + { + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_SendMessages(GetName(oCaster) + " has cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_GREEN, oPC); + } +} +void ai_CastKnownSpell(object oCaster, int nClass, int nSpell, object oTarget, int bInstant, object oPC = OBJECT_INVALID) +{ + if(AI_DEBUG) ai_Debug("0i_Spells", "965", GetName(oCaster) + " is casting " + IntToString(nSpell)); + ActionCastSpellAtObject(nSpell, oTarget, 255, FALSE, 0, 0, bInstant); + // Right now I cannot get nClass to work here... + //ActionCastSpellAtObject(nSpell, oTarget, 255, FALSE, 0, 0, TRUE, nClass); + if(oPC != OBJECT_INVALID) + { + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_SendMessages(GetName(oCaster) + " has cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_GREEN, oPC); + } +} +int ai_CheckAndCastSpell(object oCaster, int nSpell, int nSpellGroup, float fDelay, object oTarget, object oPC = OBJECT_INVALID) +{ + int nClassCnt = 1, nClass, nMaxSlot, nSpellLevel, nSpellSlot, nMemorizedSpell, nDomain, nMetaMagic; + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + while(nClassCnt <= AI_MAX_CLASSES_PER_CHARACTER && nClass != CLASS_TYPE_INVALID) + { + nClass = GetClassByPosition(nClassCnt); + // Search all memorized spells for the spell. + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + // Check each level starting with the highest to lowest. + nSpellLevel = 0; + while(nSpellLevel < 10) + { + // Check each slot within each level. + nMaxSlot = GetMemorizedSpellCountByLevel(oCaster, nClass, nSpellLevel); + nSpellSlot = 0; + while(nSpellSlot < nMaxSlot) + { + if(GetMemorizedSpellReady(oCaster, nClass, nSpellLevel, nSpellSlot)) + { + nMemorizedSpell = GetMemorizedSpellId(oCaster, nClass, nSpellLevel, nSpellSlot); + if(nMemorizedSpell == nSpell) + { + ai_CastMemorizedSpell(oCaster, nClass, nSpellLevel, nSpellSlot, oTarget, FALSE, oPC); + return TRUE; + } + } + nSpellSlot++; + } + nSpellLevel++; + } + } + // Check non-memorized known lists for the spell. + else if(GetSpellUsesLeft(oCaster, nClass, nSpell)) + { + ai_CastKnownSpell(oCaster, nClass, nSpell, oTarget, FALSE, oPC); + return TRUE; + } + nClassCnt++; + } + return FALSE; +} +void ai_SetupMonsterBuffTargets(object oCaster) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1020", GetName(oCaster) + " is setting buff targets."); + SetLocalObject (oCaster, "AI_ALLY_TARGET_1" , oCaster); + SetLocalObject (oCaster, "AI_ALLY_TARGET_2", oCaster); + int nCntr = 1; + object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, oCaster, nCntr); + if(AI_DEBUG) ai_Debug("0i_spells", "864", GetName(oCreature) + " nCntr: " + IntToString(nCntr) + + " Distance: " + FloatToString(GetDistanceBetween(oCaster, oCreature), 0, 2)); + while(oCreature != OBJECT_INVALID && nCntr < 8 && GetDistanceBetween(oCaster, oCreature) < AI_RANGE_CLOSE) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1133", "Setting " + GetName(oCreature) + " as AI_ALLY_TARGET_" + IntToString(nCntr + 2)); + SetLocalObject (oCaster, "AI_ALLY_TARGET_" + IntToString(nCntr + 2), oCreature); + oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, oCaster, ++nCntr); + if(AI_DEBUG) ai_Debug("0i_spells", "1136", GetName(oCreature) + " nCntr: " + IntToString(nCntr) + + " Distance: " + FloatToString(GetDistanceBetween(oCaster, oCreature), 0, 2)); + } +} +void ai_SetupAllyTargets(object oCaster, object oPC) +{ + // Setup our targets. + int nTarget; + if(oCaster != oPC) SetLocalObject (oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oPC); + SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCaster); + object oCreature = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oCreature); + int nCntr = 1; + int nMaxHenchman = GetMaxHenchmen() + nTarget; + object oHenchman = GetHenchman(oPC, nCntr); + while(oHenchman != OBJECT_INVALID && nCntr <= nMaxHenchman) + { + if(oHenchman == OBJECT_INVALID) break; + if(oHenchman != oCaster) SetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(++nTarget), oHenchman); + oHenchman = GetHenchman(oPC, ++nCntr); + } + nCntr = 1; + while(nCntr <= nMaxHenchman) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1166", "AI_ALLY_TARGET_" + IntToString(nCntr) + ": " + + GetName(GetLocalObject(oCaster, "AI_ALLY_TARGET_" + IntToString(nCntr)))); + nCntr++; + } +} +void ai_SetupAllyHealingTargets(object oCaster, object oPC) +{ + int nMaxHenchman = 1; + if(oPC == OBJECT_INVALID) oPC = oCaster; + if(ai_GetAIMode(oCaster, AI_MODE_PARTY_HEALING_OFF)) + { + if(!ai_GetAIMode(oCaster, AI_MODE_SELF_HEALING_OFF)) SetLocalObject(oCaster, "AI_ALLY_HEAL_1", oCaster); + } + else + { + int nTarget; + if(oCaster != oPC) + { + SetLocalObject (oCaster, "AI_ALLY_HEAL_1", oPC); + nTarget++; + } + if(!ai_GetAIMode(oCaster, AI_MODE_SELF_HEALING_OFF)) + { + SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCaster); + } + object oCreature = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + oCreature = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oCaster); + if(oCreature != OBJECT_INVALID) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oCreature); + int nCntr = 1; + nMaxHenchman = GetMaxHenchmen() + nTarget; + object oHenchman = GetHenchman(oPC, nCntr); + while(oHenchman != OBJECT_INVALID && nTarget <= nMaxHenchman) + { + if(oHenchman == OBJECT_INVALID) break; + if(oHenchman != oCaster) SetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(++nTarget), oHenchman); + oHenchman = GetHenchman(oPC, ++nCntr); + } + } + int nCntr = 1; + while(nCntr <= nMaxHenchman) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1211", "AI_ALLY_HEAL_" + IntToString(nCntr) + ": " + + GetName(GetLocalObject(oCaster, "AI_ALLY_HEAL_" + IntToString(nCntr++)))); + } +} +void ai_ClearBuffTargets(object oCaster, string sVariable) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1216", GetName(oCaster) + " is clearing " + sVariable + " targets."); + int nIndex; + int nMaxTargets = GetMaxHenchmen() + 6; + for(nIndex = 1; nIndex < nMaxTargets; nIndex++) + { + DeleteLocalObject (oCaster, sVariable + IntToString(nIndex)); + } +} +void ai_CheckForPerDayProperties(object oCreature, object oItem, int nBuffType, int bEquiped = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1150", "Checking Item properties on " + GetName(oItem)); + // We have established that we can use the item if it is equiped. + if(!bEquiped && !ai_CheckIfCanUseItem(oCreature, oItem)) return; + int nPerDay, nCharges, nUses, nSpellBuffDuration; + int nIprpSubType, nSpell, nLevel, nIPType, nIndex; + object oTarget; + itemproperty ipProp = GetFirstItemProperty(oItem); + // Lets skip this if there are no properties. + if(!GetIsItemPropertyValid(ipProp)) return; + // Check for cast spell property and add them to the talent list. + while(GetIsItemPropertyValid(ipProp)) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1163", "ItempropertyType(15): " + IntToString(GetItemPropertyType(ipProp))); + nIPType = GetItemPropertyType(ipProp); + if(nIPType == ITEM_PROPERTY_CAST_SPELL) + { + // Get how they use the item (charges or uses per day). + nUses = GetItemPropertyCostTableValue(ipProp); + // We only check uses per day. + if(AI_DEBUG) ai_Debug("0i_spells", "1172", "Item uses: " + IntToString(nPerDay)); + if(nUses > 7 && nUses < 13) + { + nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(AI_DEBUG) ai_Debug("0i_spells", "1176", "Item uses per day: " + IntToString(nPerDay)); + if(nPerDay > 0) + { + // SubType is the ip spell index for iprp_spells.2da + nIprpSubType = GetItemPropertySubType(ipProp); + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + nSpellBuffDuration = StringToInt(Get2DAString("ai_spells", "Buff_Duration", nSpell)); + if(AI_DEBUG) ai_Debug("0i_spells", "1183", "nSpell: " + IntToString(nSpell) + + " nBuffType: " + IntToString(nBuffType) + + " nSpellBuffDuration: " + IntToString(nSpellBuffDuration)); + if(nBuffType == nSpellBuffDuration || nBuffType == 1) + { + oTarget = ai_GetBuffTarget(oCreature, nSpell); + if(oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1190", GetName(oCreature) + " is using" + + GetName(oItem) + " to cast " + IntToString(nSpell) + + " on " + GetName(oTarget)); + ActionUseItemOnObject(oItem, ipProp, oTarget); + } + } + } + } + } + ipProp = GetNextItemProperty(oItem); + } +} +void ai_CheckForPerDayItems(object oCreature, object oPC, int nBuffType) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1198", GetName(oCreature) + ": Checking items for per day buffs."); + if(!ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC_ITEMS)) + { + int bEquiped; + string sSlots; + // Cycle through all the creatures inventory items. + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetIdentified(oItem)) + { + // Does the item need to be equiped to use its powers? + sSlots = Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)); + if(AI_DEBUG) ai_Debug("0i_talents", "1211", GetName(oItem) + " requires " + Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)) + " slots."); + if(sSlots == "0x00000") ai_CheckForPerDayProperties(oCreature, oItem, nBuffType); + } + oItem = GetNextItemInInventory(oCreature); + } + int nSlot; + // Cycle through all the creatures equiped items. + oItem = GetItemInSlot(nSlot, oCreature); + while(nSlot < 11) + { + if(oItem != OBJECT_INVALID) ai_CheckForPerDayProperties(oCreature, oItem, nBuffType, TRUE); + oItem = GetItemInSlot(++nSlot, oCreature); + } + oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCreature); + if(oItem != OBJECT_SELF) ai_CheckForPerDayProperties(oCreature, oItem, nBuffType, TRUE); + } + // Clean up our variables. Must be done here since these are actions! + int nCntr; + object oTarget; + while(nCntr < 11) + { + oTarget = GetLocalObject(oCreature, "AI_ALLY_TARGET_" + IntToString(nCntr)); + if(oTarget != OBJECT_INVALID) + { + ai_ClearSpellsCastGroups(oTarget); + DeleteLocalObject(oCreature, "AI_ALLY_TARGET_" + IntToString(nCntr)); + } + nCntr++; + } +} +void ai_CheckForBuffSpells(struct stSpell stSpell) +{ + ai_SetupAllyTargets(stSpell.oCaster, stSpell.oPC); + stSpell.nPosition = 1; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + if(AI_DEBUG) ai_Debug("0i_spells", "1208", "nClass: " + IntToString(stSpell.nClass)); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + if(AI_DEBUG) ai_Debug("0i_spells", "1210", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + if(AI_DEBUG) ai_Debug("0i_spells", "1214", "Memorizes Spells: " + Get2DAString("classes", "MemorizesSpells", stSpell.nClass)); + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedBuff(stSpell)); + return; + } + else + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastKnownBuff(stSpell)); + return; + } + } + stSpell.nPosition++; + } + ai_CheckForPerDayItems(stSpell.oCaster, stSpell.oPC, stSpell.nBuffType); +} +void ai_ActionCastMemorizedSummons(struct stSpell stSpell) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1122", "Start of ActionCastMemorizedSummons!"); + int nSpell; + string sBuffGroup, sBuffTarget; + object oTarget; + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + //ai_Debug("0i_spells", "1128", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + //ai_Debug("0i_spells", "1131", "nLevel: " + IntToString(stSpell.nLevel)); + while(stSpell.nLevel > -1) + { + //ai_Debug("0i_spells", "1134", "nMaxSlots: " + IntToString(stSpell.nMaxSlots) + + // " nSlots: " + IntToString(stSpell.nSlot)); + while(stSpell.nSlot < stSpell.nMaxSlots) + { + //ai_Debug("0i_spells", "1238", "Ready: " + IntToString(GetMemorizedSpellReady(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot))); + if(GetMemorizedSpellReady(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot)) + { + nSpell = GetMemorizedSpellId(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot); + //ai_Debug("0i_spells", "1142", "nSpell: " + IntToString(nSpell)); + if(Get2DAString("ai_spells", "Category", nSpell) == "S") + { + SetLocalInt(stSpell.oCaster, "AI_USED_SPELL_GROUP_-2", TRUE); + ai_CastMemorizedSpell(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot, stSpell.oCaster, TRUE, stSpell.oPC); + stSpell.nPosition = 1; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + DelayCommand(2.0, ai_SetupAllyTargets(stSpell.oCaster, stSpell.oPC)); + DelayCommand(2.0 + 0.5, AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedBuff(stSpell))); + return; + } + } + stSpell.nSlot++; + } + stSpell.nLevel--; + //ai_Debug("0i_spells", "1153", "nLevel: " + IntToString(stSpell.nLevel)); + if(stSpell.nLevel > -1) + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + } + } + } + stSpell.nPosition++; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + //ai_Debug("0i_spells", "1164", "nClass: " + IntToString(stSpell.nClass)); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nSlot = 0; + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + } + else + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastKnownBuff(stSpell)); + return; + } + } + } + ai_CheckForBuffSpells(stSpell); +} +void ai_ActionCastKnownSummons(struct stSpell stSpell) +{ + //ai_Debug("0i_spells", "1184", "Start of ActionCastKnownSummons!"); + int nSpell; + string sBuffGroup, sBuffTarget; + object oTarget; + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + //ai_Debug("0i_spells", "1190", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + //ai_Debug("0i_spells", "1193", "nLevel: " + IntToString(stSpell.nLevel)); + while(stSpell.nLevel > -1) + { + if(stSpell.nMaxSlots) + { + //ai_Debug("0i_spells", "1198", "nMaxSlots: " + IntToString(stSpell.nMaxSlots) + + // " nSlots: " + IntToString(stSpell.nSlot)); + while(stSpell.nSlot < stSpell.nMaxSlots) + { + nSpell = GetKnownSpellId(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot); + //ai_Debug("0i_spells", "1203", "Ready: " + IntToString(GetSpellUsesLeft(stSpell.oCaster, stSpell.nClass, nSpell))); + if(GetSpellUsesLeft(stSpell.oCaster, stSpell.nClass, nSpell)) + { + if(Get2DAString("ai_spells", "Category", nSpell) == "S") + { + SetLocalInt(stSpell.oCaster, "AI_USED_SPELL_GROUP_S", TRUE); + //ai_Debug("0i_spells", "1209", "nSpell: " + IntToString(nSpell)); + ai_CastKnownSpell(stSpell.oCaster, stSpell.nClass, nSpell, stSpell.oCaster, TRUE, stSpell.oPC); + stSpell.nPosition = 1; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + ai_SetupAllyTargets(stSpell.oCaster, stSpell.oPC); + DelayCommand(AI_HENCHMAN_BUFF_DELAY, AssignCommand(stSpell.oCaster, ai_ActionCastKnownBuff(stSpell))); + return; + } + } + stSpell.nSlot++; + } + } + stSpell.nLevel--; + //ai_Debug("0i_spells", "1218", "nLevel: " + IntToString(stSpell.nLevel)); + if(stSpell.nLevel > -1) + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + } + } + } + stSpell.nPosition++; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + //ai_Debug("0i_spells", "1229", "nClass: " + IntToString(stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nSlot = 0; + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedBuff(stSpell)); + return; + } + else stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + } + } + ai_CheckForBuffSpells(stSpell); +} +void ai_ActionCastMemorizedBuff(struct stSpell stSpell) +{ + int nSpell; + string sBuffGroup, sBuffTarget; + object oTarget; + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + ai_Debug("0i_spells", "1252", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + ai_Debug("0i_spells", "1255", "nLevel: " + IntToString(stSpell.nLevel)); + while(stSpell.nLevel > -1) + { + ai_Debug("0i_spells", "1258", "nMaxSlots: " + IntToString(stSpell.nMaxSlots) + + " nSlots: " + IntToString(stSpell.nSlot)); + while(stSpell.nSlot < stSpell.nMaxSlots) + { + ai_Debug("0i_spells", "1262", "Ready: " + IntToString(GetMemorizedSpellReady(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot))); + if(GetMemorizedSpellReady(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot)) + { + nSpell = GetMemorizedSpellId(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot); + int nSpellBuffDuration = StringToInt(Get2DAString("ai_spells", "Buff_Duration", nSpell)); + ai_Debug("0i_spells", "1267", "nBuffType: " + IntToString(stSpell.nBuffType) + + " nSpellBuffDuration: " + IntToString(nSpellBuffDuration) + + " sBuffGroup: " + Get2DAString("ai_spells", "Buff_Group", nSpell)); + if(stSpell.nBuffType == nSpellBuffDuration || stSpell.nBuffType == 1) + { + if(stSpell.nTarget > 0) + { + sBuffTarget = Get2DAString("ai_spells", "Buff_Target", nSpell); + oTarget = GetLocalObject(stSpell.oCaster, "AI_ALLY_TARGET_" + IntToString(stSpell.nTarget)); + if(sBuffTarget != "0" || (sBuffTarget == "0" && stSpell.oCaster == oTarget)) + { + sBuffGroup = "AI_USED_SPELL_GROUP_" + Get2DAString("ai_spells", "Buff_Group", nSpell); + if(!ai_SpellGroupNotCast(oTarget, sBuffGroup)) oTarget == OBJECT_INVALID; + } + else oTarget == OBJECT_INVALID; + } + else oTarget = ai_GetBuffTarget(stSpell.oCaster, nSpell); + ai_Debug("0i_spells", "1284", "nSpell: " + IntToString(nSpell) + + " oTarget: " + GetName(oTarget)); + if(oTarget != OBJECT_INVALID) + { + ai_CastMemorizedSpell(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot, oTarget, TRUE, stSpell.oPC); + stSpell.nSlot++; + DelayCommand(AI_HENCHMAN_BUFF_DELAY, AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedBuff(stSpell))); + return; + } + } + } + stSpell.nSlot++; + } + stSpell.nLevel--; + ai_Debug("0i_spells", "1298", "nLevel: " + IntToString(stSpell.nLevel)); + if(stSpell.nLevel > -1) + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + } + } + } + stSpell.nPosition++; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + ai_Debug("0i_spells", "1309", "nClass: " + IntToString(stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nSlot = 0; + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + } + else + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastKnownBuff(stSpell)); + return; + } + } + } + ai_CheckForPerDayItems(stSpell.oCaster, stSpell.oPC, stSpell.nBuffType); +} +void ai_ActionCastKnownBuff(struct stSpell stSpell) +{ + int nSpell; + string sBuffGroup, sBuffTarget; + object oTarget; + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + //ai_Debug("0i_spells", "1347", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + //ai_Debug("0i_spells", "1350", "nLevel: " + IntToString(stSpell.nLevel)); + while(stSpell.nLevel > -1) + { + if(stSpell.nMaxSlots) + { + //ai_Debug("0i_spells", "1356", "nMaxSlots: " + IntToString(stSpell.nMaxSlots) + + // " nSlots: " + IntToString(stSpell.nSlot)); + while(stSpell.nSlot < stSpell.nMaxSlots) + { + nSpell = GetKnownSpellId(stSpell.oCaster, stSpell.nClass, stSpell.nLevel, stSpell.nSlot); + int nSpellBuffDuration = StringToInt(Get2DAString("ai_spells", "Buff_Duration", nSpell)); + //ai_Debug("0i_spells", "1361", "nBuffType: " + IntToString(stSpell.nBuffType) + + // " nSpellBuffDuration: " + IntToString(nSpellBuffDuration) + + // " sBuffGroup: " + Get2DAString("ai_spells", "Buff_Group", nSpell)); + if(stSpell.nBuffType == nSpellBuffDuration || stSpell.nBuffType == 1) + { + //ai_Debug("0i_spells", "1367", "Ready: " + IntToString(GetSpellUsesLeft(stSpell.oCaster, stSpell.nClass, nSpell))); + if(GetSpellUsesLeft(stSpell.oCaster, stSpell.nClass, nSpell)) + { + if(stSpell.nTarget > 0) + { + sBuffTarget = Get2DAString("ai_spells", "Buff_Target", nSpell); + oTarget = GetLocalObject(stSpell.oCaster, "AI_ALLY_TARGET_" + IntToString(stSpell.nTarget)); + if(sBuffTarget != "0" || (sBuffTarget == "0" && stSpell.oCaster == oTarget)) + { + sBuffGroup = "AI_USED_SPELL_GROUP_" + Get2DAString("ai_spells", "Buff_Group", nSpell); + if(!ai_SpellGroupNotCast(oTarget, sBuffGroup)) oTarget == OBJECT_INVALID; + } + else oTarget == OBJECT_INVALID; + } + else oTarget = ai_GetBuffTarget(stSpell.oCaster, nSpell); + //ai_Debug("0i_spells", "1382", "nSpell: " + IntToString(nSpell) + + // " oTarget: " + GetName(oTarget)); + if(oTarget != OBJECT_INVALID) + { + ai_CastKnownSpell(stSpell.oCaster, stSpell.nClass, nSpell, oTarget, TRUE, stSpell.oPC); + stSpell.nSlot++; + DelayCommand(AI_HENCHMAN_BUFF_DELAY, AssignCommand(stSpell.oCaster, ai_ActionCastKnownBuff(stSpell))); + return; + } + } + } + stSpell.nSlot++; + } + } + stSpell.nLevel--; + //ai_Debug("0i_spells", "1396", "nLevel: " + IntToString(stSpell.nLevel)); + if(stSpell.nLevel > -1) + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + stSpell.nSlot = 0; + } + } + } + stSpell.nPosition++; + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + //ai_Debug("0i_spells", "921", "nClass: " + IntToString(stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + stSpell.nSlot = 0; + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedBuff(stSpell)); + return; + } + else stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + } + } + ai_CheckForPerDayItems(stSpell.oCaster, stSpell.oPC, stSpell.nBuffType); +} +void ai_CastBuffs(object oCaster, int nBuffType, int nTarget, object oPC) +{ + // buff types: 1 - All, 2 - Short duration, 3 - Long duration + // Buff groups are used to prevent a henchmen to cast spells that have the same effect, + // for example: resist elements and protection from elements are similiar so the henchmen + // would cast only the most powerful among these if he has them both. + if(AI_DEBUG) ai_Debug("0i_spells", "1670", GetName(oCaster) + " is casting buffs: " + IntToString(nBuffType) + + " nTarget: " + IntToString(nTarget) + "!"); + struct stSpell stSpell; + stSpell.oPC = oPC; + stSpell.oCaster = oCaster; + stSpell.nBuffType = nBuffType; + stSpell.nTarget = nTarget; + stSpell.nPosition = 1; + // Look for summons spells on All, Long durations and the whole party. + if((nBuffType == 1 || nBuffType == 3) && nTarget == 0) + { + while(stSpell.nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + stSpell.nClass = GetClassByPosition(stSpell.nPosition, stSpell.oCaster); + if(AI_DEBUG) ai_Debug("0i_spells", "1684", "nClass: " + IntToString(stSpell.nClass)); + if(stSpell.nClass == CLASS_TYPE_INVALID) break; + if(AI_DEBUG) ai_Debug("0i_spells", "1686", "SpellCaster: " + Get2DAString("classes", "SpellCaster", stSpell.nClass)); + if(Get2DAString("classes", "SpellCaster", stSpell.nClass) == "1") + { + stSpell.nLevel = (GetLevelByPosition(stSpell.nPosition, stSpell.oCaster) + 1) / 2; + if(AI_DEBUG) ai_Debug("0i_spells", "1692", "MemorizesSpells: " + Get2DAString("classes", "MemorizesSpells", stSpell.nClass)); + if(Get2DAString("classes", "MemorizesSpells", stSpell.nClass) == "1") + { + stSpell.nMaxSlots = GetMemorizedSpellCountByLevel(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastMemorizedSummons(stSpell)); + return; + } + else + { + stSpell.nMaxSlots = GetKnownSpellCount(stSpell.oCaster, stSpell.nClass, stSpell.nLevel); + AssignCommand(stSpell.oCaster, ai_ActionCastKnownSummons(stSpell)); + return; + } + } + stSpell.nPosition++; + } + // Exit here; if we summoned a monster then it linked off of that spell + // cast to continue the action queue for all buff spell cast actions. + } + ai_CheckForBuffSpells(stSpell); +} +int ai_CastSpontaneousCure(object oCreature, object oTarget, object oPC) +{ + if(ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) return FALSE; + if(ai_GetMagicMode(oCreature, AI_MAGIC_NO_SPONTANEOUS_CURE)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_spells", "1643", GetName(oCreature) + " is looking to cast a spontaneous cure spell."); + if(!GetLevelByClass(CLASS_TYPE_CLERIC, oCreature)) return FALSE; + int nDamage = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + int nSpell, nSlot, nMaxSlots, nLevel = 4; + int nSpellSave, nSlotSave, nLevelSave = 5; + string sSpellName; + while(nLevel > -1) + { + // We check CLASS_TYPE_CLERIC as thats the only class with spontaneous cure spells. + nMaxSlots = GetMemorizedSpellCountByLevel(oCreature, CLASS_TYPE_CLERIC, nLevel); + nSlot = 0; + if(AI_DEBUG) ai_Debug("0i_spells", "1653", "nLevel: " + IntToString(nLevel) + " nMaxSlots: " + IntToString(nMaxSlots)); + while(nSlot < nMaxSlots) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1656", "nSlot: " + IntToString(nSlot) + + " Spell Ready: " + IntToString(GetMemorizedSpellReady(oCreature, CLASS_TYPE_CLERIC, nLevel, nSlot))); + if(GetMemorizedSpellReady(oCreature, CLASS_TYPE_CLERIC, nLevel, nSlot)) + { + if(nLevel == 4) nSpell = SPELL_CURE_CRITICAL_WOUNDS; + else if(nLevel == 3) nSpell = SPELL_CURE_SERIOUS_WOUNDS; + else if(nLevel == 2) nSpell = SPELL_CURE_MODERATE_WOUNDS; + else if(nLevel == 1) nSpell = SPELL_CURE_LIGHT_WOUNDS; + else nSpell = 0; + if(AI_DEBUG) ai_Debug("0i_spells", "1665", "nSpell: " + IntToString(nSpell)); + if(nSpell) + { + if(ai_ShouldWeCastThisCureSpell(nSpell, nDamage)) + { + SetMemorizedSpellReady(oCreature, CLASS_TYPE_CLERIC, nLevel, nSlot, FALSE); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_SendMessages(GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_MAGENTA, oPC); + if(AI_DEBUG) ai_Debug("0i_spells", "1673", GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + "."); + ActionCastSpellAtObject(nSpell, oTarget, 255, TRUE); + return TRUE; + } + // Save the lowest level cure spell as we might need to cast it. + else if(nLevel < nLevelSave) + { + nSpellSave = nSpell; + nLevelSave = nLevel; + nSlotSave = nSlot; + } + } + } + nSlot++; + } + nLevel--; + } + // Did we find a cure spell? If we did then use it. + if(nSpellSave) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1693", GetName(oCreature) + " has cast the lowest level cure spell on " + GetName(oTarget) + "."); + SetMemorizedSpellReady(oCreature, CLASS_TYPE_CLERIC, nLevelSave, nSlotSave, FALSE); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpellSave))); + ai_SendMessages(GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_MAGENTA, oPC); + ActionCastSpellAtObject(nSpellSave, oTarget, 255, TRUE); + return TRUE; + } + return FALSE; +} +int ai_CastMemorizedHealing(object oCreature, object oTarget, object oPC, int nClass) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1702", GetName(oCreature) + " is looking to cast a memorized cure spell."); + int nDamage = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + int nSpell, nSlot, nMaxSlots, nLevel = 9; + int nClassSave, nSlotSave, nLevelSave = 10; + while(nLevel > -1) + { + nMaxSlots = GetMemorizedSpellCountByLevel(oCreature, nClass, nLevel); + nSlot = 0; + if(AI_DEBUG) ai_Debug("0i_spells", "1710", "nLevel: " + IntToString(nLevel) + " nMaxSlots: " + IntToString(nMaxSlots)); + while(nSlot < nMaxSlots) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1713", "nSlot: " + IntToString(nSlot) + + " Spell Ready: " + IntToString(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot))); + if(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot)) + { + nSpell = GetMemorizedSpellId(oCreature, nClass, nLevel, nSlot); + if(ai_ShouldWeCastThisCureSpell(nSpell, nDamage)) + { + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(AI_DEBUG) ai_Debug("0i_spells", "1721", GetName(oCreature) + " has cast " + sSpellName + " on " + GetName(oTarget) + "."); + ai_CastMemorizedSpell(oCreature, nClass, nLevel, nSlot, oTarget, FALSE, oPC); + return TRUE; + } + // Save the lowest level cure spell as we might need to cast it. + else if(nLevel < nLevelSave && (nSpell > 26 && nSpell < 32)) + { + nClassSave = nClass; + nLevelSave = nLevel; + nSlotSave = nSlot; + } + } + nSlot++; + } + nLevel--; + } + // Did we find a cure spell? If we did then use it. + if(nLevelSave < 10) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1740", GetName(oCreature) + " has cast the lowest level cure spell on " + GetName(oTarget) + "."); + ai_CastMemorizedSpell(oCreature, nClassSave, nLevelSave, nSlotSave, oTarget, FALSE, oPC); + return TRUE; + } + return FALSE; +} +int ai_CastKnownHealing(object oCreature, object oTarget, object oPC, int nClass) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1748", GetName(oCreature) + " is looking to cast a known cure spell."); + int nDamage = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + int nSpell, nSlot, nMaxSlots, nLevel = 9; + int nClassSave, nSpellSave, nLevelSave = 10; + while(nLevel > -1) + { + nMaxSlots = GetKnownSpellCount(oCreature, nClass, nLevel); + nSlot = 0; + if(AI_DEBUG) ai_Debug("0i_spells", "1756", "nLevel: " + IntToString(nLevel) + " nMaxSlots: " + IntToString(nMaxSlots)); + while(nSlot < nMaxSlots) + { + nSpell = GetKnownSpellId(oCreature, nClass, nLevel, nSlot); + if(AI_DEBUG) ai_Debug("0i_spells", "1760", "nSlot: " + IntToString(nSlot) + + " Spell Ready: " + IntToString(GetSpellUsesLeft(oCreature, nClass, nSpell))); + if(GetSpellUsesLeft(oCreature, nClass, nSpell)) + { + if(ai_ShouldWeCastThisCureSpell(nSpell, nDamage)) + { + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(AI_DEBUG) ai_Debug("0i_spells", "1767", GetName(oCreature) + " has cast " + sSpellName + " on " + GetName(oTarget) + "."); + ai_CastKnownSpell(oCreature, nClass, nSpell, oTarget, FALSE, oPC); + return TRUE; + } + // Save the lowest level cure spell as we might need to cast it. + else if(nLevel < nLevelSave && (nSpell > 26 && nSpell < 32)) + { + nClassSave = nClass; + nLevelSave = nLevel; + nSpellSave = nSpell; + } + } + nSlot++; + } + nLevel--; + } + return FALSE; + // Did we find a cure spell? If we did then use it. + if(nLevelSave < 10) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1781", GetName(oCreature) + " has cast the lowest level cure spell on " + GetName(oTarget) + "."); + ai_CastKnownSpell(oCreature, nClassSave, nSpellSave, oTarget, FALSE, oPC); + return TRUE; + } +} +int ai_ConcentrationCondition(object oCreature) +{ + int nType; + effect eEffect = GetFirstEffect(oCreature); + while(GetIsEffectValid(eEffect)) + { + nType = GetEffectType(eEffect); + if(nType == EFFECT_TYPE_STUNNED || nType == EFFECT_TYPE_PARALYZE || + nType == EFFECT_TYPE_SLEEP || nType == EFFECT_TYPE_FRIGHTENED || + nType == EFFECT_TYPE_PETRIFY || nType == EFFECT_TYPE_CONFUSED || + nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_POLYMORPH) + { + return TRUE; + } + eEffect = GetNextEffect(oCreature); + } + return FALSE; +} +void ai_SpellConcentrationCheck(object oCaster = OBJECT_SELF) +{ + object oMaster = GetMaster(); + if(GetLocalInt(oCaster,"X2_L_CREATURE_NEEDS_CONCENTRATION")) + { + if(GetIsObjectValid(oMaster)) + { + int nAction = GetCurrentAction(oMaster); + // master doing anything that requires attention and breaks concentration + if(nAction == ACTION_DISABLETRAP || nAction == ACTION_TAUNT || + nAction == ACTION_PICKPOCKET || nAction ==ACTION_ATTACKOBJECT || + nAction == ACTION_COUNTERSPELL || nAction == ACTION_FLAGTRAP || + nAction == ACTION_CASTSPELL || nAction == ACTION_ITEMCASTSPELL) + { + SignalEvent(oCaster,EventUserDefined(X2_EVENT_CONCENTRATION_BROKEN)); + } + else if(ai_ConcentrationCondition(oMaster)) + { + SignalEvent(oCaster,EventUserDefined(X2_EVENT_CONCENTRATION_BROKEN)); + } + } + } +} +int ai_CastInMelee(object oCreature, int nSpell, int nInMelee) +{ + // If this is a spell and we are in melee. + if(nInMelee > 0 && !GetHasFeat(FEAT_EPIC_IMPROVED_COMBAT_CASTING, oCreature)) + { + // Using DC 19 so we will use with up to a 50% failure. + int nSpellLevel = StringToInt(Get2DAString("spells", "Innate", nSpell)); + int nDC = AI_DEFENSIVE_CASTING_DC + nSpellLevel; + int nRoll = Random(AI_DEFENSIVE_CASTING_DIE) + 1; + int nConcentration = GetSkillRank(SKILL_CONCENTRATION, oCreature); + if(GetHasFeat(FEAT_COMBAT_CASTING, oCreature)) nConcentration += 4; + if(AI_DEBUG) ai_Debug("0i_spells", "1081", "Use Defensive Casting? nDC: " + IntToString(nDC) + " FEAT_COMBAT_CASTING: " + + IntToString(GetHasFeat(FEAT_COMBAT_CASTING, oCreature)) + + " nConcentration: " + IntToString(nConcentration) + " + nRoll: " + IntToString(nRoll)); + if(nConcentration + nRoll > nDC) + { + if(AI_DEBUG) ai_Debug("0i_spells", "1086", GetName(oCreature) + " is casting defensively!"); + SetActionMode(oCreature, ACTION_MODE_DEFENSIVE_CAST, TRUE); + } + // Defensive casting is a bad idea so maybe casting anyspell is a bad idea. + else + { + object oMelee = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(GetIsObjectValid(oMelee)) + { + nRoll = Random(AI_CASTING_IN_MELEE_ROLL) + 1; + nDC = AI_CASTING_IN_MELEE_DC + nSpellLevel + nInMelee * ai_GetCreatureAttackBonus(oMelee); + if(AI_DEBUG) ai_Debug("0i_spells", "1097", "Cast anyway: nConcentration: " + IntToString(nConcentration) + + " nRoll: " + IntToString(nRoll) + " nDC: " + IntToString(nDC) + + " oMelee: " + GetName(oMelee)); + if(nConcentration + nRoll > nDC) return TRUE; + if(AI_DEBUG) ai_Debug("0i_spells", "1101", GetName(oCreature) + " is not casting in melee against " + GetName(oMelee)); + return FALSE; + } + } + } + // We don't need to cast defensively so lets make sure it's off. + else if(GetActionMode(oCreature, ACTION_MODE_DEFENSIVE_CAST)) + { + SetActionMode(oCreature, ACTION_MODE_DEFENSIVE_CAST, FALSE); + } + return TRUE; +} +float ai_GetOffensiveSpellSearchRange(object oCreature, int nSpell) +{ + // Search the spell range + the distance to the closest enemy - 7.5 meters). + // This will keep the caster from running up on an enemy to cast. + // But allow them to move up some if needed. + float fRange = ai_GetSpellRange(nSpell); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + float fEnemyDistance = GetDistanceBetween(oCreature, oNearestEnemy); + // Spell range is less than the nearest enemy. Restrict based on nearest enemy. + // Spell range is less than the nearestenemy. Check enemy action then adjust. + if(fRange < fEnemyDistance) + { + // We check this because if the enemy is moving or has not started acting + // then we don't want to move up on them as they might move towards us! + int nAction = GetCurrentAction(oNearestEnemy); + if(AI_DEBUG) ai_Debug("0i_spells", "1130", GetName(oNearestEnemy) + " current action: " + IntToString(nAction)); + if(nAction != ACTION_MOVETOPOINT || nAction != ACTION_ITEMCASTSPELL || + nAction != ACTION_INVALID || nAction != ACTION_USEOBJECT || + nAction != ACTION_RANDOMWALK) fRange = fEnemyDistance + (fRange - 7.5); + } + if(fRange > AI_RANGE_BATTLEFIELD) return AI_RANGE_BATTLEFIELD; + else if(fRange < 0.1f) return 0.1f; + return fRange; +} +int ai_ShouldWeCastThisCureSpell(int nSpell, int nDamage) +{ + if(AI_DEBUG) ai_Debug("0i_spells", "1127", "nSpell: " + IntToString(nSpell) + " nDamage: " + + IntToString(nDamage)); + if(nSpell == SPELL_HEAL && nDamage > 50) return TRUE; + else if(nSpell == SPELL_CURE_CRITICAL_WOUNDS && nDamage > 31) return TRUE; + else if(nSpell == SPELL_CURE_SERIOUS_WOUNDS && nDamage > 23) return TRUE; + else if(nSpell == SPELL_CURE_MODERATE_WOUNDS && nDamage > 15) return TRUE; + else if(nSpell == SPELL_CURE_LIGHT_WOUNDS && nDamage > 6) return TRUE; + else if(nSpell == SPELL_CURE_MINOR_WOUNDS) return TRUE; + return FALSE; +} +void ai_CastWidgetSpell(object oPC, object oAssociate, object oTarget, location lLocation) +{ + int nIndex = GetLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + DeleteLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jSpell = JsonArrayGet(jWidget, nIndex); + int nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + int nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + int nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + int nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + //SendMessageToPC(oPC, "nSpell: " + IntToString(nSpell) + + // " oTarget: " + GetName(oTarget) + + // " nMetaMagic: " + IntToString(nMetaMagic) + + // " nDomain: " + IntToString(nDomain)); + if(GetCurrentAction(oAssociate) != ACTION_CASTSPELL) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + if(!GetIsObjectValid(oTarget)) + { + AssignCommand(oAssociate, ActionCastSpellAtLocation(nSpell, lLocation, nMetaMagic, FALSE, 0, FALSE, -1, FALSE, nDomain)); + } + else AssignCommand(oAssociate, ActionCastSpellAtObject(nSpell, oTarget, nMetaMagic, FALSE, nDomain)); + +} +void ai_UseWidgetFeat(object oPC, object oAssociate, object oTarget, location lLocation) +{ + int nIndex = GetLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + DeleteLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jFeat = JsonArrayGet(jWidget, nIndex); + int nFeat = JsonGetInt(JsonArrayGet(jFeat, 5)); + if(ai_GetIsInCombat(oAssociate)) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + //SendMessageToPC(oPC, "0i_spells, 2104, nFeat: " + IntToString(nFeat) + " oTarget: " + GetName(oTarget)); + if(!GetIsObjectValid(oTarget)) + { + AssignCommand(oAssociate, ActionUseFeat(nFeat, OBJECT_INVALID, 0, lLocation)); + } + else AssignCommand(oAssociate, ActionUseFeat(nFeat, oTarget)); +} +void ai_UseWidgetItem(object oPC, object oAssociate, object oTarget, location lLocation) +{ + int nIndex = GetLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + DeleteLocalInt(oAssociate, "AI_WIDGET_SPELL_INDEX"); + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); + json jSpells = JsonArrayGet(jAIData, 10); + json jWidget = JsonArrayGet(jSpells, 2); + json jItem = JsonArrayGet(jWidget, nIndex); + int nSpell = JsonGetInt(JsonArrayGet(jItem, 0)); + int nIprpSubType = JsonGetInt(JsonArrayGet(jItem, 4)); + object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jItem, 5))); + itemproperty ipProperty; + if(ai_GetIsInCombat(oAssociate)) AssignCommand(oAssociate, ai_ClearCreatureActions(TRUE)); + if(nSpell == SPELL_HEALINGKIT) + { + ipProperty = GetFirstItemProperty(oItem); + if(GetItemPropertyType(ipProperty) == ITEM_PROPERTY_HEALERS_KIT) + { + if(ai_GetIsCharacter(oPC)) ai_SendMessages(GetName(oAssociate) + " uses " + GetName(oItem) + " on " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); + AssignCommand(oAssociate, ActionUseItemOnObject(oItem, ipProperty, oTarget)); + return; + } + } + ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(nIprpSubType == GetItemPropertySubType(ipProperty)) break; + ipProperty = GetNextItemProperty(oItem); + } + if(!GetIsObjectValid(oTarget)) + { + AssignCommand(oAssociate, ActionUseItemAtLocation(oItem, ipProperty, lLocation)); + } + else AssignCommand(oAssociate, ActionUseItemOnObject(oItem, ipProperty, oTarget)); +} diff --git a/_module/nss/0i_states_cond.nss b/_module/nss/0i_states_cond.nss new file mode 100644 index 00000000..4c77ccf0 --- /dev/null +++ b/_module/nss/0i_states_cond.nss @@ -0,0 +1,423 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_states_cond +////////////////////////////////////////////////////////////////////////////////////////////////////// + Include scripts that handle states and conditions for combat. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +#include "0i_messages" +#include "0i_time" +//#include "X0_I0_COMBAT" +// Wrapper for ClearAllActions - we have added extra vars to be cleared as well. +// Note this references OBJECT_SELF! +void ai_ClearCreatureActions(int bClearCombatState = FALSE); +// Used in combat to keep track of the creatures last rounds action. +// One use is to make sure we don't use the same spell on the next round. +// 0+ is the spell that was cast, other actions use AI_LAST_ACTION_* constants. +void ai_SetLastAction(object oCreature, int nAction = AI_LAST_ACTION_NONE); +// Returns TRUE if oCreatures last rounds action is equal to nAction. +// 0+ is the spell that was cast, other actions use AI_LAST_ACTION_* constants. +int ai_CompareLastAction(object oCreature, int nAction); +// Sets the correct listen checks on oCreature. +void ai_SetListeningPatterns(object oCreature); +// Returns TRUE if oCreature is an elemental, undead, or golem i.e. non-living. +int ai_IsNonliving(int nRacialType); +// Returns TRUE if oCreature is in combat. +int ai_GetIsInCombat(object oCreature); +// Sets the time that this oCreature's current combat round started. +// Using action based combat rounds has an unfortunate side effect: +// Once you attack in melee you will continue to attack in melee do to hardcoded +// logic. This will "PUSH" your end of round back until it decides to stop attacking! +// We avoid this by setting the time and if we check for combat and 6 seconds has +// passed then we assume the current round is over, ClearAllActions, and start the next round. +void ai_SetCombatRound(object oCreature); +// Clears the current combat round timer by deleting the value. +void ai_EndCombatRound(object oCreature); +// Returns TRUE if AI_COMBAT_ROUND_IN_SECONDS has not passed since ai_SetCombatRound. +// If it returns FALSE then it will clear the current combat round timer. +int ai_IsInCombatRound(object oCreature, int nCombatRound = AI_COMBAT_ROUND_IN_SECONDS); +// Returns TRUE if oCreature is busy. +// This checks various actions to see if oCreature is busy; +// in combat, busy mode, Actions: attacking, casting spell, counterspelling, +// disabling trap, item casting spell, opening lock, resting, setting trap. +int ai_GetIsBusy(object oCreature); +// Returns a value based on the disabling effect. +// Dead = 1, Bleeding = 2, Dying = 2, Stunned = 29, Confused = 24, Paralyzed = 27 +// Frightened 25, Turned = 35, Petrified = 79, Charmed = 23, Disappearappear = 75, +// Time Stop = 66, Dazed = 28, Sleep = 30. +// Returns FALSE if not Disabled. +int ai_Disabled(object oCreature); +// Set one of the AI_MODE_* bitwise constants on oAssociate to bOn. +void ai_SetAIMode(object oAssociate, int nBit, int bOn = TRUE); +// Return if nMode is set on oAssociate. Uses the AI_MODE_* bitwise constants. +int ai_GetAIMode(object oAssociate, int nBit); +// Set one of the AI_MAGIC_* bitwise constants on oAssociate to bOn. +void ai_SetMagicMode(object oAssociate, int nBit, int bOn = TRUE); +// Return if nMode is set on oAssociate. Uses the AI_MAGIC_* bitwise constants. +int ai_GetMagicMode(object oAssociate, int nBit); +// This is based off of the PC's settings for an associate and other creatures use a default. +// Set one of the AI_LOOT_* bitwise constants on oAssociate to bOn. +void ai_SetLootFilter(object oAssociate, int nBit, int bOn = TRUE); +// Return if nMode is set on oAssociate. Uses the AI_LOOT_* bitwise constants. +int ai_GetLootFilter(object oAssociate, int nBit); +// Set one of the AI_IP_* bitwise constants on oCreature to bOn. +void ai_SetItemProperty(object oCreature, string sVarname, int nBit, int bOn = TRUE); +// Return if nMode is set on oCreature. Uses the AI_IP_* bitwise constants. +int ai_GetItemProperty(object oCreature, string sVarname, int nBit); +// Returns the number of hitpoints a creature must have to not be healed. +// This is based off of the PC's settings for an associate and other creatures use a default. +int ai_GetHealersHpLimit(object oCreature, int bInCombat = TRUE); +// Returns TRUE if nCondition is within nCurrentConditions. +// nCurrentConditions is setup in ai_GetNegativeConditions. +int ai_GetHasNegativeCondition(int nCondition, int nCurrentConditions); +// Returns an integer with bitwise flags set that represent the current negative +// conditions on oCreature. ai_GetHasNegativeCondition uses this function. +int ai_GetNegativeConditions(object oCreature); +// Returns TRUE if oObject is in the line of sight of oCreature. +// If the creature is close LineOfSight doesn't work well. +int ai_GetIsInLineOfSight(object oCreature, object oObject); +// Add the specified condition flag to the behavior state of the caller +void ai_SetBehaviorState(int nCondition, int bValid = TRUE); +// Returns TRUE if the specified behavior flag is set on the caller +int ai_GetBehaviorState(int nCondition); +// Highlights the current mode for the widget passed. +void ai_HighlightWidgetMode(object oPC, object oAssociate, int nToken); +// Checks to see if the party scale is correctly adjusted. +void ai_CheckXPPartyScale(object oCreature); + +void ai_ClearCreatureActions(int bClearCombatState = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_states_cond", "89", GetName(OBJECT_SELF) + " is clearing actions (" + + IntToString(bClearCombatState) + ")!"); + DeleteLocalInt(OBJECT_SELF, AI_CURRENT_ACTION_MODE); + ClearAllActions(bClearCombatState); +} +void ai_SetLastAction(object oCreature, int nAction = AI_LAST_ACTION_NONE) +{ + SetLocalInt(oCreature, sLastActionVarname, nAction); +} +int ai_CompareLastAction(object oCreature, int nAction) +{ + // Are we checking to see if we cast a spell? + if(nAction == AI_LAST_ACTION_CAST_SPELL && + GetLocalInt(oCreature, sLastActionVarname) > -1) return TRUE; + // Check other last actions. + return (nAction == GetLocalInt(oCreature, sLastActionVarname)); +} +void ai_SetListeningPatterns(object oCreature) +{ + SetListenPattern(oCreature, AI_I_SEE_AN_ENEMY, AI_ALLY_SEES_AN_ENEMY); + SetListenPattern(oCreature, AI_I_HEARD_AN_ENEMY, AI_ALLY_HEARD_AN_ENEMY); + SetListenPattern(oCreature, AI_ATKED_BY_WEAPON, AI_ALLY_ATKED_BY_WEAPON); + SetListenPattern(oCreature, AI_ATKED_BY_SPELL, AI_ALLY_ATKED_BY_SPELL); + SetListenPattern(oCreature, AI_I_AM_WOUNDED, AI_ALLY_IS_WOUNDED); + SetListenPattern(oCreature, AI_I_AM_DEAD, AI_ALLY_IS_DEAD); + SetListenPattern(oCreature, AI_I_AM_DISEASED, AI_ALLY_IS_DISEASED); + SetListenPattern(oCreature, AI_I_AM_POISONED, AI_ALLY_IS_POISONED); + SetListenPattern(oCreature, AI_I_AM_WEAK, AI_ALLY_IS_WEAK); + SetListening(oCreature, TRUE); +} +int ai_IsNonliving(int nRacialType) +{ + switch(nRacialType) + { + case RACIAL_TYPE_CONSTRUCT: + case RACIAL_TYPE_ELEMENTAL: + case RACIAL_TYPE_UNDEAD: return TRUE; + } + return FALSE; +} +int ai_GetIsInCombat(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_states_cond", "110", GetName(oCreature) + " is in Combat: Enemy Numbers = " + IntToString(GetLocalInt(oCreature, AI_ENEMY_NUMBERS))); + + return GetLocalInt(oCreature, AI_ENEMY_NUMBERS); +} +void ai_SetCombatRound(object oCreature) +{ + SetLocalInt(oCreature, "AI_COMBAT_ROUND_START", SQLite_GetTimeStamp()); + if(AI_DEBUG) ai_Debug("0i_states_cond", "116", " ===============> " + GetName(oCreature) + " ROUND START:" + IntToString(SQLite_GetTimeStamp()) + " <==============="); +} +void ai_EndCombatRound(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_states_cond", "120", " ===============> " + GetName(oCreature) + " ROUND END:" + IntToString(SQLite_GetTimeStamp()) + " <==============="); + DeleteLocalInt(oCreature, "AI_COMBAT_ROUND_START"); +} +int ai_IsInCombatRound(object oCreature, int nCombatRound = AI_COMBAT_ROUND_IN_SECONDS) +{ + int nCombatRoundStart = GetLocalInt(oCreature, "AI_COMBAT_ROUND_START"); + if(AI_DEBUG) ai_Debug("0i_states_cond", "148", " nCombatRoundStart: " + IntToString(nCombatRoundStart)); + if(!nCombatRoundStart) return FALSE; + // New combat round calculator. If 6 seconds has passed then we are on a new round! + int nSQLTime = SQLite_GetTimeStamp(); + int nCombatRoundTime = nSQLTime - nCombatRoundStart; + if(AI_DEBUG) ai_Debug("0i_states_cond", "153", " SQLite_GetTimeStamp: " + IntToString(nSQLTime) + + "(" + IntToString(nSQLTime - nCombatRoundStart) + ")"); + if(nCombatRoundTime < nCombatRound) return TRUE; + ai_EndCombatRound(oCreature); + return FALSE; +} +// Testing to see if we can fix some delaying in combat. +int ai_GetIsBusy(object oCreature) +{ + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("0i_states_cond", "140", GetName(oCreature) + " Get is Busy, action: " + + IntToString(nAction)); + switch(nAction) + { + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_OPENLOCK : + case ACTION_REST : + case ACTION_DISABLETRAP : + case ACTION_ATTACKOBJECT : + case ACTION_COUNTERSPELL : + case ACTION_SETTRAP : return TRUE; + case ACTION_WAIT : + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("0i_states_cond", "153", "nCombatWait: " + IntToString(nCombatWait) + + " AI_AM_I_SEARCHING: " + IntToString(GetLocalInt(oCreature, AI_AM_I_SEARCHING))); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return TRUE; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + else if(GetLocalInt(oCreature, AI_AM_I_SEARCHING)) DeleteLocalInt(oCreature, AI_AM_I_SEARCHING); + return FALSE; + } + case ACTION_MOVETOPOINT : + { + return ai_GetIsInCombat(oCreature); + } + } + return FALSE; +} +int ai_Disabled(object oCreature) +{ + if(GetIsDead(oCreature)) return 1; + // Check for effects. + effect eEffect = GetFirstEffect(oCreature); + while(GetIsEffectValid(eEffect)) + { + switch(GetEffectType(eEffect)) + { + case EFFECT_TYPE_DOMINATED : + { + if(!GetCommandable(oCreature)) SetCommandable(TRUE, oCreature); + return FALSE; + } + case EFFECT_TYPE_STUNNED : + case EFFECT_TYPE_DAZED : + case EFFECT_TYPE_SLEEP : + case EFFECT_TYPE_CONFUSED : + case EFFECT_TYPE_FRIGHTENED : + case EFFECT_TYPE_PARALYZE : + case EFFECT_TYPE_TURNED : + case EFFECT_TYPE_CHARMED : + case EFFECT_TYPE_PETRIFY : + case EFFECT_TYPE_TIMESTOP : + { + if(AI_DEBUG) ai_Debug("0i_stats_cond", "195", GetName(oCreature) + " is disabled(" + + IntToString(GetEffectType(eEffect)) + ")"); + return GetEffectType(eEffect); + } + } + eEffect = GetNextEffect(oCreature); + } + // Not Commandable is basically disabled as far as the AI is concerned. + if(!GetCommandable(oCreature)) + { + if(AI_DEBUG) ai_Debug("0i_stats_cond", "213", GetName(oCreature) + " is disabled(Not Commandable)!"); + return EFFECT_TYPE_PARALYZE; + } + if(AI_DEBUG) ai_Debug("0i_states_cond", "202", GetName(oCreature) + " is not disabled."); + return FALSE; +} +void ai_SetAIMode(object oAssociate, int nBit, int bOn = TRUE) +{ + int nAIModes = GetLocalInt(oAssociate, sAIModeVarname); + if(bOn) nAIModes = nAIModes | nBit; + else nAIModes = nAIModes & ~nBit; + SetLocalInt(oAssociate, sAIModeVarname, nAIModes); + // Set widget to show the mode they are in. + +} +int ai_GetAIMode(object oAssociate, int nBit) +{ + if(GetLocalInt(oAssociate, sAIModeVarname) & nBit) return TRUE; + return FALSE; +} +void ai_SetMagicMode(object oAssociate, int nBit, int bOn = TRUE) +{ + int nMagicModes = GetLocalInt(oAssociate, sMagicModeVarname); + if(bOn) nMagicModes = nMagicModes | nBit; + else nMagicModes = nMagicModes & ~nBit; + SetLocalInt(oAssociate, sMagicModeVarname, nMagicModes); +} +int ai_GetMagicMode(object oAssociate, int nBit) +{ + if(GetLocalInt(oAssociate, sMagicModeVarname) & nBit) return TRUE; + return FALSE; +} +void ai_SetLootFilter(object oAssociate, int nLootBit, int bOn = TRUE) +{ + int nLootFilter = GetLocalInt(oAssociate, sLootFilterVarname); + if(bOn) nLootFilter = nLootFilter | nLootBit; + else nLootFilter = nLootFilter & ~nLootBit; + SetLocalInt(oAssociate, sLootFilterVarname, nLootFilter); +} +int ai_GetLootFilter(object oAssociate, int nBit) +{ + if(GetLocalInt(oAssociate, sLootFilterVarname) & nBit) return TRUE; + return FALSE; +} +void ai_SetItemProperty(object oCreature, string sVarname, int nBit, int bOn = TRUE) +{ + int nItemProperties = GetLocalInt(oCreature, sVarname); + if(bOn) nItemProperties = nItemProperties | nBit; + else nItemProperties = nItemProperties & ~nBit; + SetLocalInt(oCreature, sVarname, nItemProperties); +} +int ai_GetItemProperty(object oCreature, string sVarname, int nBit) +{ + if(GetLocalInt(oCreature, sVarname) & nBit) return TRUE; + return FALSE; +} +int ai_GetHealersHpLimit(object oCreature, int bInCombat = TRUE) +{ + if(bInCombat) return GetLocalInt(oCreature, AI_HEAL_IN_COMBAT_LIMIT); + else return GetLocalInt(oCreature, AI_HEAL_OUT_OF_COMBAT_LIMIT); +} +int ai_GetHasNegativeCondition(int nCondition, int nCurrentConditions) +{ + return (nCurrentConditions & nCondition); +} +int ai_GetNegativeConditions(object oCreature) +{ + int nCondition, nEffectType; + effect eEffect = GetFirstEffect(oCreature); + while(GetIsEffectValid (eEffect)) + { + // Rage and maybe other abilities might come from the oCreature! + if(GetEffectCreator(eEffect) != oCreature) + { + nEffectType = GetEffectType(eEffect); + switch(nEffectType) + { + case EFFECT_TYPE_DISEASE: nCondition = nCondition | AI_CONDITION_DISEASE; break; + case EFFECT_TYPE_POISON: nCondition = nCondition | AI_CONDITION_POISON; break; + case EFFECT_TYPE_CURSE: nCondition = nCondition | AI_CONDITION_CURSE; break; + case EFFECT_TYPE_BLINDNESS: + case EFFECT_TYPE_DEAF: nCondition = nCondition | AI_CONDITION_BLINDDEAF; break; + case EFFECT_TYPE_ABILITY_DECREASE: nCondition = nCondition | AI_CONDITION_ABILITY_DRAIN; break; + case EFFECT_TYPE_NEGATIVELEVEL: nCondition = nCondition | AI_CONDITION_LEVEL_DRAIN; break; + case EFFECT_TYPE_AC_DECREASE: nCondition = nCondition | AI_CONDITION_AC_DECREASE; break; + case EFFECT_TYPE_ATTACK_DECREASE: nCondition = nCondition | AI_CONDITION_ATK_DECREASE; break; + case EFFECT_TYPE_CHARMED: nCondition = nCondition | AI_CONDITION_CHARMED; break; + case EFFECT_TYPE_CONFUSED: nCondition = nCondition | AI_CONDITION_CONFUSED; break; + case EFFECT_TYPE_DAZED: nCondition = nCondition | AI_CONDITION_DAZED; break; + case EFFECT_TYPE_DAMAGE_DECREASE: nCondition = nCondition | AI_CONDITION_DMG_DECREASE; break; + case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE: nCondition = nCondition | AI_CONDITION_DMG_I_DECREASE; break; + case EFFECT_TYPE_DOMINATED: nCondition = nCondition | AI_CONDITION_DOMINATED; break; + case EFFECT_TYPE_FRIGHTENED: nCondition = nCondition | AI_CONDITION_FRIGHTENED; break; + case EFFECT_TYPE_PARALYZE: nCondition = nCondition | AI_CONDITION_PARALYZE; break; + case EFFECT_TYPE_SAVING_THROW_DECREASE: nCondition = nCondition | AI_CONDITION_SAVE_DECREASE; break; + case EFFECT_TYPE_SKILL_DECREASE: nCondition = nCondition | AI_CONDITION_SKILL_DECREASE; break; + case EFFECT_TYPE_SLOW: nCondition = nCondition | AI_CONDITION_SLOW; break; + case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE: nCondition = nCondition | AI_CONDITION_SR_DECREASE; break; + case EFFECT_TYPE_STUNNED: nCondition = nCondition | AI_CONDITION_STUNNED; break; + } + } + eEffect = GetNextEffect(oCreature); + } + return nCondition; +} +int ai_GetIsInLineOfSight(object oCreature, object oObject) +{ + // Creatures can block the line of sight so when close we shouldn't check. + if(GetDistanceBetween(oObject, oCreature) <= AI_RANGE_MELEE) return TRUE; + return LineOfSightObject(oCreature, oObject); +} +void ai_SetBehaviorState(int nCondition, int bValid = TRUE) +{ + int nPlot = GetLocalInt(OBJECT_SELF, "NW_BEHAVIOR_MASTER"); + if(bValid) + { + nPlot = nPlot | nCondition; + SetLocalInt(OBJECT_SELF, "NW_BEHAVIOR_MASTER", nPlot); + } + else + { + nPlot = nPlot & ~nCondition; + SetLocalInt(OBJECT_SELF, "NW_BEHAVIOR_MASTER", nPlot); + } +} +int ai_GetBehaviorState(int nCondition) +{ + int nPlot = GetLocalInt(OBJECT_SELF, "NW_BEHAVIOR_MASTER"); + if(nPlot & nCondition) return TRUE; + return FALSE; +} +void ai_HighlightWidgetMode(object oPC, object oAssociate, int nToken) +{ + if(oPC == oAssociate) return; + int bBool; + bBool = ai_GetAIMode(oAssociate,AI_MODE_DEFEND_MASTER); + NuiSetBind(oPC, nToken, "btn_cmd_guard_encouraged", JsonBool(bBool)); + bBool = ai_GetAIMode(oAssociate,AI_MODE_STAND_GROUND); + NuiSetBind(oPC, nToken, "btn_cmd_hold_encouraged", JsonBool(bBool)); + bBool = ai_GetAIMode(oAssociate,AI_MODE_FOLLOW); + NuiSetBind(oPC, nToken, "btn_cmd_follow_encouraged", JsonBool(bBool)); + if(!ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER) && + !ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND) && + !ai_GetAIMode(oAssociate, AI_MODE_FOLLOW)) bBool = TRUE; + else bBool = FALSE; + NuiSetBind(oPC, nToken, "btn_cmd_attack_encouraged", JsonBool(bBool)); +} +void ai_CheckXPPartyScale(object oCreature) +{ + object oModule = GetModule(); + if(!GetLocalInt(oModule, AI_RULE_PARTY_SCALE)) return; + object oMaster; + if(!ai_GetIsCharacter(oCreature)) + { + oMaster = GetMaster(oCreature); + while(oMaster != OBJECT_INVALID) + { + if(ai_GetIsCharacter(oMaster)) break; + oMaster = GetMaster(oMaster); + } + if(oMaster == OBJECT_INVALID) return; + } + else oMaster = oCreature; + float fDefaultXPScale = IntToFloat(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); + float fPartySize = 4.0; + int nAssociateType, nHenchman, nHenchAssociate; + object oHenchman; + for(nAssociateType = 1; nAssociateType <= 5; nAssociateType++) + { + if(nAssociateType == ASSOCIATE_TYPE_HENCHMAN) + { + for(nHenchman = 1; nHenchman <= AI_MAX_HENCHMAN; nHenchman++) + { + oHenchman = GetAssociate(nAssociateType, oMaster, nHenchman); + if(oHenchman != OBJECT_INVALID) + { + fPartySize += 1.0; + for(nHenchAssociate = 2; nHenchAssociate <= 5; nHenchAssociate++) + { + if(GetAssociate(nHenchAssociate, oHenchman, 1) != OBJECT_INVALID) fPartySize += 1.0; + } + } + } + } + else if(GetAssociate(nAssociateType, oMaster, 1) != OBJECT_INVALID) fPartySize += 1.0; + } + int nXPScale = FloatToInt(fPartySize / 4.0 * fDefaultXPScale); + //SendMessageToPC(oMaster, GetName(oMaster) + " nXPScale = (3 + fPartySize / 4.0 * fDefaultXPScale)" + + // IntToString(nXPScale) + " = (" + FloatToString(fPartySize, 0, 1) + " / 4.0 * " + + // FloatToString(fDefaultXPScale, 0, 1) + ")"); + SetModuleXPScale(nXPScale); +} + diff --git a/_module/nss/0i_talents.nss b/_module/nss/0i_talents.nss new file mode 100644 index 00000000..fa773b9f --- /dev/null +++ b/_module/nss/0i_talents.nss @@ -0,0 +1,3098 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0i_talents + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Fuctions to use a category of skills, feats, spells, or items. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_combat" +// ***************************************************************************** +// ************************* Try * Defensive Talents *************************** +// ***************************************************************************** +// These functions try to find and use a specific set of talents intelligently. + +// Returns TRUE if oCreature uses a healing talent on oTarge. +// nInMelee is the number of enemies the caller is in melee with. +// If oTarget is set then they will heal that target if they need it. +// Otherwise checks all allies to see who we should heal based on the talent. +int ai_TryHealingTalent(object oCreature, int nInMelee, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses a cure condition talent on an ally or self. +int ai_TryCureConditionTalent(object oCreature, int nInMelee, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses a defensive talent. +// Checks for a Defensive talent(Protection, Enhancement, or Summons). +// Randomizes the order to mix up spells in combat. +// if oTarget is set then the defensive talent will be cast on them or OBJECT_SELF. +int ai_TryDefensiveTalents(object oCreature, int nInMelee, int nMaxLevel, int nRound = 0, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses a defensive talent. +// Checks the enemy faction for most powerful class and picks a buff based on it. +//int ai_TryAdvancedBuffOnSelf(object oCreature, int nInMelee); +// Set any auras this oCreature has instantly. +// This can be done in the OnSpawn script, heart beat, or Perception. +void ai_SetAura(object oCreature); + +// ***************************************************************************** +// ************************ Try Physical Attack Talents ************************ +// ***************************************************************************** +// These functions try to find and use melee attack talents intelligently. + +// Wrapper for ActionAttack, oCreature uses nAction (attack) on oTarget. +// nInMelee is only used in AI_LAST_ACTION_RANGED_ATK actions. +// bPassive TRUE oCreature will not move while attacking. +// nActionMode, pass the action mode if one is being used. +void ai_ActionAttack(object oCreature, int nAction, object oTarget, int nInMelee = 0, int bPassive = FALSE, int nActionMode = 0); +// Returns TRUE if oCreature uses a dragons breath talent +// Check for dragon's attacks under TALENT_CATEGORY_DRAGONS_BREATH(19). +// nRound must be supplied so we can keep track of the breath uses. +int ai_TryDragonBreathAttack(object oCreature, int nRound, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses a dragons wing attacks. +// Checks to see if a dragon can use its wings on a nearby enemy. +// Checks the right side and then the left side to see if it can attack. +int ai_TryWingAttacks(object oCreature); +// Returns TRUE if oCreature uses a dragons tail slap. +// Looks behind the dragon to see if it can use it's tail slap on an enemy. +int ai_TryTailSlap(object oCreature); +// Returns TRUE if oCreature uses a dragons crush attack. +// Dragon can fly up and crash down on opponents to do bludgeoning damage. +// If 3 times smaller than the dragon they will take extra damage and be +// Knocked Down for 1 round if Reflex save is not made. +int ai_TryCrushAttack(object oCreature, object oTarget); +// Returns TRUE if oCreature uses a dragons tail sweep attack. +// If the enemy is 4 sizes smaller than it the dragon to use its tail to sweep +// behind it doing damage and knocking the opponents down. +int ai_TryTailSweepAttack(object oCreature); +// Returns TRUE if oCreature finds a good target and uses Sneak Attack. +int ai_TrySneakAttack(object oCreature, int nInMelee, int bAlwaysAtk = TRUE); +// Returns TRUE if oCreature finds a good ranged target and uses Sneak Attack. +int ai_TryRangedSneakAttack(object oCreature, int nInMelee); +// Returns TRUE if oCreature uses a harmful melee talent. +int ai_TryMeleeTalents(object oCreature, object oTarget); +// ***************************************************************************** +// ******************************* Try * Skills ******************************** +// ***************************************************************************** +// These functions try to find and use a specific set of skills intelligently. + +// Wrapper to have oCreature use nSkill on oTarget. +void ai_UseSkill(object oCreature, int nSkill, object oTarget); +// Returns TRUE if oCreature uses the parry skill on someone attacking them. +// Checks if doing a parry might be successful. +int ai_TryParry(object oCreature); +// Returns TRUE if oCreature uses the Taunt skill on oTarget. +// Checks if doing a taunt might be successful against oTarget. +int ai_TryTaunt(object oCreature, object oTarget); +// Returns TRUE if oCreature uses the Animial emapthy skill on oTarget. +// For it to work oTarget must be an Animal, Beast, or Magical Beast. +// Checks if doing Animal Empathy might be successful against oTarget. +int ai_TryAnimalEmpathy(object oCreature, object oTarget = OBJECT_INVALID); +// ***************************************************************************** +// ******************************** Try * Feats ******************************** +// ***************************************************************************** +// These functions try to find and use a specific set of feats intelligently. + +// Wrapper to have oCreature use nFeat on oTarget. +void ai_UseFeat(object oCreature, int nFeat, object oTarget, int nSubFeat = 0); +// Wrapper to have oCreature use nActionMode on oTarget. +// nInMelee is only used in AI_LAST_ACTION_RANGED_ATK actions. +// bPassive TRUE oCreature will not move while attacking. +void ai_UseFeatAttackMode(object oCreature, int nActionMode, int nAction, object oTarget, int nInMelee = 0, int bPassive = FALSE); +// Returns TRUE if oCreature uses Rage. +// This checks if they are already in a rage and if they have the Rage feat. +int ai_TryBarbarianRageFeat(object oCreature); +// Returns TRUE if oCreature uses Bard song. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TryBardSongFeat(object oCreature); +// Returns TRUE if oCreature uses Called shot. +// This checks if they have the feat and if its viable. +int ai_TryCalledShotFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Disarm. +// This checks if they have the feat and if its viable. +int ai_TryDisarmFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Divine Might. +// This only checks if they can use the feat and have turn undead uses left. +int ai_TryDivineMightFeat(object oCreature, int nInMelee); +// Returns TRUE if oCreature uses Divine Shield. +// This only checks if they can use the feat and have turn undead uses left. +int ai_TryDivineShieldFeat(object oCreature, int nInMelee); +// Returns TRUE if oCreature uses Expertise. +// This checks if they have the feat and if its viable. +// Also checks to see if the Improved Expertise feat would be better. +int ai_TryExpertiseFeat(object oCreature); +// Returns TRUE if oCreature uses Flurry of Blows. +// This checks if they have the feat and if its viable. +int ai_TryFlurryOfBlowsFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Improved Expertise. +// This checks if they have the feat and if its viable. +// Also checks to see if the Expertise feat would be better. +int ai_TryImprovedExpertiseFeat(object oCreature); +// Returns TRUE if oCreature uses Improved Power Attack. +// This checks if they have the feat and if its viable. +// Also checks to see if the Power Attack feat would be better. +int ai_TryImprovedPowerAttackFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Ki Damage. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TryKiDamageFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Knockdown. +// This checks if they have the feat and if its viable. +int ai_TryKnockdownFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses a polymorph self feat. +// This checks if they have the feat and will use the best one. +int ai_TryPolymorphSelfFeat(object oCreature); +// Returns TRUE if oCreature uses Power Attack. +// This checks if they have the feat and if its viable. +// Also checks to see if the Improved Power Attack would be better. +int ai_TryPowerAttackFeat(object oCreature, object oEnemy); +// Returns TRUE if oCreature uses Quivering palm. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TryQuiveringPalmFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Power Attack. +// This checks if they have the feat and if its viable. +// Using a bow and having arrows should be checked before calling this. +int ai_TryRapidShotFeat(object oCreature, object oTarget, int nInMelee); +// Returns TRUE if oCreature uses Sap. +// This checks if they have the feat and if its viable. +int ai_TrySapFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Smite evil. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TrySmiteEvilFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Smite good. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TrySmiteGoodFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses Stunning fists. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TryStunningFistFeat(object oCreature, object oTarget); +// Returns TRUE if oCreature uses a summon animal companion talent. +int ai_TrySummonAnimalCompanionTalent(object oCreature); +// Returns TRUE if oCreature uses a summon familiar talent. +int ai_TrySummonFamiliarTalent(object oCreature); +// Returns TRUE if oCreature uses the Lay on Hands feat talent. +int ai_TryLayOnHands(object oCreature); +// Returns TRUE if oCreature uses a turning talent. +int ai_TryTurningTalent(object oCreature); +// Returns TRUE if oCreature uses Whirlwind. +// This checks if they have the feat and if its viable. +int ai_TryWhirlwindFeat(object oCreature); +// Returns TRUE if oCreature uses Wholeness of Body. +// This checks if they have any uses left, have the feat and if its viable. +int ai_TryWholenessOfBodyFeat(object oCreature); +// ***************************************************************************** +// ***************************** TALENT SCRIPTS ****************************** +// ***************************************************************************** +// These functions do not fall into another section. + +// Returns the MaxLevel used in GetCreatureTalent for oCreature. +// This checks the intelligence and the level of oCreature. +// Returns either -1 (random) or 10 for all talents. +int ai_GetMonsterTalentMaxLevel(object oCreature); +// Returns the nMaxLevel used in GetCreatureTalent for oCreature. +// This checks the difficulty of the combat and the level of oCreature. +// Return a number equal to 1 and half the level of oCreature upto 10. +// The max spell level used is equal to nMaxLevel or less. +int ai_GetAssociateTalentMaxLevel(object oCreature, int nDifficulty); +// Returns TRUE if oCreature has nTalent. +// nTalent will be a spell in the spells.2da. +int ai_GetHasTalent(object oCreature, int nTalent); +// Saves a talent in JsonArray. +// Array: 0-Type (1-spell, 2-sp ability, 4-feat, 3-item) +// Type 1)spell 0-type, 1-spell, 2-class, 3-level, 4-slot. +// Type 2)sp Ability 0-type, 1-spell, 2-class, 3-level, 4-slot. +// Type 3)feat 0-type, 1-spell, 2- class, 3- level. +// Type 4)item 0-type, 1-spell, 2-item object, 3-level, 4-slot. +// jJsonLevel is the level to place the talent in the json array +// maybe different then the talents actual level which is passed in nLevel. +void ai_SaveTalent(object oCreature, int nClass, int nJsonLevel, int nLevel, int nSlot, int nSpell, int nType, int bBuff, object oItem = OBJECT_INVALID); +// Removes a talent nSlotIndex from jLevel in jCategory. +void ai_RemoveTalent(object oCreature, json jCategory, json jLevel, string sCategory, int nLevel, int nSlotIndex); +// Saves a creatures talents to variables upon them for combat use. +// bMonster will check to see if they should be buffed when we set the talents. +void ai_SetCreatureTalents(object oCreature, int bMonster); +// Return TRUE if oCreature spontaneously casts a cure spell from a talent in sCategory. +int ai_UseSpontaneousCureTalentFromCategory(object oCreature, string sCategory, int nInMelee, int nDamage, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses jTalent on oTarget. +// also Returns -1 if oCreature uses jTalent on oTarget with a memorized spell. +// This allows the user to remove jTalent from jLevel in jCategory. +int ai_UseCreatureSpellTalent(object oCreature, json jLevel, json jTalent, string sCategory, int nInMelee, object oTarget = OBJECT_INVALID); +// Return TRUE if oCreature uses a jTalent from oItem on oTarget. +int ai_UseCreatureItemTalent(object oCreature, json jLevel, json jTalent, string sCategory, int nInMelee, object oTarget = OBJECT_INVALID); +// Returns TRUE if oCreature uses a talent from sCategory of nLevel or less. +int ai_UseCreatureTalent(object oCreature, string sCategory, int nInMelee, int nLevel = 10, object oTarget = OBJECT_INVALID); +// Return TRUE if oCreature uses nTalent on oTarget. +int ai_UseTalent(object oCreature, int nTalent, object oTarget); +// Returns TRUE if jTalent is used on oTarget by oCaster. +// Checks the talent type and casts the correct spell. For items it checks uses. +int ai_UseTalentOnObject(object oCaster, json jTalent, object oTarget, int nInMelee); +// Returns TRUE if jTalent is used at lTarget location by oCaster. +// Checks the talent type and cast the correct spell. For items it checks uses. +int ai_UseTalentAtLocation(object oCaster, json jTalent, object oTarget, int nInMelee); +// Return TRUE if oCreature uses jTalent on oTarget after checking special cases. +int ai_CheckSpecialTalentsandUse(object oCreature, json jTalent, string sCategory, int nInMelee, object oTarget); + +int ai_TryHealingTalent(object oCreature, int nInMelee, object oTarget = OBJECT_INVALID) +{ + // First lets evaluate oTarget and see how strong of a spell we will need. + if(oTarget != OBJECT_INVALID) + { + if(oTarget == oCreature) + { + if(ai_GetAIMode(oCreature, AI_MODE_SELF_HEALING_OFF)) return FALSE; + } + else if(ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) return FALSE; + } + // We don't have a target so lets go check for one. + else + { + if(!ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) + { + // Lets not run past an enemy to heal unless we have the feats, bad tactics! + float fRange; + if(ai_CanIMoveInCombat(oCreature)) fRange = AI_RANGE_PERCEPTION; + else + { + fRange = GetDistanceBetween(oCreature, GetLocalObject(oCreature, AI_ENEMY_NEAREST)) - 3.0f; + // Looks bad when your right next to an ally, but technically the enemy is closer. + if(fRange < AI_RANGE_MELEE) fRange = AI_RANGE_MELEE; + } + oTarget = ai_GetAllyToHealTarget(oCreature, fRange); + } + else oTarget = oCreature; + if(oTarget == OBJECT_INVALID) return FALSE; + } + // Should we ignore associates? + if(ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + int nHp = ai_GetPercHPLoss(oTarget); + int nHpLimit = ai_GetHealersHpLimit(oCreature); + if(AI_DEBUG) ai_Debug("0i_talents", "256", "nHp: " + IntToString(nHp) + + "< nHpLimit: " + IntToString(nHpLimit)); + if(nHp > nHpLimit) return FALSE; + int nDamage = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "260", GetName(oTarget) + " has lost " + IntToString(nDamage) + " hitpoints!"); + // Do they have Lay on Hands? + int bUseMagic = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC); + if(bUseMagic && GetHasFeat(FEAT_LAY_ON_HANDS, oCreature)) + { + int nCanHeal = GetAbilityModifier(ABILITY_CHARISMA, oCreature) * ai_GetCharacterLevels(oCreature); + if(nCanHeal <= nDamage) + { + ai_UseFeat(oCreature, FEAT_LAY_ON_HANDS, oTarget); + return TRUE; + } + } + int nMaxLevel = 9; + // If they are about to die then throw caution to the wind and HEAL! + if(nHp <= AI_HEALTH_BLOODY || nHp < 11) nInMelee = 0; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_HEALING, nInMelee, nMaxLevel, oTarget)) return TRUE; + if(AI_DEBUG) ai_Debug("0i_talents", "275", GetName(oCreature) + " has no healing spells!" + + " Cleric lvls: " + IntToString(GetLevelByClass(CLASS_TYPE_CLERIC, oCreature)) + + " Sontaneous casting: " + IntToString(ai_GetMagicMode(oCreature, AI_MAGIC_NO_SPONTANEOUS_CURE))); + if(bUseMagic && GetLevelByClass(CLASS_TYPE_CLERIC, oCreature) && + !ai_GetMagicMode(oCreature, AI_MAGIC_NO_SPONTANEOUS_CURE)) + { + // We need to check our talents and see what spells we can convert. + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_ENHANCEMENT, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_PROTECTION, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_TOUCH, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_RANGED, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_SUMMON, nInMelee, nDamage, oTarget)) return TRUE; + if(ai_UseSpontaneousCureTalentFromCategory(oCreature, AI_TALENT_CURE, nInMelee, nDamage, oTarget)) return TRUE; + } + return FALSE; +} +int ai_CheckTargetVsConditions(object oTarget, json jTalent, int nConditions) +{ + // Check nCondition for any negative effects based on the talent we have. + switch(JsonGetInt(JsonArrayGet(jTalent, 1))) + { + case SPELL_NEUTRALIZE_POISON : + if(ai_GetHasNegativeCondition(AI_CONDITION_POISON, nConditions)) return TRUE; + break; + case SPELL_REMOVE_DISEASE : + if(ai_GetHasNegativeCondition(AI_CONDITION_DISEASE, nConditions)) return TRUE; + break; + case SPELL_REMOVE_BLINDNESS_AND_DEAFNESS : + if(ai_GetHasNegativeCondition(AI_CONDITION_BLINDDEAF, nConditions)) return TRUE; + break; + case SPELL_REMOVE_FEAR : + if(ai_GetHasNegativeCondition(AI_CONDITION_FRIGHTENED, nConditions)) return TRUE; + break; + case SPELL_REMOVE_CURSE : + if(ai_GetHasNegativeCondition(AI_CONDITION_CURSE, nConditions)) return TRUE; + break; + case SPELL_REMOVE_PARALYSIS : + if(ai_GetHasNegativeCondition(AI_CONDITION_PARALYZE, nConditions)) return TRUE; + break; + case SPELL_CLARITY : + if(ai_GetHasNegativeCondition(AI_CONDITION_DAZED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_CHARMED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_CONFUSED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_STUNNED, nConditions)) return TRUE; + break; + case SPELL_GREATER_RESTORATION : + if(ai_GetHasNegativeCondition(AI_CONDITION_DAZED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_CONFUSED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_DOMINATED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_SLOW, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_FRIGHTENED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_STUNNED, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_CHARMED, nConditions)) return TRUE; + case SPELL_RESTORATION : + if(ai_GetHasNegativeCondition(AI_CONDITION_LEVEL_DRAIN, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_BLINDDEAF, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_PARALYZE, nConditions)) return TRUE; + case SPELL_LESSER_RESTORATION : + if(ai_GetHasNegativeCondition(AI_CONDITION_ABILITY_DRAIN, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_SAVE_DECREASE, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_SR_DECREASE, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_SKILL_DECREASE, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_AC_DECREASE , nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_ATK_DECREASE, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_DMG_DECREASE, nConditions)) return TRUE; + if(ai_GetHasNegativeCondition(AI_CONDITION_DMG_I_DECREASE, nConditions)) return TRUE; + } + return FALSE; +} +int ai_CheckTalentsVsConditions(object oCreature, int nConditions, int nInMelee, int nLevel, object oTarget) +{ + // Get the saved category from oCreature. + json jCategory = GetLocalJson(oCreature, AI_TALENT_CURE); + if(AI_DEBUG) ai_Debug("0i_talents", "357", "jCategory: " + AI_TALENT_CURE + " " + JsonDump(jCategory, 2)); + if(JsonGetType(jCategory) == JSON_TYPE_NULL) + { + SetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE, -1); + return FALSE; + } + // Get the max talent level so we can skip the higher ones and save time. + int nMaxTalentLevel = GetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE); + if(AI_DEBUG) ai_Debug("0i_talents", "365", AI_MAX_TALENT + AI_TALENT_CURE + ": " + + IntToString(nMaxTalentLevel) + + " nLevel: " + IntToString(nLevel)); + if(nMaxTalentLevel < nLevel) nLevel = nMaxTalentLevel; + if(nLevel < 0 || nLevel > 10) nLevel = 9; + json jLevel, jTalent; + int nClass, nSlot, nType, nSlotIndex, nMaxSlotIndex, nTalentUsed; + int bUseMagic = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC); + int bUseMagicItems = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC_ITEMS); + if(AI_DEBUG) ai_Debug("0i_talents", "374", "bUseMagic: " + IntToString(bUseMagic) + + " bUseMagicItems: " + IntToString(bUseMagicItems)); + // Loop through nLevels down to 0 looking for the first talent (i.e. the highest). + while(nLevel >= 0) + { + // Get the array of nLevel cycling down to 0. + jLevel = JsonArrayGet(jCategory, nLevel); + nMaxSlotIndex = JsonGetLength(jLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "382", "nLevel: " + IntToString(nLevel) + + " nMaxSlotIndex: " + IntToString(nMaxSlotIndex)); + if(nMaxSlotIndex > 0) + { + // Get the talent within nLevel cycling from the first to the last. + nSlotIndex = 0; + while (nSlotIndex <= nMaxSlotIndex) + { + jTalent= JsonArrayGet(jLevel, nSlotIndex); + if(AI_DEBUG) ai_Debug("0i_talents", "391", "nSlotIndex: " + IntToString(nSlotIndex) + + " jTalent Type: " + IntToString(JsonGetType(jTalent))); + // Check to see if the talent matches oTargets nConditionss. + if(ai_CheckTargetVsConditions(oTarget, jTalent, nConditions)) + { + nType = JsonGetInt(JsonArrayGet(jTalent, 0)); + if(bUseMagic) + { + if(nType == AI_TALENT_TYPE_SPELL) + { + if(ai_CastInMelee(oCreature, JsonGetInt(JsonArrayGet(jTalent, 1)), nInMelee)) + { + nTalentUsed = ai_UseCreatureSpellTalent(oCreature, jLevel, jTalent, AI_TALENT_CURE, nInMelee, oTarget); + // -1 means it was a memorized spell and we need to remove it. + if(nTalentUsed == -1) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, AI_TALENT_CURE, nLevel, nSlotIndex); + return TRUE; + } + else if(nTalentUsed) return TRUE; + } + } + else if(nType == AI_TALENT_TYPE_SP_ABILITY) + { + // Special ability spells do not need to concentrate?! + if(ai_CheckSpecialTalentsandUse(oCreature, jTalent, AI_TALENT_CURE, nInMelee, oTarget)) + { + // When the ability is used that slot is now not readied. + // Multiple uses of the same spell are stored in different slots. + ai_RemoveTalent(oCreature, jCategory, jLevel, AI_TALENT_CURE, nLevel, nSlotIndex); + return TRUE; + } + } + } + if(bUseMagicItems && nType == AI_TALENT_TYPE_ITEM) + { + // Items do not need to concentrate. + if(ai_UseCreatureItemTalent(oCreature, jLevel, jTalent, AI_TALENT_CURE, nInMelee, oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_talents", "430", "Checking if Item is used up: " + + IntToString(JsonGetInt(JsonArrayGet(jTalent, 4)))); + if(JsonGetInt(JsonArrayGet(jTalent, 4)) == -1) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, AI_TALENT_CURE, nLevel, nSlotIndex); + } + return TRUE; + } + } + } + nSlotIndex++; + } + } + else SetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE, nLevel - 1); + nLevel--; + } + return FALSE; +} +int ai_TryCureConditionTalent(object oCreature, int nInMelee, object oTarget = OBJECT_INVALID) +{ + // Is Casting Cure spells off? + if(ai_GetMagicMode(oCreature, AI_MAGIC_CURE_SPELLS_OFF)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "450", AI_MAX_TALENT + AI_TALENT_CURE + ": " + + IntToString(GetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE))); + // If the creature doesn't have cure talents then we set it to -1. + if(GetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE) == -1) return FALSE; + // We check targets to see if they need to be cured. + int nNegativeConditions, nTargetNegConds, nIndex, nCnt = 1; + object oTarget; + if(oTarget == OBJECT_INVALID) + { + oTarget = GetLocalObject(oCreature, AI_ALLY + "1"); + while(oTarget != OBJECT_INVALID) + { + nTargetNegConds = ai_GetNegativeConditions(oTarget); + // Should we ignore associates? + if(!ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) || + GetAssociateType(oTarget) < 2) + { + if(nNegativeConditions < nTargetNegConds) + { + nNegativeConditions = nTargetNegConds; + nIndex = nCnt; + } + } + oTarget = GetLocalObject(oCreature, AI_ALLY + IntToString(++nCnt)); + } + // No one has a negative condition then get out. + if(!nNegativeConditions) return FALSE; + oTarget = GetLocalObject(oCreature, AI_ALLY + IntToString(nIndex)); + } + else + { + nNegativeConditions = ai_GetNegativeConditions(oTarget); + if(!nNegativeConditions) return FALSE; + } + if(oTarget == oCreature) + { + if(ai_GetAIMode(oCreature, AI_MODE_SELF_HEALING_OFF)) return FALSE; + } + else if(ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "489", "nNegativeConditions: " + IntToString(nNegativeConditions) + + " on " + GetName(oTarget)); + if(ai_CheckTalentsVsConditions(oCreature, nNegativeConditions, nInMelee, 9, oTarget)) return TRUE; + return FALSE; +} +// ***************************************************************************** +// ************************* Try * Defensive Talents *************************** +// ***************************************************************************** +// These functions try to find and use a specific set of talents intelligently. + +int ai_TryDefensiveTalents(object oCreature, int nInMelee, int nMaxLevel, int nRound = 0, object oTarget = OBJECT_INVALID) +{ + // Summons are powerfull and should be used as much as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_SUMMON, nInMelee, nMaxLevel, oTarget)) return TRUE; + // Added to reduce casting defensive talents later in combat and constantly. + if(nRound >= d8()) return FALSE; + // Try to mix them up so we don't always cast spells in the same order. + int nRoll = d2(); + if(AI_DEBUG) ai_Debug("0i_talents", "507", "Lets help someone(Check Talents: " +IntToString(nRoll) + + " nMaxLevel: " + IntToString(nMaxLevel) + ")!"); + if(nRoll == 1) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_ENHANCEMENT, nInMelee, nMaxLevel, oTarget)) return TRUE; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_PROTECTION, nInMelee, nMaxLevel, oTarget)) return TRUE; + } + else if(nRoll == 2) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_PROTECTION, nInMelee, nMaxLevel, oTarget)) return TRUE; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_ENHANCEMENT, nInMelee, nMaxLevel, oTarget)) return TRUE; + } + return FALSE; +} +void ai_SetAura(object oCreature) +{ + // Cycle through a creatures special abilities and use any auras. + int bCanUse, nIndex = 0, nMaxSpAbility = GetSpellAbilityCount(oCreature); + int nSpell = GetSpellAbilitySpell(oCreature, nIndex); + while(nIndex < nMaxSpAbility) + { + bCanUse = FALSE; + if(GetSpellAbilityReady(oCreature, nIndex)) + { + if(nSpell == SPELLABILITY_AURA_BLINDING) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_COLD) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_ELECTRICITY) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_FEAR) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_FIRE) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_HORRIFICAPPEARANCE) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_MENACE) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_HORRIFICAPPEARANCE) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_PROTECTION) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_STUN) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_UNEARTHLY_VISAGE) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_UNNATURAL) bCanUse = TRUE; + else if(nSpell == SPELLABILITY_AURA_HORRIFICAPPEARANCE) bCanUse = TRUE; + else if(nSpell == 306 /*SPELLABILITY_AURA_TYRANT_FOG_MIST*/) bCanUse = TRUE; + else if(nSpell == 412 /*SPELLABILITY_AURA_DRAGON_FEAR*/) bCanUse = TRUE; + else if(nSpell == 761 /*SPELLABILITY_AURA_HELLFIRE*/) bCanUse = TRUE; + else if(nSpell == 805/*SPELLABILITY_AURA_TROGLODYTE_STENCH*/) bCanUse = TRUE; + } + if(bCanUse) ActionCastSpellAtObject(nSpell, oCreature, 255, FALSE, 0, 0, TRUE); + nSpell = GetSpellAbilitySpell(oCreature, ++nIndex); + } +} +// ***************************************************************************** +// ************************* Try * Skills ************************************** +// ***************************************************************************** +// These functions try to find and use a specific set of skills intelligently. + +void ai_UseSkill(object oCreature, int nSkill, object oTarget) +{ + ai_SetLastAction(oCreature, AI_LAST_ACTION_USED_SKILL); + if(GetIsEnemy(oTarget, oCreature)) SetLocalObject(oCreature, AI_ATTACKED_PHYSICAL, oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "498", GetName(oCreature) + " is using skill: " + + GetStringByStrRef(StringToInt(Get2DAString("skills", "Name", nSkill))) + + " on " + GetName(oTarget)); + ActionUseSkill(nSkill, oTarget); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); +} +int ai_TryParry(object oCreature) +{ + // Only use parry on an active melee attacker + object oTarget = GetLastHostileActor(oCreature); + // If we are already in parry mode then lets keep it up. + if(GetActionMode(oCreature, ACTION_MODE_PARRY) && + GetCurrentAction(oCreature) == ACTION_ATTACKOBJECT) return TRUE; + if(oTarget == OBJECT_INVALID || + ai_GetAttackedTarget(oTarget) != oCreature || + !ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget))) return FALSE; + // Only if our parry skill > their attack bonus + 5 + d10 + // Parry has a -4 atk adjustment. Our chance to hit should be 75% + d10. + // EnemyAtk(20) - OurParrySkill(10) = 0 + d10(75% to 25% chance to hit). + int nParrySkill = GetSkillRank(SKILL_PARRY, oCreature); + int nAtk = ai_GetCreatureAttackBonus(oTarget); + if(nAtk - nParrySkill >= 0 + d10()) return FALSE; + ai_EquipBestMeleeWeapon(oCreature, oTarget); + SetActionMode(oCreature, ACTION_MODE_PARRY, TRUE); + ai_SetLastAction(oCreature, AI_LAST_ACTION_USED_SKILL); + ActionAttack(oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "524", "Using parry against " + GetName(oTarget) + "!"); + return TRUE; +} +int ai_TryTaunt(object oCreature, object oTarget) +{ + int nCoolDown = GetLocalInt(oCreature, "AI_TAUNT_COOLDOWN"); + if(AI_DEBUG) ai_Debug("0i_talents", "530", "Has Taunt Effect? " + + IntToString(ai_GetHasEffectType(oTarget, EFFECT_TYPE_TAUNT)) + + " Cooldown: " + IntToString(nCoolDown)); + if(nCoolDown > 0) + { + SetLocalInt(oCreature, "AI_TAUNT_COOLDOWN", --nCoolDown); + return FALSE; + } + if(!ai_GetHasEffectType(oTarget, EFFECT_TYPE_TAUNT)) return FALSE; + // Check to see if we have a good chance for it to work. + int nTauntRnk = GetSkillRank(SKILL_TAUNT, oCreature); + if(AI_DEBUG) ai_Debug("0i_talents", "542", "Check Taunt: TauntRnk: " + IntToString(nTauntRnk) + + " HitDice + 1: " + IntToString(GetHitDice(oCreature) + 1) + + " Concentration: " + IntToString(GetSkillRank(SKILL_CONCENTRATION, oTarget)) + "."); + int nConcentration = GetSkillRank(SKILL_CONCENTRATION, oTarget); + // Our chance is greater than 50%. + if(nTauntRnk <= nConcentration) return FALSE; + ai_UseSkill(oCreature, SKILL_TAUNT, oTarget); + SetLocalInt(oCreature, "AI_TAUNT_COOLDOWN", AI_TAUNT_COOLDOWN); + return TRUE; +} +int ai_TryAnimalEmpathy(object oCreature, object oTarget = OBJECT_INVALID) +{ + if(!GetSkillRank(SKILL_ANIMAL_EMPATHY, oCreature)) return FALSE; + int nCoolDown = GetLocalInt(oCreature, "AI_EMPATHY_COOLDOWN"); + if(AI_DEBUG) ai_Debug("0i_talents", "556", "Has Dominate Effect? " + + IntToString(ai_GetHasEffectType(oTarget, EFFECT_TYPE_DOMINATED)) + + " Cooldown: " + IntToString(nCoolDown)); + if(nCoolDown > 0) + { + SetLocalInt(oCreature, "AI_EMPATHY_COOLDOWN", --nCoolDown); + return FALSE; + } + if(oTarget == OBJECT_INVALID) + { + oTarget = ai_GetNearestRacialTarget(oCreature, AI_RACIAL_TYPE_ANIMAL_BEAST); + if(oTarget == OBJECT_INVALID) return FALSE; + } + if(!GetObjectSeen(oCreature, oTarget)) return FALSE; + if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_DOMINATED) || + GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) || + GetIsImmune(oTarget, IMMUNITY_TYPE_DOMINATE) || + GetAssociateType(oTarget) != ASSOCIATE_TYPE_NONE) return FALSE; + // Get the race of the target, it only works on Animals, Beasts, and Magical Beasts. + int nRace = GetRacialType(oTarget); + int nDC; + if(nRace == RACIAL_TYPE_ANIMAL) nDC = 5; + else if(nRace == RACIAL_TYPE_BEAST || nRace == RACIAL_TYPE_MAGICAL_BEAST) nDC = 9; + else return FALSE; + // Check to see if we have a good chance for it to work. + int nEmpathyRnk = GetSkillRank(SKILL_ANIMAL_EMPATHY, oCreature); + nDC += GetHitDice(oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "632", "Check Animal Empathy: Rnk: " + IntToString(nEmpathyRnk) + + " nDC: " + IntToString(nDC) + "."); + // Our chance is greater than 50%. + if(nEmpathyRnk <= nDC) return FALSE; + ai_UseSkill(oCreature, SKILL_ANIMAL_EMPATHY, oTarget); + SetLocalInt(oCreature, "AI_EMPATHY_COOLDOWN", AI_EMPATHY_COOLDOWN); + return TRUE; +} +// ***************************************************************************** +// ************************* Try * Feats *************************************** +// ***************************************************************************** +// These functions try to find and use a specific set of feats intelligently. + +void ai_UseFeat(object oCreature, int nFeat, object oTarget, int nSubFeat = 0) +{ + ai_SetLastAction(oCreature, AI_LAST_ACTION_USED_FEAT); + if(GetIsEnemy(oTarget, oCreature)) SetLocalObject(oCreature, AI_ATTACKED_PHYSICAL, oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "600", GetName(oCreature) + " is using feat: " + + GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))) + + " on " + GetName(oTarget)); + ActionUseFeat(nFeat, oTarget, nSubFeat); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); +} +void ai_UseFeatAttackMode(object oCreature, int nActionMode, int nAction, object oTarget, int nInMelee = 0, int bPassive = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "608", "Action mode (" + IntToString(nActionMode) + ") Is it set?: " + + IntToString(GetActionMode(oCreature, nActionMode))); + if(!GetActionMode(oCreature, nActionMode)) + { + if(AI_DEBUG) ai_Debug("0i_talents", "612", "Setting action mode: " + IntToString(nActionMode)); + SetActionMode(oCreature, nActionMode, TRUE); + SetLocalInt(oCreature, AI_CURRENT_ACTION_MODE, nActionMode); + } + ai_ActionAttack(oCreature, nAction, oTarget, nInMelee, bPassive, nActionMode); +} +int ai_TryBarbarianRageFeat(object oCreature) +{ + // Must not have rage already, must have the feat, and enemy must be strong enough. + if(GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) || + !GetHasFeat(FEAT_BARBARIAN_RAGE, oCreature)) return FALSE; + ai_UseFeat(oCreature, FEAT_BARBARIAN_RAGE, oCreature); + return TRUE; +} +int ai_TryBardSongFeat(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "629", "BardSong Effect: " + IntToString(GetHasSpellEffect(411/*SPELL_BARD_SONG*/)) + + " Level: " + IntToString(GetLevelByClass(CLASS_TYPE_BARD)) + + " HasFeat: " + IntToString(GetHasFeat(FEAT_BARD_SONGS))); + if(GetHasSpellEffect(411/*SPELL_BARD_SONG*/, oCreature) || + !GetHasFeat(FEAT_BARD_SONGS, oCreature)) return FALSE; + ai_UseFeat(oCreature, FEAT_BARD_SONGS, oCreature); + return TRUE; +} +int ai_TryCalledShotFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_CALLED_SHOT, oCreature)) return FALSE; + // Called shot has a -4 to hit adjustment. + if(!ai_AttackPenaltyOk(oCreature, oTarget, -4.0)) return FALSE; + ai_UseFeat(oCreature, FEAT_CALLED_SHOT, oTarget); + return TRUE; +} +int ai_TryDisarmFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_DISARM, oCreature)) return FALSE; + // If we can't disarm them then get out! + if(!GetIsCreatureDisarmable(oTarget)) return FALSE; + int nEAC = GetAC(oTarget); + int nOAtk = ai_GetCreatureAttackBonus(oCreature); + // The combatant with the larger weapon gains +4 per size category. + // Weapon Size in the baseitems.2da is 1 = Tiny, 2 = Small, 3 = Medium, 4 = Large. + int nOWeaponType = GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)); + int nOWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nOWeaponType)); + int nEWeaponType = GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)); + int nEWeaponSize = StringToInt(Get2DAString("baseitems", "WeaponSize", nEWeaponType)); + nOAtk +=(nOWeaponSize - nEWeaponSize) * 4; + // Do they have Improved Disarm? + if(GetHasFeat(FEAT_IMPROVED_DISARM, oCreature)) nOAtk += 2; + // Disarm has a -6 atk adjustment. + if(!ai_AttackPenaltyOk(oCreature, oTarget, -6.0)) return FALSE; + ai_UseFeat(oCreature, FEAT_DISARM, oTarget); + return TRUE; +} +int ai_TryDivineMightFeat(object oCreature, int nInMelee) +{ + if(!GetHasFeat(FEAT_TURN_UNDEAD)) return FALSE; + if(!GetHasFeat(FEAT_DIVINE_MIGHT)) return FALSE; + if(GetHasFeatEffect(FEAT_DIVINE_MIGHT, oCreature)) return FALSE; + if(!nInMelee) return FALSE; + object oTarget = ai_GetEnemyAttackingMe(oCreature); + if(oTarget == OBJECT_INVALID) return FALSE; + float fAtkAdj = IntToFloat(GetAbilityModifier(ABILITY_CHARISMA, oCreature)); + if(!ai_AttackBonusGood(oCreature, oTarget, fAtkAdj)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "722", "USING DIVINE MIGHT on " + GetName(oCreature) + "."); + ai_UseFeat(oCreature, FEAT_DIVINE_MIGHT, oCreature); + return TRUE; +} +int ai_TryDivineShieldFeat(object oCreature, int nInMelee) +{ + if(!GetHasFeat(FEAT_TURN_UNDEAD)) return FALSE; + if(!GetHasFeat(FEAT_DIVINE_SHIELD)) return FALSE; + if(GetHasFeatEffect(FEAT_DIVINE_SHIELD, oCreature)) return FALSE; + if(!nInMelee) return FALSE; + object oTarget = ai_GetEnemyAttackingMe(oCreature); + if(oTarget == OBJECT_INVALID) return FALSE; + float fACAdj = IntToFloat(GetAbilityModifier(ABILITY_CHARISMA, oCreature)); + if(!ai_ACAdjustmentGood(oCreature, oTarget, fACAdj)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "736", "USING DIVINE SHIELD on " + GetName(oCreature) + "."); + ai_UseFeat(oCreature, FEAT_DIVINE_SHIELD, oCreature); + return TRUE; +} +int ai_TryExpertiseFeat(object oCreature) +{ + if(!GetHasFeat(FEAT_EXPERTISE, oCreature)) return FALSE; + object oTarget = ai_GetEnemyAttackingMe(oCreature); + // Expertise has a -5 atk and a +5 AC adjustment. + if(oTarget == OBJECT_INVALID || + !ai_AttackPenaltyOk(oCreature, oTarget, -5.0) || + !ai_ACAdjustmentGood(oCreature, oTarget, 5.0)) + { + SetActionMode(oCreature, ACTION_MODE_EXPERTISE, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "704", "USING EXPERTISE on " + GetName(oTarget) + "."); + ai_UseFeatAttackMode(oCreature, ACTION_MODE_EXPERTISE, AI_LAST_ACTION_MELEE_ATK, oTarget); + return TRUE; +} +int ai_TryFlurryOfBlowsFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_FLURRY_OF_BLOWS, oCreature)) return FALSE; + // Flurry of Blows has a -2 atk adjustment. + if(!ai_AttackPenaltyOk(oCreature, oTarget, -2.0)) + { + SetActionMode(oCreature, ACTION_MODE_FLURRY_OF_BLOWS, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "718", "USING FLURRY OF BLOWS on " + GetName(oTarget) + "."); + ai_UseFeatAttackMode(oCreature, ACTION_MODE_FLURRY_OF_BLOWS, AI_LAST_ACTION_MELEE_ATK, oTarget, TRUE); + return TRUE; +} +int ai_TryImprovedExpertiseFeat(object oCreature) +{ + if(!GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature)) return FALSE; + object oTarget = ai_GetEnemyAttackingMe(oCreature); + // Improved expertise has a -10 atk +10 AC adjustment. + if(oTarget == OBJECT_INVALID || + !ai_AttackPenaltyOk(oCreature, oTarget, -10.0) || + !ai_ACAdjustmentGood(oCreature, oTarget, 10.0)) + { + SetActionMode(oCreature, ACTION_MODE_IMPROVED_EXPERTISE, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "735", "USING IMPROVED EXPERTISE on " + GetName(oTarget) + "."); + ai_UseFeatAttackMode(oCreature, ACTION_MODE_IMPROVED_EXPERTISE, AI_LAST_ACTION_MELEE_ATK, oTarget); + return TRUE; +} +int ai_TryImprovedPowerAttackFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_IMPROVED_POWER_ATTACK, oCreature)) return FALSE; + // Improved Power Attack has a -10 atk adjustment. + // If we cannot hit or will kill in one hit then maybe we should use Power Attack instead. + if(ai_PowerAttackGood(oCreature, oTarget, 10.0)) + { + ai_UseFeatAttackMode(oCreature, ACTION_MODE_IMPROVED_POWER_ATTACK, AI_LAST_ACTION_MELEE_ATK, oTarget); + return TRUE; + } + SetActionMode(oCreature, ACTION_MODE_IMPROVED_POWER_ATTACK, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return ai_TryPowerAttackFeat(oCreature, oTarget); +} +int ai_TryKiDamageFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_KI_DAMAGE, oCreature)) return FALSE; + // Must have > 40 hitpoints AND + // Damage reduction OR damage resistance + // or just have over 200 hitpoints + int bHasDamageReduction = FALSE; + int bHasDamageResistance = FALSE; + int bHasHitpoints = FALSE; + int bHasMassiveHitpoints = FALSE; + int bOutNumbered; + int nCurrentHP = GetCurrentHitPoints(oTarget); + if(nCurrentHP > 40) bHasHitpoints = TRUE; + if(nCurrentHP > 200) bHasMassiveHitpoints = TRUE; + if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_DAMAGE_REDUCTION)) bHasDamageReduction = TRUE; + if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_DAMAGE_RESISTANCE)) bHasDamageResistance = TRUE; + if(ai_GetNearestEnemy(oCreature, 3, 7, 7) != OBJECT_INVALID) bOutNumbered = TRUE; + if((!bHasHitpoints || (!bHasDamageReduction && !bHasDamageResistance)) && + (!bHasMassiveHitpoints) && (!bHasHitpoints || !bOutNumbered)) return FALSE; + ai_UseFeat(oCreature, FEAT_KI_DAMAGE, oTarget); + return TRUE; +} +int ai_TryKnockdownFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_KNOCKDOWN, oCreature)) return FALSE; + int nMySize = GetCreatureSize(oCreature); + if(GetHasFeat(FEAT_IMPROVED_KNOCKDOWN, oCreature)) nMySize++; + // Prevent silly use of knockdown on immune or too-large targets. + // Knockdown has a -4 atk adjustment. + if(GetIsImmune(oTarget, IMMUNITY_TYPE_KNOCKDOWN) || + GetCreatureSize(oTarget) > nMySize + 1 || + !ai_AttackPenaltyOk(oCreature, oTarget, -4.0)) return FALSE; + ai_UseFeat(oCreature, FEAT_KNOCKDOWN, oTarget); + return TRUE; +} +int ai_TryPolymorphSelfFeat(object oCreature) +{ + if(GetHasFeat(FEAT_EPIC_OUTSIDER_SHAPE)) + { + int nSubFeat = Random(3) + 733; // 733 azer, 734 rakshasa, 735 Slaad. + if(ai_UseFeat(oCreature, FEAT_EPIC_OUTSIDER_SHAPE, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_EPIC_CONSTRUCT_SHAPE)) + { + int nSubFeat = Random(3) + 738; // 738 Stone, 739 Flesh, 740 Iron. + if(ai_UseFeat(oCreature, FEAT_EPIC_CONSTRUCT_SHAPE, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_EPIC_WILD_SHAPE_DRAGON)) + { + int nSubFeat = Random(3) + 707; // 707 Red, 708 Blue, 709 Green. + if(ai_UseFeat(oCreature, FEAT_EPIC_WILD_SHAPE_DRAGON, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_EPIC_WILD_SHAPE_UNDEAD)) + { + int nSubFeat = Random(3) + 704; // 704 Risen Lord, 705 Vampire, 706 Spectre. + if(ai_UseFeat(oCreature, FEAT_EPIC_WILD_SHAPE_UNDEAD, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_GREATER_WILDSHAPE_4)) + { + int nSubFeat; + int nRoll = d3(); + if(nRoll == 1) nSubFeat = 679; // Medusa + else if(nRoll == 2) nSubFeat = 691; // Mindflayer + else nSubFeat = 694; // DireTiger + if(ai_UseFeat(oCreature, FEAT_GREATER_WILDSHAPE_4, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_GREATER_WILDSHAPE_3)) + { + int nSubFeat; + int nRoll = d3(); + if(nRoll == 1) nSubFeat = 670; // Basilisk + else if(nRoll == 2) nSubFeat = 673; // Drider + else nSubFeat = 674; // Manticore + if(ai_UseFeat(oCreature, FEAT_GREATER_WILDSHAPE_3, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_GREATER_WILDSHAPE_2)) + { + int nSubFeat; + int nRoll = d3(); + if(nRoll == 1) nSubFeat = 672; // Harpy + else if(nRoll == 2) nSubFeat = 678; // Gargoyle + else nSubFeat = 680; // Minotaur + if(ai_UseFeat(oCreature, FEAT_GREATER_WILDSHAPE_2, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_GREATER_WILDSHAPE_1)) + { + int nSubFeat = Random(5) + 658; // Wyrmling + if(ai_UseFeat(oCreature, FEAT_GREATER_WILDSHAPE_1, oCreature, nSubFeat)) return TRUE; + } + if(GetHasFeat(FEAT_HUMANOID_SHAPE)) + { + int nSubFeat = Random(3) + 682; // 682 Drow, 683 Lizard, 684 Kobold. + if(ai_UseFeat(oCreature, FEAT_HUMANOID_SHAPE, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_ELEMENTAL_SHAPE)) + { + int nSubFeat = Random(4) + SUBFEAT_ELEMENTAL_SHAPE_EARTH; + if(ai_UseFeat(oCreature, FEAT_ELEMENTAL_SHAPE, oCreature, nSubFeat)) return TRUE; + } + else if(GetHasFeat(FEAT_WILD_SHAPE)) + { + int nSubFeat; + int nCompanionType = GetAnimalCompanionCreatureType(oCreature); + if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_NONE) + nSubFeat = Random(5) + SUBFEAT_WILD_SHAPE_BROWN_BEAR; + else + { + if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_BADGER) + nSubFeat = SUBFEAT_WILD_SHAPE_BADGER; + else if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_BOAR) + nSubFeat = SUBFEAT_WILD_SHAPE_BOAR; + else if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_BEAR) + nSubFeat = SUBFEAT_WILD_SHAPE_BROWN_BEAR; + else if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_PANTHER) + nSubFeat = SUBFEAT_WILD_SHAPE_PANTHER; + else if(nCompanionType == ANIMAL_COMPANION_CREATURE_TYPE_WOLF) + nSubFeat = SUBFEAT_WILD_SHAPE_WOLF; + else nSubFeat = Random(5) + SUBFEAT_WILD_SHAPE_BROWN_BEAR; + } + if(AI_DEBUG) ai_Debug("0i_talents", "885", " Using wild shape feat: " + IntToString(nSubFeat)); + ai_UseFeat(oCreature, FEAT_WILD_SHAPE, oCreature, nSubFeat); + return TRUE; + } + return FALSE; +} +int ai_TryPowerAttackFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_POWER_ATTACK, oCreature)) return FALSE; + // Power Attack has a -5 atk adjustment. + if(ai_PowerAttackGood(oCreature, oTarget, 5.0)) + { + ai_UseFeatAttackMode(oCreature, ACTION_MODE_POWER_ATTACK, AI_LAST_ACTION_MELEE_ATK, oTarget); + return TRUE; + } + SetActionMode(oCreature, ACTION_MODE_POWER_ATTACK, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return FALSE; +} +int ai_TryQuiveringPalmFeat(object oCreature, object oTarget) +{ + // Must have the feat, and enemy must be lower level, and not immune to crits. + if(!GetHasFeat(FEAT_QUIVERING_PALM, oCreature) || + GetHitDice(oTarget) >= GetHitDice(oCreature) || + GetIsImmune(oTarget, IMMUNITY_TYPE_CRITICAL_HIT)) return FALSE; + ai_UseFeat(oCreature, FEAT_QUIVERING_PALM, oTarget); + return TRUE; +} +int ai_TryRapidShotFeat(object oCreature, object oTarget, int nInMelee) +{ + if(!GetHasFeat(FEAT_RAPID_SHOT, oCreature)) return FALSE; + // Rapidshot has a -4 atk adjustment. + if(!ai_AttackPenaltyOk(oCreature, oTarget, -4.0)) + { + SetActionMode(oCreature, ACTION_MODE_RAPID_SHOT, FALSE); + DeleteLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + return FALSE; + } + ai_UseFeatAttackMode(oCreature, ACTION_MODE_RAPID_SHOT, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return TRUE; +} +int ai_TrySapFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_SAP, oCreature)) return FALSE; + // Does not work on creatures that cannot be hit by criticals or stunned. + // Sap has a -4 atk adjustment. + if(GetIsImmune(oTarget, IMMUNITY_TYPE_CRITICAL_HIT) || + GetIsImmune(oTarget, IMMUNITY_TYPE_STUN) || + !ai_AttackPenaltyOk(oCreature, oTarget, -4.0)) return FALSE; + ai_UseFeat(oCreature, FEAT_SAP, oTarget); + return TRUE; +} +int ai_TrySmiteEvilFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_SMITE_EVIL, oCreature) || + GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL || + !ai_StrongOpponent(oCreature, oTarget)) return FALSE; + ai_UseFeat(oCreature, FEAT_SMITE_EVIL, oTarget); + return TRUE; +} +int ai_TrySmiteGoodFeat(object oCreature, object oTarget) +{ + if(!GetHasFeat(FEAT_SMITE_GOOD, oCreature) || + GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD || + !ai_StrongOpponent(oCreature, oTarget)) return FALSE; + ai_UseFeat(oCreature, FEAT_SMITE_GOOD, oTarget); + return TRUE; +} +int ai_TryStunningFistFeat(object oCreature, object oTarget) +{ + // Cannot use if we have a weapon equiped. + if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature) != OBJECT_INVALID) return FALSE; + // Does not work on creatures that cannot be hit by criticals or stunned. + // Stunning Fists has a -4 atk adjustment. + if(!GetHasFeat(FEAT_STUNNING_FIST, oCreature) || + GetIsImmune(oTarget, IMMUNITY_TYPE_CRITICAL_HIT) || + GetIsImmune(oTarget, IMMUNITY_TYPE_STUN) || + !ai_StrongOpponent(oCreature, oTarget) || + !ai_AttackPenaltyOk(oCreature, oTarget, -4.0)) return FALSE; + ai_UseFeat(oCreature, FEAT_STUNNING_FIST, oTarget); + return TRUE; +} +void ai_NameAssociate(object oCreature, int nAssociateType, string sName) +{ + object oAssociate = GetAssociate(nAssociateType, oCreature); + if(GetName(oCreature) != "") return; + SetName(oAssociate, sName); + ChangeFaction(oAssociate, oCreature); +} +int ai_TrySummonAnimalCompanionTalent(object oCreature) +{ + if(!GetHasFeat(FEAT_ANIMAL_COMPANION, oCreature)) return FALSE; + if(GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCreature) != OBJECT_INVALID) return FALSE; + ai_UseFeat(oCreature, FEAT_ANIMAL_COMPANION, oCreature); + DelayCommand(0.0, ai_NameAssociate(oCreature, ASSOCIATE_TYPE_FAMILIAR, "Animal Companion")); + return TRUE; +} +int ai_TrySummonFamiliarTalent(object oCreature) +{ + if(!GetHasFeat(FEAT_SUMMON_FAMILIAR, oCreature)) return FALSE; + if(GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oCreature) != OBJECT_INVALID) return FALSE; + ai_UseFeat(oCreature, FEAT_SUMMON_FAMILIAR, oCreature); + DelayCommand(0.0, ai_NameAssociate(oCreature, ASSOCIATE_TYPE_FAMILIAR, "Familiar")); + return TRUE; +} +int ai_TryLayOnHands(object oCreature) +{ + if(!GetHasFeat(FEAT_LAY_ON_HANDS, oCreature)) return FALSE; + // Lets not run past an enemy to use touch atk unless we have the feats, bad tactics! + float fRange; + if(ai_CanIMoveInCombat(oCreature)) fRange = AI_RANGE_PERCEPTION; + else + { + fRange = GetDistanceBetween(oCreature, GetLocalObject(oCreature, AI_ENEMY_NEAREST)) - 3.0f; + // Looks bad when your right next to an ally, but technically the enemy is closer. + if(fRange < AI_RANGE_MELEE) fRange = AI_RANGE_MELEE; + } + object oTarget = ai_GetLowestCRRacialTarget(oCreature, RACIAL_TYPE_UNDEAD, fRange); + if(oTarget == OBJECT_INVALID) return FALSE; + ai_UseFeat(oCreature, FEAT_LAY_ON_HANDS, oTarget); + return TRUE; +} +int ai_TryTurningTalent(object oCreature) +{ + if(!GetHasFeat(FEAT_TURN_UNDEAD, oCreature)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "1043", "Checking for Turning Targets."); + int nHDCount, nHDCount2, nRacial, nHD; + // Get characters levels. + int nClericLevel = GetLevelByClass(CLASS_TYPE_CLERIC, oCreature); + int nPaladinLevel = GetLevelByClass(CLASS_TYPE_PALADIN, oCreature); + int nBlackguardlevel = GetLevelByClass(CLASS_TYPE_BLACKGUARD, oCreature); + int nTotalLevel = GetHitDice(oCreature); + int nTurnLevel = nClericLevel; + int nClassLevel = nClericLevel; + // GZ: Since paladin levels stack when turning, blackguard levels should stack as well + // GZ: but not with the paladin levels (thus else if). + if(nBlackguardlevel - 2 > 0 && nBlackguardlevel > nPaladinLevel) + { + nClassLevel += (nBlackguardlevel - 2); + nTurnLevel += (nBlackguardlevel - 2); + } + else if(nPaladinLevel - 2 > 0) + { + nClassLevel += (nPaladinLevel - 2); + nTurnLevel += (nPaladinLevel - 2); + } + //Flags for bonus turning types + int nElemental = GetHasFeat(FEAT_AIR_DOMAIN_POWER, oCreature) + + GetHasFeat(FEAT_EARTH_DOMAIN_POWER, oCreature) + + GetHasFeat(FEAT_FIRE_DOMAIN_POWER, oCreature) + + GetHasFeat(FEAT_WATER_DOMAIN_POWER, oCreature); + int nVermin = GetHasFeat(FEAT_PLANT_DOMAIN_POWER, oCreature); + int nConstructs = GetHasFeat(FEAT_DESTRUCTION_DOMAIN_POWER, oCreature); + int nGoodOrEvilDomain = GetHasFeat(FEAT_GOOD_DOMAIN_POWER, oCreature) + + GetHasFeat(FEAT_EVIL_DOMAIN_POWER, oCreature); + int nPlanar = GetHasFeat(854, oCreature); + // Get turning check average, modify if have the Sun Domain + int nChrMod = GetAbilityModifier(ABILITY_CHARISMA, oCreature); + int nTurnCheck = 15 + nChrMod; //The roll to apply to the max HD of undead that can be turned --> nTurnLevel + int nTurnHD = 12 + nChrMod + nClassLevel; //The number of HD of undead that can be turned. + if(GetHasFeat(FEAT_SUN_DOMAIN_POWER, oCreature)) + { + nTurnCheck += 2; + nTurnHD += 3; + } + //Determine the maximum HD of the undead that can be turned using a roll of 15 + ChrMod. + if(nTurnCheck == 15) nTurnLevel += 1; + else if(nTurnCheck >= 16 && nTurnCheck <= 18) nTurnLevel += 2; + else if(nTurnCheck >= 19 && nTurnCheck <= 21) nTurnLevel += 3; + else if(nTurnCheck >= 22) nTurnLevel += 4; + // Collect the number of HitDice we will affect. + int nCnt = 1; + object oEnemy = GetNearestCreature(7, 7, oCreature, nCnt); + while(oEnemy != OBJECT_INVALID && nHDCount < nTurnHD && GetDistanceBetween(oEnemy, oCreature) <= 20.0) + { + if(GetIsEnemy(oEnemy, oCreature) && !ai_Disabled(oEnemy)) + { + nRacial = GetRacialType(oEnemy); + nHD = 0; + if(nRacial == RACIAL_TYPE_UNDEAD) nHD = GetHitDice(oEnemy) + GetTurnResistanceHD(oEnemy); + else if(nRacial == RACIAL_TYPE_OUTSIDER && nGoodOrEvilDomain + nPlanar > 0) + { + //Planar turning decreases spell resistance against turning by 1/2 + if(nPlanar) nHD = GetHitDice(oEnemy) + (GetSpellResistance(oEnemy) / 2); + else nHD = GetHitDice(oEnemy) + GetSpellResistance(oEnemy); + } + else if(nRacial == RACIAL_TYPE_VERMIN && nVermin > 0) nHD = GetHitDice(oEnemy); + else if(nRacial == RACIAL_TYPE_ELEMENTAL && nElemental > 0) nHD = GetHitDice(oEnemy); + else if (nRacial == RACIAL_TYPE_CONSTRUCT && nConstructs > 0) nHD = GetHitDice(oEnemy); + // Only count undead we can defeat! + if(AI_DEBUG) ai_Debug("0i_talents", "1110", " nHD: " + IntToString(nHD) + + " nTurnLevel: " + IntToString(nTurnLevel) + + " nTurnHD: " + IntToString(nTurnHD) + + " nHDCount: " + IntToString(nHDCount)); + if(nHD > 0 && nHD <= nTurnLevel && nHD <= (nTurnHD - nHDCount)) nHDCount += nHD; + } + oEnemy = GetNearestCreature(7, 7, oCreature, ++nCnt); + } + if(AI_DEBUG) ai_Debug("0i_talents", "1089", "Found " + IntToString(nHDCount) + " hitdice to turn from my location."); + // Lets do one more check to see if we can get a better position to use TurnUndead. + nCnt = 1; + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(GetDistanceBetween(oCreature, oNearestEnemy) > AI_RANGE_MELEE) + { + oEnemy = oNearestEnemy; + if(AI_DEBUG) ai_Debug("0i_talents", "1126", GetName(oEnemy)); + while(oEnemy != OBJECT_INVALID && nHDCount2 < nTurnHD && GetDistanceBetween(oEnemy, oNearestEnemy) <= 20.0) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1129", GetName(oEnemy)); + if(GetIsEnemy(oEnemy, oCreature) && !ai_Disabled(oEnemy)) + { + nRacial = GetRacialType(oEnemy); + nHD = 0; + if(nRacial == RACIAL_TYPE_UNDEAD) nHD = GetHitDice(oEnemy) + GetTurnResistanceHD(oEnemy); + else if(nRacial == RACIAL_TYPE_OUTSIDER && nGoodOrEvilDomain + nPlanar > 0) + { + //Planar turning decreases spell resistance against turning by 1/2 + if(nPlanar) nHD = GetHitDice(oEnemy) + (GetSpellResistance(oEnemy) / 2); + else nHD = GetHitDice(oEnemy) + GetSpellResistance(oEnemy); + } + else if(nRacial == RACIAL_TYPE_VERMIN && nVermin > 0) nHD = GetHitDice(oEnemy); + else if(nRacial == RACIAL_TYPE_ELEMENTAL && nElemental > 0) nHD = GetHitDice(oEnemy); + else if (nRacial == RACIAL_TYPE_CONSTRUCT && nConstructs > 0) nHD = GetHitDice(oEnemy); + // Only count undead we can defeat! + if(AI_DEBUG) ai_Debug("0i_talents", "1140", " nHD: " + IntToString(nHD) + + " nTurnLevel: " + IntToString(nTurnLevel) + + " nTurnHD: " + IntToString(nTurnHD) + + " nHDCount2: " + IntToString(nHDCount2)); + if(nHD > 0 && nHD <= nTurnLevel && nHD <= (nTurnHD - nHDCount2)) nHDCount2 += nHD; + } + oEnemy = GetNearestCreature(7, 7, oNearestEnemy, ++nCnt); + } + } + if(AI_DEBUG) ai_Debug("0i_talents", "1148", "Found " + IntToString(nHDCount2) + " hitdice to turn from enemy location."); + if(nHDCount > nHDCount2) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1176", " My Location - nHDCount: " + IntToString(nHDCount) + + " >= nTurnHD / 2: " + IntToString(nTurnHD / 2)); + if(nHDCount < nTurnHD / 2) return FALSE; + ai_UseFeat(oCreature, FEAT_TURN_UNDEAD, oCreature); + return TRUE; + } + else + { + if(AI_DEBUG) ai_Debug("0i_talents", "1184", " Better location - nHDCount2: " + IntToString(nHDCount2) + + " >= nTurnHD / 2: " + IntToString(nTurnHD / 2)); + if(nHDCount2 < nTurnHD / 2) return FALSE; + ActionMoveToObject(oNearestEnemy, TRUE, 1.0f); + ai_UseFeat(oCreature, FEAT_TURN_UNDEAD, oCreature); + return TRUE; + } + return FALSE; +} +int ai_TryWhirlwindFeat(object oCreature) +{ + if(!GetHasFeat(FEAT_WHIRLWIND_ATTACK, oCreature)) return FALSE; + // Only worth using if there are 3+ targets. + if(AI_DEBUG) ai_Debug("0i_talents", "860", "WHIRLWIND : NumOfEnemies: " + IntToString(ai_GetNumOfEnemiesInGroup(oCreature, 3.0)) + "."); + // Shortened distance so its more effective(went from 5.0 to 2.0 and up to 3.0) + if(ai_GetNumOfEnemiesInGroup(oCreature, 3.0) < d3() + 1) return FALSE; + // * DO NOT WHIRLWIND if any of the targets are "large" or bigger + // * it seldom works against such large opponents. + // * Though its okay to use Improved Whirlwind against these targets + if((!GetHasFeat(FEAT_IMPROVED_WHIRLWIND, oCreature)) || + (GetCreatureSize(ai_GetNearestEnemy(oCreature, 1, 7, 7)) >= CREATURE_SIZE_LARGE && + GetCreatureSize(ai_GetNearestEnemy(oCreature, 2, 7, 7)) >= CREATURE_SIZE_LARGE)) + ai_UseFeat(oCreature, FEAT_WHIRLWIND_ATTACK, oCreature); + return TRUE; +} +int ai_TryWholenessOfBodyFeat(object oCreature) +{ + if(!GetHasFeat(FEAT_WHOLENESS_OF_BODY, oCreature)) return FALSE; + // Get when we are suppose to heal base off conversation with PC or + // on spawn generation. + int nHp = ai_GetPercHPLoss(oCreature); + if(nHp >= AI_HEALTH_WOUNDED) return FALSE; + ai_UseFeat(oCreature, FEAT_WHOLENESS_OF_BODY, oCreature); + return TRUE; +} +// ***************************************************************************** +// ******************** Try Physical Attack Talents **************************** +// ***************************************************************************** +// These functions try to find and use physical attack talents intelligently. + +void ai_ActionAttack(object oCreature, int nAction, object oTarget, int nInMelee = 0, int bPassive = FALSE, int nActionMode = 0) +{ + // If we are doing a ranged attack then check our position on the battlefield. + if(nAction == AI_LAST_ACTION_RANGED_ATK && ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nAction)) return; + ai_SetLastAction(oCreature, nAction); + SetLocalObject(oCreature, AI_ATTACKED_PHYSICAL, oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "894", GetName(oCreature) + " is attacking(" + IntToString(nAction) + + ") " + GetName(oTarget) + " Current Action: " + IntToString(GetCurrentAction(oCreature)) + + " Lastround Attacked Target: " + GetName(ai_GetAttackedTarget(oCreature)) + + " bPassive: " + IntToString(bPassive) + " nActionMode: " + IntToString(nActionMode)); + ActionAttack(oTarget, bPassive); + if(nActionMode == 0) ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); +} +void ai_FlyToAttacks(object oCreature, object oTarget) +{ + ai_TryWingAttacks(oCreature); + // If we don't do a Tail sweep attack then see if we can do a Tail slap! + if(!ai_TryTailSweepAttack(oCreature)) ai_TryTailSlap(oCreature); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); +} +void ai_FlyToTarget(object oCreature, object oTarget) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "908", GetName(OBJECT_SELF) + " is flying to " + GetName(oTarget) + "!"); + effect eFly = EffectDisappearAppear(GetLocation(oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eFly, oCreature, 3.0f); + DelayCommand(4.0f, ai_FlyToAttacks(oCreature, oTarget)); + // Used to make creature wait before starting its next round. + SetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS, 5); +} +int ai_TryDragonBreathAttack(object oCreature, int nRound, object oTarget = OBJECT_INVALID) +{ + int nCnt = GetLocalInt(oCreature, "AI_DRAGONS_BREATH"); + if(AI_DEBUG) ai_Debug("0i_talents", "918", "Try Dragon Breath Attack: nRound(" + IntToString(nRound) + ")" + + " <= nCnt(" + IntToString(nCnt) + ")!"); + if(nRound <= nCnt) return FALSE; + talent tUse = GetCreatureTalentBest(TALENT_CATEGORY_DRAGONS_BREATH, 20, oCreature); + if(!GetIsTalentValid(tUse)) return FALSE; + if(oTarget == OBJECT_INVALID) + { + string sIndex = IntToString(ai_GetHighestMeleeIndexNotInAOE(oCreature)); + oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + if(oTarget == OBJECT_INVALID) return FALSE; + } + SetLocalInt(oCreature, "AI_DRAGONS_BREATH", d4() + nRound); + ActionCastSpellAtObject(GetIdFromTalent(tUse), oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "1019", GetName(oCreature) + " breaths on " + GetName(oTarget) + "!"); + return TRUE; +} +void ai_DragonMeleeAttack(object oCreature, object oTarget, string sDmgDice, string sText) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "941", "oAttacker: " + GetName(oCreature) + + " oTarget: " + GetName(oTarget)); + int nDmg, nCheck, nAB = ai_GetCreatureAttackBonus(oCreature) - 5; + int nAC = GetAC(oTarget); + int nRoll = d20(); + string sHit; + // nCheck is a hit if nCheck > -1 and a miss if < 0; + if(nRoll == 20) nCheck = 20; + // We add one to the check so a equal result is still a hit. + else if(nRoll > 1) nCheck = nRoll + nAB - nAC + 1; + else nCheck == 0; + if(nCheck > 0) + { + nDmg = ai_RollDiceString(sDmgDice); + if(nCheck == 20) nDmg = nDmg * 2; + } + if(nCheck > 0) sHit = "*hit*"; + else sHit = "*miss*"; + string sMessage = ai_AddColorToText(GetName(oCreature) + "'s", AI_COLOR_LIGHT_MAGENTA) + + ai_AddColorToText(sText + "attacks " + GetName(oTarget) + " : " + sHit + " :(" + + IntToString(nRoll) + " + " + IntToString(nAB) + + " = " + IntToString(nRoll + nAB) + ")", AI_COLOR_DARK_ORANGE); + if(ai_GetIsCharacter(oTarget)) SendMessageToPC(oCreature, sMessage); + if(ai_GetIsCharacter(oTarget)) SendMessageToPC(oTarget, sMessage); + if(AI_DEBUG) ai_Debug("0i_talents", "965", "nAB: " + IntToString(nAB) + + " nAC: " + IntToString(nAC) + " nRoll: " + IntToString(nRoll) + + " nCheck: " + IntToString(nCheck) + " nDmg: " + IntToString(nDmg)); + if(nCheck <= 0) return; + // Apply any damage to the target! + effect eDmg = EffectDamage(nDmg, DAMAGE_TYPE_BLUDGEONING); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); +} +// Checks to see if a dragon can use its wings on a nearby enemy. +// Checks the right side and then the left side to see if it can attack. +int ai_TryWingAttacks(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "977", GetName(oCreature) + " is checking for wing Attacks!"); + // Only Medium size dragons can use thier wings in combat. + // We use HitDice to base size S:1-5, M:6-11, L:12-17, H:18-29, G:30-39, C:40+. + int nHitDice = GetHitDice(oCreature); + if(nHitDice <= 5) return FALSE; + int nDragonSize; + string sDmgDice, sMessage; + float fSize; + // Get the stats based on the size of the dragon. + if(nHitDice < 12) { fSize = 5.0f; nDragonSize = 3; sDmgDice = "1d4"; } // Medium + else if(nHitDice < 18) { fSize = 10.0f; nDragonSize = 4; sDmgDice = "1d6"; } // Large + else if(nHitDice < 30) { fSize = 10.0f; nDragonSize = 5; sDmgDice = "1d8"; } // Huge + else if(nHitDice < 40) { fSize = 15.0f; nDragonSize = 6; sDmgDice = "2d6"; } // Gargantuan + else { fSize = 15.0f; nDragonSize = 7; sDmgDice = "2d8"; } // Colossal + // Add half the dragons strength modifier. + int nDmg = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(nDmg > 0) sDmgDice = sDmgDice + "+" + IntToString(nDmg / 2); + if(AI_DEBUG) ai_Debug("0i_talents", "994", "nHitDice: " + IntToString(nHitDice) + + " nDragonSize: " + IntToString(nDragonSize) + + " sDmgDice: " + sDmgDice + " nDmg: " + IntToString(nDmg)); + // Get the closest enemy to our right wing. + location lWing = GetFlankingRightLocation(oCreature); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fSize, lWing); + while(oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1002", "oTarget: " + GetName(oTarget)); + if(GetIsEnemy(oTarget, oCreature) && !GetIsDead(oTarget)) break; + oTarget = GetNextObjectInShape(SHAPE_SPHERE, fSize, lWing); + } + if(oTarget != OBJECT_INVALID) ai_DragonMeleeAttack(oCreature, oTarget, sDmgDice, " right wing "); + // Get the closest enemy to our left wing. + lWing = GetFlankingLeftLocation(oCreature); + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fSize, lWing); + while(oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1012", "oTarget: " + GetName(oTarget)); + if(GetIsEnemy(oTarget, oCreature) && !GetIsDead(oTarget)) break; + oTarget = GetNextObjectInShape(SHAPE_SPHERE, fSize, lWing); + } + if(oTarget != OBJECT_INVALID) ai_DragonMeleeAttack(oCreature, oTarget, sDmgDice, " left wing "); + return TRUE; +} +// Looks behind the dragon to see if it can use it's tail slap on an enemy. +int ai_TryTailSlap(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1022", GetName(OBJECT_SELF) + " is checking for tail slap Attack!"); + // Only Large size dragons can use thier tail in combat. + // We use HitDice to base size S:1-5, M:6-11, L:12-17, H:18-29, G:30-39, C:40+. + int nHitDice = GetHitDice(oCreature); + if(nHitDice <= 11) return FALSE; + int nDragonSize; + string sDmgDice, sMessage; + float fSize; + // Get the stats based on the size of the dragon. + if(nHitDice < 12) { fSize = 5.0f; nDragonSize = 3; sDmgDice = "1d4"; } // Medium + else if(nHitDice < 18) { fSize = 10.0f; nDragonSize = 4; sDmgDice = "1d6"; } // Large + else if(nHitDice < 30) { fSize = 10.0f; nDragonSize = 5; sDmgDice = "1d8"; } // Huge + else if(nHitDice < 40) { fSize = 15.0f; nDragonSize = 6; sDmgDice = "2d6"; } // Gargantuan + else { fSize = 15.0f; nDragonSize = 7; sDmgDice = "2d8"; } // Colossal + // Add one and a half the dragons strength modifier. + int nDmg = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(nDmg > 0) sDmgDice = sDmgDice + "+" + IntToString(nDmg + nDmg / 2); + if(AI_DEBUG) ai_Debug("0i_talents", "1039", "nHitDice: " + IntToString(nHitDice) + + " nDragonSize: " + IntToString(nDragonSize) + + " sDmgDice: " + sDmgDice + " nDmg: " + IntToString(nDmg)); + // Get the closest enemy to our tail. + location lTail = GetBehindLocation(oCreature); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fSize, lTail); + while(oTarget != OBJECT_INVALID) + { + if(GetIsEnemy(oTarget, oCreature) && !GetIsDead(oTarget)) break; + oTarget = GetNextObjectInShape(SHAPE_SPHERE, fSize, lTail); + } + if(oTarget != OBJECT_INVALID) ai_DragonMeleeAttack(oCreature, oTarget, sDmgDice, " tail ");\ + return TRUE; +} +void ai_CrushEffect(object oCreature, object oBaseTarget, int nHitDice) +{ + int nDragonSize, nAtkValue, nDC = ai_GetDragonDC(oCreature); + string sDmgDice, sMessage; + location lImpact = GetLocation(oBaseTarget); + float fSize; + // Get the stats based on the size of the dragon. + if(nHitDice < 30) { fSize = 15.0f; nDragonSize = 5; sDmgDice = "2d8"; } // Huge + else if(nHitDice < 40) { fSize = 25.0f; nDragonSize = 6; sDmgDice = "4d6"; } // Gargantuan + else { fSize = 45.0f; nDragonSize = 7; sDmgDice = "4d8"; } // Colossal + // Add the dragons strength modifier 1.5 times. + int nDmgBonus = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(nDmgBonus > 0) sDmgDice = sDmgDice + "+" + IntToString(nDmgBonus + nDmgBonus / 2); + // Dragon flies up and then crushes the area below it. + effect eDmg, eKnockDown = EffectKnockdown(); + effect eImpact = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fSize, lImpact); + while(oTarget != OBJECT_INVALID) + { + if(ai_GetIsCharacter(oTarget)) DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget)); + // If they have evasion they automatically dodge the crush attack. + if(!GetHasFeat(FEAT_EVASION, oTarget) && oTarget != oCreature) + { + if(!ReflexSave(oTarget, nDC, SAVING_THROW_TYPE_NONE, oCreature)) + { + eDmg =EffectDamage(ai_RollDiceString(sDmgDice), DAMAGE_TYPE_BLUDGEONING); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); + sMessage = ai_AddColorToText(GetName(oCreature), AI_COLOR_LIGHT_MAGENTA) + + ai_AddColorToText(" crushes " + GetName(oTarget) + ".", AI_COLOR_DARK_ORANGE); + if(ai_GetIsCharacter(oTarget)) SendMessageToPC(oTarget, sMessage); + // Must be 3 sizes smaller to be affected by extra damage and knockdown. + if(nDragonSize - 2 < GetCreatureSize(oTarget)) + { + if(!GetIsImmune(oTarget, IMMUNITY_TYPE_KNOCKDOWN)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockDown, oTarget, 6.0f); + } + } + } + } + else + { + if(ai_GetIsCharacter(oTarget)) + { + sMessage = ai_AddColorToText(GetName(oTarget), AI_COLOR_LIGHT_MAGENTA) + + ai_AddColorToText(" dodges the crush attack from " + GetName(oTarget) + ".", AI_COLOR_DARK_ORANGE); + if(ai_GetIsCharacter(oTarget)) SendMessageToPC(oTarget, sMessage); + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, fSize, lImpact); + } + // Now do normal attacks! + ai_FlyToAttacks(oCreature, oBaseTarget); +} +int ai_TryCrushAttack(object oCreature, object oTarget) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1110", GetName(OBJECT_SELF) + " is checking for crush Attack!"); + // Only Huge size dragons can use crush attack. + // We use HitDice to base size S:1-5, M:6-11, L:12-17, H:18-29, G:30-39, C:40+. + int nHitDice = GetHitDice(oCreature); + if(nHitDice <= 17) return FALSE; + int nCrush = GetLocalInt(oCreature, "0_DRAGON_CRUSH") - 1; + if(nCrush > 0) + { + SetLocalInt(oCreature, "0_DRAGON_CRUSH", nCrush); + return FALSE; + } + effect eFly = EffectDisappearAppear(GetLocation(oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eFly, oCreature, 3.0f); + DelayCommand(4.0f, ai_CrushEffect(oCreature, oTarget, nHitDice)); + // Used to make creature wait before starting its next round. + SetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS, 5); + // We only crush every 3 rounds if we can. + SetLocalInt(oCreature, "0_DRAGON_CRUSH", 3); + return TRUE; +} +int ai_TryTailSweepAttack(object oCreature) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1132", GetName(oCreature) + " is checking for tail sweep Attack!"); + // Only Gargantuan size dragons can use tail sweep attack. + // We use HitDice to base size S:1-5, M:6-11, L:12-17, H:18-29, G:30-40, C:40+. + int nHitDice = GetHitDice(oCreature); + if(nHitDice <= 29) return FALSE; + int nSweep = GetLocalInt(oCreature, "0_DRAGON_SWEEP") - 1; + if(nSweep > 0) + { + SetLocalInt(oCreature, "0_DRAGON_SWEEP", nSweep); + return FALSE; + } + int nDragonSize, nAtkValue, nDC = ai_GetDragonDC(oCreature); + string sDmgDice, sMessage; + float fSize; + // Get the stats based on the size of the dragon. + if(nHitDice < 33) { fSize = 15.0f; nDragonSize = 6; sDmgDice = "2d6"; } // Gargantuan + else { fSize = 40.0f; nDragonSize = 7; sDmgDice = "2d8"; } // Colossal + location lImpact = GetBehindLocation(oCreature); + // We always sweep if we have the opportunity. + // Add the dragons strength modifier 1.5 times. + int nDmgBonus = GetAbilityModifier(ABILITY_STRENGTH, oCreature); + if(nDmgBonus > 0) sDmgDice = sDmgDice + "+" + IntToString(nDmgBonus + nDmgBonus / 2); + // Sweeps any creatures behind them. + effect eDmg; + effect eKnockDown = EffectKnockdown(); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fSize, lImpact); + while(oTarget != OBJECT_INVALID) + { + sMessage = ai_AddColorToText(GetName(oCreature), AI_COLOR_LIGHT_MAGENTA) + + ai_AddColorToText(" sweeps " + GetName(oTarget) + ".", AI_COLOR_ORANGE); + if(ai_GetIsCharacter(oTarget)) SendMessageToPC(oTarget, sMessage); + // If they have evasion they automatically dodge the sweep attack. + if(!GetHasFeat(FEAT_EVASION, oTarget) && oTarget != oCreature) + { + if(!ReflexSave(oTarget, nDC, SAVING_THROW_TYPE_NONE, oCreature)) + { + eDmg = EffectDamage(ai_RollDiceString(sDmgDice), DAMAGE_TYPE_BLUDGEONING); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); + // Must be 4 sizes smaller to be affected by extra damage and knockdown. + if(nDragonSize - 3 < GetCreatureSize(oTarget)) + { + if(!GetIsImmune(oTarget, IMMUNITY_TYPE_KNOCKDOWN)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockDown, oTarget, 12.0f); + } + } + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, fSize, lImpact); + } + // We only sweep every 3 rounds if we can. + SetLocalInt(oCreature, "0_DRAGON_SWEEP", 3); + return TRUE; +} +int ai_TrySneakAttack(object oCreature, int nInMelee, int bAlwaysAtk = TRUE) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1188", GetName(OBJECT_SELF) + " is checking for melee Sneak Attack!"); + if(!GetHasFeat(FEAT_SNEAK_ATTACK, oCreature)) return FALSE; + // Lets get the nearest target that is attacking someone besides me. + object oTarget = OBJECT_INVALID; + oTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + string sIndex; + // Check if we have Mobility, Spring Attack or a good tumble. + // if we do then look for other targets besides who we are in melee with. + if(!nInMelee) sIndex = IntToString(ai_GetBestSneakAttackIndex(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk)); + // If there are few enemies then we can safely move around. + else if(nInMelee < 3 || ai_CanIMoveInCombat(oCreature)) + { + sIndex = IntToString(ai_GetBestSneakAttackIndex(oCreature, AI_RANGE_MELEE)); + } + // Ok we are in a serious fight so lets not give attack of opportunities. + else sIndex = IntToString(ai_GetNearestIndex(oCreature, AI_RANGE_MELEE)); + oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + } + if(oTarget == OBJECT_INVALID) return FALSE; + int nRacialType = GetRacialType(oTarget); + if(nRacialType == RACIAL_TYPE_CONSTRUCT || nRacialType == RACIAL_TYPE_UNDEAD) return FALSE; + if(ai_GetHasEffectType(oTarget, IMMUNITY_TYPE_CRITICAL_HIT)) return FALSE; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return TRUE; +} +int ai_TryRangedSneakAttack(object oCreature, int nInMelee) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1209", GetName(oCreature) + " is checking for a Ranged Sneak Attack!"); + // If we have Sneak Attack then we should be attacking targets that + // are busy fighting so we can get extra damage. + if(!GetHasFeat(FEAT_SNEAK_ATTACK, oCreature)) return FALSE; + object oTarget = OBJECT_INVALID; + oTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = GetLocalObject(oCreature, AI_ENEMY + IntToString(ai_GetBestSneakAttackIndex(oCreature))); + if(oTarget == OBJECT_INVALID) return FALSE; + int nRacialType = GetRacialType(oTarget); + if(nRacialType == RACIAL_TYPE_CONSTRUCT || nRacialType == RACIAL_TYPE_UNDEAD) return FALSE; + if(ai_GetHasEffectType(oTarget, IMMUNITY_TYPE_CRITICAL_HIT)) return FALSE; + // If we have a target and are not within 30' then move within 30'. + if(GetDistanceToObject(oTarget) > AI_RANGE_CLOSE) ActionMoveToObject(oTarget, TRUE, AI_RANGE_CLOSE); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return TRUE; +} +int ai_TryMeleeTalents(object oCreature, object oTarget) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1224", "Check category melee talents!"); + talent tUse = GetCreatureTalentBest(TALENT_CATEGORY_HARMFUL_MELEE, 20, oCreature); + if(!GetIsTalentValid(tUse)) return FALSE; + int nId = GetIdFromTalent(tUse); + if(AI_DEBUG) ai_Debug("0i_talents", "1228", "TALENT_CATEGORY_MELEE_TALENTS nId: " + IntToString(nId)); + if(nId == FEAT_POWER_ATTACK) { if(ai_TryPowerAttackFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_EXPERTISE) { if(ai_TryExpertiseFeat(oCreature)) return TRUE; } + else if(nId == FEAT_KNOCKDOWN) { if(ai_TryKnockdownFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_SMITE_EVIL) { if(ai_TrySmiteEvilFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_SMITE_GOOD) { if(ai_TrySmiteGoodFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_IMPROVED_POWER_ATTACK) { if(ai_TryImprovedPowerAttackFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_IMPROVED_EXPERTISE) { if(ai_TryImprovedExpertiseFeat(oCreature)) return TRUE; } + else if(nId == FEAT_FLURRY_OF_BLOWS) { if(ai_TryFlurryOfBlowsFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_STUNNING_FIST) { if(ai_TryStunningFistFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_SAP) { if(ai_TrySapFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_DISARM) { if(ai_TryDisarmFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_KI_DAMAGE) { if(ai_TryKiDamageFeat(oCreature, oTarget)) return TRUE; } + else if(nId == FEAT_CALLED_SHOT) { if(ai_TryCalledShotFeat(oCreature, oTarget)) return TRUE; } + return FALSE; +} +// ***************************************************************************** +// ***************************** TALENT SCRIPTS ****************************** +// ***************************************************************************** +// These functions do not fall into another section. + +int ai_GetMonsterTalentMaxLevel(object oCreature) +{ + // Monsters should use either the best spell they have or a random spell so + // they all don't look robotic. Mix it up based on an Intelligence check. + int nMaxLevel = (ai_GetCharacterLevels(oCreature) + 1) / 2; + if(nMaxLevel > 9) nMaxLevel = 9; + if(AI_DEBUG) ai_Debug("0i_talents", "1258", "nMaxLevel: " + IntToString(nMaxLevel)); + return nMaxLevel; +} +int ai_GetAssociateTalentMaxLevel(object oCreature, int nDifficulty) +{ + int nLevel = (ai_GetCharacterLevels(oCreature) + 1) / 2; + if(nLevel > 20) nLevel = 20; + int nMaxLevel = (nLevel * nDifficulty) / 20; + if(nMaxLevel < 1) nMaxLevel = 1; + if(AI_DEBUG) ai_Debug("0i_talents", "1267", "nLevel: " + IntToString(nLevel) + + " nMaxLevel: " + IntToString(nMaxLevel)); + return nMaxLevel; +} +int ai_GetHasTalent(object oCreature, int nTalent) +{ + string sCategory = Get2DAString("ai_spells", "Category", nTalent); + json jCategory = GetLocalJson(oCreature, sCategory); + if(JsonGetType(jCategory) == JSON_TYPE_NULL) return FALSE; + int nLevel, nSlot, nSlotIndex, nMaxSlotIndex, nSpell; + json jLevel, jTalent; + // Loop through nLevels looking for nTalent + while(nLevel <= 9) + { + // Get the array of nLevel. + jLevel = JsonArrayGet(jCategory, nLevel); + nMaxSlotIndex = JsonGetLength(jLevel); + if(nMaxSlotIndex > 0) + { + // Get the talent within nLevel cycling from the first to the last. + nSlotIndex = 0; + while (nSlotIndex < nMaxSlotIndex) + { + jTalent= JsonArrayGet(jLevel, nSlotIndex); + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + if(nSpell == nTalent) return TRUE; + nSlotIndex++; + } + } + nLevel++; + } + return FALSE; +} +object ai_CheckTalentForBuffing(object oCreature, string sCategory, int nSpell) +{ + // Should we buff this monster caster? Added legacy code just in case. + if((sCategory == "P" || sCategory == "E" || sCategory == "S") && + (GetLocalInt(GetModule(), AI_RULE_BUFF_MONSTERS) || + GetLocalInt(oCreature, "NW_GENERIC_MASTER") & 0x04000000)) return ai_GetBuffTarget(oCreature, nSpell); + //if(sCategory == "S" && GetLocalInt(GetModule(), AI_RULE_PRESUMMON)) return oCreature; + return OBJECT_INVALID; +} +int ai_UseBuffTalent(object oCreature, int nClass, int nLevel, int nSlot, int nSpell, int nType, object oTarget, object oItem) +{ + if(nType == AI_TALENT_TYPE_SPELL) + { + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + if(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot)) + { + ai_CastMemorizedSpell(oCreature, nClass, nLevel, nSlot, oTarget, TRUE); + return TRUE; + } + } + else if(GetSpellUsesLeft(oCreature, nClass, nSpell)) + { + ai_CastKnownSpell(oCreature, nClass, nSpell, oTarget, TRUE); + return TRUE; + } + } + else if(nType == AI_TALENT_TYPE_SP_ABILITY) + { + ActionCastSpellAtObject(nSpell, oTarget, 255, FALSE, 0, 0, TRUE, 255); + } + /* This will not work as there is no cheat option for using an item. + else if(nType == AI_TALENT_TYPE_ITEM) + { + int nBaseItem = GetBaseItemType(oItem); + if(!AI_BUFF_MONSTER_POTIONS && + (nBaseItem == BASE_ITEM_POTIONS || nBaseItem == BASE_ITEM_ENCHANTED_POTION)) return FALSE; + itemproperty ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + if(nIndex++ == nSlot) break; + ipProp = GetNextItemProperty(oItem); + } + // Cast items have the following: + // 1)Single_Use. + // 2-6) Charges/Use [Note: 7 is 0 charges per use]. + // 8-12) Uses/Day [Note: 13 is unlimited uses per day]. + // We set the slot to -1 to let the other function know we need this talent removed. + int nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses == 1) jTalent = JsonArrayInsert(jTalent, JsonInt(-1), 4); + else if(nUses > 1 && nUses < 7) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1319", "Item charges: " + IntToString(GetItemCharges(oItem))); + int nCharges = GetItemCharges(oItem); + if(nUses == 6 && nCharges == 1 || nUses == 5 && nCharges < 4 || + nUses == 4 && nCharges < 6 || nUses == 3 && nCharges < 8 || + nUses == 2 && nCharges < 10) return FALSE; + } + else if(nUses > 7 && nUses < 13) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1327", "Item uses: " + IntToString(GetItemPropertyUsesPerDayRemaining(oItem, ipProp))); + int nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(nUses == 8 && nPerDay == 1 || nUses == 9 && nPerDay < 4 || + nUses == 10 && nPerDay < 6 || nUses == 11 && nPerDay < 8 || + nUses == 12 && nPerDay < 10) return FASLE; + } + ActionUseItemOnObject(oItem, ipProp, oTarget, nSubIndex); + return TRUE; + } */ + return FALSE; +} +int ai_SpellRestricted(int nSpell) +{ + json jRSpells = GetLocalJson(GetModule(), AI_RULE_RESTRICTED_SPELLS); + int nIndex, nMaxIndex = JsonGetLength(jRSpells); + while(nIndex < nMaxIndex) + { + if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1703", IntToString(nSpell) + " is has been restricted and will be ignored!"); + return TRUE; + } + nIndex++; + } + return FALSE; +} +void ai_SaveTalent(object oCreature, int nClass, int nJsonLevel, int nLevel, int nSlot, int nSpell, int nType, int bMonster, object oItem = OBJECT_INVALID) +{ + // Players/Admins can restrict some spells. + if(ai_SpellRestricted(nSpell)) return; + // Get the talent category, we organize all talents by categories. + string sCategory = Get2DAString("ai_spells", "Category", nSpell); + // If it is a blank talent or it is an Area of Effect talent we skip. + if(sCategory == "" || sCategory == "A") return; + // Check to see if we should be prebuffing. + if(bMonster) + { + int nSpellBuffDuration = StringToInt(Get2DAString("ai_spells", "Buff_Duration", nSpell)); + if(nSpellBuffDuration == 3) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1600", GetName(oCreature) + " is buffing with spell " + IntToString(nSpell)); + object oTarget = ai_CheckTalentForBuffing(oCreature, sCategory, nSpell); + if(oTarget != OBJECT_INVALID && + ai_UseBuffTalent(oCreature, nClass, nLevel, nSlot, nSpell, nType, oTarget, oItem)) return; + } + } + json jCategory = GetLocalJson(oCreature, sCategory); + // With no jCategory then we make one with all 0-9 levels. + if(JsonGetType(jCategory) == JSON_TYPE_NULL) + { + jCategory = JsonArray(); + jCategory = JsonArrayInsert(jCategory, JsonArray(), 0); + int nNewLevel = 9; + while(nNewLevel > 0) + { + jCategory = JsonArrayInsert(jCategory, JsonArray()); + nNewLevel--; + } + } + // Get the current Level so we can save to it. + json jLevel = JsonArrayGet(jCategory, nJsonLevel); + json jTalent = JsonArray(); + if(nType == AI_TALENT_TYPE_SPELL || nType == AI_TALENT_TYPE_SP_ABILITY) + { + jTalent = JsonArrayInsert(jTalent, JsonInt(nType), 0); + jTalent = JsonArrayInsert(jTalent, JsonInt(nSpell)); + jTalent = JsonArrayInsert(jTalent, JsonInt(nClass)); + jTalent = JsonArrayInsert(jTalent, JsonInt(nLevel)); + jTalent = JsonArrayInsert(jTalent, JsonInt(nSlot)); + } + else if(nType == AI_TALENT_TYPE_ITEM) + { + jTalent = JsonArrayInsert(jTalent, JsonInt(nType), 0); + jTalent = JsonArrayInsert(jTalent, JsonInt(nSpell)); + jTalent = JsonArrayInsert(jTalent, JsonString(ObjectToString(oItem))); + jTalent = JsonArrayInsert(jTalent, JsonInt(nLevel)); + jTalent = JsonArrayInsert(jTalent, JsonInt(nSlot)); + } + jLevel = JsonArrayInsert(jLevel, jTalent); + jCategory = JsonArraySet(jCategory, nJsonLevel, jLevel); + SetLocalJson(oCreature, sCategory, jCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "1777", sCategory + ": " + JsonDump(jCategory, 1)); + if(AI_DEBUG) ai_Debug("0i_talents", "1778", "AI_MAX_TALENT: " + + IntToString(GetLocalInt(oCreature, AI_MAX_TALENT + sCategory)) + + " nJsonLevel: " + IntToString(nJsonLevel)); + // Set AI_MAX_TALENT if this talent is higher than the maximum. + if(nJsonLevel > GetLocalInt(oCreature, AI_MAX_TALENT + sCategory)) + { + SetLocalInt(oCreature, AI_MAX_TALENT + sCategory, nJsonLevel); + } +} +// For removing used up spell slots. +void ai_RemoveTalent(object oCreature, json jCategory, json jLevel, string sCategory, int nLevel, int nSlotIndex) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1400", "removing Talent from slot: " + IntToString(nSlotIndex)); + jLevel = JsonArrayDel(jLevel, nSlotIndex); + if(AI_DEBUG) ai_Debug("0i_talents", "1402", "jLevel: " + JsonDump(jLevel, 2)); + jCategory = JsonArraySet(jCategory, nLevel, jLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "1404", "jCategory: " + JsonDump(jCategory, 2)); + SetLocalJson(oCreature, sCategory, jCategory); +} +// For removing Sorcerer/Bard spell levels once used up. +void ai_RemoveTalentLevel(object oCreature, json jCategory, json jLevel, string sCategory, int nLevel) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1410", "removing Talent level: " + IntToString(nLevel)); + jCategory = JsonArrayDel(jCategory, nLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "1412", "jCategory: " + JsonDump(jCategory, 2)); + SetLocalJson(oCreature, sCategory, jCategory); +} +void ai_SetCreatureSpellTalents(object oCreature, int bMonster) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1417", GetName(oCreature) + ": Setting Spell Talents for combat [Buff: " + + IntToString(bMonster) + "]."); + // Cycle through all classes and spells. + int nClassPosition = 1, nMaxSlot, nLevel, nSlot, nSpell, nIndex, nMetaMagic; + int nClass = GetClassByPosition(nClassPosition, oCreature); + while(nClassPosition <= AI_MAX_CLASSES_PER_CHARACTER && nClass != CLASS_TYPE_INVALID) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1824", "nClass: " + IntToString(nClass) + + " nClassPosition: " + IntToString(nClassPosition) + + " SpellCaster: " + Get2DAString("classes", "SpellCaster", nClass) + + " Memorized: " + Get2DAString("classes", "MemorizesSpells", nClass)); + if(Get2DAString("classes", "SpellCaster", nClass) == "1") + { + // Search all memorized spells for the spell. + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + // Check each level organizing from highest to lowest. + nLevel = (GetLevelByPosition(nClassPosition, oCreature) + 1) / 2; + if(nLevel > 9) nLevel = 9; + while(nLevel > -1) + { + // Check each slot within each level. + nMaxSlot = GetMemorizedSpellCountByLevel(oCreature, nClass, nLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "1434", "nClass: " + IntToString(nClass) + + " nLevel: " + IntToString(nLevel) + " nMaxSlot: " + + IntToString(nMaxSlot)); + nSlot = 0; + while(nSlot < nMaxSlot) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1440", "nSlot: " + IntToString(nSlot) + " nSpell: " + + IntToString(GetMemorizedSpellId(oCreature, nClass, nLevel, nSlot)) + " spell memorized: " + + IntToString(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot))); + if(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot) == 1) + { + nSpell = GetMemorizedSpellId(oCreature, nClass, nLevel, nSlot); + /* Spells are already at the higher level when saved as a talent. + // Move a spell up to a different JsonLevel as higher Jsonlevel + // spells usually get cast first. + nMetaMagic = GetMemorizedSpellMetaMagic(oCreature, nClass, nLevel, nSlot); + if(nMetaMagic > 0) + { + if(nMetaMagic == METAMAGIC_STILL) nMetaMagic = 1; + else if(nMetaMagic == METAMAGIC_EXTEND) nMetaMagic = 1; + else if(nMetaMagic == METAMAGIC_SILENT) nMetaMagic = 1; + else if(nMetaMagic == METAMAGIC_EMPOWER) nMetaMagic = 2; + else if(nMetaMagic == METAMAGIC_MAXIMIZE) nMetaMagic = 3; + else if(nMetaMagic == METAMAGIC_QUICKEN) nMetaMagic = 4; + nAdjLevel = nLevel + nMetaMagic; + if(nAdjLevel > 9) nAdjLevel = 9; + } + else nAdjLevel = nLevel; */ + ai_SaveTalent(oCreature, nClass, nLevel, nLevel, nSlot, nSpell, AI_TALENT_TYPE_SPELL, bMonster); + } + nSlot++; + } + nLevel--; + } + } + // Check non-memorized known lists for the spell. + else + { + // Check each level starting with the highest to lowest. + nLevel = (GetLevelByPosition(nClassPosition, oCreature) + 1) / 2; + if(nLevel > 9) nLevel = 9; + while(nLevel > -1) + { + // Check each slot within each level. + nMaxSlot = GetKnownSpellCount(oCreature, nClass, nLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "1462", "nClass: " + IntToString(nClass) + + " nLevel: " + IntToString(nLevel) + " nMaxSlot: " + + IntToString(nMaxSlot)); + nSlot = 0; + while(nSlot < nMaxSlot) + { + nSpell = GetKnownSpellId(oCreature, nClass, nLevel, nSlot); + if(AI_DEBUG) ai_Debug("0i_talents", "1469", "nSlot: " + IntToString(nSlot) + + " nSpell: " + IntToString(nSpell) + " nUsesLeft: " + + IntToString(GetSpellUsesLeft(oCreature, nClass, nSpell))); + if(GetSpellUsesLeft(oCreature, nClass, nSpell) > 0) + { + ai_SaveTalent(oCreature, nClass, nLevel, nLevel, nSlot, nSpell, AI_TALENT_TYPE_SPELL, bMonster); + } + nSlot++; + } + nLevel--; + } + } + } + nClassPosition++; + nClass = GetClassByPosition(nClassPosition, oCreature); + } +} +void ai_SetCreatureSpecialAbilityTalents(object oCreature, int bMonster) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1488", GetName(oCreature) + ": Setting Special Ability Talents for combat."); + // Cycle through all the creatures special abilities. + int nMaxSpecialAbilities = GetSpellAbilityCount(oCreature); + if(AI_DEBUG) ai_Debug("0i_talents", "1491", IntToString(GetSpellAbilityCount(oCreature)) + " Spell abilities."); + if(nMaxSpecialAbilities) + { + int nIndex, nSpell, nLevel; + while(nIndex < nMaxSpecialAbilities) + { + nSpell = GetSpellAbilitySpell(oCreature, nIndex); + if(GetSpellAbilityReady(oCreature, nSpell)) + { + nLevel = StringToInt(Get2DAString("spells", "Innate", nSpell)); + ai_SaveTalent(oCreature, 255, nLevel, nLevel, nIndex, nSpell, AI_TALENT_TYPE_SP_ABILITY, bMonster); + } + nIndex++; + } + } +} +void ai_CheckItemProperties(object oCreature, object oItem, int bMonster, int bEquiped = FALSE) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1509", "Checking Item properties on " + GetName(oItem)); + // We have established that we can use the item if it is equiped. + if(!bEquiped && !ai_CheckIfCanUseItem(oCreature, oItem)) return; + // Get or create an Immunity in json so we can check item immunities quickly. + int nSpellImmunity, bHasItemImmunity, nPerDay, nCharges, nUses, bSaveTalent; + json jImmunity = GetLocalJson(oCreature, AI_TALENT_IMMUNITY); + if(JsonGetType(jImmunity) == JSON_TYPE_NULL) jImmunity = JsonArray(); + int nIprpSubType, nSpell, nLevel, nIPType, nIndex; + itemproperty ipProp = GetFirstItemProperty(oItem); + // Lets skip this if there are no properties. + if(!GetIsItemPropertyValid(ipProp)) return; + // Check for cast spell property and add them to the talent list. + while(GetIsItemPropertyValid(ipProp)) + { + nIPType = GetItemPropertyType(ipProp); + if(AI_DEBUG) ai_Debug("0i_talents", "1895", "ItempropertyType(15/80/53): " + IntToString(nIPType)); + if(nIPType == ITEM_PROPERTY_CAST_SPELL) + { + bSaveTalent = TRUE; + // Get how they use the item (charges or uses per day). + nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses > 1 && nUses < 7) + { + nCharges = GetItemCharges(oItem); + if(AI_DEBUG) ai_Debug("0i_talents", "1530", "Charges per use: " + IntToString(nUses) + + " Item charges: " + IntToString(nCharges)); + if((nUses == IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE && nCharges < 1) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE && nCharges < 2) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE && nCharges < 3) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE && nCharges < 4) || + (nUses == IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE && nCharges < 5)) bSaveTalent = FALSE; + } + else if(nUses > 7 && nUses < 13) + { + nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(AI_DEBUG) ai_Debug("0i_talents", "1676", "Item uses: " + IntToString(nPerDay)); + if(nPerDay == 0) bSaveTalent = FALSE; + } + if(bSaveTalent) + { + // SubType is the ip spell index for iprp_spells.2da + nIprpSubType = GetItemPropertySubType(ipProp); + nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); + nLevel = StringToInt(Get2DAString("iprp_spells", "InnateLvl", nIprpSubType)); + ai_SaveTalent(oCreature, 255, nLevel, nLevel, nIndex, nSpell, AI_TALENT_TYPE_ITEM, bMonster, oItem); + } + } + else if(nIPType == ITEM_PROPERTY_HEALERS_KIT) + { + // Lets set Healing kits as Cure Light Wounds since they heal 1d20 in combat. + nSpell = SPELL_CURE_MINOR_WOUNDS; + // Save the healer kit as level 9 so we can use them first. + // Must also have ranks in healing kits. + if(GetSkillRank(SKILL_HEAL, oCreature) > 0) + { + ai_SaveTalent(oCreature, 255, 7, 0, nIndex, nSpell, AI_TALENT_TYPE_ITEM, bMonster, oItem); + } + } + if(bEquiped) + { + if(nIPType == ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL) + { + bHasItemImmunity = TRUE; + nSpellImmunity = GetItemPropertyCostTableValue(ipProp); + nSpellImmunity = StringToInt(Get2DAString("iprp_spellcost", "SpellIndex", nSpellImmunity)); + //if(AI_DEBUG) ai_Debug("0i_talents", "1950", "SpellImmunity to " + Get2DAString("spells", "Label", nSpellImmunity)); + jImmunity = JsonArrayInsert(jImmunity, JsonInt(nSpellImmunity)); + } + else if(nIPType == ITEM_PROPERTY_HASTE) + { + SetLocalInt(oCreature, sIPHasHasteVarname, TRUE); + } + else if(nIPType == ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE) + { + int nBit, nIpSubType = GetItemPropertySubType(ipProp); + if(AI_DEBUG) ai_Debug("0i_talents", "1957", "nIPSubType: " + IntToString(nIpSubType)); + if(nIpSubType == 0) nBit = DAMAGE_TYPE_BLUDGEONING; + else if(nIpSubType == 1) nBit = DAMAGE_TYPE_PIERCING; + else if(nIpSubType == 2) nBit = DAMAGE_TYPE_SLASHING; + else if(nIpSubType == 5) nBit = DAMAGE_TYPE_MAGICAL; + else if(nIpSubType == 6) nBit = DAMAGE_TYPE_ACID; + else if(nIpSubType == 7) nBit = DAMAGE_TYPE_COLD; + else if(nIpSubType == 8) nBit = DAMAGE_TYPE_DIVINE; + else if(nIpSubType == 9) nBit = DAMAGE_TYPE_ELECTRICAL; + else if(nIpSubType == 10) nBit = DAMAGE_TYPE_FIRE; + else if(nIpSubType == 11) nBit = DAMAGE_TYPE_NEGATIVE; + else if(nIpSubType == 12) nBit = DAMAGE_TYPE_POSITIVE; + else if(nIpSubType == 13) nBit = DAMAGE_TYPE_SONIC; + if(nBit > 0) ai_SetItemProperty(oCreature, sIPImmuneVarname, nBit, TRUE); + } + else if(nIPType == ITEM_PROPERTY_DAMAGE_RESISTANCE) + { + int nBit, nIpSubType = GetItemPropertySubType(ipProp); + if(nIpSubType == 0) nBit = DAMAGE_TYPE_BLUDGEONING; + else if(nIpSubType == 1) nBit = DAMAGE_TYPE_PIERCING; + else if(nIpSubType == 2) nBit = DAMAGE_TYPE_SLASHING; + else if(nIpSubType == 5) nBit = DAMAGE_TYPE_MAGICAL; + else if(nIpSubType == 6) nBit = DAMAGE_TYPE_ACID; + else if(nIpSubType == 7) nBit = DAMAGE_TYPE_COLD; + else if(nIpSubType == 8) nBit = DAMAGE_TYPE_DIVINE; + else if(nIpSubType == 9) nBit = DAMAGE_TYPE_ELECTRICAL; + else if(nIpSubType == 10) nBit = DAMAGE_TYPE_FIRE; + else if(nIpSubType == 11) nBit = DAMAGE_TYPE_NEGATIVE; + else if(nIpSubType == 12) nBit = DAMAGE_TYPE_POSITIVE; + else if(nIpSubType == 13) nBit = DAMAGE_TYPE_SONIC; + if(nBit > 0) ai_SetItemProperty(oCreature, sIPResistVarname, nBit, TRUE); + } + else if(nIPType == ITEM_PROPERTY_DAMAGE_REDUCTION) + { + int nIpSubType = GetItemPropertySubType(ipProp); + SetLocalInt(oCreature, sIPReducedVarname, nIpSubType); + } + } + nIndex++; + ipProp = GetNextItemProperty(oItem); + } + // If nSpellImmunity has been set then we need to save our Immunity json. + if(bHasItemImmunity) SetLocalJson(oCreature, AI_TALENT_IMMUNITY, jImmunity); +} +void ai_SetCreatureItemTalents(object oCreature, int bMonster) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1561", GetName(oCreature) + ": Setting Item Talents for combat."); + int bEquiped; + string sSlots; + // Cycle through all the creatures inventory items. + object oItem = GetFirstItemInInventory(oCreature); + while(oItem != OBJECT_INVALID) + { + if(GetIdentified(oItem)) + { + // Does the item need to be equiped to use its powers? + sSlots = Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)); + if(AI_DEBUG) ai_Debug("0i_talents", "1572", GetName(oItem) + " requires " + Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)) + " slots."); + if(sSlots == "0x00000") ai_CheckItemProperties(oCreature, oItem, bMonster); + } + oItem = GetNextItemInInventory(oCreature); + } + int nSlot; + // Cycle through all the creatures equiped items. + oItem = GetItemInSlot(nSlot, oCreature); + while(nSlot < 11) + { + if(oItem != OBJECT_INVALID) ai_CheckItemProperties(oCreature, oItem, bMonster, TRUE); + oItem = GetItemInSlot(++nSlot, oCreature); + } + oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCreature); + if(oItem != OBJECT_INVALID) ai_CheckItemProperties(oCreature, oItem, bMonster, TRUE); +} +void ai_SetCreatureTalents(object oCreature, int bMonster) +{ + json jCreature = ObjectToJson(oCreature); + //if(AI_DEBUG) ai_Debug("0i_talents", "2072", GetName(oCreature) + " jCreature: " + JsonDump(jCreature, 4)); + if(GetLocalInt(oCreature, AI_TALENTS_SET)) return; + SetLocalInt(oCreature, AI_TALENTS_SET, TRUE); + object oModule = GetModule(); + ai_Counter_Start(); + ai_SetCreatureSpellTalents(oCreature, bMonster); + ai_Counter_End(GetName(oCreature) + ": Spell Talents"); + ai_SetCreatureSpecialAbilityTalents(oCreature, bMonster); + ai_Counter_End(GetName(oCreature) + ": Special Ability Talents"); + DeleteLocalJson(oCreature, AI_TALENT_IMMUNITY); + ai_SetCreatureItemTalents(oCreature, bMonster); + ai_Counter_End(GetName(oCreature) + ": Item Talents"); + if(GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS) && GetLocalInt(oModule, AI_RULE_PRESUMMON) && bMonster) + { + ai_TrySummonFamiliarTalent(oCreature); + ai_TrySummonAnimalCompanionTalent(oCreature); + } + // AI_CAT_CURE is setup differently we save the level as the highest. + //if(JsonGetType(GetLocalJson(oCreature, AI_TALENT_CURE)) != JSON_TYPE_NULL) SetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_CURE, 9); + // With spontaneous cure spells we need to clear this as the number of spells don't count. + //if(GetLevelByClass(CLASS_TYPE_CLERIC, oCreature)) SetLocalInt(oCreature, AI_MAX_TALENT + AI_TALENT_HEALING, 0); +} +int ai_UseSpontaneousCureTalentFromCategory(object oCreature, string sCategory, int nInMelee, int nDamage, object oTarget = OBJECT_INVALID) +{ + // Get the saved category from oCreature. + json jCategory = GetLocalJson(oCreature, sCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "2095", "jCategory: " + sCategory + " " + JsonDump(jCategory, 2)); + if(JsonGetType(jCategory) == JSON_TYPE_NULL) return FALSE; + int nLevel = 4; + // If there are no talents at lower levels then start at the lower level. + int nMaxTalentLevel = GetLocalInt(oCreature, AI_MAX_TALENT + sCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "2100", AI_MAX_TALENT + sCategory + ": " + + IntToString(nMaxTalentLevel) + + " nLevel: " + IntToString(nLevel)); + if(nMaxTalentLevel < nLevel) nLevel = nMaxTalentLevel; + if(nLevel < 0 || nLevel > 5) nLevel = 4; + json jLevel, jTalent, jLevelSave; + int nTalentType, nTalentClass, nTalentSlot, nSpell; + int nSlotIndex, nMaxSlotIndex, nMaxNoTalentLevel, nSpellSave, nLevelSave, nSlotSave; + string sSpellName; + // Loop through nLevels down to nMinNoTalentLevel looking for the first talent + // (i.e. the highest or best?). + while(nLevel > -1) + { + // Get the array of nLevel cycling down to 0. + jLevel = JsonArrayGet(jCategory, nLevel); + nMaxSlotIndex = JsonGetLength(jLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "2116", "nLevel: " + IntToString(nLevel) + + " nMaxSlotIndex: " + IntToString(nMaxSlotIndex)); + if(nMaxSlotIndex > 0) + { + // Get the talent within nLevel cycling from the first to the last. + nSlotIndex = 0; + while (nSlotIndex < nMaxSlotIndex) + { + jTalent= JsonArrayGet(jLevel, nSlotIndex); + if(AI_DEBUG) ai_Debug("0i_talents", "2125", "nSlotIndex: " + IntToString(nSlotIndex) + + " jTalent Type: " + IntToString(JsonGetInt(JsonArrayGet(jTalent, 0)))); + nTalentType = JsonGetInt(JsonArrayGet(jTalent, 0)); + nTalentClass = JsonGetInt(JsonArrayGet(jTalent, 2)); + // We can only convert spells from the cleric class. + if(nTalentType == AI_TALENT_TYPE_SPELL && nTalentClass == CLASS_TYPE_CLERIC) + { + if(nLevel == 4) nSpell = SPELL_CURE_CRITICAL_WOUNDS; + else if(nLevel == 3) nSpell = SPELL_CURE_SERIOUS_WOUNDS; + else if(nLevel == 2) nSpell = SPELL_CURE_MODERATE_WOUNDS; + else if(nLevel == 1) nSpell = SPELL_CURE_LIGHT_WOUNDS; + else nSpell = 0; + if(AI_DEBUG) ai_Debug("0i_talents", "2137", "nSpell: " + IntToString(nSpell)); + if(nSpell) + { + if(ai_ShouldWeCastThisCureSpell(nSpell, nDamage)) + { + + nTalentSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + SetMemorizedSpellReady(oCreature, nTalentClass, nLevel, nTalentSlot, FALSE); + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(ai_GetIsCharacter(oCreature)) ai_SendMessages(GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_MAGENTA, oCreature); + if(AI_DEBUG) ai_Debug("0i_talents", "2148", GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + "."); + ActionCastSpellAtObject(nSpell, oTarget, 255, TRUE); + return TRUE; + } + // Save the lowest level cure spell as we might need to cast it. + else if(nLevel < nLevelSave) + { + jLevelSave = jLevel; + nLevelSave = nLevel; + nSlotSave = nTalentSlot; + nSpellSave = nSpell; + } + } + } + nSlotIndex++; + } + } + else SetLocalInt(oCreature, AI_MAX_TALENT + sCategory, nLevel - 1); + nLevel--; + } + // Did we find a spell? If we did then use it. + if(nSpellSave) + { + if(AI_DEBUG) ai_Debug("0i_talents", "2171", GetName(oCreature) + " has cast the lowest level cure spell on " + GetName(oTarget) + "."); + SetMemorizedSpellReady(oCreature, CLASS_TYPE_CLERIC, nLevelSave, nSlotSave, FALSE); + ai_RemoveTalent(oCreature, jCategory, jLevelSave, sCategory, nLevelSave, nSlotSave); + sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpellSave))); + if(ai_GetIsCharacter(oCreature)) ai_SendMessages(GetName(oCreature) + " has spontaneously cast " + sSpellName + " on " + GetName(oTarget) + ".", AI_COLOR_MAGENTA, oCreature); + ActionCastSpellAtObject(nSpellSave, oTarget, 255, TRUE); + return TRUE; + } + return FALSE; +} +int ai_UseCreatureSpellTalent(object oCreature, json jLevel, json jTalent, string sCategory, int nInMelee, object oTarget = OBJECT_INVALID) +{ + // Check for polymorph, spells cannot be used while polymorphed. + if(GetAppearanceType(oCreature) != ai_GetNormalAppearance(oCreature)) return FALSE; + // Get the spells information so we can check if they still have it. + int nClass = JsonGetInt(JsonArrayGet(jTalent, 2)); + int nLevel = JsonGetInt(JsonArrayGet(jTalent, 3)); + int nSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + if(ai_IsSilenced(oCreature, JsonGetInt(JsonArrayGet(jTalent, 2)))) + { + if(GetMemorizedSpellMetaMagic(oCreature, nClass, nLevel, nSlot) != METAMAGIC_SILENT) + { + object oAOE = GetNearestObjectByTag("VFX_MOB_SILENCE", oCreature); + float fDistance = GetDistanceBetween(oAOE, oCreature); + if(fDistance != 0.0 && fDistance <= 4.0) + { + location lLocation = GetRandomLocation(GetArea(oCreature), oCreature, 5.0); + ai_ClearCreatureActions(); + if(AI_DEBUG) ai_Debug("0i_talents", "2225", GetName(oCreature) + " is moving out of a silence effect!"); + ActionMoveToLocation(lLocation, TRUE); + return TRUE; + } + else return FALSE; + } + } + if(ai_ArcaneSpellFailureTooHigh(oCreature, nClass, nLevel, nSlot)) return FALSE; + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + // Shouldn't need this anymore, we need to do a debug looking at this. + if(GetMemorizedSpellReady(oCreature, nClass, nLevel, nSlot) < 1) return FALSE; + if(ai_CheckSpecialTalentsandUse(oCreature, jTalent, sCategory, nInMelee, oTarget)) + { + if(ai_CompareLastAction(oCreature, AI_LAST_ACTION_CAST_SPELL)) return -1; + return TRUE; + } + return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "1629", "Known caster Level: " + IntToString(nLevel) + + " Uses : " + IntToString(GetSpellUsesLeft(oCreature, nClass, JsonGetInt(JsonArrayGet(jTalent, 1))))); + if(!GetSpellUsesLeft(oCreature, nClass, JsonGetInt(JsonArrayGet(jTalent, 1)))) return -2; + return ai_CheckSpecialTalentsandUse(oCreature, jTalent, sCategory, nInMelee, oTarget); +} +int ai_UseCreatureItemTalent(object oCreature, json jLevel, json jTalent, string sCategory, int nInMelee, object oTarget = OBJECT_INVALID) +{ + object oItem = StringToObject(JsonGetString(JsonArrayGet(jTalent, 2))); + int nItemType = GetBaseItemType(oItem); + // Check if the item is a potion since there are some special cases. + if(nItemType == BASE_ITEM_POTIONS || nItemType == BASE_ITEM_ENCHANTED_POTION) + { + // Potions cause attack of opportunities and this could be deadly! + // Removed for healing potions as that is one time you would use potions in melee. + if(sCategory != AI_TALENT_HEALING) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1925", "Using a non-healing potion nInMelee: " + IntToString(nInMelee)); + if(nInMelee > 1) return FALSE; + // Don't use potions on allies that are not within 3 meters. + if(GetDistanceBetween(oCreature, oTarget) > 3.1) return FALSE; + } + // For now we are allowing creatures to use "give" potions to others + // unless the player is using a healing potion and has party healing turned off. + else if(oCreature != oTarget && ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) return FALSE; + } + // Check for polymorph, only potions can be used while polymorphed. + else if(GetAppearanceType(oCreature) != ai_GetNormalAppearance(oCreature)) return FALSE; + else if(nItemType == BASE_ITEM_HEALERSKIT) + { + if(!GetLocalInt(GetModule(), AI_RULE_HEALERSKITS)) return FALSE; + if(oCreature != oTarget && ai_GetAIMode(oCreature, AI_MODE_PARTY_HEALING_OFF)) return FALSE; + if(AI_DEBUG) ai_Debug("0i_talents", "1724", "Using " + GetName(oItem) + " nInMelee: " + IntToString(nInMelee) + + " targeting: " + GetName(oTarget)); + ai_SetLastAction(oCreature, AI_LAST_ACTION_USED_ITEM); + ActionUseItemOnObject(oItem, GetFirstItemProperty(oItem), oTarget); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + // We also must check for stack size. + if(GetItemStackSize(oItem) == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + return TRUE; + } + if(ai_CheckSpecialTalentsandUse(oCreature, jTalent, sCategory, nInMelee, oTarget)) return TRUE; + return FALSE; +} +int ai_UseCreatureTalent(object oCreature, string sCategory, int nInMelee, int nLevel = 10, object oTarget = OBJECT_INVALID) +{ + // Get the saved category from oCreature. + json jCategory = GetLocalJson(oCreature, sCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "2292", "jCategory: " + sCategory + " " + JsonDump(jCategory, 2)); + if(JsonGetType(jCategory) == JSON_TYPE_NULL) return FALSE; + // If there are no talents at lower levels then start at the lower level. + int nMaxTalentLevel = GetLocalInt(oCreature, AI_MAX_TALENT + sCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "2297", AI_MAX_TALENT + sCategory + ": " + + IntToString(nMaxTalentLevel) + + " nLevel: " + IntToString(nLevel)); + if(nMaxTalentLevel < nLevel) nLevel = nMaxTalentLevel; + if(nLevel < 0 || nLevel > 10) nLevel = 9; + json jLevel, jTalent; + int nClass, nSlot, nType, nSlotIndex, nMaxSlotIndex, nTalentUsed, nSpell; + int bUseMagic = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC); + int bUseMagicItems = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC_ITEMS); + if(AI_DEBUG) ai_Debug("0i_talents", "2305", "bUseMagic: " + IntToString(bUseMagic) + + " bUseMagicItems: " + IntToString(bUseMagicItems) + + " nLevel: " + IntToString(nLevel)); + // Loop through nLevels down to nMinNoTalentLevel looking for the first talent + // (i.e. the highest or best?). + while(nLevel > -1) + { + // Get the array of nLevel cycling down to 0. + jLevel = JsonArrayGet(jCategory, nLevel); + nMaxSlotIndex = JsonGetLength(jLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "2288", "nLevel: " + IntToString(nLevel) + + " nMaxSlotIndex: " + IntToString(nMaxSlotIndex)); + if(nMaxSlotIndex > 0) + { + // Get the talent within nLevel cycling from the first to the last. + nSlotIndex = 0; + while (nSlotIndex < nMaxSlotIndex) + { + jTalent= JsonArrayGet(jLevel, nSlotIndex); + if(AI_DEBUG) ai_Debug("0i_talents", "2300", "nSlotIndex: " + IntToString(nSlotIndex) + + " jTalent Type: " + IntToString(JsonGetInt(JsonArrayGet(jTalent, 0)))); + nType = JsonGetInt(JsonArrayGet(jTalent, 0)); + if(bUseMagic) + { + if(nType == AI_TALENT_TYPE_SPELL) + { + nTalentUsed = ai_UseCreatureSpellTalent(oCreature, jLevel, jTalent, sCategory, nInMelee, oTarget); + // -1 means it was a memorized spell and we need to remove it. + if(nTalentUsed == -1) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + return TRUE; + } + else if(nTalentUsed == -2) + { + ai_RemoveTalentLevel(oCreature, jCategory, jLevel, sCategory, nLevel); + } + else if(nTalentUsed) return TRUE; + } + else if(nType == AI_TALENT_TYPE_SP_ABILITY) + { + // Special ability spells do not need to concentrate?! + if(ai_CheckSpecialTalentsandUse(oCreature, jTalent, sCategory, nInMelee, oTarget)) + { + // When the ability is used that slot is now not readied. + // Multiple uses of the same spell are stored in different slots. + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + return TRUE; + } + } + } + if(bUseMagicItems && nType == AI_TALENT_TYPE_ITEM) + { + // Items do not need to concentrate. + if(ai_UseCreatureItemTalent(oCreature, jLevel, jTalent, sCategory, nInMelee, oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_talents", "2337", "Checking if Item is used up: " + + IntToString(JsonGetInt(JsonArrayGet(jTalent, 4)))); + if(JsonGetInt(JsonArrayGet(jTalent, 4)) == -1) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + } + return TRUE; + } + } + //else if(nType == AI_TALENT_TYPE_FEAT) {} + nSlotIndex++; + } + } + else SetLocalInt(oCreature, AI_MAX_TALENT + sCategory, nLevel - 1); + nLevel--; + } + return FALSE; +} +int ai_UseTalent(object oCreature, int nTalent, object oTarget) +{ + if(AI_DEBUG) ai_Debug("0i_talents", "1912", GetName(oCreature) + " is trying to use " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nTalent))) + + " on " + GetName(oTarget)); + // Get the saved category from oCreature. + string sCategory = Get2DAString("ai_spells", "Category", nTalent); + json jCategory = GetLocalJson(oCreature, sCategory); + if(AI_DEBUG) ai_Debug("0i_talents", "1917", "jCategory: " + sCategory + " " + JsonDump(jCategory, 2)); + if(JsonGetType(jCategory) == JSON_TYPE_NULL) return FALSE; + json jLevel, jTalent; + int nLevel, nClass, nSlot, nType, nSlotIndex, nMaxSlotIndex, nTalentUsed, nSpell; + // Loop through nLevels down to nMinNoTalentLevel looking for the first talent + // (i.e. the highest or best?). + while(nLevel <= 9) + { + // Get the array of nLevel. + jLevel = JsonArrayGet(jCategory, nLevel); + nMaxSlotIndex = JsonGetLength(jLevel); + if(AI_DEBUG) ai_Debug("0i_talents", "1925", "nLevel: " + IntToString(nLevel) + + " nMaxSlotIndex: " + IntToString(nMaxSlotIndex)); + if(nMaxSlotIndex > 0) + { + // Get the talent within nLevel cycling from the first to the last. + nSlotIndex = 0; + while (nSlotIndex < nMaxSlotIndex) + { + jTalent= JsonArrayGet(jLevel, nSlotIndex); + if(AI_DEBUG) ai_Debug("0i_talents", "1936", "nSlotIndex: " + IntToString(nSlotIndex) + + " jTalent Type: " + IntToString(JsonGetInt(JsonArrayGet(jTalent, 0)))); + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + if(nSpell == nTalent) + { + nType = JsonGetInt(JsonArrayGet(jTalent, 0)); + if(nType == AI_TALENT_TYPE_SPELL || nType == AI_TALENT_TYPE_SP_ABILITY) + { + if(ai_UseTalentOnObject(oCreature, jTalent, oTarget, 0)) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + return TRUE; + } + } + else if(nType == AI_TALENT_TYPE_ITEM) + { + // Items do not need to concentrate. + if(ai_UseCreatureItemTalent(oCreature, jLevel, jTalent, sCategory, 0, oTarget)) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1955", "Checking if Item is used up: " + + IntToString(JsonGetInt(JsonArrayGet(jTalent, 4)))); + if(JsonGetInt(JsonArrayGet(jTalent, 4)) == -1) + { + ai_RemoveTalent(oCreature, jCategory, jLevel, sCategory, nLevel, nSlotIndex); + } + return TRUE; + } + } + } + nSlotIndex++; + } + } + nLevel++; + } + return FALSE; +} +int ai_UseTalentOnObject(object oCreature, json jTalent, object oTarget, int nInMelee) +{ + int nClass, nLevel, nSlot, nMetaMagic, nDomain; + int nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + int nType = JsonGetInt(JsonArrayGet(jTalent, 0)); + if(nType == AI_TALENT_TYPE_SPELL) + { + if(!ai_CastInMelee(oCreature, nSpell, nInMelee)) return FALSE; + nClass = JsonGetInt(JsonArrayGet(jTalent, 2)); + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + nLevel = JsonGetInt(JsonArrayGet(jTalent, 3)); + nSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + if(GetMemorizedSpellIsDomainSpell(oCreature, nClass, nLevel, nSlot) == 1) nDomain = nLevel; + else nDomain = 0; + nMetaMagic = GetMemorizedSpellMetaMagic(oCreature, nClass, nLevel, nSlot); + } + else + { + nMetaMagic = METAMAGIC_NONE; + nDomain = 0; + } + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell)) return TRUE; + } + else if(nType == AI_TALENT_TYPE_SP_ABILITY) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1790", GetName(oCreature) + " is using a special ability!"); + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + nClass = 255; + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell)) return TRUE; + } + else if(nType == AI_TALENT_TYPE_ITEM) + { + object oItem = StringToObject(JsonGetString(JsonArrayGet(jTalent, 2))); + int nBaseItemType = GetBaseItemType(oItem); + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell, nBaseItemType)) return TRUE; + int nIndex, nSubIndex = 0; + nSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + itemproperty ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + if(nIndex++ == nSlot) break; + ipProp = GetNextItemProperty(oItem); + } + // Cast items have the following: + // 1)Single_Use. + // 2-6) Charges/Use [Note: 7 is 0 charges per use]. + // 8-12) Uses/Day [Note: 13 is unlimited uses per day]. + // We set the slot to -1 to let the other function know we need this talent removed. + int nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses == 1) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1816", "Single Use item."); + if(AI_DEBUG) ai_Debug("0i_talents", "1817", "Stack size: " + IntToString(GetItemStackSize(oItem))); + // We also must check for stack size. + if(GetItemStackSize(oItem) == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + } + else if(nUses > 1 && nUses < 7) + { + int nCharges = GetItemCharges(oItem); + // If the item is equipable then do not use the last charge! + if(Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)) != "0x00000") + { + if(nCharges <= 7 - nUses) return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "1824", "Item charges: " + IntToString(nCharges)); + if(nCharges < (7 - nUses) * 2) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1829", "Stack size: " + IntToString(GetItemStackSize(oItem))); + // We also must check for stack size. + if(GetItemStackSize(oItem) == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + } + } + else if(nUses > 7 && nUses < 13) + { + int nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(AI_DEBUG) ai_Debug("0i_talents", "1837", "Item uses: " + IntToString(nPerDay)); + if(nPerDay == 1) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1842", "Stack size: " + IntToString(GetItemStackSize(oItem))); + // We also must check for stack size. + if(GetItemStackSize(oItem) == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + } + } + // Lets not always use unlimited items! + else if(nUses == 7 || nUses == 13) + { + if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + } + ai_SetLastAction(oCreature, nSpell); + ActionUseItemOnObject(oItem, ipProp, oTarget, nSubIndex); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + if(AI_DEBUG) ai_Debug("0i_talents", "1850", GetName(oCreature) + " is using " + GetName(oItem) + " on " + GetName(oTarget)); + return TRUE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "1853", "nMetaMagic: " + IntToString(nMetaMagic) + + " nDomain: " + IntToString(nDomain) + " nClass: " + IntToString(nClass)); + ai_SetLastAction(oCreature, nSpell); + ActionCastSpellAtObject(nSpell, oTarget, nMetaMagic, FALSE, nDomain, 0, FALSE, nClass, FALSE); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + if(AI_DEBUG) + { + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + ai_Debug("0i_talents", "1859", GetName(oCreature) + " is casting " + sSpellName + " on " + GetName(oTarget)); + } + return TRUE; +} +int ai_UseTalentAtLocation(object oCreature, json jTalent, object oTarget, int nInMelee) +{ + int nSpell, nClass, nLevel, nSlot, nMetaMagic, nDomain; + int nType = JsonGetInt(JsonArrayGet(jTalent, 0)); + if(nType == AI_TALENT_TYPE_SPELL) + { + if(!ai_CastInMelee(oCreature, nSpell, nInMelee)) return FALSE; + nClass = JsonGetInt(JsonArrayGet(jTalent, 2)); + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + nLevel = JsonGetInt(JsonArrayGet(jTalent, 3)); + nSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + if(GetMemorizedSpellIsDomainSpell(oCreature, nClass, nLevel, nSlot) == 1) nDomain = nLevel; + else nDomain = 0; + nMetaMagic = GetMemorizedSpellMetaMagic(oCreature, nClass, nLevel, nSlot); + } + else + { + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + nMetaMagic = METAMAGIC_NONE; + nDomain = 0; + } + } + else if(nType == AI_TALENT_TYPE_SP_ABILITY) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1888", GetName(oCreature) + " is using a special ability!"); + nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + nClass = 255; + } + else if(nType == AI_TALENT_TYPE_ITEM) + { + object oItem = StringToObject(JsonGetString(JsonArrayGet(jTalent, 2))); + int nBaseItemType = GetBaseItemType(oItem); + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell, nBaseItemType)) return TRUE; + int nIndex; + int nSubIndex = JsonGetInt(JsonArrayGet(jTalent, 3));; + nSlot = JsonGetInt(JsonArrayGet(jTalent, 4)); + itemproperty ipProp = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProp)) + { + if(nIndex++ == nSlot) break; + ipProp = GetNextItemProperty(oItem); + } + // Cast items have the following: + // 1)Single_Use. + // 2-6) Charges/Use [Note: 7 is 0 charges per use]. + // 8-12) Uses/Day [Note: 13 is unlimited uses per day]. + // We set the slot to -1 to let the other function know we need this talent removed. + int nUses = GetItemPropertyCostTableValue(ipProp); + if(nUses == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + else if(nUses > 1 && nUses < 7) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1915", "Item charges: " + IntToString(GetItemCharges(oItem))); + int nCharges = GetItemCharges(oItem); + // If the item is equipable then do not use the last charge! + if(Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)) != "0x00000") + { + if(nCharges <= 7 - nUses) return FALSE; + } + if(AI_DEBUG) ai_Debug("0i_talents", "1824", "Item charges: " + IntToString(nCharges)); + if(nCharges < (7 - nUses) * 2) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1829", "Stack size: " + IntToString(GetItemStackSize(oItem))); + // We also must check for stack size. + if(GetItemStackSize(oItem) == 1) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + } + } + else if(nUses > 7 && nUses < 13) + { + if(AI_DEBUG) ai_Debug("0i_talents", "1923", "Item uses: " + IntToString(GetItemPropertyUsesPerDayRemaining(oItem, ipProp))); + int nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); + if(nUses == 8 && nPerDay == 1 || nUses == 9 && nPerDay < 4 || + nUses == 10 && nPerDay < 6 || nUses == 11 && nPerDay < 8 || + nUses == 12 && nPerDay < 10) JsonArrayInsertInplace(jTalent, JsonInt(-1), 4); + } + // Lets not always use unlimited items! + else if(nUses == 7 || nUses == 13) + { + if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + } + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell)) return TRUE; + ai_SetLastAction(oCreature, nSpell); + ActionUseItemAtLocation(oItem, ipProp, GetLocation(oTarget), nSubIndex); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + if(AI_DEBUG) ai_Debug("0i_talents", "1934", GetName(oCreature) + " is using " + GetName(oItem) + " at a location."); + return TRUE; + } + if(ai_CheckCombatPosition(oCreature, oTarget, nInMelee, nSpell)) return TRUE; + ai_SetLastAction(oCreature, nSpell); + ActionCastSpellAtLocation(nSpell, GetLocation(oTarget), nMetaMagic, FALSE, 0, FALSE, nClass, FALSE, nDomain); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + string sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(AI_DEBUG) ai_Debug("0i_talents", "1943", GetName(oCreature) + " is casting " + sSpellName + " at a location!"); + return TRUE; +} +int ai_CheckSpecialTalentsandUse(object oCreature, json jTalent, string sCategory, int nInMelee, object oTarget) +{ + int nSpell = JsonGetInt(JsonArrayGet(jTalent, 1)); + if(AI_DEBUG) ai_Debug("0i_talents", "1949", "nSpell: " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))) + + " sCategory: " + sCategory); + if(sCategory == AI_TALENT_DISCRIMINANT_AOE) + { + //ai_Debug("0i_talents", "1953", "CompareLastAction: " + + // IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + //if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + // Check to see if Disjunction should *not* be cast. + if(nSpell == SPELL_MORDENKAINENS_DISJUNCTION) + { + // Our master does not want us using any type of dispel! + if(ai_GetMagicMode(oCreature, AI_MAGIC_STOP_DISPEL)) return FALSE; + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + // Get the biggest group we can. + string sIndex = IntToString(ai_GetHighestMeleeIndexNotInAOE(oCreature)); + oTarget = GetLocalObject(oCreature, AI_ENEMY + sIndex); + if(!ai_CreatureHasDispelableEffect(oCreature, oTarget)) return FALSE; + // Maybe we should do an area of effect instead? + int nEnemies = ai_GetNumOfEnemiesInRange(oTarget, 5.0); + if(nEnemies > 2) + { + if(ai_UseTalentAtLocation(oCreature, jTalent, oTarget, nInMelee)) return TRUE; + } + } + // These spells have a Range of Personal i.e. cast on themselves, and + // an Area of Effect of Colossal (10.0). + else if(nSpell == SPELL_FIRE_STORM || nSpell == SPELL_STORM_OF_VENGEANCE) + { + // Make sure we have enough enemies to use this on. + int nEnemies = ai_GetNumOfEnemiesInRange(oCreature, 10.0); + if(nEnemies < 2) return FALSE; + // Get the nearest target to check defenses on. + oTarget = ai_GetNearestTarget(oCreature, 10.0); + if(!ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + if(ai_UseTalentAtLocation(oCreature, jTalent, oTarget, nInMelee)) return TRUE; + } + else if(nSpell == SPELL_UNDEATH_TO_DEATH) + { + float fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + int nUndead = ai_GetRacialTypeCount(oCreature, RACIAL_TYPE_UNDEAD, fRange); + if(nUndead < 3) return FALSE; + oTarget = ai_GetLowestCRRacialTarget(oCreature, RACIAL_TYPE_UNDEAD, fRange); + } + // Get a target for discriminant spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_CheckForGroupedTargetNotInAOE(oCreature, fRange); + } + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget) || + !ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + } + else if(sCategory == AI_TALENT_INDISCRIMINANT_AOE) + { + //ai_Debug("0i_talents", "1991", "CompareLastAction: " + + // IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + //if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + // These spells have a Range of Personal i.e. cast on themselves, and + // an Area of Effect of Colossal (10.0). + if(nSpell == SPELL_METEOR_SWARM) + { + // Make sure we have enough enemies and few allies to hit. + int nAllies = ai_GetNumOfAlliesInGroup(oCreature, 10.0); + int nEnemies = ai_GetNumOfEnemiesInRange(oCreature, 10.0); + if(nAllies > 1 || nEnemies < 2) return FALSE; + // Get the nearest target to check defenses on. + oTarget = ai_GetNearestTarget(oCreature, 10.0); + if(!ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + if(ai_UseTalentAtLocation(oCreature, jTalent, oCreature, nInMelee)) return TRUE; + } + // Get a target for indiscriminant spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + float fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_CheckForGroupedTargetNotInAOE(oCreature, fRange); + // Check for the number of allies, if there are too many then skip. + if(oTarget == OBJECT_INVALID) return FALSE; + int nRoll = d6() + 1; + if(GetAssociateType(oCreature)) nRoll = d3(); + int nAllies = ai_GetNumOfAlliesInGroup(oTarget, AI_RANGE_CLOSE); + if(AI_DEBUG) ai_Debug("0i_talents", "2084", "Num of Allies in range: " + IntToString(nAllies)+ + " < nRoll: " + IntToString(nRoll)); + if(nAllies >= nRoll) return FALSE; + } + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget) || + !ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + //********************************************************************** + //********** These spells are checked after picking a target *********** + //********************************************************************** + // Check if the Sleep spells are being used appropriately. + if(nSpell == SPELL_SLEEP) + { + if(GetHitDice(oTarget) > 4) return FALSE; + } + // Lets only use silence on casters. + else if(nSpell == SPELL_SILENCE) + { + if(!ai_CheckClassType(oTarget, AI_CLASS_TYPE_CASTER)) + { + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER); + if(oTarget == OBJECT_INVALID) return FALSE; + } + } + } + else if(sCategory == AI_TALENT_RANGED) + { + //ai_Debug("0i_talents", "2045", "CompareLastAction: " + + // IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + //if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + // Check to see if Dispel Magic and similar spells should *not* be cast + if(nSpell == SPELL_DISPEL_MAGIC || nSpell == SPELL_LESSER_DISPEL || + nSpell == SPELL_GREATER_DISPELLING) + { + // Our master does not want us using any type of dispel! + if(ai_GetMagicMode(oCreature, AI_MAGIC_STOP_DISPEL)) return FALSE; + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + // Lets get a caster as they should have more buffs. + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER, fRange); + // No caster then get the most powerful enemy! + if(oTarget == OBJECT_INVALID) oTarget = ai_GetHighestCRTarget(oCreature, fRange); + if(oTarget != OBJECT_INVALID) + { + if(!ai_CreatureHasDispelableEffect(oCreature, oTarget)) return FALSE; + // Maybe we should do an area of effect instead? + int nEnemies = ai_GetNumOfEnemiesInRange(oTarget, 5.0); + if(nEnemies > 2) + { + if(ai_UseTalentAtLocation(oCreature, jTalent, oTarget, nInMelee)) return TRUE; + } + } + if(oTarget == OBJECT_INVALID) return FALSE; + } + // Make sure the spell will work on the target. + else if(nSpell == SPELL_HOLD_PERSON || nSpell == SPELL_DOMINATE_PERSON || + nSpell == SPELL_CHARM_PERSON) + { + if(oTarget != OBJECT_INVALID) + { + int nRaceType = GetRacialType(oTarget); + if(AI_DEBUG) ai_Debug("0i_talents", "2075", " Person Spell race: " + IntToString(nRaceType)); + if((nRaceType > 6 && nRaceType < 12) || nRaceType > 15) oTarget = OBJECT_INVALID; + } + if(oTarget == OBJECT_INVALID) + { + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_GetNearestRacialTarget(oCreature, AI_RACIAL_TYPE_HUMANOID, fRange); + if(oTarget == OBJECT_INVALID) return FALSE; + } + } + else if(nSpell == SPELL_HOLD_ANIMAL || nSpell == SPELL_DOMINATE_ANIMAL) + { + if(oTarget != OBJECT_INVALID) + { + if(GetRacialType(oTarget) != RACIAL_TYPE_ANIMAL) oTarget = OBJECT_INVALID; + } + if(oTarget == OBJECT_INVALID) + { + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_GetNearestRacialTarget(oCreature, AI_RACIAL_TYPE_ANIMAL_BEAST, fRange); + if(oTarget == OBJECT_INVALID) return FALSE; + } + } + // Get a target for ranged spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_GetSpellTargetBasedOnSaves(oCreature, nSpell, fRange); + } + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget) || + !ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + //********************************************************************** + //********** These spells are checked after picking a target *********** + //********************************************************************** + // Don't use Domination spells on players! They don't work. + if((nSpell == SPELL_DOMINATE_MONSTER || nSpell == SPELL_DOMINATE_PERSON)) + { + if(ai_GetIsCharacter(oTarget)) return FALSE; + } + // Check to see if they have the shield spell up. + else if(nSpell == SPELL_MAGIC_MISSILE) + { + if(GetHasSpellEffect(SPELL_SHIELD, oTarget)) return FALSE; + } + // Scare only works on 5 hitdice or less. + else if(nSpell == SPELL_SCARE) + { + if(GetHitDice(oTarget) > 5) return FALSE; + } + // Don't use drown against nonliving opponents. + else if(nSpell == SPELL_DROWN) + { + if(ai_IsNonliving(GetRacialType(oTarget))) return FALSE; + } + // Don't use Power Word Kill on Targets with more than 100hp + else if(nSpell == SPELL_POWER_WORD_KILL) + { + if(GetCurrentHitPoints(oTarget) <= 100) return FALSE; + } + } + else if(sCategory == AI_TALENT_TOUCH) + { + //ai_Debug("0i_talents", "2139", "CompareLastAction: " + + // IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + //if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + // Get a target for touch spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + oTarget = ai_GetSpellTargetBasedOnSaves(oCreature, nSpell, AI_RANGE_MELEE); + } + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget) || + !ai_CastOffensiveSpellVsTarget(oCreature, oTarget, nSpell) || + ai_CreatureImmuneToEffect(oCreature, oTarget, nSpell)) return FALSE; + } + else if(sCategory == AI_TALENT_HEALING) + { + int nHpLost = ai_GetPercHPLoss(oTarget); + // If the target is bloody then just use the best we have! + if(nHpLost > AI_HEALTH_BLOODY) + { + // Make sure we should use a mass heal on us or an ally! + // Two allies need healing or one is almost dead to use mass heal! + if(nSpell == SPELL_MASS_HEAL) + { + int bWoundedAlly; + object oAlly = ai_GetNearestAlly(oTarget); + if(oAlly != OBJECT_INVALID) + { + // If we don't have a nearby ally that needs healed then skip. + if(ai_GetPercHPLoss(oAlly) > AI_HEALTH_WOUNDED || + GetDistanceBetween(oCreature, oAlly) > 9.0f) return FALSE; + } + } + // Make sure they have taken enough damage. + int nHpDmg = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + if(!ai_ShouldWeCastThisCureSpell(nSpell, nHpDmg)) return FALSE; + } + } + else if(sCategory == AI_TALENT_ENHANCEMENT) + { + if(AI_DEBUG) ai_Debug("0i_talents", "2713", "CompareLastAction: " + + IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + if(nSpell == SPELL_INVISIBILITY || nSpell == SPELL_SANCTUARY) + { + // Lets not run past an enemy to cast an enhancement unless we have + // the ability to move in combat, bad tactics! + float fRange; + if(ai_CanIMoveInCombat(oCreature)) fRange = AI_RANGE_PERCEPTION; + else + { + fRange = GetDistanceBetween(oCreature, GetLocalObject(oCreature, AI_ENEMY_NEAREST)) - 3.0f; + // Looks bad when your right next to an ally, but technically the enemy is closer. + if(fRange < AI_RANGE_MELEE) fRange = AI_RANGE_MELEE; + } + oTarget = ai_GetAllyToHealTarget(oCreature, fRange); + if(oTarget != OBJECT_INVALID) + { + int nHp = ai_GetPercHPLoss(oTarget); + int nHpLimit = ai_GetHealersHpLimit(oCreature); + if(nHp > nHpLimit) return FALSE; + } + } + if(nSpell == SPELL_PRAYER) + { + int nEnemies = ai_GetNumOfEnemiesInRange(oCreature, 10.0); + int nAllies = ai_GetNumOfAlliesInGroup(oCreature, 10.0); + if(nEnemies + nAllies < 5) return FALSE; + oTarget = oCreature; + } + // Since haste does not have an effect when it comes from items when we + // check for item properties we set this variable so we know they have it. + else if(nSpell == SPELL_HASTE && GetLocalInt(oCreature, sIPHasHasteVarname)) return FALSE; + // Only reason to cast Ultravision(Darkvision) in combat is if a Darkness + // spell is nearby. + else if(nSpell == SPELL_DARKVISION) + { + int nCnt = 1, bCastSpell; + string sAOEType; + object oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oCreature, nCnt); + while(oAOE != OBJECT_INVALID && GetDistanceBetween(oCreature, oAOE) <= AI_RANGE_PERCEPTION) + { + // AOE's have the tag set to the "LABEL" in vfx_persistent.2da + sAOEType = GetTag(oAOE); + if(AI_DEBUG) ai_Debug("0i_talents", "2759", "Ultravision check; AOE tag: " + sAOEType); + if(sAOEType == "VFX_PER_DARKNESS") + { + if(!GetHasFeat(FEAT_DARKVISION)) bCastSpell = TRUE; + break; + } + oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oCreature, ++nCnt); + } + if(!bCastSpell) return FALSE; + } + // Get a target for enhancement spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + // Get talents range and target. + float fRange = ai_GetSpellRange(nSpell); + // Personal spell + if(fRange == 0.1f) oTarget = oCreature; + // Range/Touch spell + else oTarget = ai_GetAllyBuffTarget(oCreature, nSpell, fRange); + } + if(AI_DEBUG) ai_Debug("0i_talents", "2260", " oTarget: " + GetName(oTarget) + + " HasSpellEffect: " + IntToString(GetHasSpellEffect(nSpell, oTarget))); + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget)) return FALSE; + //********************************************************************** + //********** These spells are checked after picking a target *********** + //********************************************************************** + // Weapon enhancing spells only work on melee weapons! + if(nSpell == SPELL_MAGIC_WEAPON || nSpell == SPELL_GREATER_MAGIC_WEAPON || + nSpell == SPELL_BLESS_WEAPON || nSpell == SPELL_FLAME_WEAPON || + nSpell == SPELL_DARKFIRE) + { + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + if(!ai_GetIsMeleeWeapon(oWeapon)) return FALSE; + } + // Should we ignore associates? + if(ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + } + else if(sCategory == AI_TALENT_PROTECTION) + { + if(AI_DEBUG) ai_Debug("0i_talents", "2281", "CompareLastAction: " + + IntToString(ai_CompareLastAction(oCreature, nSpell))); + // If we used this spell talent last round then don't use it this round. + if(ai_CompareLastAction(oCreature, nSpell)) return FALSE; + // Stone bones only effects the undead. + if(nSpell == SPELL_STONE_BONES) + { + if(oTarget != OBJECT_INVALID) + { + if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD) oTarget = OBJECT_INVALID; + } + if(oTarget == OBJECT_INVALID) + { + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + oTarget = ai_GetNearestRacialTarget(oCreature, RACIAL_TYPE_UNDEAD, fRange); + if(oTarget == OBJECT_INVALID) return FALSE; + } + } + else if(nSpell == SPELL_MAGIC_FANG) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCreature); + if(oTarget == OBJECT_INVALID) return FALSE; + } + // Lets see if we should cast resistances in our current situation, + // lets check for enemy casters that may have energy damaging spells, or energy weapons. + else if(nSpell == SPELL_ENDURE_ELEMENTS || nSpell == SPELL_PROTECTION_FROM_ELEMENTS || + nSpell == SPELL_RESIST_ELEMENTS || nSpell == SPELL_ENERGY_BUFFER) + { + int bCastSpell; + object oEnemy = ai_GetEnemyAttackingMe(oCreature); + if(oEnemy != OBJECT_INVALID) + { + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oEnemy); + if(oWeapon == OBJECT_INVALID) oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oEnemy); + if(oWeapon == OBJECT_INVALID) oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oEnemy); + if(AI_DEBUG) ai_Debug("0i_talents", "2812", GetName(oEnemy) + " is using weapon: " + GetName(oWeapon)); + if(oWeapon != OBJECT_INVALID) + { + itemproperty nProperty = GetFirstItemProperty(oWeapon); + while(GetIsItemPropertyValid(nProperty)) + { + if(GetItemPropertyType(nProperty) == ITEM_PROPERTY_DAMAGE_BONUS) + { + int nSubType = GetItemPropertySubType(nProperty); + if(AI_DEBUG) ai_Debug("0i_talents", "2821", GetName(oWeapon) + " has PropertySubType: " + + IntToString(nSubType) + " If equals [6,7,9,10,13] don't cast!"); + if(nSubType == 6 || nSubType == 7 || nSubType == 9 || + nSubType == 10 || nSubType == 13) + { + bCastSpell = TRUE; + break; + } + } + nProperty = GetNextItemProperty(oWeapon); + } + } + } + if(ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER) != OBJECT_INVALID) bCastSpell = TRUE; + if(!bCastSpell) return FALSE; + } + // Get a target for protection spells if one is not already set. + if(oTarget == OBJECT_INVALID) + { + // Get talents range and target. + float fRange = ai_GetSpellRange(nSpell); + // Personal spell + if(fRange == 0.1f) oTarget = oCreature; + // Range/Touch spell + else oTarget = ai_GetAllyBuffTarget(oCreature, nSpell, fRange); + } + if(oTarget == OBJECT_INVALID || GetHasSpellEffect(nSpell, oTarget)) return FALSE; + //********************************************************************** + //********** These spells are checked after picking a target *********** + //********************************************************************** + // Don't double up Stoneskin, Ghostly visage, or Ethereal visage. + if(nSpell == SPELL_GHOSTLY_VISAGE || nSpell == SPELL_ETHEREAL_VISAGE || + nSpell == SPELL_STONESKIN) + { + if(GetHasSpellEffect(SPELL_ETHEREAL_VISAGE, oTarget) || + GetHasSpellEffect(SPELL_STONESKIN, oTarget) || + GetHasSpellEffect(SPELL_GHOSTLY_VISAGE, oTarget)) return FALSE; + } + // Don't use displacement if we are invisible! + else if(nSpell == SPELL_DISPLACEMENT) + { + if(GetHasSpellEffect(SPELL_INVISIBILITY, oTarget) || + GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY, oTarget) || + GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE, oTarget) || + GetHasSpellEffect(SPELL_DISPLACEMENT, oTarget)) return FALSE; + } + // Should we ignore associates? + if(ai_GetAIMode(oCreature, AI_MODE_IGNORE_ASSOCIATES) && + GetAssociateType(oTarget) > 1) return FALSE; + } + else if(sCategory == AI_TALENT_SUMMON) + { + if(GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCreature) != OBJECT_INVALID) return FALSE; + if(oTarget == OBJECT_INVALID) + { + /* Removed for now, summons creature in location that enemy was... looks bad. + float fRange; + if(nInMelee) fRange = AI_RANGE_MELEE; + else fRange = ai_GetOffensiveSpellSearchRange(oCreature, nSpell); + // Select lowest enemy combat target for summons. + oTarget = ai_GetLowestCRTarget(oCreature, fRange); + if(oTarget == OBJECT_INVALID) oTarget = oCreature; + */ + oTarget = oCreature; + if(ai_UseTalentAtLocation(oCreature, jTalent, oTarget, nInMelee)) + { + DelayCommand(4.0, ai_NameAssociate(oCreature, ASSOCIATE_TYPE_SUMMONED, "")); + return TRUE; + } + } + } + else if(sCategory == AI_TALENT_CURE) + { + } + if(ai_UseTalentOnObject(oCreature, jTalent, oTarget, nInMelee)) return TRUE; + return FALSE; +} diff --git a/_module/nss/0i_time.nss b/_module/nss/0i_time.nss new file mode 100644 index 00000000..3052ea67 --- /dev/null +++ b/_module/nss/0i_time.nss @@ -0,0 +1,95 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_time +//////////////////////////////////////////////////////////////////////////////// + Include script for handling all time functions for the server. + + Lokey's functions: +int GetPosixTimestamp(); +string GetCurrentDateTime(); + +*/////////////////////////////////////////////////////////////////////////////// +// RETURNS a Timestamp in seconds since 1970-01-01. +int GetCurrentTimeInSeconds(); +// RETURNS a formated date, good for timestamping logs and text. +string GetCurrentDateTime(); +// Sends a server shutdown message 1800 seconds i.e 30 minutes before. +// nDuration is in seconds. i.e. one hours is 3600 defaults to 24 hours (86400). +// Should be put into the servers OnHeartBeat. +void CheckServerShutdownMessage(int nDuration = 86400); + +int GetCurrentTimeInSeconds() +{ + string stmt = "SELECT strftime('%s','now');"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlStep(sqlQuery); + return SqlGetInt(sqlQuery, 0); +} +string GetCurrentDateTime() +{ + string stmt = "SELECT datetime('now', 'localtime')"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlStep(sqlQuery); + return SqlGetString(sqlQuery, 0); +} +/// @addtogroup time Time +/// @brief Provides various time related functions. +/// @brief Returns the current time formatted according to the provided sqlite date time format string. +/// @param format Format string as used by sqlites STRFTIME(). +/// @return The current time in the requested format. Empty string on error. +string SQLite_GetFormattedSystemTime(string format); +/// @return Returns the number of seconds since midnight on January 1, 1970. +int SQLite_GetTimeStamp(); +/// @return Returns the number of milliseconds since midnight on January 1, 1970. +int SQLite_GetTimeMilliseconds(); +/// @brief A millisecond timestamp +struct SQLite_MillisecondTimeStamp +{ + int seconds; ///< Seconds since epoch + int milliseconds; ///< Milliseconds +}; +/// @remark For mircosecond timestamps use NWNX_Utility_GetHighResTimeStamp(). +/// @return Returns the number of milliseconds since midnight on January 1, 1970. +struct SQLite_MillisecondTimeStamp SQLite_GetMillisecondTimeStamp(); +/// @brief Returns the current date. +/// @return The date in the format (mm/dd/yyyy). +string SQLite_GetSystemDate(); +/// @brief Returns current time. +/// @return The current time in the format (24:mm:ss). +string SQLite_GetSystemTime(); +/// @} +string SQLite_GetFormattedSystemTime(string format) +{ + sqlquery query = SqlPrepareQueryObject(GetModule(), "SELECT STRFTIME(@format, 'now', 'localtime')"); + SqlBindString(query, "@format", format); + SqlStep(query); // sqlite returns NULL for invalid format in STRFTIME() + return SqlGetString(query, 0); +} +int SQLite_GetTimeStamp() +{ + sqlquery query = SqlPrepareQueryObject(GetModule(), "SELECT STRFTIME('%s', 'now')"); + SqlStep(query); + return SqlGetInt(query, 0); +} +int SQLite_GetTimeMillisecond() +{ + sqlquery query = SqlPrepareQueryObject(GetModule(), "select cast((julianday('now') - 2440587.5) * 86400 * 1000 as integer)"); + SqlStep(query); + return SqlGetInt(query, 0); +} +struct SQLite_MillisecondTimeStamp SQLite_GetMillisecondTimeStamp() +{ + sqlquery query = SqlPrepareQueryObject(GetModule(), "SELECT STRFTIME('%s', 'now'), SUBSTR(STRFTIME('%f', 'now'), 4)"); + SqlStep(query); + struct SQLite_MillisecondTimeStamp t; + t.seconds = SqlGetInt(query, 0); + t.milliseconds = SqlGetInt(query, 1); + return t; +} +string SQLite_GetSystemDate() +{ + return SQLite_GetFormattedSystemTime("%m/%d/%Y"); +} +string SQLite_GetSystemTime() +{ + return SQLite_GetFormattedSystemTime("%H:%M:%S"); +} diff --git a/_module/nss/ai_a_ambusher.nss b/_module/nss/ai_a_ambusher.nss new file mode 100644 index 00000000..f3f424b6 --- /dev/null +++ b/_module/nss/ai_a_ambusher.nss @@ -0,0 +1,105 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_ambusher +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to ambush creatures by hiding or turning invisible. + OBJECT_SELF is the creature running the ai. + * This assumes we are not invisible since the ai_a_invisible script should fire if we are. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "19", GetName(oCreature) + " is using ambusher tactics: " + + " oNearestEnemy: " + GetName(oNearestEnemy) + " fDistance: " + + FloatToString(GetDistanceBetween(oNearestEnemy, oCreature), 0, 2)); + if(GetDistanceBetween(oNearestEnemy, oCreature) > AI_RANGE_CLOSE) + { + // Has our master told us to not use magic? + if(!ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) + { + // If can turn invisible then we should probably do that! + if(ai_UseTalent(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY_SPHERE, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_SANCTUARY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_ETHEREALNESS, oCreature)) return; // Greater Sanctuary + if(ai_UseTalent(oCreature, SPELLABILITY_AS_IMPROVED_INVISIBLITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELLABILITY_AS_INVISIBILITY, oCreature)) return; + } + } + // Check the battle field to see if anyone see us? + int nEnemyIndex = ai_GetNearestIndexThatSeesUs(oCreature); + // If seen, can we try to hide now? + if(nEnemyIndex) + { + // Check for an attacker and can they see through invisibility? + object oAttacker = ai_GetEnemyAttackingMe(oCreature); + int bCanSeeInvisible; + if(oAttacker != OBJECT_INVALID) + { + bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_SEEINVISIBLE); + if(!bCanSeeInvisible) bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_TRUESEEING); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_5_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_10_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_60_FEET, oCreature); + } + if(!bCanSeeInvisible) + { + if(GetHasFeat(FEAT_HIDE_IN_PLAIN_SIGHT, oCreature)) + { + if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "55", GetName(oCreature) + " is using hide in plain sight!"); + ClearAllActions(TRUE); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + return; + } + } + // Does not have hide in plain sight. + else + { + string sEnemyIndex = IntToString(nEnemyIndex); + float fEnemyDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + sEnemyIndex); + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "66", "fDistance: " + FloatToString(fEnemyDistance, 0, 2)); + if(fEnemyDistance > 20.0) + { + int bTried = GetLocalInt(oCreature, AI_TRIED_TO_HIDE); + if(!bTried) + { + // Move away so we can hide. + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "73", GetName(oCreature) + " is trying to move away to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + object oEnemy = GetLocalObject(oCreature, AI_ENEMY + sEnemyIndex); + ActionMoveAwayFromObject(oEnemy, TRUE, AI_RANGE_BATTLEFIELD); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + else SetLocalInt(oCreature, AI_TRIED_TO_HIDE, GetLocalInt(oCreature, AI_TRIED_TO_HIDE) - 1); + } + // We have been seen by an enemy near us so drop stealth. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + } + // The enemy can see through stealth so lets drop it. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + // We are not in stealth mode so and no one sees us so lets hide. + else if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + // Use any hiding talents we have + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "97", GetName(oCreature) + " is trying to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + // If we have givin up on stealth do our normal actions. + string sScript = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + if(sScript == "ai_a_ambusher" || sScript == "") sScript = "ai_a_default"; + if(AI_DEBUG) ai_Debug("ai_a_ambusher", "101", "Executing Script: " + sScript); + ExecuteScript(sScript, oCreature); +} diff --git a/_module/nss/ai_a_atk_casters.nss b/_module/nss/ai_a_atk_casters.nss new file mode 100644 index 00000000..362ba4b2 --- /dev/null +++ b/_module/nss/ai_a_atk_casters.nss @@ -0,0 +1,159 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_atk_casters +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to the nearest casting creatures. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy. + 2 - Check for healing and curing first. + 3 - Check moral if wounded and this is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff or summons if this is a difficult+ battle. + 6 - Check for a Class ability and an offensive spell if this is a simple+ battle. + 7 - Check for a physical attack. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + int bAlwaysAtk = !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK); + if(AI_DEBUG) ai_Debug("ai_a_atk_casters", "80", "Check for ranged attack on nearest casting enemy!"); + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the nearest targets first. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "519", "Do ranged attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("ai_a_atk_casters", "119", "Check for melee attack on nearest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) + { + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget == OBJECT_INVALID) + { + // Are we in melee? If so try to get the nearest enemy in melee. + if(nInMelee > 0) + { + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER, AI_RANGE_MELEE, AI_ENEMY, bAlwaysAtk); + // If we didn't get a target then get any target within range. + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE, AI_ENEMY, bAlwaysAtk); + } + // If not then lets go find someone to attack! + else + { + // Get the nearest enemy. + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk); + // If we didn't get a target then get any target within range. + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk); + } + } + } + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("ai_a_atk_casters", "149", GetName(oTarget) + " is the nearest target for melee combat!"); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + if(AI_DEBUG) ai_Debug("ai_a_atk_casters", "154", "Do melee attack against (caster/nearest): " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} + diff --git a/_module/nss/ai_a_atk_nearest.nss b/_module/nss/ai_a_atk_nearest.nss new file mode 100644 index 00000000..1261dc7a --- /dev/null +++ b/_module/nss/ai_a_atk_nearest.nss @@ -0,0 +1,80 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_atk_nearest +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to the nearest target. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy. + 2 - Check for healing and curing first. + 3 - Check moral if wounded and this is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff or summons if this is a difficult+ battle. + 6 - Check for a Class ability and an offensive spell if this is a simple+ battle. + 7 - Check for a physical attack. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + ai_DoPhysicalAttackOnNearest(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); +} + diff --git a/_module/nss/ai_a_atk_warrior.nss b/_module/nss/ai_a_atk_warrior.nss new file mode 100644 index 00000000..4821e53e --- /dev/null +++ b/_module/nss/ai_a_atk_warrior.nss @@ -0,0 +1,159 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_atk_warrior +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to the nearest casting creatures. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy. + 2 - Check for healing and curing first. + 3 - Check moral if wounded and this is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff or summons if this is a difficult+ battle. + 6 - Check for a Class ability and an offensive spell if this is a simple+ battle. + 7 - Check for a physical attack. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + int bAlwaysAtk = !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK); + if(AI_DEBUG) ai_Debug("0i_actions", "496", "Check for ranged attack on nearest casting enemy!"); + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the nearest targets first. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_WARRIOR); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_WARRIOR, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("0i_actions", "519", "Do ranged attack against nearest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("ai_a_atk_warrior", "119", "Check for melee attack on nearest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) + { + object oPCTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + if(oPCTarget == OBJECT_INVALID) + { + // Are we in melee? If so try to get the nearest enemy in melee. + if(nInMelee > 0) + { + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_WARRIOR, AI_RANGE_MELEE, AI_ENEMY, bAlwaysAtk); + // If we didn't get a target then get any target within range. + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE, AI_ENEMY, bAlwaysAtk); + } + // If not then lets go find someone to attack! + else + { + // Get the nearest enemy. + oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_WARRIOR, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk); + // If we didn't get a target then get any target within range. + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_PERCEPTION, AI_ENEMY, bAlwaysAtk); + } + } + } + // We might not have a target this is fine as sometimes we don't want to attack! + if(AI_DEBUG) ai_Debug("ai_a_atk_warrior", "149", GetName(oTarget) + " is the nearest target for melee combat!"); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + if(AI_DEBUG) ai_Debug("ai_a_atk_warrior", "154", "Do melee attack against (caster/nearest): " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} + diff --git a/_module/nss/ai_a_barbarian.nss b/_module/nss/ai_a_barbarian.nss new file mode 100644 index 00000000..12521c93 --- /dev/null +++ b/_module/nss/ai_a_barbarian.nss @@ -0,0 +1,87 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_barbarian +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Barbarian class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oTarget; + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature)) + { + //************************* HEALING & CURES ************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // ************************ CLASS FEATURES ************************* + if(ai_TryBarbarianRageFeat(oCreature)) return; + // ************************* SPELL TALENTS ************************* + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************* SPELL TALENTS ************************* + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ Ranged feat attacks ************************ + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + } + // *************************** Melee feat attacks ************************** + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_bard.nss b/_module/nss/ai_a_bard.nss new file mode 100644 index 00000000..975bac2e --- /dev/null +++ b/_module/nss/ai_a_bard.nss @@ -0,0 +1,83 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_bard +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Bard class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryBardSongFeat(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = OBJECT_INVALID; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_cleric.nss b/_module/nss/ai_a_cleric.nss new file mode 100644 index 00000000..5de1cc26 --- /dev/null +++ b/_module/nss/ai_a_cleric.nss @@ -0,0 +1,102 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_cleric +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Cleric class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ************************** CLASS FEATURES *************************** + // Turning is basically a powerful AOE so treat it like one. + if(ai_TryTurningTalent(oCreature)) return; + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + } + // SIMPLE+ - Offensive talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = OBJECT_INVALID; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_cntrspell.nss b/_module/nss/ai_a_cntrspell.nss new file mode 100644 index 00000000..a1bc9ec0 --- /dev/null +++ b/_module/nss/ai_a_cntrspell.nss @@ -0,0 +1,69 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_cntrspell +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the combat mode counter spell. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + // We are not in melee combat then we don't attack. + int bAttack = nInMelee; + if(!bAttack) + { + // If there are no casters, i.e. CLERIC or MAGES in the battle then attack. + struct stClasses stClasses = ai_GetFactionsClasses(oCreature); + if(!stClasses.CLERICS && !stClasses.MAGES) bAttack = TRUE; + } + // If we are not attacking and using magic then setup for counter spelling. + if(!bAttack && !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC)) + { + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "30", " Counterspell Mode? " + + IntToString(GetActionMode(OBJECT_SELF, ACTION_MODE_COUNTERSPELL))); + if(!GetActionMode(oCreature, ACTION_MODE_COUNTERSPELL)) + { + object oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER); + // We can only counter spells from a hasted caster if we are hasted as well. + if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_HASTE) && + !ai_GetHasEffectType(oCreature, EFFECT_TYPE_HASTE)) + { + // If we have haste then we should cast it. + if(GetHasSpell(SPELL_HASTE, oCreature)) + { + if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "42", "Opponent is hasted! Casting Haste."); + ActionCastSpellAtObject(SPELL_HASTE, oCreature); + ai_SetLastAction(oCreature, SPELL_HASTE); + return; + } + // If not then we need to go into normal combat. + else + { + if(AI_DEBUG) ai_Debug("ai_cntrspell", "50", "Opponent is hasted! Using ranged AI."); + ExecuteScript("ai_a_ranged"); + return; + } + } + if(oTarget != OBJECT_INVALID) + { + // First a good tactic for counter spelling is to be invisible. + if(ai_TryToBecomeInvisible(oCreature)) return; + // If we have attempted to become invisible or are invisible then + // it is time to counter spell. + if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "61", "Setting Counterspell mode!"); + ActionCounterSpell(oTarget); + return; + } + } + } + if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "67", "Situation is not good for counterspelling! Using ranged AI."); + ExecuteScript("ai_a_ranged"); +} diff --git a/_module/nss/ai_a_default.nss b/_module/nss/ai_a_default.nss new file mode 100644 index 00000000..7540340c --- /dev/null +++ b/_module/nss/ai_a_default.nss @@ -0,0 +1,80 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_no_modes +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to not use any combat modes during combat ai. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy. + 2 - Check for healing and curing first. + 3 - Check moral if wounded and this is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff or summons if this is a difficult+ battle. + 6 - Check for a Class ability and an offensive spell if this is a simple+ battle. + 7 - Check for a physical attack. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + ai_DoPhysicalAttackOnBest(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); +} + diff --git a/_module/nss/ai_a_defensive.nss b/_module/nss/ai_a_defensive.nss new file mode 100644 index 00000000..f19523c4 --- /dev/null +++ b/_module/nss/ai_a_defensive.nss @@ -0,0 +1,77 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_defensive +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates put in to a defensive mode to protect themselves. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy and the difficulty of the battle. + 2 - Check for healing potions if this is a simple+ battle. + 3 - Check moral if wounded and is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff if this is a difficult+ battle. + 6 - Check for defensive ability such as knockdown, expertise or parry. + 7 - If we can't fight defensive then flee. + 8 - If we are out of range with no ability then stand and watch. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(AI_DEBUG) ai_Debug("ai_a_defensive", "25", "oNearest Enemy: " + GetName(oNearestEnemy) + + " Distance to Nearest Enemy: " + FloatToString(GetDistanceToObject(oNearestEnemy), 0, 2)); + // ALWAYS - Check for healing and cure talents. + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // SIMPLE+ - Check for moral and get what spell power we should be using. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // DIFFICULT+ - Class talents, Offensive AOE's, Defensive talents, and Potion talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS **************** + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if (ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound, oTarget)) return; + } + } + object oTarget; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + if(nInMelee > 0) + { + if(ai_TryImprovedExpertiseFeat(oCreature)) return; + if(ai_TryExpertiseFeat(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + oTarget = ai_GetHighestCRTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = oNearestEnemy; + // Use knockdown when appropriate and the target is not immune. + if(ai_TryKnockdownFeat(oCreature, oTarget)) return; + if (ai_TryParry (oCreature)) return; + // We have tried everything to protect ourselves so the only thing left + // to do is man up and attack! + ai_DoPhysicalAttackOnLowestCR(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + return; + } + //********************** PHYSICAL ATTACKS ******************************** + // Even in defensive mode we want to be in battle so go find someone! + ai_DoPhysicalAttackOnBest(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); +} diff --git a/_module/nss/ai_a_druid.nss b/_module/nss/ai_a_druid.nss new file mode 100644 index 00000000..6b82c260 --- /dev/null +++ b/_module/nss/ai_a_druid.nss @@ -0,0 +1,86 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_druid +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Druid class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // ************************** CLASS FEATURES *************************** + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TryPolymorphSelfFeat(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************** Ranged feat attacks ************************** + object oTarget; + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_fighter.nss b/_module/nss/ai_a_fighter.nss new file mode 100644 index 00000000..a5f3720c --- /dev/null +++ b/_module/nss/ai_a_fighter.nss @@ -0,0 +1,82 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: 0i_a_fighter +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Fighter class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = OBJECT_INVALID; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_flanker.nss b/_module/nss/ai_a_flanker.nss new file mode 100644 index 00000000..fb6845a5 --- /dev/null +++ b/_module/nss/ai_a_flanker.nss @@ -0,0 +1,117 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_flanker +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to flank the enemy and not charge into combat. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + oTarget = GetLocalObject(oCreature, AI_PC_LOCKED_TARGET); + // ************************** Melee feat attacks ************************* + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + // Lets get the nearest target that is attacking someone besides me. We want to flank! + if(oTarget == OBJECT_INVALID) + { + if(!nInMelee) oTarget = ai_GetFlankTarget(oCreature); + // If there are few enemies then we can safely move around. + else if(nInMelee < 3 || ai_CanIMoveInCombat(oCreature)) + { + oTarget = ai_GetFlankTarget(oCreature, AI_RANGE_MELEE); + } + // Ok we are in a serious fight so lets not give attack of opportunities. + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + } + // If there are no enemies being attacked then lets stay back. + if(oTarget == OBJECT_INVALID) + { + if(nInMelee) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + object oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + } + // ************************** Ranged feat attacks ************************** + else if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + oTarget = ai_GetLowestCRTarget(oCreature); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + else + { + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + } + if(oTarget != OBJECT_INVALID) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + // Are we too far from our master? + object oMaster = GetMaster(); + if(GetDistanceBetween(oMaster, oCreature) > AI_RANGE_LONG) + { + ActionMoveToObject(oMaster, TRUE, AI_RANGE_CLOSE); + return; + } + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); +} diff --git a/_module/nss/ai_a_invisible.nss b/_module/nss/ai_a_invisible.nss new file mode 100644 index 00000000..9772b322 --- /dev/null +++ b/_module/nss/ai_a_invisible.nss @@ -0,0 +1,123 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_invisible +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to use when they are invisible. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + // Has our master told us to not use magic? + int bUseMagic = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_EASY) + { + // *************************** SPELL TALENTS *************************** + if(ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) return; + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound, oTarget)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Melee feat attacks ************************* + // If we won't loose invisibility then ranged attacks are ok! + // ************************ RANGED ATTACKS ******************************* + if(GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY) || GetHasSpellEffect(SPELLABILITY_AS_IMPROVED_INVISIBLITY)) + { + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + } + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + talent tUse = GetCreatureTalentBest(TALENT_CATEGORY_HARMFUL_MELEE, 20, oCreature); + if(GetIsTalentValid(tUse)) + { + int nId = GetIdFromTalent(tUse); + if(nId == FEAT_POWER_ATTACK) { if(ai_TryPowerAttackFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_KNOCKDOWN) { if(ai_TryKnockdownFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SMITE_EVIL) { if(ai_TrySmiteEvilFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SMITE_GOOD) { if(ai_TrySmiteGoodFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_IMPROVED_POWER_ATTACK) { if(ai_TryImprovedPowerAttackFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_FLURRY_OF_BLOWS) { if(ai_TryFlurryOfBlowsFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_STUNNING_FIST) { if(ai_TryStunningFistFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SAP) { if(ai_TrySapFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_DISARM) { if(ai_TryDisarmFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_KI_DAMAGE) { if(ai_TryKiDamageFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_CALLED_SHOT) { if(ai_TryCalledShotFeat(oCreature, oTarget)) return; } + } + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} + diff --git a/_module/nss/ai_a_monk.nss b/_module/nss/ai_a_monk.nss new file mode 100644 index 00000000..607ce4cd --- /dev/null +++ b/_module/nss/ai_a_monk.nss @@ -0,0 +1,82 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_monk +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Monk class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryWholenessOfBodyFeat(oCreature)) return; + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_no_cmb_mode.nss b/_module/nss/ai_a_no_cmb_mode.nss new file mode 100644 index 00000000..1ffedb4d --- /dev/null +++ b/_module/nss/ai_a_no_cmb_mode.nss @@ -0,0 +1,131 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_o_cmb_modes +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to not use any combat modes during combat ai. + OBJECT_SELF is the creature running the ai. + Our actions. + 1 - Get nearest enemy. + 2 - Check for healing and curing first. + 3 - Check moral if wounded and this is a simple+ battle. + 4 - Check for a magical ranged attack if not in melee and a difficult+ battle. + 5 - Check for a buff or summons if this is a difficult+ battle. + 6 - Check for a Class ability and an offensive spell if this is a simple+ battle. + 7 - Check for a physical attack. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + if(AI_DEBUG) ai_Debug("ai_a_no_modes", "78", "Check for ranged attack on weakest enemy!"); + object oTarget; + int bAlwaysAtk = !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK); + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + !ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && + ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the weaker targets. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + if(AI_DEBUG) ai_Debug("ai_a_no_modes", "105", GetName(OBJECT_SELF) + " does ranged attack on weakest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + if(AI_DEBUG) ai_Debug("ai_a_no_modes", "117", "Check for melee attack on weakest enemy!"); + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee, bAlwaysAtk)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, bAlwaysAtk); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee, bAlwaysAtk); + if(oTarget != OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("ai_a_no_modes", "126", GetName(OBJECT_SELF) + " does melee attack against weakest: " + GetName(oTarget) + "!"); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} + diff --git a/_module/nss/ai_a_paladin.nss b/_module/nss/ai_a_paladin.nss new file mode 100644 index 00000000..24520a76 --- /dev/null +++ b/_module/nss/ai_a_paladin.nss @@ -0,0 +1,110 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_paladin +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Paladin class. + Paladins always protect their masters and face the strongest opponents first! + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + } + if(!ai_GetMagicMode(oCreature, AI_MAGIC_OFFENSIVE_CASTING)) + { + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + // Does our master want to be buffed first? + object oTarget = OBJECT_INVALID; + if(ai_GetMagicMode(oCreature, AI_MAGIC_BUFF_MASTER)) oTarget = GetMaster(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, 0, oTarget)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + } + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + if(ai_TryLayOnHands(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = OBJECT_INVALID; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Paladins ALWAYS protect their masters first! + oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Paladins face off against the strongest opponents first. + if(!nInMelee) oTarget = ai_GetHighestCRTarget(oCreature); + else oTarget = ai_GetHighestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + // Paladins ALWAYS protect their masters first! + oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + int bCheckCombat = ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK); + if(bCheckCombat) oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee, FALSE); + // If always attacking Paladins ALWAYS attack the strongest opponent. + else oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_peaceful.nss b/_module/nss/ai_a_peaceful.nss new file mode 100644 index 00000000..b9bd3103 --- /dev/null +++ b/_module/nss/ai_a_peaceful.nss @@ -0,0 +1,81 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_a_peaceful +//////////////////////////////////////////////////////////////////////////////// + ai script mode for associates to use when they should remain out of combat. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + float fDistance = GetDistanceBetween(oCreature, oNearestEnemy); + // In Melee combat! + if(nInMelee > 0) + { + // If we are not being attacked then we should back out of combat. + if(ai_GetEnemyAttackingMe(oCreature) == OBJECT_INVALID) + { + if(AI_DEBUG) ai_Debug("ai_a_peaceful", "23", GetName(oCreature) + " is moving away from " + GetName(oNearestEnemy) + + "[" + FloatToString(AI_RANGE_MELEE - fDistance + 1.0, 0, 2) + "]" + " to use a ranged weapon."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + // Lets move just out of melee range! + int bRun = ai_CanIMoveInCombat(oCreature); + ActionMoveAwayFromObject(oNearestEnemy, bRun, AI_RANGE_CLOSE + 2.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return; + } + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryImprovedExpertiseFeat(oCreature)) return; + if(ai_TryExpertiseFeat(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + object oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget == OBJECT_INVALID) oTarget = oNearestEnemy; + // Use knockdown when appropriate and the target is not immune. + if(ai_TryKnockdownFeat(oCreature, oTarget)) return; + if (ai_TryParry(oCreature)) return; + // We have tried everything to protect ourselves so the only thing left + // to do is man up and attack! + // Physical attacks are under TALENT_CATEGORY_HARMFUL_MELEE(22). + ai_DoPhysicalAttackOnNearest(oCreature, nInMelee); + return; + } + if(fDistance <= AI_RANGE_LONG) + { + if(AI_DEBUG) ai_Debug("ai_a_peaceful", "49", GetName(oCreature) + " is moving away from " + GetName(oNearestEnemy) + + "[" + FloatToString(AI_RANGE_LONG - fDistance, 0, 2) + "]" + "."); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MOVE); + // Lets move out of close range! + ActionMoveAwayFromObject(oNearestEnemy, TRUE, AI_RANGE_LONG + 2.0); + ActionDoCommand(ExecuteScript("0e_do_combat_rnd", oCreature)); + return; + } + //************************* OUT OF COMBAT ************************** + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, 0, oCreature)) return; + if(ai_TryCureConditionTalent(oCreature, 0)) return; + //************************** DEFENSIVE TALENTS *************************** + // Has our master told us to not use magic? + int bUseMagic = !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC); + if(bUseMagic) + { + // If can turn invisible then we should probably do that! + if(ai_UseTalent(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY_SPHERE, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_SANCTUARY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_ETHEREALNESS, oCreature)) return; // Greater Sanctuary + if(ai_UseTalent(oCreature, SPELLABILITY_AS_IMPROVED_INVISIBLITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELLABILITY_AS_INVISIBILITY, oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + // Summons are powerfull and should be used as much as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_SUMMON, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_PROTECTION, nInMelee, nMaxLevel)) return; + } + // Stand and watch the battle we don't want to provoke anyone! + if(AI_DEBUG) ai_Debug("ai_a_peaceful", "80", GetName(oCreature) + " is holding here."); +} diff --git a/_module/nss/ai_a_polymorphed.nss b/_module/nss/ai_a_polymorphed.nss new file mode 100644 index 00000000..107e6e92 --- /dev/null +++ b/_module/nss/ai_a_polymorphed.nss @@ -0,0 +1,70 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_polymorphed +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for polymorphed associates. + We check for abilities based on the form we are using and if we should polymorph back. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void ai_DoActions(object oCreature, int nForm) +{ + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(GetPercentageHPLoss(oCreature) <= AI_HEALTH_BLOODY) + { + //ai_Debug("ai_a_polymorphed", "24", "We are wounded and are transforming back!"); + ai_RemoveASpecificEffect(oCreature, EFFECT_TYPE_POLYMORPH); + return; + } + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // When polymorphed we turn back then check moral. + //if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, FALSE); +} +void main() +{ + object oCreature = OBJECT_SELF; + // Need to know who we are so we can use thier abilities. + int nForm = GetAppearanceType(oCreature); + // Check to see if we are back to our normal form?(-1 to get the actual form #) + if(nForm == GetLocalInt(oCreature, AI_NORMAL_FORM) - 1) + { + // If we are transformed back then go back to our primary ai. + ai_SetCreatureAIScript(oCreature); + DeleteLocalInt(oCreature, AI_NORMAL_FORM); + string sAI = GetLocalString(oCreature, AI_COMBAT_SCRIPT); + if(sAI == "ai_a_polymorphed" || sAI == "") sAI = "ai_a_default"; + ExecuteScript(sAI, oCreature); + } + else ai_DoActions(oCreature, nForm); +} diff --git a/_module/nss/ai_a_ranged.nss b/_module/nss/ai_a_ranged.nss new file mode 100644 index 00000000..477937de --- /dev/null +++ b/_module/nss/ai_a_ranged.nss @@ -0,0 +1,129 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_ranged +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates to use the ranged ai. + OBJECT_SELF is the creature running the ai. + Will attempt to use ranged weapons until surrounded. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + // Turning is basically a powerful AOE so treat it like one. + if(ai_TryTurningTalent(oCreature)) return; + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED)) + { + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + nInMelee < 3) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Lets defend master, nearest favored enemy, ranged, sneak, weakest targets. + if(!nInMelee) + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget == ai_GetRangedTarget(oCreature); + if(oTarget == OBJECT_INVALID && ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + } + // ************************** Melee feat attacks ************************* + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(nInMelee) + { + oTarget = ai_GetEnemyAttackingMe(oCreature); + if(oTarget != OBJECT_INVALID) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + } + } + if(oNearestEnemy != OBJECT_INVALID) + { + float fDistance = GetDistanceBetween(oCreature, oNearestEnemy); + float fRange = AI_RANGE_LONG; + if(GetIsAreaInterior(GetArea(oCreature))) fRange = AI_RANGE_CLOSE; + if(GetHasFeat(FEAT_SNEAK_ATTACK, oCreature)) fRange = AI_RANGE_CLOSE; + if(fDistance < fRange) + { + int bRun = ai_CanIMoveInCombat(oCreature); + ActionMoveAwayFromObject(oNearestEnemy, bRun, fRange - fDistance + 2.0); + } + } + else ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); +} + diff --git a/_module/nss/ai_a_ranger.nss b/_module/nss/ai_a_ranger.nss new file mode 100644 index 00000000..179298f0 --- /dev/null +++ b/_module/nss/ai_a_ranger.nss @@ -0,0 +1,96 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_ranger +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Ranger class. + Rangers will take out favored enemies first! + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) + { + oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature); + } + else + { + oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + // Our master may have setup to check difficulty before we move into melee. + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_PERCEPTION, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_rogue.nss b/_module/nss/ai_a_rogue.nss new file mode 100644 index 00000000..10e1ae05 --- /dev/null +++ b/_module/nss/ai_a_rogue.nss @@ -0,0 +1,83 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_rogue +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Rogue class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_sorcerer.nss b/_module/nss/ai_a_sorcerer.nss new file mode 100644 index 00000000..5e4a3b74 --- /dev/null +++ b/_module/nss/ai_a_sorcerer.nss @@ -0,0 +1,75 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_sorcerer +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Sorcerer class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_a_taunter.nss b/_module/nss/ai_a_taunter.nss new file mode 100644 index 00000000..b06fed80 --- /dev/null +++ b/_module/nss/ai_a_taunter.nss @@ -0,0 +1,53 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_a_taunter +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using defined to use the taunt skill. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + //************************** SKILL FEATURES ************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + // ************************** CLASS FEATURES *************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Class and Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + // ************************** CLASS FEATURES *************************** + if(ai_TryTurningTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // Taunt the nearest target! + if (ai_TryTaunt (oCreature, ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee))) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + ai_DoPhysicalAttackOnLowestCR(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); +} diff --git a/_module/nss/ai_a_wizard.nss b/_module/nss/ai_a_wizard.nss new file mode 100644 index 00000000..dfad8c30 --- /dev/null +++ b/_module/nss/ai_a_wizard.nss @@ -0,0 +1,77 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_a_wizard +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for associates using the Wizard class. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + int nDifficulty = ai_GetDifficulty(oCreature); + int nMaxLevel; + // Check for moral and get the maximum spell level we should use. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(nInMelee && ai_MoralCheck(oCreature)) return; + nMaxLevel = ai_GetAssociateTalentMaxLevel(oCreature, nDifficulty); + } + // Skill, Class, Offensive AOE's, and Defensive talents. + if(nDifficulty >= AI_COMBAT_MODERATE) + { + // ************************** CLASS FEATURES *************************** + if(ai_TrySummonFamiliarTalent(oCreature)) return; + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + } + // Offensive single target talents. + if(nDifficulty >= AI_COMBAT_EFFORTLESS) + { + if(!ai_GetMagicMode(oCreature, AI_MAGIC_DEFENSIVE_CASTING)) + { + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + } + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Are we suppose to protect our master first? + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) + { + // Lets pick off the weakest targets. + if(!nInMelee) oTarget = ai_GetLowestCRTarget(oCreature); + else oTarget = ai_GetLowestCRTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_DEFEND_MASTER)) oTarget = ai_GetLowestCRAttackerOnMaster(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetBestTargetForMeleeCombat(oCreature, nInMelee, !ai_GetAIMode(oCreature, AI_MODE_CHECK_ATTACK)); + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, FALSE); +} diff --git a/_module/nss/ai_ambusher.nss b/_module/nss/ai_ambusher.nss new file mode 100644 index 00000000..829a3dae --- /dev/null +++ b/_module/nss/ai_ambusher.nss @@ -0,0 +1,100 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_ambusher +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for ambushing creatures (Any). + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + // Rule used to disable ambush if the player wants to. + if(!GetLocalInt(GetModule(), AI_RULE_AMBUSH)) + { + ExecuteScript("ai_default", oCreature); + return; + } + // If can turn invisible then we should probably do that! + if(ai_UseTalent(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY_SPHERE, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_SANCTUARY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_ETHEREALNESS, oCreature)) return; // Greater Sanctuary + if(ai_UseTalent(oCreature, SPELLABILITY_AS_IMPROVED_INVISIBLITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELLABILITY_AS_INVISIBILITY, oCreature)) return; + // Check the battle field to see if anyone see us? + int nEnemyIndex = ai_GetNearestIndexThatSeesUs(oCreature); + // If seen, can we try to hide now? + if(nEnemyIndex) + { + // Check for an attacker and can they see through invisibility? + object oAttacker = ai_GetEnemyAttackingMe(oCreature); + int bCanSeeInvisible; + if(oAttacker != OBJECT_INVALID) + { + bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_SEEINVISIBLE); + if(!bCanSeeInvisible) bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_TRUESEEING); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_5_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_10_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_60_FEET, oCreature); + } + if(AI_DEBUG) ai_Debug("ai_ambusher", "43", "bCanSeeInvisible: " + IntToString(bCanSeeInvisible)); + if(!bCanSeeInvisible) + { + if(GetHasFeat(FEAT_HIDE_IN_PLAIN_SIGHT, oCreature)) + { + if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + if(AI_DEBUG) ai_Debug("ai_ambusher", "50", GetName(oCreature) + " is using hide in plain sight!"); + ClearAllActions(TRUE); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + return; + } + } + // Does not have hide in plain sight. + else + { + string sEnemyIndex = IntToString(nEnemyIndex); + float fEnemyDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + sEnemyIndex); + if(AI_DEBUG) ai_Debug("ai_ambusher", "61", "fDistance: " + FloatToString(fEnemyDistance, 0, 2)); + if(fEnemyDistance >= AI_RANGE_LONG) + { + int bTried = GetLocalInt(oCreature, AI_TRIED_TO_HIDE); + if(!bTried) + { + // Move away so we can hide. + if(AI_DEBUG) ai_Debug("ai_ambusher", "68", GetName(oCreature) + " is trying to move away to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + object oEnemy = GetLocalObject(oCreature, AI_ENEMY + sEnemyIndex); + ActionMoveAwayFromObject(oEnemy, TRUE, AI_RANGE_BATTLEFIELD); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + else SetLocalInt(oCreature, AI_TRIED_TO_HIDE, GetLocalInt(oCreature, AI_TRIED_TO_HIDE) - 1); + } + // We have been seen by an enemy too close to us so drop stealth. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + } + // The enemy can see through stealth so lets drop it. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + // We are not in stealth mode so lets get there. + else if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + // Use any hiding talents we have + if(AI_DEBUG) ai_Debug("ai_ambusher", "88", GetName(oCreature) + " is trying to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + // If we have givin up on stealth do our normal actions. + string sScript = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + if(sScript == "ai_ambusher" || sScript == "") sScript = "ai_default"; + if(AI_DEBUG) ai_Debug("ai_ambusher", "96", "sScript: " + sScript + " AI_DEFAULT_SCRIPT: " + GetLocalString(oCreature, AI_DEFAULT_SCRIPT)); + ExecuteScript(sScript, oCreature); +} diff --git a/_module/nss/ai_barbarian.nss b/_module/nss/ai_barbarian.nss new file mode 100644 index 00000000..69efcb42 --- /dev/null +++ b/_module/nss/ai_barbarian.nss @@ -0,0 +1,71 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_barbarian +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Barbarian. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oTarget; + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature)) + { + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // *************************** RANGED ATTACKS ***************************** + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + } + // ***************************** MELEE ATTACKS *************************** + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_bard.nss b/_module/nss/ai_bard.nss new file mode 100644 index 00000000..9dde198f --- /dev/null +++ b/_module/nss/ai_bard.nss @@ -0,0 +1,67 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_bard +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Bard. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBardSongFeat(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_cleric.nss b/_module/nss/ai_cleric.nss new file mode 100644 index 00000000..34bd1e67 --- /dev/null +++ b/_module/nss/ai_cleric.nss @@ -0,0 +1,68 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_cleric +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Cleric. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryTurningTalent(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_cntrspell.nss b/_module/nss/ai_cntrspell.nss new file mode 100644 index 00000000..04939c9f --- /dev/null +++ b/_module/nss/ai_cntrspell.nss @@ -0,0 +1,68 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_cntrspell +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the combat mode counter spell. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + // We are not in melee combat then we don't attack. + int bAttack = nInMelee; + if(!bAttack) + { + // If there are no casters, i.e. CLERIC or MAGES in the battle then attack. + struct stClasses stClasses = ai_GetFactionsClasses(oCreature); + if(!stClasses.CLERICS && !stClasses.MAGES) bAttack = TRUE; + } + // If we are not attacking then setup for counter spelling. + if(!bAttack) + { + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(AI_DEBUG) ai_Debug("ai_cntrspell", "29", " Counterspell Mode? " + + IntToString(GetActionMode(OBJECT_SELF, ACTION_MODE_COUNTERSPELL))); + if(!GetActionMode(oCreature, ACTION_MODE_COUNTERSPELL)) + { + object oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER); + // We can only counter spells from a hasted caster if we are hasted as well. + if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_HASTE) && + !ai_GetHasEffectType(oCreature, EFFECT_TYPE_HASTE)) + { + // If we have haste then we should cast it. + if(GetHasSpell(SPELL_HASTE, oCreature)) + { + if(AI_DEBUG) ai_Debug("ai_cntrspell", "41", "Opponent is hasted! Casting Haste."); + ActionCastSpellAtObject(SPELL_HASTE, oCreature); + ai_SetLastAction(oCreature, SPELL_HASTE); + return; + } + // If not then we need to go into normal combat. + else + { + if(AI_DEBUG) ai_Debug("ai_cntrspell", "49", "Opponent is hasted! Using ranged AI."); + ExecuteScript("ai_ranged"); + return; + } + } + if(oTarget != OBJECT_INVALID) + { + // First a good tactic for counter spelling is to be invisible. + if(ai_TryToBecomeInvisible(oCreature)) return; + // If we have attempted to become invisible or are invisible then + // it is time to counter spell. + if(AI_DEBUG) ai_Debug("ai_cntrspell", "60", "Setting Counterspell mode!"); + ActionCounterSpell(oTarget); + return; + } + } + } + if(AI_DEBUG) ai_Debug("ai_cntrspell", "66", "Situation is not good for counterspelling! Using ranged AI."); + ExecuteScript("ai_ranged"); +} diff --git a/_module/nss/ai_coward.nss b/_module/nss/ai_coward.nss new file mode 100644 index 00000000..b88e4243 --- /dev/null +++ b/_module/nss/ai_coward.nss @@ -0,0 +1,133 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_coward +//////////////////////////////////////////////////////////////////////////////// + ai script for cowardly creatures (Any) used when they fail a moral check or + when associates are to remain out of combat. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with us. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + // If we have been healed up then get back in there! + if(ai_GetPercHPLoss(oCreature) > AI_HEALTH_WOUNDED) + { + string sDefaultCombatScript = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); + SetLocalString(oCreature, AI_COMBAT_SCRIPT, sDefaultCombatScript); + ExecuteScript(sDefaultCombatScript, oCreature); + return; + } + // In Melee combat! + if(nInMelee) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryImprovedExpertiseFeat(oCreature)) return; + if(ai_TryExpertiseFeat(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + object oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget == OBJECT_INVALID) oTarget = oNearestEnemy; + // Use knockdown when appropriate and the target is not immune. + if(ai_TryKnockdownFeat(oCreature, oTarget)) return; + if (ai_TryParry(oCreature)) return; + // We have tried everything to protect ourselves so the only thing left + // to do is man up and attack! + // Physical attacks are under TALENT_CATEGORY_HARMFUL_MELEE(22). + ai_DoPhysicalAttackOnNearest(oCreature, nInMelee); + return; + } + else + { + // If can turn invisible then we should probably do that! + if(ai_UseTalent(oCreature, SPELL_IMPROVED_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_INVISIBILITY_SPHERE, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_SANCTUARY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELL_ETHEREALNESS, oCreature)) return; // Greater Sanctuary + if(ai_UseTalent(oCreature, SPELLABILITY_AS_IMPROVED_INVISIBLITY, oCreature)) return; + if(ai_UseTalent(oCreature, SPELLABILITY_AS_INVISIBILITY, oCreature)) return; + // If we are seen by the enemy we need to move back so we can hide. + int nEnemyIndex = ai_GetNearestIndexThatSeesUs(oCreature); + if(nEnemyIndex) + { + // Check for an attacker and can they see through invisibility? + object oAttacker = ai_GetEnemyAttackingMe(oCreature); + int bCanSeeInvisible; + if(oAttacker != OBJECT_INVALID) + { + bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_SEEINVISIBLE); + if(!bCanSeeInvisible) bCanSeeInvisible = ai_GetHasEffectType(oAttacker, EFFECT_TYPE_TRUESEEING); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_5_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_10_FEET, oCreature); + if(!bCanSeeInvisible) bCanSeeInvisible = GetHasFeat(FEAT_BLINDSIGHT_60_FEET, oCreature); + } + if(!bCanSeeInvisible) + { + if(GetHasFeat(FEAT_HIDE_IN_PLAIN_SIGHT, oCreature)) + { + if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + if(AI_DEBUG) ai_Debug("ai_coward", "74", GetName(oCreature) + " is using hide in plain sight!"); + ClearAllActions(TRUE); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + return; + } + } + // Does not have hide in plain sight. + else + { + string sEnemyIndex = IntToString(nEnemyIndex); + float fEnemyDistance = GetLocalFloat(oCreature, AI_ENEMY_RANGE + sEnemyIndex); + if(AI_DEBUG) ai_Debug("ai_coward", "85", "fDistance: " + FloatToString(fEnemyDistance, 0, 2)); + if(fEnemyDistance >= AI_RANGE_CLOSE) + { + int bTried = GetLocalInt(oCreature, AI_TRIED_TO_HIDE); + if(!bTried) + { + // Move away so we can hide. + if(AI_DEBUG) ai_Debug("ai_coward", "93", GetName(oCreature) + " is trying to move away to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + object oEnemy = GetLocalObject(oCreature, AI_ENEMY + sEnemyIndex); + ActionMoveAwayFromObject(oEnemy, TRUE, AI_RANGE_BATTLEFIELD); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + else SetLocalInt(oCreature, AI_TRIED_TO_HIDE, GetLocalInt(oCreature, AI_TRIED_TO_HIDE) - 1); + } + // We have been seen by an enemy near us so drop stealth. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + } + // The enemy can see through stealth so lets drop it. + else SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + } + // We are not in stealth mode so lets get there. + else if(!GetActionMode(oCreature, ACTION_MODE_STEALTH)) + { + // Use any hiding talents we have + if(AI_DEBUG) ai_Debug("ai_coward", "113", GetName(oCreature) + " is trying to hide!"); + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + SetLocalInt(oCreature, AI_TRIED_TO_HIDE, 3); + return; + } + } + // Either we cannot go into stealth or we are in stealth so do something else. + //************************* OUT OF MELEE COMBAT ************************** + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, 0, oCreature)) return; + if(ai_TryCureConditionTalent(oCreature, 0)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //************************** DEFENSIVE TALENTS *************************** + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel)) return; + // Stand and watch the battle we don't want to provoke anyone! + if(AI_DEBUG) ai_Debug("ai_coward", "132", GetName(oCreature) + " is holding here."); +} diff --git a/_module/nss/ai_default.nss b/_module/nss/ai_default.nss new file mode 100644 index 00000000..cfe8e8f9 --- /dev/null +++ b/_module/nss/ai_default.nss @@ -0,0 +1,49 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_default +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for default creatures(Any). + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + if(ai_TryPolymorphSelfFeat(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + ai_DoPhysicalAttackOnNearest(oCreature, nInMelee); +} diff --git a/_module/nss/ai_defensive.nss b/_module/nss/ai_defensive.nss new file mode 100644 index 00000000..15f52751 --- /dev/null +++ b/_module/nss/ai_defensive.nss @@ -0,0 +1,48 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_defensive +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures put in to a defensive mode to protect themselves(Any). + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + //************************** DEFENSIVE TALENTS *************************** + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel)) return; + //******************** DEFENSIVE MELEE FEATS ***************************** + if(nInMelee > 0) + { + if(ai_TryImprovedExpertiseFeat(oCreature)) return; + if(ai_TryExpertiseFeat(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + object oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget == OBJECT_INVALID) oTarget = oNearestEnemy; + // Use knockdown when appropriate and the target is not immune + if(ai_TryKnockdownFeat(oCreature, oTarget)) return; + if(ai_TryParry(oCreature)) return; + } + //********************** PHYSICAL ATTACKS ******************************** + // Even in defensive mode we want to be in battle so go find someone! + ai_DoPhysicalAttackOnNearest(oCreature, nInMelee); +} diff --git a/_module/nss/ai_dragon.nss b/_module/nss/ai_dragon.nss new file mode 100644 index 00000000..a82362ce --- /dev/null +++ b/_module/nss/ai_dragon.nss @@ -0,0 +1,51 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_dragon +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for dragons. + OBJECT_SELF is the dragons running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + // Dragons do not flee! if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // ************************ MELEE ATTACKS ******************************** + object oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(GetDistanceBetween(oCreature, oTarget) > AI_RANGE_CLOSE) + { + // Can we do a crush attack(HD 18+)? + if(ai_TryCrushAttack(oCreature, oTarget)) return; + ai_FlyToTarget(oCreature, oTarget); + return; + } + if(ai_TryDragonBreathAttack(oCreature, nRound)) return; + ai_TryWingAttacks(oCreature); + // If we don't do a Tail sweep attack(HD 30+) then see if we can do a Tail slap(HD 12+)! + if(!ai_TryTailSweepAttack(oCreature)) ai_TryTailSlap(oCreature); + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_druid.nss b/_module/nss/ai_druid.nss new file mode 100644 index 00000000..95cb82b5 --- /dev/null +++ b/_module/nss/ai_druid.nss @@ -0,0 +1,70 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_druid +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Druid. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS) && ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TryPolymorphSelfFeat(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // All else fails lets see if we have any good potions. + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Lets pick off the nearest targets. + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_fighter.nss b/_module/nss/ai_fighter.nss new file mode 100644 index 00000000..04f4ce06 --- /dev/null +++ b/_module/nss/ai_fighter.nss @@ -0,0 +1,65 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_fighter +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Fighter. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange (oCreature); + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //***************** OFFENSIVE AREA OF EFFECT TALENTS ********************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + // *********************** DEFENSIVE TALENTS ***************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //******************* OFFENSIVE TARGETED TALENTS ************************* + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // *************************** RANGED ATTACKS **************************** + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // **************************** MELEE ATTACKS **************************** + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryWhirlwindFeat (oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee); + if (oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents (oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_flanker.nss b/_module/nss/ai_flanker.nss new file mode 100644 index 00000000..20a65389 --- /dev/null +++ b/_module/nss/ai_flanker.nss @@ -0,0 +1,102 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_flanker +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for monsters to flank the enemy and not charge into combat. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //***************** OFFENSIVE AREA OF EFFECT TALENTS ********************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + // *********************** DEFENSIVE TALENTS ***************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //******************* OFFENSIVE TARGETED TALENTS ************************* + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Melee feat attacks ************************* + // Lets get the nearest target that is attacking someone besides me. We want to flank! + if(oTarget == OBJECT_INVALID) + { + if(!nInMelee) oTarget = ai_GetFlankTarget(oCreature); + // If there are few enemies then we can safely move around. + else if(nInMelee < 3 || ai_CanIMoveInCombat(oCreature)) + { + oTarget = ai_GetFlankTarget(oCreature, AI_RANGE_MELEE); + } + // Ok we are in a serious fight so lets not give attack of opportunities. + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + } + // If there are no enemies being attacked then lets stay back. + if(oTarget == OBJECT_INVALID) + { + if(nInMelee) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + // Lets get the strongest melee opponent in melee with us. + object oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + } + // ************************** Ranged feat attacks ************************** + if(!ai_GetAIMode(oCreature, AI_MODE_STOP_RANGED) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + oTarget = ai_GetNearestTarget(oCreature); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + else + { + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + } + if(oTarget != OBJECT_INVALID) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); +} diff --git a/_module/nss/ai_incorporeal.nss b/_module/nss/ai_incorporeal.nss new file mode 100644 index 00000000..cdd20bdd --- /dev/null +++ b/_module/nss/ai_incorporeal.nss @@ -0,0 +1,83 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_incorporeal +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures that are incorporeal. + oCreature is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange (oCreature); + if (nInMelee && ai_MoralCheck (oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + if(ai_TrySummonFamiliarTalent(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if (!GetHasFeatEffect (FEAT_BARBARIAN_RAGE, oCreature) && ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if (ai_TryRangedSneakAttack (oCreature, nInMelee)) return; + string sIndex; + if (!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget (oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat (oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee); + if (oTarget != OBJECT_INVALID) + { + // If we are using our hands then do a touch attack instead. + if (GetItemInSlot (INVENTORY_SLOT_RIGHTHAND) == OBJECT_INVALID) + { + if (GetItemInSlot (INVENTORY_SLOT_CWEAPON_L) != OBJECT_INVALID) + { + // Randomize so they don't appear synchronized. + float fDelay = IntToFloat(Random(2) + 1); + DelayCommand(fDelay, ActionCastSpellAtObject (769/*Shadow_Attack*/, oTarget, METAMAGIC_ANY, TRUE)); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MELEE_ATK); + SetLocalObject (oCreature, AI_ATTACKED_PHYSICAL, oTarget); + } + } + else ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_invisible.nss b/_module/nss/ai_invisible.nss new file mode 100644 index 00000000..7d42b21b --- /dev/null +++ b/_module/nss/ai_invisible.nss @@ -0,0 +1,93 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_invisible +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures(Any) that are invisible. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + // Skill, Class, Offensive AOE's, and Defensive talents. + // *************************** SPELL TALENTS *************************** + // ********** PROTECTION/ENHANCEMENT/SUMMON TALENTS ************ + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + // ************************** CLASS FEATURES *************************** + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + // ******************* OFFENSIVE AOE TALENTS *********************** + // Check the battlefield for a group of enemies to shoot a big spell at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // If we won't loose invisibility then ranged attacks are ok! + // ************************ RANGED ATTACKS ******************************* + if(GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY) || GetHasSpellEffect(SPELLABILITY_AS_IMPROVED_INVISIBLITY)) + { + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetLowestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + talent tUse = GetCreatureTalentBest(TALENT_CATEGORY_HARMFUL_MELEE, 20, oCreature); + if(GetIsTalentValid(tUse)) + { + int nId = GetIdFromTalent(tUse); + if(nId == FEAT_POWER_ATTACK) { if(ai_TryPowerAttackFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_KNOCKDOWN) { if(ai_TryKnockdownFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SMITE_EVIL) { if(ai_TrySmiteEvilFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SMITE_GOOD) { if(ai_TrySmiteGoodFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_IMPROVED_POWER_ATTACK) { if(ai_TryImprovedPowerAttackFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_FLURRY_OF_BLOWS) { if(ai_TryFlurryOfBlowsFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_STUNNING_FIST) { if(ai_TryStunningFistFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_SAP) { if(ai_TrySapFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_DISARM) { if(ai_TryDisarmFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_KI_DAMAGE) { if(ai_TryKiDamageFeat(oCreature, oTarget)) return; } + else if(nId == FEAT_CALLED_SHOT) { if(ai_TryCalledShotFeat(oCreature, oTarget)) return; } + } + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_monk.nss b/_module/nss/ai_monk.nss new file mode 100644 index 00000000..d6ff1b65 --- /dev/null +++ b/_module/nss/ai_monk.nss @@ -0,0 +1,65 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_monk +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Monk. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange (oCreature); + //*************************** HEALING & CURES **************************** + if (ai_TryWholenessOfBodyFeat (oCreature)) return; + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck (oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if (!nInMelee) oTarget = ai_GetNearestTarget (oCreature); + else oTarget = ai_GetNearestTarget (oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee); + if (oTarget != OBJECT_INVALID) + { + if (ai_TryMeleeTalents (oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_paladin.nss b/_module/nss/ai_paladin.nss new file mode 100644 index 00000000..d45d2231 --- /dev/null +++ b/_module/nss/ai_paladin.nss @@ -0,0 +1,71 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_paladin +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Paladin. + Paladins face the strongest opponents on the battlefield first! + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryTurningTalent(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + if(ai_TryDivineShieldFeat(oCreature, nInMelee)) return; + if(ai_TryDivineMightFeat(oCreature, nInMelee)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Paladins face the biggest challenges first! + if(!nInMelee) oTarget = ai_GetHighestCRTarget(oCreature); + else oTarget = ai_GetHighestCRTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + // Paladins face the biggest challenges first! + oTarget = ai_GetHighestCRTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_polymorphed.nss b/_module/nss/ai_polymorphed.nss new file mode 100644 index 00000000..9a7630a6 --- /dev/null +++ b/_module/nss/ai_polymorphed.nss @@ -0,0 +1,55 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_polymorphed +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for polymorphed creatures. + We check for abilities based on the form we are using and if we should polymorph back. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void ai_DoActions(object oCreature, int nForm) +{ + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(GetPercentageHPLoss(oCreature) <= AI_HEALTH_BLOODY) + { + if(AI_DEBUG) ai_Debug("ai_polymorphed", "19", "We are wounded and are transforming back!"); + ai_RemoveASpecificEffect(oCreature, EFFECT_TYPE_POLYMORPH); + return; + } + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + // When polymorphed we turn back then check moral. + // if(nInMelee && ai_MoralCheck(oCreature)) return; + // Skill, Class, Offensive AOE's, and Defensive talents. + // *************************** SPELL TALENTS *************************** + if(ai_CheckForAssociateSpellTalent(oCreature, nInMelee, nMaxLevel)) return; + // Class and Offensive single target talents. + // *************************** SPELL TALENTS *************************** + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + // If we don't find a target then we don't want to fight anyone! + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, TRUE); +} +void main() +{ + object oCreature = OBJECT_SELF; + // Need to know who we are so we can use thier abilities. + int nForm = GetAppearanceType(oCreature); + // Check to see if we are back to our normal form?(-1 to get the actual form #) + if(nForm == GetLocalInt(oCreature, AI_NORMAL_FORM) - 1) + { + // If we are transformed back then go back to our primary ai. + ai_SetCreatureAIScript(oCreature); + DeleteLocalInt(oCreature, AI_NORMAL_FORM); + string sAI = GetLocalString(oCreature, AI_COMBAT_SCRIPT); + if(sAI == "ai_polymorphed" || sAI == "") sAI = "ai_default"; + ExecuteScript(sAI, oCreature); + } + else ai_DoActions(oCreature, nForm); +} diff --git a/_module/nss/ai_ranged.nss b/_module/nss/ai_ranged.nss new file mode 100644 index 00000000..3a46228c --- /dev/null +++ b/_module/nss/ai_ranged.nss @@ -0,0 +1,116 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_ranged +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for monsters to use the ranged ai. + OBJECT_SELF is the creature running the ai. + Will attempt to use ranged weapons/spells until surrounded. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + // Check for moral and get the maximum spell level we should use. + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + // ************************** CLASS FEATURES ******************************* + if(ai_TryTurningTalent(oCreature)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + object oTarget; + // ************************** Ranged feat attacks ************************** + if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oCreature) && + (nInMelee < 3 || ai_GetEnemyAttackingMe(oCreature) == OBJECT_INVALID)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + // Lets pick off the ranged then nearest targets. + if(!nInMelee) + { + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget == ai_GetRangedTarget(oCreature); + if(oTarget == OBJECT_INVALID && ai_TryRangedSneakAttack(oCreature, nInMelee)) return; + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature); + } + else + { + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************** Melee feat attacks ************************* + object oNearestEnemy = GetLocalObject(oCreature, AI_ENEMY_NEAREST); + if(nInMelee) + { + oTarget = ai_GetEnemyAttackingMe(oCreature); + if(oTarget != OBJECT_INVALID) + { + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if(ai_TrySneakAttack(oCreature, nInMelee)) return; + if(ai_TryWhirlwindFeat(oCreature)) return; + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + return; + } + } + } + if(oNearestEnemy != OBJECT_INVALID) + { + float fDistance = GetDistanceBetween(oCreature, oNearestEnemy); + float fRange = AI_RANGE_LONG; + if(GetHasFeat(FEAT_SNEAK_ATTACK, oCreature)) fRange = AI_RANGE_CLOSE; + if(fDistance < fRange) + { + int bRun = ai_CanIMoveInCombat(oCreature); + ActionMoveAwayFromObject(oNearestEnemy, bRun, fRange - fDistance + 2.0); + } + } + else ai_SearchForHiddenCreature(oCreature, FALSE, OBJECT_INVALID, AI_RANGE_CLOSE); +} + diff --git a/_module/nss/ai_ranger.nss b/_module/nss/ai_ranger.nss new file mode 100644 index 00000000..5878cfb5 --- /dev/null +++ b/_module/nss/ai_ranger.nss @@ -0,0 +1,79 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_ranger +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Ranger. + Need to add ---> Rangers will take out favored enemies first! + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS) && ai_TrySummonAnimalCompanionTalent(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) + { + oTarget = ai_GetNearestFavoredEnemyTarget(oCreature); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature); + } + else + { + oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + } + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestFavoredEnemyTarget(oCreature, AI_RANGE_MELEE); + if(oTarget == OBJECT_INVALID) oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryMeleeTalents(oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_rogue.nss b/_module/nss/ai_rogue.nss new file mode 100644 index 00000000..81c4500b --- /dev/null +++ b/_module/nss/ai_rogue.nss @@ -0,0 +1,66 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_rogue +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Rogue. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange (oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck (oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if (ai_TryRangedSneakAttack (oCreature, nInMelee)) return; + oTarget = ai_GetNearestTarget (oCreature); + if(oTarget != OBJECT_INVALID) + { + if (ai_TryRapidShotFeat (oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + if (ai_TrySneakAttack (oCreature, nInMelee)) return; + oTarget = ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee); + if (oTarget != OBJECT_INVALID) + { + if (ai_TryMeleeTalents (oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_shadow.nss b/_module/nss/ai_shadow.nss new file mode 100644 index 00000000..3d6419fa --- /dev/null +++ b/_module/nss/ai_shadow.nss @@ -0,0 +1,77 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_shadow +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures that are incorporeal. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + // Shadows do not flee! if(nInMelee && ai_MoralCheck()) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************ RANGED ATTACKS ******************************* + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + string sIndex; + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee); + if(oTarget != OBJECT_INVALID) + { + // If we are using our hands then do a touch attack instead. + if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND) == OBJECT_INVALID) + { + if(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L) != OBJECT_INVALID) + { + // Randomize so they don't appear synchronized. + float fDelay = IntToFloat(Random(2) + 1); + DelayCommand(fDelay, ActionCastSpellAtObject (769/*Shadow_Attack*/, oTarget, METAMAGIC_ANY, TRUE)); + ai_SetLastAction(oCreature, AI_LAST_ACTION_MELEE_ATK); + SetLocalObject (oCreature, AI_ATTACKED_PHYSICAL, oTarget); + } + } + else ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_sorcerer.nss b/_module/nss/ai_sorcerer.nss new file mode 100644 index 00000000..f1fdcc3f --- /dev/null +++ b/_module/nss/ai_sorcerer.nss @@ -0,0 +1,61 @@ +/*//////////////////////////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_sorcerer +////////////////////////////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Sorcerer. + OBJECT_SELF is the creature running the ai. +*///////////////////////////////////////////////////////////////////////////////////////////////////// +// Programmer: Philos +////////////////////////////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************* OFFENSIVE TARGETED TALENTS *********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************** RANGED ATTACKS ***************************** + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee, FALSE); + // I have a target now lets see if we want to move in! + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, TRUE, OBJECT_INVALID, AI_RANGE_CLOSE); +} diff --git a/_module/nss/ai_taunter.nss b/_module/nss/ai_taunter.nss new file mode 100644 index 00000000..825d0259 --- /dev/null +++ b/_module/nss/ai_taunter.nss @@ -0,0 +1,78 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: ai_taunter +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using defined to use the taunt skill. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange (oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck (oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + //**************************** SKILL FEATURES **************************** + if(ai_TryAnimalEmpathy(oCreature)) return; + //**************************** CLASS FEATURES **************************** + if(ai_TryBarbarianRageFeat(oCreature)) return; + if(ai_TryBardSongFeat(oCreature)) return; + if(ai_TryTurningTalent(oCreature)) return; + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS)) + { + if(ai_TrySummonFamiliarTalent(oCreature)) return; + if(ai_TrySummonAnimalCompanionTalent(oCreature)) return; + } + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************** OFFENSIVE TARGETED TALENTS ********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // *************************** RANGED ATTACKS ***************************** + // We use a bow when we are not in melee, or only 1 enemy with PBS. + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if (!nInMelee) oTarget = ai_GetNearestTarget (oCreature); + else oTarget = ai_GetNearestTarget (oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + if(ai_TryRapidShotFeat(oCreature, oTarget, nInMelee)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ***************************** MELEE ATTACKS *************************** + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat (oCreature, nInMelee); + if (oTarget != OBJECT_INVALID) + { + if (ai_TryTaunt (oCreature, oTarget)) return; + if (ai_TryMeleeTalents (oCreature, oTarget)) return; + ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + } + else ai_SearchForHiddenCreature(oCreature, TRUE); +} diff --git a/_module/nss/ai_wizard.nss b/_module/nss/ai_wizard.nss new file mode 100644 index 00000000..6baa4c8c --- /dev/null +++ b/_module/nss/ai_wizard.nss @@ -0,0 +1,63 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: ai_wizard +//////////////////////////////////////////////////////////////////////////////// + ai script for creatures using the class Wizard. + OBJECT_SELF is the creature running the ai. +//////////////////////////////////////////////////////////////////////////////// + Programmer: Philos +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" +void main() +{ + object oCreature = OBJECT_SELF; + // Get the number of enemies that we are in melee combat with. + int nInMelee = ai_GetNumOfEnemiesInRange(oCreature); + //*************************** HEALING & CURES **************************** + if(ai_TryHealingTalent(oCreature, nInMelee)) return; + if(ai_TryCureConditionTalent(oCreature, nInMelee)) return; + if(nInMelee && ai_MoralCheck(oCreature)) return; + int nMaxLevel = ai_GetMonsterTalentMaxLevel(oCreature); + //******************* OFFENSIVE AREA OF EFFECT TALENTS ******************* + // Check the battlefield for a group of enemies to shoot a big talent at! + // We are checking here since these opportunities are rare and we need + // to take advantage of them as often as possible. + if(ai_UseCreatureTalent(oCreature, AI_TALENT_INDISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_DISCRIMINANT_AOE, nInMelee, nMaxLevel)) return; + // ************************** CLASS FEATURES **************************** + if(GetLocalInt(GetModule(), AI_RULE_SUMMON_COMPANIONS) && ai_TrySummonFamiliarTalent(oCreature)) return; + //************************** DEFENSIVE TALENTS *************************** + int nRound = ai_GetCurrentRound(oCreature); + if(ai_TryDefensiveTalents(oCreature, nInMelee, nMaxLevel, nRound)) return; + //********************* OFFENSIVE TARGETED TALENTS *********************** + // Look for a touch attack since we are in melee. + if(nInMelee > 0 && ai_UseCreatureTalent(oCreature, AI_TALENT_TOUCH, nInMelee, nMaxLevel)) return; + if(ai_UseCreatureTalent(oCreature, AI_TALENT_RANGED, nInMelee, nMaxLevel)) return; + // PHYSICAL ATTACKS - Either we don't have talents or we are saving them. + // ************************** RANGED ATTACKS ***************************** + object oTarget; + if(ai_CanIUseRangedWeapon(oCreature, nInMelee)) + { + if(ai_HasRangedWeaponWithAmmo(oCreature)) + { + if(!nInMelee) oTarget = ai_GetNearestTarget(oCreature); + else oTarget = ai_GetNearestTarget(oCreature, AI_RANGE_MELEE); + if(oTarget != OBJECT_INVALID) + { + ai_ActionAttack(oCreature, AI_LAST_ACTION_RANGED_ATK, oTarget, nInMelee, TRUE); + return; + } + else + { + ai_SearchForHiddenCreature(oCreature, TRUE, OBJECT_INVALID, AI_RANGE_CLOSE); + return; + } + } + else if(ai_InCombatEquipBestRangedWeapon(oCreature)) return; + } + // ************************* MELEE ATTACKS ******************************* + if(ai_InCombatEquipBestMeleeWeapon(oCreature)) return; + oTarget = ai_GetNearestTargetForMeleeCombat(oCreature, nInMelee, TRUE); + // I have a target now lets see if we want to move in! + if(oTarget != OBJECT_INVALID) ai_ActionAttack(oCreature, AI_LAST_ACTION_MELEE_ATK, oTarget); + else ai_SearchForHiddenCreature(oCreature, TRUE, OBJECT_INVALID, AI_RANGE_CLOSE); +} diff --git a/_module/nss/food.nss b/_module/nss/food.nss index 3ef457d0..4c4b1ac9 100644 --- a/_module/nss/food.nss +++ b/_module/nss/food.nss @@ -13,5 +13,4 @@ else if (iHungry == 1) { FloatingTextStringOnCreature("You aren't hungry, but you eat the "+ sName +" anyway.",oPC,TRUE); } - -} +} \ No newline at end of file diff --git a/_module/nss/mm_prc_spells.nss b/_module/nss/mm_prc_spells.nss new file mode 100644 index 00000000..4aeb8e03 --- /dev/null +++ b/_module/nss/mm_prc_spells.nss @@ -0,0 +1,161 @@ +#include "0i_menus" +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +json ai_CheckToReplaceSpell(json jSpellList, int nClass, int nLevel, int nSlot) +{ + //if(d100() > 49) return jSpellList; + string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); + int nRoll = d10() + 1 + nLevel * 10; + int nSpell = StringToInt(Get2DAString("prc_add_spells", sSpellTableColumn, nRoll)); + if(nSpell > 0) + { + //WriteTimestampedLogEntry("mm_prc_spells, 13 nSpell: " + IntToString(nSpell) + + // " nLevel: " + IntToString(nLevel) + " nSlot: " + IntToString(nSlot)); + json jSpellArray = JsonArrayGet(jSpellList, nSlot); + json jSpell = JsonObjectGet(jSpellArray, "Spell"); + jSpell = JsonObjectSet(jSpell, "value", JsonInt(nSpell)); + jSpellArray = JsonObjectSet(jSpellArray, "Spell", jSpell); + return JsonArraySet(jSpellList, nSlot, jSpellArray); + } + return jSpellList; +} +void main() +{ + object oPC = OBJECT_SELF; + if(StartingUp(oPC)) return; + int bChanged, bCreatureChanged, nPosition, nClass, nLevel, nSlot, nMaxSlots; + json jClass, jMemorizedList, jKnownList; + object oModule = GetModule(); + json jCreature = GetLocalJson(oModule, AI_MONSTER_JSON); + object oCreature = GetLocalObject(oModule, AI_MONSTER_OBJECT); + json jClassList = GffGetList(jCreature, "ClassList"); + while(nPosition <= AI_MAX_CLASSES_PER_CHARACTER) + { + nClass = GetClassByPosition(nPosition, oCreature); + if(Get2DAString("classes", "SpellCaster", nClass) == "1") + { + //WriteTimestampedLogEntry("mm_prc_spells, 39 " + GetName(oCreature) + JsonDump(jClassList, 4)); + jClass = JsonArrayGet(jClassList, nPosition - 1); + if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") + { + nLevel = 1; + while(nLevel < 9) + { + jMemorizedList = GffGetList(jClass, "MemorizedList" + IntToString(nLevel)); + if(JsonGetType(jMemorizedList) != JSON_TYPE_NULL) + { + nSlot = 0; + nMaxSlots = GetMemorizedSpellCountByLevel(oCreature, nClass, nLevel); + while(nSlot < nMaxSlots) + { + jMemorizedList = ai_CheckToReplaceSpell(jMemorizedList, nClass, nLevel, nSlot); + nSlot++; + } + //WriteTimestampedLogEntry("nClass: " + IntToString(nClass) + " nLevel: " + IntToString(nLevel) + + // " nSlot: " + IntToString(nSlot) + " jMemorizedList " + JsonDump(jMemorizedList, 4)); + jClass = GffReplaceList(jClass, "MemorizedList" + IntToString(nLevel), jMemorizedList); + bChanged = TRUE; + } + nLevel++; + } + } + else + { + nLevel = 1; + while(nLevel < 9) + { + jKnownList = GffGetList(jClass, "KnownList" + IntToString(nLevel)); + if(JsonGetType(jMemorizedList) != JSON_TYPE_NULL) + { + nSlot = 0; + nMaxSlots = GetKnownSpellCount(oCreature, nClass, nLevel); + while(nSlot < nMaxSlots) + { + jKnownList = ai_CheckToReplaceSpell(jKnownList, nClass, nLevel, nSlot); + nSlot++; + } + jClass = GffReplaceList(jClass, "KnownList" + IntToString(nLevel), jKnownList); + bChanged = TRUE; + } + nLevel++; + } + } + if(bChanged) + { + //WriteTimestampedLogEntry("0i_module, 87 " + GetName(oCreature) + " jClass: " + JsonDump(jClass, 4)); + jClassList = JsonArraySet(jClassList, nPosition - 1, jClass); + //if(AI_DEBUG) ai_Debug("0i_module, 89 " + GetName(oCreature) + " jClassList: " + JsonDump(jClassList, 4)); + jCreature = GffReplaceList(jCreature, "ClassList", jClassList); + bCreatureChanged = TRUE; + bChanged = FALSE; + } + } + nPosition++; + } + if(bCreatureChanged) + { + //WriteTimestampedLogEntry("mm_prc_spells, 99 " + GetName(oCreature) + " jClassList: " + JsonDump(jClassList, 4)); + SetLocalJson(oModule, AI_MONSTER_JSON, jCreature); + SetLocalInt(oModule, AI_MONSTER_CHANGED, TRUE); + } +} +int PRCSpellsSetup(object oPC) +{ + // Check to make sure prc_add_spells.2da is loaded. + if(ResManGetAliasFor("prc_add_spells", RESTYPE_2DA) == "") + { + SendMessageToPC(oPC, "prc_add_spells.2da is not loaded! Make sure it is in the override or development folder."); + return FALSE; + } + // Check to make sure PRC is loaded. + if(!GetLocalInt(GetModule(), AI_USING_PRC)) + { + SendMessageToPC(oPC, "PRC is not being used. PRC must be active for this mod to work."); + return FALSE; + } + return TRUE; +} +void SetMonsterModJson(object oPC) +{ + object oModule = GetModule(); + json jMonsterMods = GetLocalJson(oModule, AI_MONSTER_MOD_JSON); + if(JsonGetType(jMonsterMods) == JSON_TYPE_NULL) jMonsterMods = JsonArray(); + int nIndex; + string sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, nIndex)); + while(sMonsterMod != "") + { + if(sMonsterMod == "mm_prc_spells") return; + sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, ++nIndex)); + } + jMonsterMods = JsonArrayInsert(jMonsterMods, JsonString("mm_prc_spells")); + SetLocalJson(oModule, AI_MONSTER_MOD_JSON, jMonsterMods); + ai_SendMessages("mm_prc_spells loaded! Monsters will be using PRC spells.", AI_COLOR_YELLOW, oPC); +} +int StartingUp(object oPC) +{ + if(!PRCSpellsSetup(oPC)) + { + SendMessageToPC(oPC, "mm_prc_spells monster mod has failed to load due to an error."); + // Return -1 in AI_PLUGIN_SET to tell PEPS that we failed to load. + SetLocalInt(oPC, AI_PLUGIN_SET, -1); + return TRUE; + } + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("mm_prc_spells")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(3)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Monsters will use PRC spells!")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + SetMonsterModJson(oPC); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + SetMonsterModJson(oPC); + return TRUE; +} + diff --git a/_module/nss/mmd_inc_random.nss b/_module/nss/mmd_inc_random.nss new file mode 100644 index 00000000..2b2541ab --- /dev/null +++ b/_module/nss/mmd_inc_random.nss @@ -0,0 +1,91 @@ +//::////////////////////////////////////////////// +//;: +//:: mmd_inc_random.nss +//:: +/* + Handles random NPC appearances. +*/ +//:: +//::////////////////////////////////////////////// +//:: Created By: Jaysyn +//:: Created On: 2025-07-15 16:49:54 +//::////////////////////////////////////////////// + +void rnd_height(object oPC) +{ + int nPercent = 90 + Random(21); // 90% to 110% + float fScale = IntToFloat(nPercent) / 100.0f; + + SetObjectVisualTransform(OBJECT_SELF, OBJECT_VISUAL_TRANSFORM_SCALE, fScale); +} + + +void rnd_skin(object oPC) +{ +//:: Randomize skin color + int nKeepskin = GetLocalInt(OBJECT_SELF,"MMD_KEEPSKIN"); + int nSkinColor; + nSkinColor = Random(15); + + if (nKeepskin != 1) + { + SetColor(OBJECT_SELF, COLOR_CHANNEL_SKIN, nSkinColor); + } +} + +void rnd_pheno(object oPC) +{ +//: Randomize body size (3:1 ratio) + int nKeepPheno = GetLocalInt(OBJECT_SELF, "MMD_KEEPPHENO"); + int nRandom = d4(); + + if (nKeepPheno != 1 && nRandom == 1) + { + SetPhenoType(PHENOTYPE_BIG , OBJECT_SELF); + } + +} + +void rnd_head(object oPC) +{ + // Randomize head + int nKeephead = GetLocalInt(OBJECT_SELF,"MMD_KEEPHEAD"); + int nKeephair = GetLocalInt(OBJECT_SELF,"MMD_KEEPHAIR"); + int nHeadNumber; + nHeadNumber = Random(12)+1; + + if (nKeephead != 1) + { + SetCreatureBodyPart(CREATURE_PART_HEAD, nHeadNumber, OBJECT_SELF); + } + + // Randomize hair color + int nHairColor; + nHairColor = Random(15); + if (nKeephair != 1) + { + SetColor(OBJECT_SELF, COLOR_CHANNEL_HAIR, nHairColor); + } +} + +void rnd_tattoo(object oPC) +{ + // Randomize Tattoos + int nKeeptats = GetLocalInt(OBJECT_SELF,"MMD_KEEPTATS"); + int nTattoo1; + nTattoo1 = Random(60); + + if (nKeeptats != 1) + { + SetColor(OBJECT_SELF, COLOR_CHANNEL_TATTOO_1, nTattoo1); + } + + int nTattoo2; + nTattoo2 = Random(60); + + if (nKeeptats != 1) + { + SetColor(OBJECT_SELF, COLOR_CHANNEL_TATTOO_2, nTattoo2); + } + +} diff --git a/_module/nss/mp_hen_spawn.nss b/_module/nss/mp_hen_spawn.nss index 8ab1a968..1fd848e5 100644 --- a/_module/nss/mp_hen_spawn.nss +++ b/_module/nss/mp_hen_spawn.nss @@ -12,16 +12,42 @@ Henchman-specific OnSpawn handler for XP1. Based on NW_CH_AC9 by Bioware. #include "x0_i0_anims" #include "x0_inc_henai" #include "x2_inc_switches" +#include "ms_name_inc" +#include "mmd_inc_random" void main() { -string sTag = GetTag(OBJECT_SELF); -object oReset = GetWaypointByTag(sTag); -object oRespawn = GetObjectByTag("NW_DEATH_TEMPLE"); -location lRespawn = GetLocation(oRespawn); -location lReset = GetLocation(oReset); -//SetLocalInt(OBJECT_SELF,"X2_L_SPAWN_USE_AMBIENT",1); + object oNPC = OBJECT_SELF; + string sTag = GetTag(oNPC); + object oReset = GetWaypointByTag(sTag); + object oRespawn = GetObjectByTag("NW_DEATH_TEMPLE"); + location lRespawn = GetLocation(oRespawn); + location lReset = GetLocation(oReset); + //SetLocalInt(oNPC,"X2_L_SPAWN_USE_AMBIENT",1); + + + //:: Don't want all the Henchmen to have a title. + if (d2(1) == 2) + { + DeleteLocalInt(oNPC, "RND_BARD"); + DeleteLocalInt(oNPC, "RND_BARBARIAN"); + DeleteLocalInt(oNPC, "RND_CLERIC"); + DeleteLocalInt(oNPC, "RND_DRUID"); + DeleteLocalInt(oNPC, "RND_FIGHTER"); + DeleteLocalInt(oNPC, "RND_MAGE"); + DeleteLocalInt(oNPC, "RND_MONK"); + DeleteLocalInt(oNPC, "RND_PALADIN"); + DeleteLocalInt(oNPC, "RND_RANGER"); + DeleteLocalInt(oNPC, "RND_ROGUE"); + } + ms_Nomenclature(oNPC); + + DelayCommand(0.0f, rnd_skin(oNPC)); + DelayCommand(0.0f, rnd_head(oNPC)); + DelayCommand(0.0f, rnd_pheno(oNPC)); + DelayCommand(0.0f, rnd_tattoo(oNPC)); + DelayCommand(0.0f, rnd_height(oNPC)); //Sets up the special henchmen listening patterns SetAssociateListenPatterns(); @@ -40,25 +66,26 @@ location lReset = GetLocation(oReset); //Use melee weapons by default SetAssociateState(NW_ASC_USE_RANGED_WEAPON, FALSE); - // Set starting location - //SetAssociateStartLocation(); - - // Set respawn location - // SetRespawnLocationSpecific(OBJECT_SELF, lRespawn); - // For some general behavior while we don't have a master, // let's do some immobile animations //SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS); SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS); //JumpToLocation(lReset); -int iRoll = Random(60)+1; -string sTag2 = "henchwp"; -object oWP = GetObjectByTag(sTag2+IntToString(iRoll)); -//ExecuteScript("nw_c2_default9",OBJECT_SELF); -//ActionForceMoveToObject(oWP,FALSE,3.0f); -JumpToObject(oWP); -//DelayCommand(6.0f,ActionRandomWalk()); -if (GetIsHired(OBJECT_SELF)!=TRUE) SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); -} + int iRoll = Random(60)+1; + string sTag2 = "henchwp"; + object oWP = GetObjectByTag(sTag2+IntToString(iRoll)); + //ExecuteScript("nw_c2_default9",OBJECT_SELF); + //ActionForceMoveToObject(oWP,FALSE,3.0f); + JumpToObject(oWP); + // Set starting location + //SetAssociateStartLocation(); + + // Set respawn location + //SetRespawnLocationSpecific(oNPC, lRespawn); + + //DelayCommand(6.0f,ActionRandomWalk()); + if (GetIsHired(oNPC)!=TRUE) SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); + +} \ No newline at end of file diff --git a/_module/nss/ms_name_inc.nss b/_module/nss/ms_name_inc.nss index 90de1df5..2b5e0115 100644 --- a/_module/nss/ms_name_inc.nss +++ b/_module/nss/ms_name_inc.nss @@ -27,7 +27,7 @@ // the NPC then is given a random name generated by RACE and GENDER using // the RandomName function. // -// eg. Male Dwarven Villager in the creator becomes Gloigan on spawn +// eg. Male Dwarven Villager in the Aurora Toolset becomes Gloigan on spawn // this time and perhaps Rufus on the next spawned Villager. // // "NAME_TYPE": Setting this int variable to "1" will cause a Full Name @@ -60,12 +60,11 @@ #include "prc_inc_racial" -//void main (){} ///// FUNCTION DECLARATIONS //////////////////////////////////////////////////// -string GetClassLevelTitle(int nClassType); +string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF); int GetHighestClassLevel(object oCreature = OBJECT_SELF); @@ -96,969 +95,869 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF) string sTitle = GetLocalString(oNPC, "TITLE"); string sPostfix = GetLocalString(oNPC, "POSTFIX"); string sBaseRace = GetLocalString(oNPC, "BASE_RACE"); + string sClassTitle; - int nGender = GetGender(oNPC); int bClassTitle = GetLocalInt(oNPC,"CLASS_TITLE"); - int nHighClass = GetHighestClassLevel(oNPC); - int nLevel = GetLevelByClass(nHighClass, oNPC); + //:: Handles class level based NPC titles if (bClassTitle) { - string sTitle; - - switch (nHighClass) - { - case CLASS_TYPE_BARBARIAN: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Brute" ; - break; - - case 4: case 5: - sTitle = "Vandal"; break; - - case 6: - if (nGender == 1) - {sTitle = "Plunderess"; break;} - else - {sTitle = "Plunderer"; break;} - - case 7: - sTitle = "Pillager"; break; - - case 8: - sTitle = "Marauder"; break; - - case 9: - sTitle = "Reaver"; break; - - case 10: - sTitle = "Barbarian"; break; - - case 11: - sTitle = "Mauler"; break; - - case 12: - sTitle = "Ravager"; break; - - case 13: - sTitle = "Slaughterer"; break; - - case 14: - sTitle = "Destroyer"; break; - - case 15: - if (nGender == 1) - {sTitle = "Chieftainess"; break;} - else - {sTitle = "Chieftain"; break;} - - case 16: - sTitle = "Bloodletter"; break; - - case 17: - sTitle = "Rampager"; break; - - case 18: - sTitle = "Slayer"; break; - - case 19: - sTitle = "Warmonger"; break; - - case 20: - if (nGender == 1) - {sTitle = "High Chieftainess"; break;} - else - {sTitle = "High Chieftain"; break;} - - default: - if (nGender == 1) - {sTitle = "Conqueress"; break;} - else - {sTitle = "Conqueror"; break;} - - } - - case CLASS_TYPE_ROGUE: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Lookout" ; - break; - - case 4: case 5: - sTitle = "Outlaw"; break; - - case 6: - sTitle = "Scalawag"; break; - - case 7: - sTitle = "Creeper"; break; - - case 8: - sTitle = "Larker"; break; - - case 9: - sTitle = "Footpad"; break; - - case 10: - sTitle = "Rogue"; break; - - case 11: - sTitle = "Cutpurse"; break; - - case 12: - sTitle = "Thief"; break; - - case 13: - sTitle = "Pilferer"; break; - - case 14: - sTitle = "Robber"; break; - - case 15: - sTitle = "Sharper"; break; - - case 16: - sTitle = "Burglar"; break; - - case 17: - sTitle = "Filcher"; break; - - case 18: - sTitle = "Scoundrel"; break; - - case 19: - sTitle = "Knave"; break; - - case 20: - sTitle = "Prowler"; break; - - default: - sTitle = "Master Rogue"; break; - - } - - case CLASS_TYPE_BARD: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Crier" ; - break; - - case 4: case 5: - if (nGender == 1) - {sTitle = "Chantress"; break;} - else - {sTitle = "Chanter"; break;} - - case 6: - sTitle = "Skop"; break; - - case 7: - sTitle = "Accompanist"; break; - - case 8: - sTitle = "Rhymer"; break; - - case 9: - sTitle = "Singer"; break; - - case 10: - sTitle = "Balladeer"; break; - - case 11: - if (nGender == 1) - {sTitle = "Cantoress"; break;} - else - {sTitle = "Cantor"; break;} - - case 12: - sTitle = "Lutenist"; break; - - case 13: - sTitle = "Melodist"; break; - - case 14: - sTitle = "Lyrist"; break; - - case 15: - sTitle = "Jongleur"; break; - - case 16: - sTitle = "Loreweaver"; break; - - case 17: - sTitle = "Chronicler"; break; - - case 18: - sTitle = "Muse"; break; - - case 19: - if (nGender == 1) - {sTitle = "Rhapsode"; break;} - else - {sTitle = "Rhapsodist"; break;} - - case 20: - sTitle = "Bard"; break; - - case 21: - sTitle = "Raconteur"; break; - - case 22: - sTitle = "Siren"; break; - - case 23: - sTitle = "Songsmith"; break; - - case 24: - sTitle = "Versifer"; break; - - case 25: - sTitle = "Minstrel"; break; - - case 26: - sTitle = "Sonneteer"; break; - - case 27: - if (nGender == 1) - {sTitle = "Trobairitz"; break;} - else - {sTitle = "Troubadour"; break;} - - case 28: - sTitle = "Citharist"; break; - - case 29: - sTitle = "High Minstrel"; break; - - default: - sTitle = "Master Bard"; break; - - } - - case CLASS_TYPE_SORCERER: - case CLASS_TYPE_WIZARD: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Apprentice" ; - break; - - case 4: case 5: - sTitle = "Adept"; break; - - case 6: - sTitle = "Journeymage"; break; - - case 7: - sTitle = "Hedge Mage"; break; - - case 8: - sTitle = "Magician"; break; - - case 9: - sTitle = "Prestidigitator"; break; - - case 10: - sTitle = "Wizard"; break; - - case 11: - sTitle = "Sage"; break; - - case 12: - sTitle = "Visionary"; break; - - case 13: - sTitle = "Loremaster"; break; - - case 14: - sTitle = "Mage"; break; - - case 15: - sTitle = "Fatespinner"; break; - - case 16: - sTitle = "Cabalist"; break; - - case 17: - sTitle = "Thaumaturge"; break; - - case 18: - sTitle = "Theurgist"; break; - - case 19: - sTitle = "Augur"; break; - - case 20: - sTitle = "Spellbinder"; break; - - default: - sTitle = "Archmage"; break; - - } - - case CLASS_TYPE_CLERIC: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Candidate" ; - break; - - case 4: case 5: - sTitle = "Aspirant"; break; - - case 6: - sTitle = "Novice"; break; - - case 7: - sTitle = "Acolyte"; break; - - case 8: - sTitle = "Initiate"; break; - - case 9: - if (nGender == 1) - {sTitle = "Priestess"; break;} - else - {sTitle = "Priest"; break;} - - case 10: - sTitle = "Cleric"; break; - - case 11: - sTitle = "Curate"; break; - - case 12: - sTitle = "Apostle"; break; - - case 13: - sTitle = "Ovate"; break; - - case 14: - sTitle = "Missionary"; break; - - case 15: - if (nGender == 1) - {sTitle = "Canoness"; break;} - else - {sTitle = "Canon"; break;} - - case 16: - if (nGender == 1) - {sTitle = "Abbotess"; break;} - else - {sTitle = "Abbot"; break;} - - case 17: - sTitle = "Bishop"; break; - - case 18: - if (nGender == 1) - {sTitle = "Matriarch"; break;} - else - {sTitle = "Patriarch"; break;} - - case 19: - sTitle = "Preacher"; break; - - default: - if (nGender == 1) - {sTitle = "High Priestess"; break;} - else - {sTitle = "High Priest"; break;} - - } - - case CLASS_TYPE_DRUID: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Initiate" ; - break; - - case 4: case 5: - sTitle = "Devotee"; break; - - case 6: - sTitle = "Beastling"; break; - - case 7: - sTitle = "Grovelurker"; break; - - case 8: - sTitle = "Shaper"; break; - - case 9: - sTitle = "Springwalker"; break; - - case 10: - sTitle = "Druid"; break; - - case 11: - sTitle = "Naturekin"; break; - - case 12: - sTitle = "Treewarden"; break; - - case 13: - sTitle = "Auspex"; break; - - case 14: - sTitle = "Haruspex"; break; - - case 15: - sTitle = "Student of Stones"; break; - - case 16: - sTitle = "Student of Waters"; break; - - case 17: - sTitle = "Student of Forests"; break; - - case 18: - sTitle = "Student of Winds"; break; - - case 19: - sTitle = "Student of Changes"; break; - - case 20: - sTitle = "Pathwarden"; break; - - default: - sTitle = "Archdruid"; break; - - } - - case CLASS_TYPE_FIGHTER: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Guard"; - break; - - case 4: - sTitle = "Elite Guard"; break; - - case 5: case 6: - sTitle = "Warrior"; break; - - case 7: - sTitle = "Elite Warrior"; break; - - case 8: - sTitle = "Soldier"; break; - - case 9: - sTitle = "Enforcer"; break; - - case 10: - sTitle = "Fighter"; break; - - case 11: - sTitle = "Skirmisher"; break; - - case 12: - sTitle = "Veteran"; break; - - case 13: - sTitle = "Armiger"; break; - - case 14: - sTitle = "Myrmidon"; break; - - case 15: - sTitle = "Hero"; break; - - case 16: - sTitle = "Vanguard"; break; - - case 17: - sTitle = "Sentinel"; break; - - case 18: - sTitle = "Dominator"; break; - - case 19: - sTitle = "Warmonger"; break; - - case 20: - sTitle = "Champion"; break; - - default: - sTitle = "Grandmaster"; break; - - } - - case CLASS_TYPE_MONK: - switch(nLevel) - { - case 1: - sTitle = "Trainee"; break; - - case 2: - sTitle = "Initiate"; break; - - case 3: - sTitle = "Novice"; break; - - case 4: - sTitle = "Neophyte"; break; - - case 5: - sTitle = "Aspirant"; break; - - case 6: - sTitle = "Acolyte"; break; - - case 7: - sTitle = "Devotee"; break; - - case 8: - sTitle = "Disciple"; break; - - case 9: - sTitle = "Adept"; break; - - case 10: - sTitle = "Ascetic"; break; - - case 11: - sTitle = "Pilgrim"; break; - - case 12: - sTitle = "Master"; break; - - case 13: - sTitle = "Anchorite"; break; - - case 14: - sTitle = "Mystic"; break; - - case 15: - sTitle = "Meditator"; break; - - case 16: - sTitle = "Seeker"; break; - - case 17: - sTitle = "Guru"; break; - - case 18: - sTitle = "Sensei"; break; - - case 19: - sTitle = "Sannyasi"; break; - - case 20: - sTitle = "Exemplar"; break; - - case 21: - sTitle = "Transcendent"; break; - - default: - sTitle = "High Master"; break; - - } - - case CLASS_TYPE_PALADIN: - switch(nLevel) - { - case 1: - sTitle = "Advocate"; break; - - case 2: - sTitle = "Initiate"; break; - - case 3: - sTitle = "Squire"; break; - - case 4: - sTitle = "Gallant"; break; - - case 5: - sTitle = "Emissary"; break; - - case 6: - sTitle = "Guardian"; break; - - case 7: - sTitle = "Devotee"; break; - - case 8: - sTitle = "Disciple"; break; - - case 9: - sTitle = "Adept"; break; - - case 10: - sTitle = "Ascetic"; break; - - case 11: - sTitle = "Pilgrim"; break; - - case 12: - sTitle = "Master"; break; - - case 13: - sTitle = "Anchorite"; break; - - case 14: - sTitle = "Mystic"; break; - - case 15: - sTitle = "Meditator"; break; - - case 16: - sTitle = "Seeker"; break; - - case 17: - sTitle = "Guru"; break; - - case 18: - sTitle = "Sensei"; break; - - case 19: - sTitle = "Sannyasi"; break; - - case 20: - sTitle = "Exemplar"; break; - - case 21: - sTitle = "Transcendent"; break; - - default: - sTitle = "High Master"; break; - - } - - case CLASS_TYPE_RANGER: - switch(nLevel) - { - case 1: case 2: case 3: - sTitle = "Greenhorn" ; - break; - - case 4: case 5: - sTitle = "Tenderfoot"; break; - - case 6: - sTitle = "Vagrant"; break; - - case 7: - sTitle = "Tramp"; break; - - case 8: - sTitle = "Nomad"; break; - - case 9: - sTitle = "Wanderer"; break; - - case 10: - sTitle = "Ranger"; break; - - case 11: - sTitle = "Rambler"; break; - - case 12: - sTitle = "Traveler"; break; - - case 13: - sTitle = "Sojourner"; break; - - case 14: - sTitle = "Outrider"; break; - - case 15: - sTitle = "Wayfarer"; break; - - case 16: - sTitle = "Excursionist"; break; - - case 17: - sTitle = "Trekker"; break; - - case 18: - sTitle = "Trailblazer"; break; - - case 19: - sTitle = "Woodsman"; break; - - case 20: - sTitle = "High Ranger"; break; - - case 21: - sTitle = "Ranger"; break; - - case 22: - sTitle = "Rambler"; break; - - case 23: - sTitle = "Traveler"; break; - - case 24: - sTitle = "Sojourner"; break; - - case 25: - sTitle = "Outrider"; break; - - case 26: - sTitle = "Wayfarer"; break; - - case 27: - sTitle = "Excursionist"; break; - - case 28: - sTitle = "Trekker"; break; - - case 29: - sTitle = "Trailblazer"; break; - - default: - sTitle = "Ranger Lord"; break; - - } - - } - - //return sTitle; + sClassTitle = GetClassLevelTitle(GetHighestClassLevel(oNPC), oNPC); } //:: Handles class based Henchman titles - int nRndRogue = GetLocalInt(OBJECT_SELF,"RND_ROGUE"); - if (nRndRogue == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Quick"; - } - else if(nResult == 2) - { - sPostfix = "the Quiet"; - } - else if(nResult == 3) - { - sPostfix = "the Sharp"; - } - else if(nResult ==4) - { - sPostfix = "the Sneak"; - } - else if(nResult == 5) - { - sPostfix = "the Rogue"; - } - else - sPostfix = "the Footpad"; + int nRndPaladin = GetLocalInt(OBJECT_SELF, "RND_PALADIN"); + if (nRndPaladin == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + switch (nResult) + { + case 1: sPostfix = "the Righteous"; break; + case 2: sPostfix = "the Just"; break; + case 3: sPostfix = "the Defender"; break; + case 4: sPostfix = "the Virtuous"; break; + case 5: sPostfix = "the Crusader"; break; + case 6: sPostfix = "the Lightbringer"; break; + case 7: sPostfix = "the Faithful"; break; + case 8: sPostfix = "the Zealous"; break; + case 9: sPostfix = "the Beacon"; break; + case 10: sPostfix = "the Redeemer"; break; + case 11: sPostfix = "the Shield of Faith"; break; + case 12: sPostfix = "of the Sacred Flame"; break; + case 13: sPostfix = "the Lawful"; break; + case 14: sPostfix = "the Blessed"; break; + case 15: sPostfix = "the Chosen"; break; + case 16: sPostfix = "of the Holy Vow"; break; + case 17: sPostfix = "the Avenger"; break; + case 18: sPostfix = "the Purifier"; break; + case 19: sPostfix = "the Divine Hand"; break; + case 20: sPostfix = "the Sacred Blade"; break; + case 21: sPostfix = "the Lightforged"; break; + case 22: sPostfix = "the Protector"; break; + case 23: sPostfix = "the Illuminated"; break; + case 24: sPostfix = "of the Silver Oath"; break; + case 25: sPostfix = "the Guardian"; break; + case 26: sPostfix = "the Oathbound"; break; + case 27: sPostfix = "the Valiant"; break; + case 28: sPostfix = "the Seraphic"; break; + case 29: sPostfix = "the Golden Knight"; break; + case 30: sPostfix = "the True"; break; + } + } - } + int nRndMonk = GetLocalInt(OBJECT_SELF, "RND_MONK"); + if (nRndMonk == 1) + { + int nResult = Random(30) + 1; + switch (nResult) + { + case 1: sPostfix = "the Disciplined"; break; + case 2: sPostfix = "the Enlightened"; break; + case 3: sPostfix = "of the Open Palm"; break; + case 4: sPostfix = "of the Empty Hand"; break; + case 5: sPostfix = "the Ascetic"; break; + case 6: sPostfix = "the Calm"; break; + case 7: sPostfix = "the Wayfarer"; break; + case 8: sPostfix = "the Iron Fist"; break; + case 9: sPostfix = "the Centered"; break; + case 10: sPostfix = "of the Quiet Mind"; break; + case 11: sPostfix = "the Humble"; break; + case 12: sPostfix = "the Swift Palm"; break; + case 13: sPostfix = "the Inner Flame"; break; + case 14: sPostfix = "the Master"; break; + case 15: sPostfix = "of the Lotus Path"; break; + case 16: sPostfix = "the Patient"; break; + case 17: sPostfix = "the Balanced"; break; + case 18: sPostfix = "the Serene"; break; + case 19: sPostfix = "the Watchful"; break; + case 20: sPostfix = "the Disciple"; break; + case 21: sPostfix = "the Harmonious"; break; + case 22: sPostfix = "the Seeker"; break; + case 23: sPostfix = "the Breathless"; break; + case 24: sPostfix = "the Stilled Hand"; break; + case 25: sPostfix = "of Perfect Form"; break; + case 26: sPostfix = "the Tranquil"; break; + case 27: sPostfix = "the Unbound"; break; + case 28: sPostfix = "the Silent Step"; break; + case 29: sPostfix = "the Mindful"; break; + case 30: sPostfix = "the Flowing One"; break; + } + } + + int nRndRogue = GetLocalInt(OBJECT_SELF,"RND_ROGUE"); + if (nRndRogue == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + switch (nResult) + { + case 1: + sPostfix = "the Quick"; + break; + case 2: + sPostfix = "the Quiet"; + break; + case 3: + sPostfix = "the Sharp"; + break; + case 4: + sPostfix = "the Sneak"; + break; + case 5: + sPostfix = "the Rogue"; + break; + case 6: + sPostfix = "the Footpad"; + break; + case 7: + sPostfix = "the Shadow"; + break; + case 8: + sPostfix = "the Nimble"; + break; + case 9: + sPostfix = "the Swift"; + break; + case 10: + sPostfix = "the Silent"; + break; + case 11: + sPostfix = "the Sly"; + break; + case 12: + sPostfix = "the Crafty"; + break; + case 13: + sPostfix = "the Cunning"; + break; + case 14: + sPostfix = "the Elusive"; + break; + case 15: + sPostfix = "the Deft"; + break; + case 16: + sPostfix = "the Guileful"; + break; + case 17: + sPostfix = "the Lurker"; + break; + case 18: + sPostfix = "the Trickster"; + break; + case 19: + sPostfix = "the Prowler"; + break; + case 20: + sPostfix = "the Skulker"; + break; + case 21: + sPostfix = "the Phantom"; + break; + case 22: + sPostfix = "the Wily"; + break; + case 23: + sPostfix = "the Mysterious"; + break; + case 24: + sPostfix = "the Furtive"; + break; + case 25: + sPostfix = "the Discreet"; + break; + case 26: + sPostfix = "the Spy"; + break; + case 27: + sPostfix = "the Veiled"; + break; + case 28: + sPostfix = "the Artful"; + break; + case 29: + sPostfix = "the Sleuth"; + break; + case 30: + sPostfix = "the Masked"; + break; + } + } - int nRndBarb = GetLocalInt(OBJECT_SELF,"RND_BARBARIAN"); - if (nRndBarb == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Barbarian"; - } - else if(nResult == 2) - { - sPostfix = "the Destroyer"; - } - else if(nResult == 3) - { - sPostfix = "of the Plains"; - } - else if(nResult ==4) - { - sPostfix = "of Klar Clan"; - } - else if(nResult == 5) - { - sPostfix = "the Rampager"; - } - else - sPostfix = "the Reaver"; + int nRndBarb = GetLocalInt(OBJECT_SELF,"RND_BARBARIAN"); + if (nRndBarb == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + switch (nResult) + { + case 1: + sPostfix = "the Barbarian"; + break; + case 2: + sPostfix = "the Destroyer"; + break; + case 3: + sPostfix = "of the Plains"; + break; + case 4: + sPostfix = "of Bear Clan"; + break; + case 5: + sPostfix = "the Rampager"; + break; + case 6: + sPostfix = "the Reaver"; + break; + case 7: + sPostfix = "the Savage"; + break; + case 8: + sPostfix = "the Berserker"; + break; + case 9: + sPostfix = "the Untamed"; + break; + case 10: + sPostfix = "the Fierce"; + break; + case 11: + sPostfix = "the Warbringer"; + break; + case 12: + sPostfix = "the Wild"; + break; + case 13: + sPostfix = "the Raider"; + break; + case 14: + sPostfix = "the Vicious"; + break; + case 15: + sPostfix = "the Ruthless"; + break; + case 16: + sPostfix = "the Savage"; + break; + case 17: + sPostfix = "the Bloodthirsty"; + break; + case 18: + sPostfix = "the Warlord"; + break; + case 19: + sPostfix = "the Brute"; + break; + case 20: + sPostfix = "the Fierce"; + break; + case 21: + sPostfix = "the Marauder"; + break; + case 22: + sPostfix = "the Howler"; + break; + case 23: + sPostfix = "the Ravager"; + break; + case 24: + sPostfix = "the Crusher"; + break; + case 25: + sPostfix = "the Frenzied"; + break; + case 26: + sPostfix = "the Beast"; + break; + case 27: + sPostfix = "the Juggernaut"; + break; + case 28: + sPostfix = "the Slayer"; + break; + case 29: + sPostfix = "the Rager"; + break; + case 30: + sPostfix = "the Conqueror"; + break; + } + } - } + int nRndFight = GetLocalInt(OBJECT_SELF,"RND_FIGHTER"); + if (nRndFight == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + switch (nResult) + { + case 1: + sPostfix = "the Strong"; + break; + case 2: + sPostfix = "the Stout"; + break; + case 3: + sPostfix = "of Harrowdale"; + break; + case 4: + sPostfix = "of Tyr"; + break; + case 5: + sPostfix = "of Neverwinter"; + break; + case 6: + sPostfix = "the Swordhand"; + break; + case 7: + sPostfix = "the Valiant"; + break; + case 8: + sPostfix = "the Brave"; + break; + case 9: + sPostfix = "the Defender"; + break; + case 10: + sPostfix = "the Just"; + break; + case 11: + sPostfix = "the Noble"; + break; + case 12: + sPostfix = "the Gallant"; + break; + case 13: + sPostfix = "the Protector"; + break; + case 14: + sPostfix = "the Shield"; + break; + case 15: + sPostfix = "the Champion"; + break; + case 16: + sPostfix = "the Guardian"; + break; + case 17: + sPostfix = "the Sentinel"; + break; + case 18: + sPostfix = "the Warrior"; + break; + case 19: + sPostfix = "the Stalwart"; + break; + case 20: + sPostfix = "the Ironclad"; + break; + case 21: + sPostfix = "the Blade"; + break; + case 22: + sPostfix = "the Swordsman"; + break; + case 23: + sPostfix = "the Vanguard"; + break; + case 24: + sPostfix = "the Lancer"; + break; + case 25: + sPostfix = "the Spearhead"; + break; + case 26: + sPostfix = "the Battlemaster"; + break; + case 27: + sPostfix = "the Blademaster"; + break; + case 28: + sPostfix = "the Warlord"; + break; + case 29: + sPostfix = "the Vanquisher"; + break; + case 30: + sPostfix = "the Swordmaster"; + break; + } + } - int nRndFight = GetLocalInt(OBJECT_SELF,"RND_FIGHTER"); - if (nRndFight == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Strong"; - } - else if(nResult == 2) - { - sPostfix = "the Stout"; - } - else if(nResult == 3) - { - sPostfix = "of the Blade"; - } - else if(nResult ==4) - { - sPostfix = "of Tyr"; - } - else if(nResult == 5) - { - sPostfix = "of Urik"; - } - else - sPostfix = "the Swordhand"; + int nRndCleric = GetLocalInt(OBJECT_SELF,"RND_CLERIC"); + if (nRndCleric == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + if (nResult == 1) + { + sPostfix = "the Pious"; + } + else if (nResult == 2) + { + sPostfix = "the Holy"; + } + else if (nResult == 3) + { + sPostfix = "the Priest"; + } + else if (nResult == 4) + { + sPostfix = "the Zealous"; + } + else if (nResult == 5) + { + sPostfix = "of Phlan"; + } + else if (nResult == 6) + { + sPostfix = "the Wise"; + } + else if (nResult == 7) + { + sPostfix = "the Devout"; + } + else if (nResult == 8) + { + sPostfix = "the Faithful"; + } + else if (nResult == 9) + { + sPostfix = "the Righteous"; + } + else if (nResult == 10) + { + sPostfix = "the Blessed"; + } + else if (nResult == 11) + { + sPostfix = "the Pure"; + } + else if (nResult == 12) + { + sPostfix = "the Sacred"; + } + else if (nResult == 13) + { + sPostfix = "the Benevolent"; + } + else if (nResult == 14) + { + sPostfix = "the Virtuous"; + } + else if (nResult == 15) + { + sPostfix = "the Saintly"; + } + else if (nResult == 16) + { + sPostfix = "the Healer"; + } + else if (nResult == 17) + { + sPostfix = "the Anointed"; + } + else if (nResult == 18) + { + sPostfix = "the Protector"; + } + else if (nResult == 19) + { + sPostfix = "the Merciful"; + } + else if (nResult == 20) + { + sPostfix = "the Revered"; + } + else if (nResult == 21) + { + sPostfix = "the Graceful"; + } + else if (nResult == 22) + { + sPostfix = "the Watchful"; + } + else if (nResult == 23) + { + sPostfix = "the Forgiving"; + } + else if (nResult == 24) + { + sPostfix = "the Humble"; + } + else if (nResult == 25) + { + sPostfix = "the Divine"; + } + else if (nResult == 26) + { + sPostfix = "the Preacher"; + } + else if (nResult == 27) + { + sPostfix = "the Illuminated"; + } + else if (nResult == 28) + { + sPostfix = "the Mystic"; + } + else if (nResult == 29) + { + sPostfix = "the Herald"; + } + else // nResult == 30 + { + sPostfix = "the Exalted"; + } + } - } + int nRndMage = GetLocalInt(OBJECT_SELF,"RND_MAGE"); + if (nRndMage == 1) + { + int nResult = Random(30) + 1; // Generate a random number between 1 and 30 + switch (nResult) + { + case 1: + sPostfix = "the Mad"; + break; + case 2: + sPostfix = "the Arcane"; + break; + case 3: + sPostfix = "the Black"; + break; + case 4: + sPostfix = "the Wizard"; + break; + case 5: + sPostfix = "of Waterdeep"; + break; + case 6: + sPostfix = "the Mage"; + break; + case 7: + sPostfix = "the Enigmatic"; + break; + case 8: + sPostfix = "the Mystical"; + break; + case 9: + sPostfix = "the Eldritch"; + break; + case 10: + sPostfix = "the Runeweaver"; + break; + case 11: + sPostfix = "the Sorcerous"; + break; + case 12: + sPostfix = "the Seer"; + break; + case 13: + sPostfix = "the Arcanist"; + break; + case 14: + sPostfix = "the Illustrious"; + break; + case 15: + sPostfix = "the Sage"; + break; + case 16: + sPostfix = "the Sorcerous"; + break; + case 17: + sPostfix = "the Occult"; + break; + case 18: + sPostfix = "the Arcane Adept"; + break; + case 19: + sPostfix = "the Spellbinder"; + break; + case 20: + sPostfix = "the Occultist"; + break; + case 21: + sPostfix = "the Conjurer"; + break; + case 22: + sPostfix = "the Seer"; + break; + case 23: + sPostfix = "the Invoker"; + break; + case 24: + sPostfix = "the Mysterious"; + break; + case 25: + sPostfix = "the Shrouded"; + break; + case 26: + sPostfix = "the Visionary"; + break; + case 27: + sPostfix = "the Spellweaver"; + break; + case 28: + sPostfix = "the Willbreaker"; + break; + case 29: + sPostfix = "the Charmer"; + break; + case 30: + sPostfix = "the Elementalist"; + break; + } + } - int nRndCleric = GetLocalInt(OBJECT_SELF,"RND_CLERIC"); - if (nRndCleric == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Pious"; - } - else if(nResult == 2) - { - sPostfix = "the Holy"; - } - else if(nResult == 3) - { - sPostfix = "the Priest"; - } - else if(nResult ==4) - { - sPostfix = "the Zealous"; - } - else if(nResult == 5) - { - sPostfix = "of Phlan"; - } - else - sPostfix = "the Wise"; + int nRndBard = GetLocalInt(OBJECT_SELF,"RND_BARD"); + if (nRndBard == 1) + { + int nResult = Random(25) + 1; // Generate a random number between 1 and 25 + switch (nResult) + { + case 1: + sPostfix = "the Subtle"; + break; + case 2: + sPostfix = "the Veiled"; + break; + case 3: + sPostfix = "the Shadowed"; + break; + case 4: + sPostfix = "the Intriguer"; + break; + case 5: + sPostfix = "of Altaruk"; + break; + case 6: + sPostfix = "the Elusive"; + break; + case 7: + sPostfix = "the Mysterious"; + break; + case 8: + sPostfix = "the Cryptic"; + break; + case 9: + sPostfix = "the Insidious"; + break; + case 10: + sPostfix = "the Quiet"; + break; + case 11: + sPostfix = "the Sly"; + break; + case 12: + sPostfix = "the Covert"; + break; + case 13: + sPostfix = "the Furtive"; + break; + case 14: + sPostfix = "the Discreet"; + break; + case 15: + sPostfix = "the Subversive"; + break; + case 16: + sPostfix = "the Shrouded"; + break; + case 17: + sPostfix = "the Obscured"; + break; + case 18: + sPostfix = "the Clever"; + break; + case 19: + sPostfix = "the Enigmatic"; + break; + case 20: + sPostfix = "of Elventree"; + break; + case 21: + sPostfix = "of Melvaunt"; + break; + case 22: + sPostfix = "of Deepingdale"; + break; + case 23: + sPostfix = "of Skullport"; + break; + case 24: + sPostfix = "the Crafty"; + break; + case 25: + sPostfix = "of Amn"; + break; + } + } - } + int nRndDruid = GetLocalInt(OBJECT_SELF,"RND_DRUID"); + if (nRndDruid == 1) + { + int nResult = Random(25) + 1; // Generate a random number between 1 and 25 + switch (nResult) + { + case 1: + sPostfix = "the Druid"; + break; + case 2: + sPostfix = "of the Forest"; + break; + case 3: + sPostfix = "of the Wild"; + break; + case 4: + sPostfix = "the Wolflord"; + break; + case 5: + sPostfix = "the Treelord"; + break; + case 6: + sPostfix = "the Verdant"; + break; + case 7: + sPostfix = "the Earthshaker"; + break; + case 8: + sPostfix = "the Feral"; + break; + case 9: + sPostfix = "of the Glade"; + break; + case 10: + sPostfix = "of the Crystal Forest"; + break; + case 11: + sPostfix = "the Thorned"; + break; + case 12: + sPostfix = "the Greenwarden"; + break; + case 13: + sPostfix = "the Naturebound"; + break; + case 14: + sPostfix = "the Forestborn"; + break; + case 15: + sPostfix = "the Spiritcaller"; + break; + case 16: + sPostfix = "the Leafblade"; + break; + case 17: + sPostfix = "the Mossy"; + break; + case 18: + sPostfix = "the Grovekeeper"; + break; + case 19: + sPostfix = "the Stormbringer"; + break; + case 20: + sPostfix = "the Earthshaper"; + break; + case 21: + sPostfix = "the Bramble"; + break; + case 22: + sPostfix = "of the Black Sands"; + break; + case 23: + sPostfix = "of the Silt Sea"; + break; + case 24: + sPostfix = "the Spiritbinder"; + break; + case 25: + sPostfix = "the Wildheart"; + break; + } + } - int nRndMage = GetLocalInt(OBJECT_SELF,"RND_MAGE"); - if (nRndMage == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Mad"; - } - else if(nResult == 2) - { - sPostfix = "the Arcane"; - } - else if(nResult == 3) - { - sPostfix = "the Black"; - } - else if(nResult ==4) - { - sPostfix = "the Wizard"; - } - else if(nResult == 5) - { - sPostfix = "of Ur-Draxa"; - } - else - sPostfix = "the Mage"; - - } - - int nRndBard = GetLocalInt(OBJECT_SELF,"RND_BARD"); - if (nRndMage == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Dancer"; - } - else if(nResult == 2) - { - sPostfix = "the Troubador"; - } - else if(nResult == 3) - { - sPostfix = "of the Song"; - } - else if(nResult ==4) - { - sPostfix = "the Bard"; - } - else if(nResult == 5) - { - sPostfix = "the Raconteur"; - } - else - sPostfix = "the Minstrel"; - - } - - int nRndDruid = GetLocalInt(OBJECT_SELF,"RND_DRUID"); - if (nRndDruid == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Druid"; - } - else if(nResult == 2) - { - sPostfix = "of the Forest"; - } - else if(nResult == 3) - { - sPostfix = "of the Wild"; - } - else if(nResult ==4) - { - sPostfix = "the Wolflord"; - } - else if(nResult == 5) - { - sPostfix = "the Treelord"; - } - else - sPostfix = "the Warden"; - - } - - int nRndRanger = GetLocalInt(OBJECT_SELF,"RND_RANGER"); - if (nRndRanger == 1) - { - int nResult = d6(1); - if (nResult == 1) - { - sPostfix = "the Ranger"; - } - else if(nResult == 2) - { - sPostfix = "of the Forest"; - } - else if(nResult == 3) - { - sPostfix = "of the Wild"; - } - else if(nResult ==4) - { - sPostfix = "the Strider"; - } - else if(nResult == 5) - { - sPostfix = "the Venger"; - } - else - sPostfix = "the Warden"; - - } + int nRndRanger = GetLocalInt(OBJECT_SELF,"RND_RANGER"); + if (nRndRanger == 1) + { + int nResult = Random(25) + 1; // Generate a random number between 1 and 25 + switch (nResult) + { + case 1: + sPostfix = "the Ranger"; + break; + case 2: + sPostfix = "of the Forest"; + break; + case 3: + sPostfix = "of the Wild"; + break; + case 4: + sPostfix = "the Strider"; + break; + case 5: + sPostfix = "the Venger"; + break; + case 6: + sPostfix = "the Pathfinder"; + break; + case 7: + sPostfix = "the Woodsman"; + break; + case 8: + sPostfix = "the Trailblazer"; + break; + case 9: + sPostfix = "the Hunter"; + break; + case 10: + sPostfix = "the Scout"; + break; + case 11: + sPostfix = "the Wayfarer"; + break; + case 12: + sPostfix = "the Outrider"; + break; + case 13: + sPostfix = "the Seeker"; + break; + case 14: + sPostfix = "the Sentinel"; + break; + case 15: + sPostfix = "the Forestborn"; + break; + case 16: + sPostfix = "the Survivalist"; + break; + case 17: + sPostfix = "the Tracker"; + break; + case 18: + sPostfix = "the Forager"; + break; + case 19: + sPostfix = "the Warder"; + break; + case 20: + sPostfix = "the Greenblade"; + break; + case 21: + sPostfix = "the Beastmaster"; + break; + case 22: + sPostfix = "the Thornhunter"; + break; + case 23: + sPostfix = "of the Deepwood"; + break; + case 24: + sPostfix = "of the Roughlands"; + break; + case 25: + sPostfix = "the Wilderness Guide"; + break; + } + } if (sRandomName != "") { @@ -1149,20 +1048,64 @@ string ms_RandomLastName(object oNPC = OBJECT_SELF) return Name; } - -// Function to get the class-based level title based on the class type -string GetClassLevelTitle(int nClassType) +//:: Function to get the highest class level of an object, excluding racialtype classes +int GetHighestClassLevel(object oCreature) { - object oCreature = OBJECT_SELF; // Assuming this function is called on a creature object - - int nLevel = GetLevelByClass(nClassType, oCreature); - int nGender = GetGender(oCreature); - - string sTitle; + int nHighestLevel = -1; + int nClassTypes = 254; // Maximum number of class types + int i; - switch (nClassType) + for (i = 0; i <= nClassTypes; i++) { - case CLASS_TYPE_BARBARIAN: + // Check if the class type is excluded + 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) + continue; + + int nLevel = GetLevelByClass(i, oCreature); + if (nLevel > 0) + { + if (nLevel > nHighestLevel) + { + nHighestLevel = nLevel; + } + } + else + { + break; // Reached an invalid class level, exit the loop + } + } + + return nHighestLevel; +} + + +//:: Handles 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) + { + case CLASS_TYPE_BARBARIAN: switch(nLevel) { case 1: case 2: case 3: @@ -1234,7 +1177,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_ROGUE: + case CLASS_TYPE_ROGUE: switch(nLevel) { case 1: case 2: case 3: @@ -1294,7 +1237,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_BARD: + case CLASS_TYPE_BARD: switch(nLevel) { case 1: case 2: case 3: @@ -1393,7 +1336,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_SORCERER: + case CLASS_TYPE_SORCERER: case CLASS_TYPE_WIZARD: switch(nLevel) { @@ -1454,7 +1397,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_CLERIC: + case CLASS_TYPE_CLERIC: switch(nLevel) { case 1: case 2: case 3: @@ -1526,7 +1469,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_DRUID: + case CLASS_TYPE_DRUID: switch(nLevel) { case 1: case 2: case 3: @@ -1586,7 +1529,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_FIGHTER: + case CLASS_TYPE_FIGHTER: switch(nLevel) { case 1: case 2: case 3: @@ -1646,7 +1589,7 @@ string GetClassLevelTitle(int nClassType) } - case CLASS_TYPE_MONK: + case CLASS_TYPE_MONK: switch(nLevel) { case 1: @@ -1875,55 +1818,9 @@ string GetClassLevelTitle(int nClassType) } - } + } - return sTitle; + return sTitle; } -//:: Function to get the highest class level of an object, excluding racial classes types -int GetHighestClassLevel(object oCreature) -{ - int nHighestLevel = -1; - int nClassTypes = 254; // Maximum number of class types - int i; - - for (i = 0; i <= nClassTypes; i++) - { - // Check if the class type is excluded - 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) - continue; - - int nLevel = GetLevelByClass(i, oCreature); - if (nLevel > 0) - { - if (nLevel > nHighestLevel) - { - nHighestLevel = nLevel; - } - } - else - { - break; // Reached an invalid class level, exit the loop - } - } - - return nHighestLevel; -} - - +//::void main (){} diff --git a/_module/nss/nui_i_library.nss b/_module/nss/nui_i_library.nss new file mode 100644 index 00000000..a6fb4f56 --- /dev/null +++ b/_module/nss/nui_i_library.nss @@ -0,0 +1,44 @@ +/// ---------------------------------------------------------------------------- +/// @file nui_i_library.nss +/// @author Ed Burke (tinygiant98) +/// @brief Boilerplate code for creating a library dispatcher. Should only be +/// included in library scripts as it implements main(). +/// ---------------------------------------------------------------------------- + +#include "nui_i_main" + +// ----------------------------------------------------------------------------- +// Function Protoypes +// ----------------------------------------------------------------------------- + +void DefineForm(); +void BindForm(); +void HandleNUIEvents(); +void HandleModuleEvents(); + +// ----------------------------------------------------------------------------- +// Function Implementations +// ----------------------------------------------------------------------------- + +// These are dummy implementations to prevent nwnsc from complaining that they +// do not exist. If you want to compile in the toolset rather than using nwnsc, +// comment these lines out. +//#pragma default_function(DefineForm) +//#pragma default_function(BindForm) +//#pragma default_function(HandleNUIEvents) +//#pragma default_function(HandleModuleEvents) + +// ----------------------------------------------------------------------------- +// Library Dispatch +// ----------------------------------------------------------------------------- + +void main() +{ + string sOperation = GetScriptParam(NUI_FUNCTION); + + if (sOperation == NUI_DEFINE) DefineForm(); + else if (sOperation == NUI_BIND) BindForm(); + else if (sOperation == NUI_EVENT_NUI) HandleNUIEvents(); + else if (sOperation == NUI_EVENT_MOD) HandleModuleEvents(); + else NUI(); +} diff --git a/_module/nss/nui_i_main.nss b/_module/nss/nui_i_main.nss index 2b47a6aa..f28ab6b9 100644 --- a/_module/nss/nui_i_main.nss +++ b/_module/nss/nui_i_main.nss @@ -7,12 +7,13 @@ #include "util_i_csvlists" #include "util_i_color" #include "nui_c_config" +#include "nw_inc_nui" // ----------------------------------------------------------------------------- // Constants // ----------------------------------------------------------------------------- -const string NUI_VERSION = "0.4.7"; +const string NUI_VERSION = "0.5.0"; const string NUI_DATABASE = "nui_form_data"; const int NUI_ORIENTATION_ROW = 0; @@ -28,42 +29,23 @@ const int NUI_DRAW_MOUSELEFT = 3; const int NUI_DRAW_MOUSERIGHT = 4; const int NUI_DRAW_MOUSEMIDDLE = 5; -const int NUI_SCROLLBARS_NONE = 0; -const int NUI_SCROLLBARS_X = 1; -const int NUI_SCROLLBARS_Y = 2; -const int NUI_SCROLLBARS_BOTH = 3; -const int NUI_SCROLLBARS_AUTO = 4; - const int NUI_CHART_LINE = 0; const int NUI_CHART_BAR = 1; -const int NUI_ASPECT_FIT = 0; -const int NUI_ASPECT_FILL = 1; -const int NUI_ASPECT_FIT100 = 2; -const int NUI_ASPECT_EXACT = 3; -const int NUI_ASPECT_EXACTSCALED = 4; -const int NUI_ASPECT_STRETCH = 5; - -const int NUI_HALIGN_CENTER = 0; -const int NUI_HALIGN_LEFT = 1; -const int NUI_HALIGN_RIGHT = 2; - -const int NUI_VALIGN_MIDDLE = 0; -const int NUI_VALIGN_TOP = 1; -const int NUI_VALIGN_BOTTOM = 2; - const string NUI_DEFINE = "DefineForm"; const string NUI_BIND = "BindForm"; const string NUI_EVENT_NUI = "HandleNUIEvents"; const string NUI_EVENT_MOD = "HandleModuleEvents"; const string NUI_OBJECT = "NUI_OBJECT"; +const string NUI_FUNCTION = "NUI_FUNCTION"; +const string NUI_ARGS = "NUI_ARGS"; const int NUI_FI_EVENT_UPDATE_FORMS = 100001; const int NUI_FI_EVENT_UPDATE_EVENTS = 100002; -json jTrue = JsonBool(TRUE); -json jFalse = JsonBool(FALSE); +json jTrue = JSON_TRUE; +json jFalse = JSON_FALSE; const int NUI_USE_CAMPAIGN_DATABASE = FALSE; const string NUI_FORMFILE_PREFIX = "nui_f_"; @@ -976,8 +958,10 @@ void NUI_DefineForms(string sFormfile = ""); /// @param oPC Client to display the form on. /// @param sFormID ID of the form to display. /// @param sProfile Optional form profile. +/// @param bSelfManage If TRUE, call the formfile directly instead of the +/// game's NUI event handler. /// @returns Form's token as assigned by the game engine. -int NUI_DisplayForm(object oPC, string sFormID, string sProfile = "default"); +int NUI_DisplayForm(object oPC, string sFormID, string sProfile = "", int bSelfManage = FALSE); /// @brief Close an open form. /// @param oPC Client on which to close the form. @@ -1301,7 +1285,7 @@ int nui_InitializeDatabase() "timestamp INTEGER);"; SqlStep(nui_PrepareQuery(sQuery)); - sQuery = "SELECT * FROM nui_forms;"; + sQuery = "SELECT COUNT(*) FROM nui_forms;"; return SqlStep(nui_PrepareQuery(sQuery)); } @@ -1332,9 +1316,9 @@ void nui_CopyDefinitions(string sTable = "nui_forms") string sQuery = "WITH forms AS (SELECT json_object('form', form, 'definition', definition) AS f " + "FROM " + sTable + ") SELECT json_group_array(json(f)) FROM forms;"; sqlquery sql = nui_PrepareQuery(sQuery, TRUE); - json jForms = SqlStep(sql) ? SqlGetJson(sql, 0) : JsonNull(); + json jForms = SqlStep(sql) ? SqlGetJson(sql, 0) : JSON_NULL; - if (jForms == JsonNull()) + if (jForms == JSON_NULL) return; sQuery = "INSERT OR REPLACE INTO " + sTable + " (form, definition) " + @@ -1554,7 +1538,7 @@ void NUI_SaveBindState(object oPC, string sFormID) void NUI_RestoreBindState(object oPC, string sFormID) { json jState = GetLocalJson(oPC, "NUI_STATE:" + sFormID); - if (jState == JsonNull()) + if (jState == JSON_NULL) return; json jKeys = JsonObjectKeys(jState); @@ -1732,6 +1716,11 @@ void NUI_CloseRow() {nui_DecrementPath();} void NUI_CloseLayout() {nui_DecrementPath();} +void NUI_AddLayout(json jLayout) +{ + nui_SetProperty("root", JsonDump(jLayout)); +} + // Controls -------------------------------------------------------------------- void NUI_AddCheckbox(string sID = "") {nui_CreateControl("check", sID);} @@ -2269,7 +2258,7 @@ json nui_GetForm(string sFormID, int bForceModule = FALSE) sqlquery sql = nui_PrepareQuery("SELECT definition FROM nui_forms WHERE form = @form;", bForceModule); SqlBindString(sql, "@form", sFormID); - return SqlStep(sql) ? SqlGetJson(sql, 0) : JsonNull(); + return SqlStep(sql) ? SqlGetJson(sql, 0) : JSON_NULL; } string nui_GetFormsByPrefix(string sForms, string sPrefix, int nResType) @@ -2294,8 +2283,8 @@ int nui_ExecuteFunction(string sFile, string sFunction, object oTarget = OBJECT_ if (ResManFindPrefix(sFile, RESTYPE_NCS) == sFile) { - SetScriptParam("NUI_FUNCTION", sFunction); - SetScriptParam("NUI_ARGS", sArguments); + SetScriptParam(NUI_FUNCTION, sFunction); + SetScriptParam(NUI_ARGS, sArguments); ExecuteScript(sFile, oTarget); return TRUE; } @@ -2314,7 +2303,7 @@ json nui_GetWatchedBinds(string sFormID) "nui_forms.definition, path || '.watch') = true AND form = @form);"; sqlquery sql = nui_PrepareQuery(sQuery); SqlBindString(sql, "@form", sFormID); - return SqlStep(sql) ? SqlGetJson(sql, 0) : JsonArray(); + return SqlStep(sql) ? SqlGetJson(sql, 0) : JSON_ARRAY; } json NUI_GetOrphanBinds(string sFormID) @@ -2325,7 +2314,7 @@ json NUI_GetOrphanBinds(string sFormID) "'$.profiles.default') AS value WHERE form = @form));"; sqlquery sql = nui_PrepareQuery(sQuery); SqlBindString(sql, "@form", sFormID); - return SqlStep(sql) ? SqlGetJson(sql, 0) : JsonArray(); + return SqlStep(sql) ? SqlGetJson(sql, 0) : JSON_ARRAY; } // ----------------------------------------------------------------------------- @@ -2377,7 +2366,7 @@ json nui_GetProfileBinds(string sFormID, string sProfile = "") sqlquery sql = nui_PrepareQuery(sQuery); SqlBindString(sql, "@form", sFormID); SqlBindString(sql, "@profile", sProfile); - return SqlStep(sql) ? SqlGetJson(sql, 0) : JsonObject(); + return SqlStep(sql) ? SqlGetJson(sql, 0) : JSON_OBJECT; } /// @private Called during form opening, sets the initial values for all default binds. @@ -2426,7 +2415,7 @@ void NUI_DefineForms(string sFormfile = "") int n; for (n; n < CountList(NUI_FORMFILE_PREFIX); n++) { string sFormfiles = nui_GetForms(GetListItem(NUI_FORMFILE_PREFIX, n)); - if (sFormfiles == "") return; + if (sFormfiles == "") break; int f; for (f; f < CountList(sFormfiles); f++) { @@ -2443,14 +2432,16 @@ void NUI_DefineForms(string sFormfile = "") nui_CommitTransaction(); } -int NUI_DisplayForm(object oPC, string sFormID, string sProfile = "default") +int NUI_DisplayForm(object oPC, string sFormID, string sProfile = "", int bSelfManage = FALSE) { json jForm = nui_GetForm(sFormID); - if (jForm != JsonNull()) + if (jForm != JSON_NULL) { - int nToken = NuiCreate(oPC, jForm, sFormID); - json jData = JsonObjectSet(JsonObject(), "profile", JsonString(sProfile)); - jData = JsonObjectSet(jData, "formfile", JsonString(nui_GetDefinitionValue(sFormID, "formfile"))); + string sFormfile = nui_GetDefinitionValue(sFormID, "formfile"); + + int nToken = NuiCreate(oPC, jForm, sFormID, (bSelfManage ? sFormfile : "")); + json jData = JsonObjectSet(JSON_OBJECT, "profile", JsonString(sProfile == "" ? "default" : sProfile)); + jData = JsonObjectSet(jData, "formfile", JsonString(sFormfile)); NuiSetUserData(oPC, NuiFindWindow(oPC, sFormID), jData); return nToken; @@ -2490,7 +2481,7 @@ void NUI_CreateProfile(string sProfile, string sBase = "") void NUI_SetProfileBind(string sBind, string sJson) { - if (sBind == "" || sJson == "" || JsonParse(sJson) == JsonNull()) + if (sBind == "" || sJson == "" || JsonParse(sJson) == JSON_NULL) return; nui_SetProfileBind(sBind, sJson); @@ -2503,7 +2494,7 @@ void NUI_SetProfileBindJ(string sBind, json jValue) void NUI_SetProfileBinds(string sBinds, string sJson) { - if (sBinds == "" || sJson == "" || JsonParse(sJson) == JsonNull()) + if (sBinds == "" || sJson == "" || JsonParse(sJson) == JSON_NULL) return; int n; for (n; n < CountList(sBinds); n++) diff --git a/_module/nss/nw_c2_default1.nss b/_module/nss/nw_c2_default1.nss index 62ac86b0..4801a4d8 100644 --- a/_module/nss/nw_c2_default1.nss +++ b/_module/nss/nw_c2_default1.nss @@ -1,108 +1,94 @@ -//::////////////////////////////////////////////////// -//:: NW_C2_DEFAULT1 -/* - Default OnHeartbeat script for NPCs. - - This script causes NPCs to perform default animations - while not otherwise engaged. - - This script duplicates the behavior of the default - script and just cleans up the code and removes - redundant conditional checks. - - */ -//::////////////////////////////////////////////////// -//:: Copyright (c) 2002 Floodgate Entertainment -//:: Created By: Naomi Novik -//:: Created On: 12/22/2002 -//::////////////////////////////////////////////////// - -#include "nw_i0_generic" -#include "prc_inc_spells" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default1 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnHeartbeat script; + This will usually fire every 6 seconds (1 game round). +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_module" void main() { - - // * if not runnning normal or better Ai then exit for performance reasons - if (GetAILevel() == AI_LEVEL_VERY_LOW) return; + // If not runnning normal or better AI then exit for performance reasons + if (GetAILevel(OBJECT_SELF) == AI_LEVEL_VERY_LOW) return; ExecuteScript("prc_npc_hb", OBJECT_SELF); - - // Buff ourselves up right away if we should - if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY)) - { - // This will return TRUE if an enemy was within 40.0 m - // and we buffed ourselves up instantly to respond -- - // simulates a spellcaster with protections enabled - // already. - if(TalentAdvancedBuff(40.0)) - { - // This is a one-shot deal - SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE); - - // This return means we skip sending the user-defined - // heartbeat signal in this one case. - return; - } - } - - - if(PRCGetHasEffect(EFFECT_TYPE_SLEEP)) + + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("nw_c2_default1", "16", GetName(oCreature) + " Heartbeat." + + " OnSpawn: " + IntToString(GetLocalInt(oCreature, AI_ONSPAWN_EVENT))); + // We run our OnSpawn in the heartbeat so the creator can use the original + // OnSpawn for their own use. If we have to recreate the creature then we + // skip the rest of the heartbeat since this version is being destroyed! + if(ai_OnMonsterSpawn(oCreature)) return; + if(AI_DEBUG) ai_Debug("nw_c2_default1", "16", GetName(oCreature) + " Heartbeat." + + " Searching: " + IntToString(GetLocalInt(oCreature, AI_AM_I_SEARCHING))); + if(ai_GetHasEffectType(oCreature, EFFECT_TYPE_SLEEP)) { // If we're asleep and this is the result of sleeping // at night, apply the floating 'z's visual effect // every so often - if(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT)) { effect eVis = EffectVisualEffect(VFX_IMP_SLEEP); if(d10() > 6) { - ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature); } } } - - // If we have the 'constant' waypoints flag set, walk to the next - // waypoint. - else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) ) - { - WalkWayPoints(); - } - - // Check to see if we should be playing default animations - // - make sure we don't have any current targets - else if ( !GetIsObjectValid(GetAttemptedAttackTarget()) - && !GetIsObjectValid(GetAttemptedSpellTarget()) - // && !GetIsPostOrWalking()) - && !GetIsObjectValid(GetNearestSeenEnemy())) - { - if (GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) || GetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE) || - GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE)) - { - // This handles special attacking/fleeing behavior - // for omnivores & herbivores. - DetermineSpecialBehavior(); - } - else if (!IsInConversation(OBJECT_SELF)) - { - if (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) - || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) - || GetIsEncounterCreature()) - { - PlayMobileAmbientAnimations(); - } - else if (GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)) - { - PlayImmobileAmbientAnimations(); - } - } - } - - // Send the user-defined event signal if specified + // Send the user-defined event signal if specified here so it doesn't get skipped. if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT)) { - SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_HEARTBEAT)); + SignalEvent(oCreature, EventUserDefined(EVENT_HEARTBEAT)); } + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature) || + GetLocalInt(oCreature, AI_AM_I_SEARCHING)) return; + if(ai_GetIsInCombat(oCreature)) + { + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE)) + { + object oTarget = ai_GetNearestEnemy(oCreature, 1, 7, 7, -1, -1, TRUE); + if(GetDistanceBetween(oCreature, oTarget) <= 6.0) + { + if(GetLevelByClass(CLASS_TYPE_DRUID, oTarget) == 0 && GetLevelByClass(CLASS_TYPE_RANGER, oTarget) == 0) + { + SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_coward"); + ActionMoveAwayFromObject(oTarget, TRUE, AI_RANGE_LONG); + return; + } + } + } + ai_DoMonsterCombatRound(oCreature); + return; + } + if(ai_CheckForCombat(oCreature, TRUE)) return; + // If we have not set up our talents then we need to check to see if we should. + if(!GetLocalInt(oCreature, AI_TALENTS_SET)) + { + // We setup our talents when a PC gets withing Battlefield range 40.0 meters. + object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oCreature, 1, CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY); + if(oPC != OBJECT_INVALID && GetDistanceBetween(oCreature, oPC) <= AI_RANGE_BATTLEFIELD) + { + if(AI_DEBUG) ai_Debug("nw_c2_default1", "72", GetName(oCreature) + " is " + + FloatToString(GetDistanceBetween(oCreature, oPC), 0, 2) + " from " + GetName(oPC)); + if(AI_DEBUG) ai_Debug("nw_c2_default1", "74", GetName(oCreature) + " is Setting Creature Talents and buffing!"); + ai_SetupMonsterBuffTargets(oCreature); + // To save steps and time we set the talents while we buff! + ai_SetCreatureTalents(oCreature, TRUE); + ai_ClearBuffTargets(oCreature, "AI_ALLY_TARGET_"); + } + } + if(!IsInConversation (oCreature)) + { + if(GetWalkCondition(NW_WALK_FLAG_CONSTANT)) WalkWayPoints(); + if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)) PlayMobileAmbientAnimations_NonAvian(); + else if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)) PlayMobileAmbientAnimations_Avian(); + else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)) PlayImmobileAmbientAnimations(); + else if(GetLocalInt(GetModule(), AI_RULE_WANDER) && GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oCreature) > 89) + { + ai_AmbientAnimations(); + } + } + if(ai_TryHealing(oCreature, oCreature)) return; } diff --git a/_module/nss/nw_c2_default2.nss b/_module/nss/nw_c2_default2.nss index 34499fdb..b7d5e074 100644 --- a/_module/nss/nw_c2_default2.nss +++ b/_module/nss/nw_c2_default2.nss @@ -1,166 +1,138 @@ -//::////////////////////////////////////////////////// -//:: NW_C2_DEFAULT2 -/* - Default OnPerception event handler for NPCs. - - Handles behavior when perceiving a creature for the - first time. - */ -//::////////////////////////////////////////////////// - -#include "nw_i0_generic" -#include "prc_inc_spells" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default2 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnPerception script when not in combat; + There are 4 types of perception - Heard, Inaudible, Seen, Vanished. + Only one type will ever be true in an event trigger. + The order of trigger is Heard/Seen and Inaudible/Vanished. + There are two states of percepion Heard and Seen. + These states can be set at the same time thus a heard event can see the creature. + Fires when ever one of these states changes from TRUE to FALSE or FALSE to TRUE. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" void main() { - // * if not runnning normal or better Ai then exit for performance reasons - if (GetAILevel() == AI_LEVEL_VERY_LOW) return; - + // * if not runnning normal or better AI then exit for performance reasons + //if (GetAILevel() == AI_LEVEL_VERY_LOW) return; + object oCreature = OBJECT_SELF; ExecuteScript("prc_npc_percep", OBJECT_SELF); - - object oPercep = GetLastPerceived(); + if(AI_DEBUG) ai_Debug("nw_c2_default2", "19", "AI_ONSPAWN_EVENT: " + IntToString(GetLocalInt(oCreature, AI_ONSPAWN_EVENT))); + if(!GetLocalInt(oCreature, AI_ONSPAWN_EVENT)) return; + if(GetLastPerceptionSeen()) + { + if(AI_DEBUG) ai_Debug("nw_c2_default2", "22", GetName(oCreature) + " sees " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + "."); + } + if(GetLastPerceptionHeard()) + { + if(AI_DEBUG) ai_Debug("nw_c2_default2", "28", GetName(oCreature) + " heard " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + "."); + } + if(GetLastPerceptionVanished ()) + { + if(AI_DEBUG) ai_Debug("nw_c2_default2", "34", GetName(oCreature) + " lost sight of " + + GetName(GetLastPerceived ()) + "."); + } + // We do nothing on Inaudibles so drop out early! + if(GetLastPerceptionInaudible()) + { + if(AI_DEBUG) ai_Debug("nw_c2_default2", "41", GetName(oCreature) + " lost sound of " + + GetName(GetLastPerceived()) + "."); + return; + } + object oLastPerceived = GetLastPerceived(); + if(AI_DEBUG) ai_Debug("nw_c2_default2", "45", "Dead? " + IntToString(GetIsDead(oLastPerceived)) + + " Enemy? " + IntToString(GetIsEnemy(oLastPerceived, oCreature))); + if(ai_Disabled(oCreature)) return; + if(GetIsDead(oLastPerceived)) return; int bSeen = GetLastPerceptionSeen(); - int bHeard = GetLastPerceptionHeard(); - if (bHeard == FALSE) + // This will cause all NPC's to speak their one-liner conversation + // on perception even if they are already in combat. + if(GetIsPC(oLastPerceived) && bSeen) { - // Has someone vanished in front of me? - bHeard = GetLastPerceptionVanished(); - } - - // This will cause the NPC to speak their one-liner - // conversation on perception even if they are already - // in combat. - if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION) - && GetIsPC(oPercep) - && bSeen) - { - SpeakOneLinerConversation(); - } - - // March 5 2003 Brent - // Had to add this section back in, since modifications were not taking this specific - // example into account -- it made invisibility basically useless. - //If the last perception event was hearing based or if someone vanished then go to search mode - if ((GetLastPerceptionVanished()) && GetIsEnemy(GetLastPerceived())) - { - object oGone = GetLastPerceived(); - if((GetAttemptedAttackTarget() == GetLastPerceived() || - GetAttemptedSpellTarget() == GetLastPerceived() || - GetAttackTarget() == GetLastPerceived()) && GetArea(GetLastPerceived()) != GetArea(OBJECT_SELF)) + if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION)) { - ClearAllActions(); - DetermineCombatRound(); + SpeakOneLinerConversation(); } } - - // This section has been heavily revised while keeping the - // pre-existing behavior: - // - If we're in combat, keep fighting. - // - If not and we've perceived an enemy, start to fight. - // Even if the perception event was a 'vanish', that's - // still what we do anyway, since that will keep us - // fighting any visible targets. - // - If we're not in combat and haven't perceived an enemy, - // see if the perception target is a PC and if we should - // speak our attention-getting one-liner. - if (GetIsInCombat(OBJECT_SELF)) + if(GetIsEnemy(oLastPerceived, oCreature)) { - // don't do anything else, we're busy - //MyPrintString("GetIsFighting: TRUE"); - - } - // * BK FEB 2003 Only fight if you can see them. DO NOT RELY ON HEARING FOR ENEMY DETECTION - else if (GetIsEnemy(oPercep) && bSeen) - { // SpawnScriptDebugger(); - //MyPrintString("GetIsEnemy: TRUE"); - // We spotted an enemy and we're not already fighting - if(!PRCGetHasEffect(EFFECT_TYPE_SLEEP)) { - if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) + // ************************** ENEMY SEEN ******************************* + if(bSeen) + { + // If the creature we are perceiving was our invisible creature then + // remove that they are invisible. + if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE)) { - //MyPrintString("DetermineSpecialBehavior"); - DetermineSpecialBehavior(); - } else - { - //MyPrintString("DetermineCombatRound"); - SetFacingPoint(GetPosition(oPercep)); - SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); - DetermineCombatRound(); + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); } + ai_MonsterEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY); } + // ************************** ENEMY HEARD ****************************** + else if(GetLastPerceptionHeard()) + { + ai_MonsterEvaluateNewThreat(oCreature, oLastPerceived, AI_I_HEARD_AN_ENEMY); + } + // ************************** ENEMY VANISHED *************************** + else if(GetLastPerceptionVanished()) + { + // Lets keep a mental note of the invisible creature. + SetLocalObject(oCreature, AI_IS_INVISIBLE, oLastPerceived); + if(AI_DEBUG) ai_Debug("0e_c2_2_percept", "82", " We saw " + GetName(oLastPerceived) + " disappear!"); + if(ai_GetIsBusy(oCreature)) return; + // If in combat check to see if our target disappeared. + // If they have and we are not in melee with them then reevaluate combat + // since we lost our target. + if(ai_GetIsInCombat(oCreature)) + { + if(AI_DEBUG) ai_Debug("nw_c2_default2", "89", "Is this our target? " + + IntToString(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived)); + if(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived) + { + ai_DoMonsterCombatRound(oCreature); + } + } + // We are not in combat so lets move to that location and check it out. + else ActionMoveToLocation(GetLocation(oLastPerceived), TRUE); + // we use to move to the object but thats a bit creepy! + //else ActionMoveToObject(oLastPerceived, TRUE, AI_RANGE_CLOSE); + } + // ************************ ENEMY INAUDIBLE***************************** + // Not used. } else { - if (bSeen) + // ************************ NON_ENEMY SEEN ***************************** + if(bSeen) { - //MyPrintString("GetLastPerceptionSeen: TRUE"); - if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { - DetermineSpecialBehavior(); - } else if (GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION) - && GetIsPC(oPercep)) + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) ai_DetermineSpecialBehavior(oCreature); + else if(GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION) && GetIsPC(oLastPerceived)) { - // The NPC will speak their one-liner conversation - // This should probably be: - // SpeakOneLinerConversation(oPercep); - // instead, but leaving it as is for now. - ActionStartConversation(OBJECT_SELF); + ActionStartConversation(oCreature); } } - else - // * July 14 2003: Some minor reactions based on invisible creatures being nearby - if (bHeard && GetIsEnemy(oPercep)) - { - // SpeakString("vanished"); - // * don't want creatures wandering too far after noises - if (GetDistanceToObject(oPercep) <= 7.0) - { -// if (GetHasSpell(SPELL_TRUE_SEEING) == TRUE) - if (GetHasSpell(SPELL_TRUE_SEEING)) - { - ActionCastSpellAtObject(SPELL_TRUE_SEEING, OBJECT_SELF); - } - else -// if (GetHasSpell(SPELL_SEE_INVISIBILITY) == TRUE) - if (GetHasSpell(SPELL_SEE_INVISIBILITY)) - { - ActionCastSpellAtObject(SPELL_SEE_INVISIBILITY, OBJECT_SELF); - } - else -// if (GetHasSpell(SPELL_INVISIBILITY_PURGE) == TRUE) - if (GetHasSpell(SPELL_INVISIBILITY_PURGE)) - { - ActionCastSpellAtObject(SPELL_INVISIBILITY_PURGE, OBJECT_SELF); - } - else - { - ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.5); - ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.5); - ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 0.5); - } - } - } - - // activate ambient animations or walk waypoints if appropriate - if (!IsInConversation(OBJECT_SELF)) { - if (GetIsPostOrWalking()) { - WalkWayPoints(); - } else if (GetIsPC(oPercep) && - (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) - || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) - || GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) - || GetIsEncounterCreature())) - { - SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); - } - } } - + if(!IsInConversation(oCreature)) + { + if(GetIsPostOrWalking()) + { + WalkWayPoints(); + } + else if(GetIsPC(oLastPerceived) && + (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || + GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) || + GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) || + GetIsEncounterCreature())) + { + SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); + } + } // Send the user-defined event if appropriate - if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen()) + if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && bSeen) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_PERCEIVE)); } } - - - - diff --git a/_module/nss/nw_c2_default3.nss b/_module/nss/nw_c2_default3.nss index 572e1239..567b327f 100644 --- a/_module/nss/nw_c2_default3.nss +++ b/_module/nss/nw_c2_default3.nss @@ -1,56 +1,68 @@ -//:://///////////////////////////////////////////// -//:: Default: End of Combat Round -//:: NW_C2_DEFAULT3 -//:: Copyright (c) 2008 Bioware Corp. -//::////////////////////////////////////////////// -/* - Calls the end of combat script every round -*/ -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Oct 16, 2001 -//::////////////////////////////////////////////// -//::////////////////////////////////////////////// -//:: Modified By: Deva Winblood -//:: Modified On: Feb 16th, 2008 -//:: Added Support for Mounted Combat Feat Support -//::////////////////////////////////////////////// - -#include "NW_I0_GENERIC" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default3 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnCombatRoundEnd event script; + Fires at the end of each combat round (6 seconds). + This will fire as long as oCreature is in combat (GetIsInCombat()). + This event starts counting once a combat action is started. + Every time a spell is cast it will queue another end combat round so haste with + two spells cast will fire this twice in one round. + It will also fire at the end of a hostile effect that stops actions i.e Stunned, Knockdown etc. + Action modes are also cleared prior to this event executing! + GetAttemptedAttackTarget() & GetAttemptedSpellTarget() also get cleared prior to this event. + This event can be canceled with ClearAllActions(TRUE) and SurrenderToEnemies. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" void main() { - ExecuteScript("prc_npc_combat", OBJECT_SELF); - - if (!GetLocalInt(GetModule(),"X3_NO_MOUNTED_COMBAT_FEAT")) - { // set variables on target for mounted combat - DeleteLocalInt(OBJECT_SELF,"bX3_LAST_ATTACK_PHYSICAL"); - DeleteLocalInt(OBJECT_SELF,"nX3_HP_BEFORE"); - DeleteLocalInt(OBJECT_SELF,"bX3_ALREADY_MOUNTED_COMBAT"); - if (GetHasFeat(FEAT_MOUNTED_COMBAT,OBJECT_SELF)) - { // check for AC increase - int nRoll=d20()+GetSkillRank(SKILL_RIDE); - nRoll=nRoll-10; - if (nRoll>4) - { // ac increase - nRoll=nRoll/5; - ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACIncrease(nRoll),OBJECT_SELF,8.5); - } // ac increase - } // check for AC increase - } // set variables on target for mounted combat - - if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) - { - DetermineSpecialBehavior(); - } - else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) - { - DetermineCombatRound(); - } + object oCreature = OBJECT_SELF; + ExecuteScript("prc_npc_combat", OBJECT_SELF); + if(AI_DEBUG) ai_Debug("nw_c2_default3", "20", GetName(oCreature) + " ends combat round." + + " Current action: " + IntToString(GetCurrentAction(oCreature))); if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1003)); } + if(ai_Disabled(oCreature)) return; + // Action modes get cleared prior to each OnCombatRoundEnd! + // We do this to keep the action mode going. + int nActionMode = GetLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + if(nActionMode > 0) + { + SetActionMode(oCreature, nActionMode, TRUE); + // We don't want to use up all of the Dwarven Defenders uses! + if(nActionMode == 12) IncrementRemainingFeatUses(oCreature, FEAT_DWARVEN_DEFENDER_DEFENSIVE_STANCE); + } + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("nw_c2_default3", "37", "nAction: " + IntToString(nAction)); + switch(nAction) + { + // These actions are uninteruptable. + case ACTION_MOVETOPOINT : + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_COUNTERSPELL : return; + // Might be doing a special action that is not a defined action. + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("nw_c2_default3", "49", "nCombatWait: " + IntToString(nCombatWait)); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + } + // We always want to interupt an attack action at the end of a round. + //case ACTION_ATTACKOBJECT : + } + if(ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound (oCreature); + return; + } + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) ai_DetermineSpecialBehavior(oCreature); } diff --git a/_module/nss/nw_c2_default4.nss b/_module/nss/nw_c2_default4.nss index de904593..cd1f6160 100644 --- a/_module/nss/nw_c2_default4.nss +++ b/_module/nss/nw_c2_default4.nss @@ -1,93 +1,70 @@ -//::////////////////////////////////////////////////// -//:: NW_C2_DEFAULT4 -/* - Default OnConversation event handler for NPCs. - - */ -//::////////////////////////////////////////////////// -//:: Copyright (c) 2002 Floodgate Entertainment -//:: Created By: Naomi Novik -//:: Created On: 12/22/2002 -//::////////////////////////////////////////////////// - -#include "nw_i0_generic" -#include "prc_inc_spells" - +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_c2_4_convers + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnConversation; + Fires when oCreature has been clicked on for conversation. + Fires when oCreature hears a shout from another creature. + If SetListening is FALSE then oCreature will not "hear" anything. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void ai_MonsterCommands(object oCreature, object oSpeaker, int nMatch); void main() { - // * if petrified, jump out - if (PRCGetHasEffect(EFFECT_TYPE_PETRIFY, OBJECT_SELF) == TRUE) - { - return; - } - - // * If dead, exit directly. - if (GetIsDead(OBJECT_SELF) == TRUE) - { - return; - } - + object oCreature = OBJECT_SELF; ExecuteScript("prc_npc_conv", OBJECT_SELF); - - // See if what we just 'heard' matches any of our - // predefined patterns + if(AI_DEBUG) ai_Debug("nw_c2_default4", "15", GetName(oCreature) + " listens " + + IntToString(GetListenPatternNumber()) + " to " + GetName(GetLastSpeaker()) + "." + + " AI_AM_I_SEARCHING: " + IntToString(GetLocalInt(oCreature, AI_AM_I_SEARCHING))); + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature) || GetLocalInt(oCreature, AI_AM_I_SEARCHING)) return; + if(ai_GetIsInCombat(oCreature)) + { + ai_DoMonsterCombatRound(oCreature); + return; + } + object oLastSpeaker = GetLastSpeaker(); int nMatch = GetListenPatternNumber(); - object oShouter = GetLastSpeaker(); - - if (nMatch == -1) + if(nMatch != -1) { - // Not a match -- start an ordinary conversation - if (GetCommandable(OBJECT_SELF)) - { - ClearActions(CLEAR_NW_C2_DEFAULT4_29); - BeginConversation(); - } - else - // * July 31 2004 - // * If only charmed then allow conversation - // * so you can have a better chance of convincing - // * people of lowering prices - if (PRCGetHasEffect(EFFECT_TYPE_CHARMED) == TRUE) - { - ClearActions(CLEAR_NW_C2_DEFAULT4_29); - BeginConversation(); - } + if(GetFactionEqual(oLastSpeaker, oCreature)) ai_MonsterCommands(oCreature, oLastSpeaker, nMatch); } - // Respond to shouts from friendly non-PCs only - else if (GetIsObjectValid(oShouter) - && !GetIsPC(oShouter) - && GetIsFriend(oShouter)) + else { - object oIntruder = OBJECT_INVALID; - // Determine the intruder if any - if(nMatch == 4) - { - oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER"); - } - else if (nMatch == 5) - { - oIntruder = GetLastHostileActor(oShouter); - if(!GetIsObjectValid(oIntruder)) - { - oIntruder = GetAttemptedAttackTarget(); - if(!GetIsObjectValid(oIntruder)) - { - oIntruder = GetAttemptedSpellTarget(); - if(!GetIsObjectValid(oIntruder)) - { - oIntruder = OBJECT_INVALID; - } - } - } - } - - // Actually respond to the shout - RespondToShout(oShouter, nMatch, oIntruder); + ai_ClearCreatureActions(); + BeginConversation(); } - // Send the user-defined event if appropriate if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE)); } } +void ai_MonsterCommands(object oCreature, object oSpeaker, int nMatch) +{ + object oTarget = GetLocalObject(oSpeaker, AI_MY_TARGET); + if(nMatch == AI_ALLY_SEES_AN_ENEMY || nMatch == AI_ALLY_HEARD_AN_ENEMY) + { + if(AI_DEBUG) ai_Debug("nw_c2_default4", "46", GetName(oCreature) + " heard " + + GetName(oSpeaker) + " has seen an enemy!"); + if(ai_CanIAttack(oCreature)) ai_FindTheEnemy(oCreature, oSpeaker, oTarget, TRUE); + } + else if(nMatch == AI_ALLY_ATKED_BY_WEAPON || + nMatch == AI_ALLY_ATKED_BY_SPELL) + { + if(AI_DEBUG) ai_Debug("nw_c2_default4", "53", GetName(oCreature) + " heard " + + GetName(oSpeaker) + " has been attacked by " + + GetName(GetLocalObject(oSpeaker, AI_MY_TARGET)) + "!"); + if(ai_CanIAttack(oCreature)) ai_FindTheEnemy(oCreature, oSpeaker, oTarget, TRUE); + } + else if(nMatch == AI_ALLY_IS_WOUNDED) + { + if(AI_DEBUG) ai_Debug("nw_c2_default4", "60", GetName(oCreature) + " heard " + + GetName(oSpeaker) + " is wounded!"); + if(ai_GetIsInCombat(oCreature)) ai_TryHealingTalent(oCreature, ai_GetNumOfEnemiesInRange(oCreature), oSpeaker); + else ai_TryHealing(oCreature, oSpeaker); + } + /*else if(nMatch == AI_ALLY_IS_DEAD) + { + } */ +} + diff --git a/_module/nss/nw_c2_default5.nss b/_module/nss/nw_c2_default5.nss index d6e2e631..acc3b3ed 100644 --- a/_module/nss/nw_c2_default5.nss +++ b/_module/nss/nw_c2_default5.nss @@ -1,71 +1,37 @@ -//:://///////////////////////////////////////////// -//:: Default On Attacked -//:: NW_C2_DEFAULT5 -//:: Copyright (c) 2001 Bioware Corp. -//::////////////////////////////////////////////// -/* - If already fighting then ignore, else determine - combat round -*/ -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Oct 16, 2001 -//::////////////////////////////////////////////// -//::////////////////////////////////////////////// -//:: Modified By: Deva Winblood -//:: Modified On: Jan 4th, 2008 -//:: Added Support for Mounted Combat Feat Support -//::////////////////////////////////////////////// - -#include "nw_i0_generic" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default5 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnPhysicalAttacked event script; + Fires for all physical attacks, claws, weapons, fists, bow, etc. + Fires for taunt skill, animal empathy skill. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" void main() { + object oCreature = OBJECT_SELF; ExecuteScript("prc_npc_physatt", OBJECT_SELF); - - if (!GetLocalInt(GetModule(),"X3_NO_MOUNTED_COMBAT_FEAT")) - { // set variables on target for mounted combat - SetLocalInt(OBJECT_SELF,"bX3_LAST_ATTACK_PHYSICAL",TRUE); - SetLocalInt(OBJECT_SELF,"nX3_HP_BEFORE",GetCurrentHitPoints(OBJECT_SELF)); - } // set variables on target for mounted combat - - if(GetFleeToExit()) { - // Run away! - ActivateFleeToExit(); - } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) { - // We give an attacker one warning before we attack - // This is not fully implemented yet - SetSpawnInCondition(NW_FLAG_SET_WARNINGS, FALSE); - - //Put a check in to see if this attacker was the last attacker - //Possibly change the GetNPCWarning function to make the check - } else { - object oAttacker = GetLastAttacker(); - if (!GetIsObjectValid(oAttacker)) { - // Don't do anything, invalid attacker - - } else if (!GetIsFighting(OBJECT_SELF)) { - // We're not fighting anyone else, so - // start fighting the attacker - if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { - SetSummonHelpIfAttacked(); - DetermineSpecialBehavior(oAttacker); - } else if (GetArea(oAttacker) == GetArea(OBJECT_SELF)) { - SetSummonHelpIfAttacked(); - DetermineCombatRound(oAttacker); - } - - //Shout Attack my target, only works with the On Spawn In setup - SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); - - //Shout that I was attacked - SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); - } + object oAttacker = GetLastAttacker(oCreature); + if(AI_DEBUG) ai_Debug("nw_c2_default5", "14", GetName(oCreature) + " was attacked by " + + GetName(oAttacker) + "."); + SetLocalObject(oAttacker, AI_ATTACKED_PHYSICAL, oCreature); + // Run away! + if(ai_GetFleeToExit(oCreature)) + { + ai_ActivateFleeToExit(oCreature); + return; } - - if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT)) { - SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_ATTACKED)); + SignalEvent(oCreature, EventUserDefined(EVENT_ATTACKED)); } + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(ai_GetIsInCombat(oCreature)) return; + // We only inform others if attacked when not busy, not disabled & not in combat. + if(AI_DEBUG) ai_Debug("nw_c2_default5", "30", "Tell my allies I've been attacked!"); + SetLocalObject (oCreature, AI_MY_TARGET, oAttacker); + SpeakString(AI_ATKED_BY_WEAPON, TALKVOLUME_SILENT_TALK); + // Now move towards the attack in the hopes we can see them. + if(GetDistanceBetween(oCreature, oAttacker) < AI_RANGE_CLOSE) ai_DoMonsterCombatRound(oCreature); + else ActionMoveToObject(oAttacker, TRUE, AI_RANGE_CLOSE); } diff --git a/_module/nss/nw_c2_default6.nss b/_module/nss/nw_c2_default6.nss index d362ecf1..53478420 100644 --- a/_module/nss/nw_c2_default6.nss +++ b/_module/nss/nw_c2_default6.nss @@ -1,109 +1,36 @@ -//::////////////////////////////////////////////////// -//:: NW_C2_DEFAULT6 -//:: Default OnDamaged handler -/* - If already fighting then ignore, else determine - combat round - */ -//::////////////////////////////////////////////////// -//:: Copyright (c) 2002 Floodgate Entertainment -//:: Created By: Naomi Novik -//:: Created On: 12/22/2002 -//::////////////////////////////////////////////////// -//::////////////////////////////////////////////////// -//:: Modified By: Deva Winblood -//:: Modified On: Jan 17th, 2008 -//:: Added Support for Mounted Combat Feat Support -//::////////////////////////////////////////////////// - -#include "nw_i0_generic" -#include "x3_inc_horse" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default6 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnDamaged event script; + Does not fire if the creature dies from the damage. + Does not fire for plot creatures as they take no damage. + May fire before or after OnPhysicalAttacked event. + Fires when EffectDamage is applied to oCreature even if 0 damage. + Fires when a weapon damages a oCreature, but not if resisted. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" void main() { - ExecuteScript("prc_npc_damaged", OBJECT_SELF); - - object oDamager = GetLastDamager(); - object oMe=OBJECT_SELF; - int nHPBefore; - if (!GetLocalInt(GetModule(),"X3_NO_MOUNTED_COMBAT_FEAT")) - if (GetHasFeat(FEAT_MOUNTED_COMBAT)&&HorseGetIsMounted(OBJECT_SELF)) - { // see if can negate some damage - if (GetLocalInt(OBJECT_SELF,"bX3_LAST_ATTACK_PHYSICAL")) - { // last attack was physical - nHPBefore=GetLocalInt(OBJECT_SELF,"nX3_HP_BEFORE"); - if (!GetLocalInt(OBJECT_SELF,"bX3_ALREADY_MOUNTED_COMBAT")) - { // haven't already had a chance to use this for the round - SetLocalInt(OBJECT_SELF,"bX3_ALREADY_MOUNTED_COMBAT",TRUE); - int nAttackRoll=GetBaseAttackBonus(oDamager)+d20(); - int nRideCheck=GetSkillRank(SKILL_RIDE,OBJECT_SELF)+d20(); - if (nRideCheck>=nAttackRoll&&!GetIsDead(OBJECT_SELF)) - { // averted attack - if (GetIsPC(oDamager)) SendMessageToPC(oDamager,GetName(OBJECT_SELF)+GetStringByStrRef(111991)); - //if (GetIsPC(OBJECT_SELF)) SendMessageToPCByStrRef(OBJECT_SELF,111992"); - if (GetCurrentHitPoints(OBJECT_SELF) (GetMaxHitPoints(OBJECT_SELF) / 4) - || (GetHitDice(oDamager) - 2) > GetHitDice(oTarget) - ) - ) - ) - { - // Switch targets - DetermineCombatRound(oDamager); - } - } - } - + object oCreature = OBJECT_SELF; + + ExecuteScript("prc_npc_damaged", OBJECT_SELF); + // Send the user-defined event signal if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT)) { - SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED)); + SignalEvent(oCreature, EventUserDefined(EVENT_DAMAGED)); + return; } + if(ai_Disabled(oCreature)) return; + // Make sure to clear wounded shout limit if we take damage. See ai_TryHealing. + DeleteLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT"); + object oDamager = GetLastDamager(oCreature); + if(AI_DEBUG) ai_Debug("nw_c2_default6", "23", GetName(oCreature) + " has been damaged by " + GetName(oDamager)); + if(ai_GetFleeToExit(oCreature)) return; + if(GetObjectType(oDamager) == OBJECT_TYPE_AREA_OF_EFFECT && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature) || ai_GetIsInCombat(oCreature)) return; + if(GetDistanceBetween(oCreature, oDamager) < AI_RANGE_CLOSE) ai_DoMonsterCombatRound(oCreature); + else ActionMoveToObject(oDamager, TRUE, AI_RANGE_CLOSE - 1.0); } diff --git a/_module/nss/nw_c2_default8.nss b/_module/nss/nw_c2_default8.nss index 3e494283..fa7ef11b 100644 --- a/_module/nss/nw_c2_default8.nss +++ b/_module/nss/nw_c2_default8.nss @@ -1,30 +1,26 @@ -//::////////////////////////////////////////////////// -//:: NW_C2_DEFAULT8 -/* - Default OnDisturbed event handler for NPCs. - */ -//::////////////////////////////////////////////////// -//:: Copyright (c) 2002 Floodgate Entertainment -//:: Created By: Naomi Novik -//:: Created On: 12/22/2002 -//::////////////////////////////////////////////////// - -#include "nw_i0_generic" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_default8 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnDisturbed event script; + Fires when the inventory of oCreature is changed i.e. added or removed. + Creatures can't have items added or removed from its inventory (it's not a + container), then the only way this fires for creatures if something is stolen. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_actions" void main() { ExecuteScript("prc_npc_disturb", OBJECT_SELF); - - object oTarget = GetLastDisturbed(); - - // If we've been disturbed and are not already fighting, - // attack our disturber. - if (GetIsObjectValid(oTarget) && !GetIsFighting(OBJECT_SELF)) { - DetermineCombatRound(oTarget); - } - + + if(AI_DEBUG) ai_Debug("nw_c2_default8", "13", GetName(OBJECT_SELF) + " is been disturbed!"); + // We do nothing at the moment... lets not mess up our factions ok? + // This should be defined by the server admins and is commented out. + //if(ai_GetIsBusy(OBJECT_SELF, FALSE) || ai_Disabled()) return; + //object oTarget = GetLastDisturbed(); + //if (oTarget != OBJECT_INVALID) ai_DoMonsterCombatRound (); // Send the disturbed flag if appropriate. - if(GetSpawnInCondition(NW_FLAG_DISTURBED_EVENT)) { + if(GetSpawnInCondition(NW_FLAG_DISTURBED_EVENT)) + { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DISTURBED)); } -} \ No newline at end of file +} diff --git a/_module/nss/nw_c2_defaultb.nss b/_module/nss/nw_c2_defaultb.nss index 13385446..31500267 100644 --- a/_module/nss/nw_c2_defaultb.nss +++ b/_module/nss/nw_c2_defaultb.nss @@ -1,159 +1,42 @@ -//:://///////////////////////////////////////////// -//:: Default: On Spell Cast At -//:: NW_C2_DEFAULTB -//:: Copyright (c) 2001 Bioware Corp. -//::////////////////////////////////////////////// -/* - This determines if the spell just cast at the - target is harmful or not. - - GZ 2003-Oct-02 : - New AoE Behavior AI. Will use - Dispel Magic against AOES - - Flying Creatures will ignore - Grease - -*/ -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Dec 6, 2001 -//:: Last Modified On: 2003-Oct-13 -//::////////////////////////////////////////////// -//::////////////////////////////////////////////// -//:: Modified By: Deva Winblood -//:: Modified On: Jan 4th, 2008 -//:: Added Support for Mounted Combat Feat Support -//::////////////////////////////////////////////// - -#include "nw_i0_generic" -#include "x2_i0_spells" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_defaultb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monster OnSpellCastAt event script; + Fires when oCreature becomes the target of a spell via SignalEvent. + Fires when a healing kit is used on a creature. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" void main() { - ExecuteScript("prc_npc_spellat", OBJECT_SELF); - + object oCreature = OBJECT_SELF; object oCaster = GetLastSpellCaster(); - - - if(GetLastSpellHarmful()) - { - SetCommandable(TRUE); - - if (!GetLocalInt(GetModule(),"X3_NO_MOUNTED_COMBAT_FEAT")) - { // set variables on target for mounted combat - DeleteLocalInt(OBJECT_SELF,"bX3_LAST_ATTACK_PHYSICAL"); - } // set variables on target for mounted combat - - // ------------------------------------------------------------------ - // If I was hurt by someone in my own faction - // Then clear any hostile feelings I have against them - // After all, we're all just trying to do our job here - // if we singe some eyebrow hair, oh well. - // ------------------------------------------------------------------ - if (GetFactionEqual(oCaster, OBJECT_SELF) == TRUE) - { - ClearPersonalReputation(oCaster, OBJECT_SELF); - ClearAllActions(TRUE); - DelayCommand(1.2, ActionDoCommand(DetermineCombatRound(OBJECT_INVALID))); - // Send the user-defined event as appropriate - if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT)) - { - SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT)); - } - return; - } - - int bAttack = TRUE; - // ------------------------------------------------------------------ - // GZ, 2003-Oct-02 - // Try to do something smart if we are subject to an AoE Spell. - // ------------------------------------------------------------------ - if (MatchAreaOfEffectSpell(GetLastSpell()) == TRUE) - { - int nAI = (GetBestAOEBehavior(GetLastSpell())); // from x2_i0_spells - switch (nAI) - { - case X2_SPELL_AOEBEHAVIOR_DISPEL_L: - case X2_SPELL_AOEBEHAVIOR_DISPEL_N: - case X2_SPELL_AOEBEHAVIOR_DISPEL_M: - case X2_SPELL_AOEBEHAVIOR_DISPEL_G: - case X2_SPELL_AOEBEHAVIOR_DISPEL_C: - bAttack = FALSE; - ActionCastSpellAtLocation(nAI, GetLocation(OBJECT_SELF)); - ActionDoCommand(SetCommandable(TRUE)); - SetCommandable(FALSE); - break; - - case X2_SPELL_AOEBEHAVIOR_FLEE: - ClearActions(CLEAR_NW_C2_DEFAULTB_GUSTWIND); - oCaster = GetLastSpellCaster(); - ActionForceMoveToObject(oCaster, TRUE, 2.0); - DelayCommand(1.2, ActionDoCommand(DetermineCombatRound(oCaster))); - bAttack = FALSE; - break; - - case X2_SPELL_AOEBEHAVIOR_IGNORE: - // well ... nothing - break; - - case X2_SPELL_AOEBEHAVIOR_GUST: - ActionCastSpellAtLocation(SPELL_GUST_OF_WIND, GetLocation(OBJECT_SELF)); - ActionDoCommand(SetCommandable(TRUE)); - SetCommandable(FALSE); - bAttack = FALSE; - break; - } - - } - // --------------------------------------------------------------------- - // Not an area of effect spell, but another hostile spell. - // If we're not already fighting someone else, - // attack the caster. - // --------------------------------------------------------------------- - if( !GetIsFighting(OBJECT_SELF) && bAttack) - { - if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) - { - DetermineSpecialBehavior(oCaster); - } - else - { - DetermineCombatRound(oCaster); - } - } - - // We were attacked, so yell for help - SetCommandable(TRUE); - //Shout Attack my target, only works with the On Spawn In setup - SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); - - //Shout that I was attacked - SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); - } - else - { - // --------------------------------------------------------------------- - // July 14, 2003 BK - // If there is a valid enemy nearby and a NON HARMFUL spell has been - // cast on me I should call DetermineCombatRound - // I may be invisible and casting spells on myself to buff myself up - // --------------------------------------------------------------------- - // Fix: JE - let's only do this if I'm currently in combat. If I'm not - // in combat, and something casts a spell on me, it'll make me search - // out the nearest enemy, no matter where they are on the level, which - // is kinda dumb. - object oEnemy =GetNearestEnemy(); - if ((GetIsObjectValid(oEnemy) == TRUE) && (GetIsInCombat() == TRUE)) - { - // SpeakString("keep me in combat"); - DetermineCombatRound(oEnemy); - } - } - + SetLocalObject(oCaster, AI_ATTACKED_SPELL, oCreature); + if(ai_Disabled(oCreature)) return; + ExecuteScript("prc_npc_spellat", OBJECT_SELF); + if(!GetLastSpellHarmful()) return; // Send the user-defined event as appropriate if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT)); } - - + // If the spell came from an ally, we don't want to hold it against them. + if(GetFactionEqual(oCaster, oCreature)) ClearPersonalReputation(oCaster, oCreature); + // Lets see what kind of area of effect this is and select an appropriate action. + int nSpell = GetLastSpell(); + if(AI_DEBUG) ai_Debug("nw_c2_defaultb", "26", GetName(oCreature) + " has been hit by a harmful spell(" + + Get2DAString("spells", "Label", nSpell) + ")!"); + if(ai_GetInAOEReaction(oCreature, oCaster, nSpell) && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature)) return; + if(ai_CheckForCombat(oCreature, TRUE)) return; + // We have been attacked out of combat, so let our allies know. + SetLocalObject(oCreature, AI_MY_TARGET, oCaster); + SpeakString(AI_ATKED_BY_SPELL, TALKVOLUME_SILENT_TALK); + if(GetDistanceBetween(oCreature, oCaster) < AI_RANGE_CLOSE) + { + if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) ai_DetermineSpecialBehavior(oCreature); + else ai_DoMonsterCombatRound(oCreature); + } + else ActionMoveToObject(oCaster, TRUE, AI_RANGE_CLOSE); } diff --git a/_module/nss/nw_c2_defaulte.nss b/_module/nss/nw_c2_defaulte.nss index 3d8ab2c9..76f62db6 100644 --- a/_module/nss/nw_c2_defaulte.nss +++ b/_module/nss/nw_c2_defaulte.nss @@ -1,51 +1,53 @@ -//:://///////////////////////////////////////////// -//:: Default On Blocked -//:: NW_C2_DEFAULTE -//:: Copyright (c) 2001 Bioware Corp. -//::////////////////////////////////////////////// -/* - This will cause blocked creatures to open - or smash down doors depending on int and - str. -*/ -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Nov 23, 2001 -//::////////////////////////////////////////////// - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_c2_defaulte + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Monsters OnBlocked event script; + Can be blocked by a creature or door. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" void main() { - ExecuteScript("prc_npc_blocked", OBJECT_SELF); - - object oDoor = GetBlockingDoor(); - if (GetObjectType(oDoor) == OBJECT_TYPE_CREATURE) + object oCreature = OBJECT_SELF; + // This actually gets either a Creature or Door that is blocking OBJECT_SELF. + object oObject = GetBlockingDoor(); + if(AI_DEBUG) ai_Debug("nw_c2_defaulte", "14", GetName(oCreature) + " is being blocked by " + GetName(oObject)); + int nObjectType = GetObjectType(oObject); + if(nObjectType == OBJECT_TYPE_CREATURE) { - // * Increment number of times blocked - /*SetLocalInt(OBJECT_SELF, "X2_NUMTIMES_BLOCKED", GetLocalInt(OBJECT_SELF, "X2_NUMTIMES_BLOCKED") + 1); - if (GetLocalInt(OBJECT_SELF, "X2_NUMTIMES_BLOCKED") > 3) + if(GetIsEnemy(oObject, oCreature)) { - SpeakString("Blocked by creature"); - SetLocalInt(OBJECT_SELF, "X2_NUMTIMES_BLOCKED",0); - ClearAllActions(); - object oEnemy = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY); - if (GetIsObjectValid(oEnemy) == TRUE) + if(ai_CanIAttack(oCreature) && ai_GetIsInCombat(oCreature)) { - ActionEquipMostDamagingRanged(oEnemy); - ActionAttack(oEnemy); + ai_DoMonsterCombatRound(oCreature); + return; } - return; - } */ + if(ai_CheckForCombat(oCreature, TRUE)) return; + } + } + // Anything below blocking us is a door. + if(nObjectType != OBJECT_TYPE_DOOR) return; + // Only open the door if the player has turned door opening on. + if(!GetLocalInt(GetModule(), AI_RULE_OPEN_DOORS)) return; + //if(GetLockKeyTag(oObject) != "") return; + else if(GetIsDoorActionPossible(oObject, DOOR_ACTION_OPEN) && + GetAbilityScore(oCreature, ABILITY_INTELLIGENCE) >= 5) + { + if(AI_DEBUG) ai_Debug("nw_c2_defaulte", "33", GetName(oCreature) + " is opening " + GetName(oObject)); + DoDoorAction(oObject, DOOR_ACTION_OPEN); return; } - if(GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 5) + // If we are in combat we should ignore doors that do not easily open. + if(GetIsDoorActionPossible(oObject, DOOR_ACTION_BASH) && + ai_GetWeaponDamage(oCreature, 3, TRUE) > GetHardness(oObject) && + GetLockKeyTag(oObject) == "") { - if(GetIsDoorActionPossible(oDoor, DOOR_ACTION_OPEN) && GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 7 ) - { - DoDoorAction(oDoor, DOOR_ACTION_OPEN); - } - else if(GetIsDoorActionPossible(oDoor, DOOR_ACTION_BASH)) - { - DoDoorAction(oDoor, DOOR_ACTION_BASH); - } + ActionWait(1.0); + ActionAttack(oObject); + // Give them 3 rounds to break through a door. + DelayCommand(18.0, ai_ClearCreatureActions(TRUE)); + return; } } + + diff --git a/_module/nss/nw_ch_ac1.nss b/_module/nss/nw_ch_ac1.nss new file mode 100644 index 00000000..6ed2fea5 --- /dev/null +++ b/_module/nss/nw_ch_ac1.nss @@ -0,0 +1,158 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac1 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate(Summons, Familiar, Companion) OnHeart beat script when out of combat; + This will usually fire every 6 seconds (1 game round). +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_module" +#include "0i_menus" +void ai_ActionFollow(object oCreature, object oTarget) +{ + if(GetLocalInt(OBJECT_SELF, AI_CURRENT_ACTION_MODE) == AI_LAST_ACTION_MOVE) + { + float fDistance = GetDistanceBetween(oCreature, oTarget); + float fFollowDistance = ai_GetFollowDistance(oCreature); + if(fDistance > fFollowDistance) + { + if(fDistance > fFollowDistance * 5.0 && + ai_GetIsInCombat(oCreature)) AssignCommand(oCreature, JumpToObject(oTarget)); + else + { + ClearAllActions(); + ActionMoveToObject(oTarget, TRUE, fFollowDistance); + } + } + DelayCommand(1.0, ai_ActionFollow(oCreature, oTarget)); + } +} +void main() +{ + if (GetAILevel(OBJECT_SELF) == AI_LEVEL_VERY_LOW) return; + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Counter_Start(); + // We run our OnSpawn in the heartbeat so the creator can use the original + // OnSpawn for their own use. + ai_OnAssociateSpawn(oCreature); + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat, ai_OnAssociateSpawn"); + if(AI_DEBUG) ai_Debug("nw_ch_ac1", "37", GetName(oCreature) + " Heartbeat." + + " MODE_FOLLOW: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_FOLLOW)) + + " Action: " + IntToString(GetCurrentAction(oCreature))); + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat, ai_GetIsBusy/ai_Disabled"); + // If we are an associate and don't have a master then exit. + object oMaster = GetMaster(oCreature); + if(AI_DEBUG) ai_Debug("nw_ch_ac1", "43", "oMaster: " + GetName(oMaster)); + if(oMaster == OBJECT_INVALID) + { + if(ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound(oCreature); + return; + } + ai_CheckForCombat(oCreature, FALSE); + return; + } + // ***** Code for Henchman data and menus ***** + if(ai_GetIsCharacter(oMaster)) + { + string sAssociateType = ai_GetAssociateType(oMaster, oCreature); + ai_CheckAssociateData(oMaster, oCreature, sAssociateType); + ai_CheckPCStart(oMaster); + if(AI_HENCHMAN_WIDGET) + { + // This keeps widgets from disappearing and reappearing. + int nUiToken = NuiFindWindow(oMaster, sAssociateType + AI_WIDGET_NUI); + if(nUiToken) + { + json jData = NuiGetUserData(oMaster, nUiToken); + object oAssociate = StringToObject(JsonGetString(JsonArrayGet(jData, 0))); + if(oAssociate != oCreature) NuiDestroy(oMaster, nUiToken); + } + else + { + if(!ai_GetWidgetButton(oMaster, BTN_WIDGET_OFF, oCreature, sAssociateType)) + { + ai_CreateWidgetNUI(oMaster, oCreature); + } + } + } + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat, Get Associate data/Build widget"); + } + // If follow mode we do not want the NPC doing anything but follow. + if(!ai_GetAIMode(oCreature, AI_MODE_FOLLOW)) + { + if(ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND)) + { + ai_TryHealing(oCreature, oCreature); + return; + } + if(ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound(oCreature); + return; + } + if(ai_CheckForCombat(oCreature, FALSE)) return; + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat, ai_CheckForCombat"); + if(IsInConversation(oCreature)) return; + // In command mode we let the player tell us what to do. + if(!ai_GetAIMode(oCreature, AI_MODE_COMMANDED)) + { + if(ai_TryHealing(oCreature, oCreature)) return; + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat: TryHealing"); + if(ai_CheckNearbyObjects(oCreature)) return; + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat: CheckNearbyObjects"); + if(ai_GetAIMode(oCreature, AI_MODE_SCOUT_AHEAD)) + { + ai_ScoutAhead(oCreature); + return; + } + } + } + // Finally we check to make sure we are following our master. + if(GetCurrentAction(oCreature) != ACTION_FOLLOW) + { + //ai_Debug("nw_ch_ac1", "66", "Follow master: " + + // " Stealth: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH)) + + // " Search: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH))); + if(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH)) + { + if(AI_DEBUG) ai_Debug("nw_ch_ac1", "120", "Going into stealth mode!"); + int nStealth = GetSkillRank(SKILL_HIDE, oCreature); + nStealth += GetSkillRank(SKILL_MOVE_SILENTLY, oCreature); + if(nStealth / 2 >= ai_GetCharacterLevels(oCreature)) + { + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + } + } + else + { + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + if(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH)) + { + if(AI_DEBUG) ai_Debug("nw_ch_ac1", "134", "Going into search mode!"); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + } + else SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + } + // Follow master. + if(GetDistanceBetween(oCreature, oMaster) > ai_GetFollowDistance(oCreature)) + { + if(!ai_GetAIMode(oCreature, AI_MODE_COMMANDED)) + { + object oTarget = GetLocalObject(oCreature, AI_FOLLOW_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oMaster; + //ActionForceFollowObject(oTarget, ai_GetFollowDistance(oCreature)); + //ActionMoveToObject(oTarget, TRUE, ai_GetFollowDistance(oCreature)); + SetLocalInt(oCreature, AI_CURRENT_ACTION_MODE, AI_LAST_ACTION_MOVE); + ai_ActionFollow(oCreature, oTarget); + } + } + } + if(AI_DEBUG) ai_Counter_End(GetName(oCreature) + ": Heartbeat, end"); + if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(1001)); + } +} diff --git a/_module/nss/nw_ch_ac2.nss b/_module/nss/nw_ch_ac2.nss index 908594c9..04a56f98 100644 --- a/_module/nss/nw_ch_ac2.nss +++ b/_module/nss/nw_ch_ac2.nss @@ -1,57 +1,107 @@ -`//:://///////////////////////////////////////////// -//:: Associate: On Percieve -//:: NW_CH_AC2 -//:: Copyright (c) 2001 Bioware Corp. -//::////////////////////////////////////////////// -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Nov 19, 2001 -//::////////////////////////////////////////////// - -#include "X0_INC_HENAI" - +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac2 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate(Summons, Familiars, Companions) OnPerception script when not in combat; + There are 4 types of perception - Heard, Inaudible, Seen, Vanished. + Only one type will ever be true in an event trigger. + The order of trigger is Heard/Seen and Inaudible/Vanished. + There are two states of percepion Heard and Seen. + These states can be set at the same time thus a heard event can see the creature. + Fires when ever one of these states changes from TRUE to FALSE or FALSE to TRUE. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" void main() { - //This is the equivalent of a force conversation bubble, should only be used if you want an NPC - //to say something while he is already engaged in combat. - if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION)) + object oCreature = OBJECT_SELF; + object oLastPerceived = GetLastPerceived(); + if(AI_DEBUG) { - ActionStartConversation(OBJECT_SELF); - } - - // * July 2003 - // * If in Stealth mode, don't attack enemies. Wait for player to attack or - // * for you to be attacked. (No point hiding anymore if you've been detected) - if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND) && GetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH)== FALSE) - { - //Do not bother checking the last target seen if already fighting - if(!GetIsObjectValid(GetAttemptedAttackTarget()) && - !GetIsObjectValid(GetAttackTarget()) && - !GetIsObjectValid(GetAttemptedSpellTarget())) + if(GetLastPerceptionHeard ()) { - //Check if the last percieved creature was actually seen - if(GetLastPerceptionSeen()) - { - if(GetIsEnemy(GetLastPerceived())) - { - SetFacingPoint(GetPosition(GetLastPerceived())); - HenchmenCombatRound(OBJECT_INVALID); - } - //Linked up to the special conversation check to initiate a special one-off conversation - //to get the PCs attention - else if(GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION) && GetIsPC(GetLastPerceived())) - { - ActionStartConversation(OBJECT_SELF); - } - } + ai_Debug("nw_ch_ac2", "21", GetName(oCreature) + " heard " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + + " Seen: " + IntToString(GetObjectSeen(oLastPerceived, oCreature)) + "."); + } + if(GetLastPerceptionSeen ()) + { + ai_Debug("nw_ch_ac2", "29", GetName(oCreature) + " sees " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + "."); + } + if(GetLastPerceptionVanished ()) + { + ai_Debug("nw_ch_ac2", "35", GetName(oCreature) + " lost sight of " + + GetName(GetLastPerceived()) + "."); } } - if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT)) + // We do nothing on Inaudibles so drop out early! + if(GetLastPerceptionInaudible()) { - SignalEvent(OBJECT_SELF, EventUserDefined(1002)); + ai_Debug("nw_ch_ac2", "42", GetName(oCreature) + " lost sound of " + + GetName(GetLastPerceived()) + "."); + return; } - - if (GetIsHired(OBJECT_SELF)!=TRUE) ExecuteScript("nw_c2_default2",OBJECT_SELF); - //SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); + if(AI_DEBUG) ai_Debug("nw_ch_ac2", "46", "Dead? " + IntToString(GetIsDead(oLastPerceived)) + + " Enemy? " + IntToString(GetIsEnemy(oLastPerceived, oCreature))); + if(ai_Disabled(oCreature)) return; + if(GetIsDead(oLastPerceived) || !GetIsEnemy(oLastPerceived, oCreature)) return; + // All code below assumes the perceived creature is an enemy and is alive! + // **************************** ENEMY HEARD ******************************** + if(GetLastPerceptionHeard()) + { + // Since Heard is run before Seen, but the values are set at the same + // time we can skip heard checks on heard & seen creatures! + if(GetObjectSeen(oLastPerceived, oCreature)) + { + // If the creature we are perceiving was our invisible creature then + // remove that they are invisible. + if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE)) + { + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); + } + ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY); + } + else ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_HEARD_AN_ENEMY); + return; + } + // **************************** ENEMY SEEN ********************************* + if(GetLastPerceptionSeen()) + { + // If the creature we are perceiving was our invisible creature then + // remove that they are invisible. + if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE)) + { + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); + } + ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY); + return; + } + // **************************** ENEMY VANISHED ***************************** + if(GetLastPerceptionVanished()) + { + // Lets keep a mental note of the invisible creature. + SetLocalObject(oCreature, AI_IS_INVISIBLE, oLastPerceived); + if(AI_DEBUG) ai_Debug("nw_ch_ac2", "86", " We saw " + GetName(oLastPerceived) + " disappear!"); + if(ai_GetIsBusy(oCreature)) return; + // If in combat check to see if our target disappeared. + // If they have and we are not in melee with them then reevaluate combat + // since we lost our target. + if(ai_GetIsInCombat(oCreature)) + { + if(AI_DEBUG) ai_Debug("nw_ch_ac2", "93", "Is this our target? " + + IntToString(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived)); + if(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived) + { + ai_DoAssociateCombatRound(oCreature); + } + return; + } + // If they are not invisible then that means they left our perception + // range and we need follow them. + if(ai_CanIAttack(oCreature)) ActionMoveToObject(oLastPerceived, TRUE, AI_RANGE_CLOSE); + } + // **************************** ENEMY INAUDIBLE***************************** + // Not used. } - diff --git a/_module/nss/nw_ch_ac3.nss b/_module/nss/nw_ch_ac3.nss new file mode 100644 index 00000000..9eb34065 --- /dev/null +++ b/_module/nss/nw_ch_ac3.nss @@ -0,0 +1,56 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac3 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate (Summons, Familiars, Companions) OnCombatRoundEnd event script; + Fires at the end of each combat round (6 seconds). + This will fire as long as oCreature is in combat (GetIsInCombat()). + This event starts counting once a combat action is started. + Every time a spell is cast it will queue another end combat round so haste with + two spells cast will fire this twice in one round. + It will also fire at the end of a hostile effect that stops actions i.e Stunned, Knockdown etc. + Action modes are also cleared prior to this event executing! + GetAttemptedAttackTarget() & GetAttemptedSpellTarget() also get cleared prior to this event. + This event can be canceled with ClearAllActions(TRUE) and SurrenderToEnemies. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("nw_ch_ac3", "20", GetName(oCreature) + " ends combat round."); + if(ai_Disabled(oCreature)) return; + // Action modes get cleared prior to each OnCombatRoundEnd! + // We do this to keep the action mode going. + int nActionMode = GetLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + if(nActionMode > 0) + { + SetActionMode(oCreature, nActionMode, TRUE); + // We don't want to use up all of the Dwarven Defenders uses! + if(nActionMode == 12) IncrementRemainingFeatUses(oCreature, FEAT_DWARVEN_DEFENDER_DEFENSIVE_STANCE); + } + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("nw_ch_ac3", "32", "nAction: " + IntToString(nAction)); + switch(nAction) + { + // These actions are uninteruptable. + case ACTION_MOVETOPOINT : + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_COUNTERSPELL : return; + // Might be doing a special action that is not a defined action. + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("nw_ch_ac3", "44", "nCombatWait: " + IntToString(nCombatWait)); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + } + // We always want to interupt an attack action at the end of a round. + //case ACTION_ATTACKOBJECT : + } + if(ai_GetIsInCombat(oCreature)) ai_DoAssociateCombatRound (oCreature); +} + diff --git a/_module/nss/nw_ch_ac4.nss b/_module/nss/nw_ch_ac4.nss new file mode 100644 index 00000000..f6c290d6 --- /dev/null +++ b/_module/nss/nw_ch_ac4.nss @@ -0,0 +1,45 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac4 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate(Summons, Familiar, Companion) OnDialoge event script; + Fires when oCreature has been clicked on for conversation. + Fires when oCreature hears a shout from another creature. + If SetListening is FALSE then oCreature will not "hear" anything. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +#include "nw_inc_gff" +void main() +{ + object oCreature = OBJECT_SELF; + int nMatch = GetListenPatternNumber(); + if(AI_DEBUG) ai_Debug("nw_ch_ac4", "16", GetName(oCreature) + " listens " + + IntToString(nMatch) + " to " + GetName(GetLastSpeaker()) + "."); + // Skip ASSOCIATE_COMMAND_MASTERUNDERATTACK(11) since it fires for + // every physical attack made on our master. This fires alot! + if(nMatch == ASSOCIATE_COMMAND_MASTERUNDERATTACK) return; + // If we are disabled then we can't listen or talk, Busy is checked in ai_SelectAssociateCommand(). + if(ai_Disabled(oCreature)) return; + object oLastSpeaker = GetLastSpeaker(); + // Some commands override being busy so we check in ai_SelectAssociateCommand. + if(nMatch != -1) + { + if(GetFactionEqual(oLastSpeaker, oCreature)) ai_SelectAssociateCommand(oCreature, oLastSpeaker, nMatch); + } + else + { + if (!ai_GetIsBusy(oCreature)) + { + ai_ClearCreatureActions(); + if(GetAssociateType(oCreature) == ASSOCIATE_TYPE_HENCHMAN) BeginConversation("oc_ai_henchmen", oLastSpeaker); + else + { + json jHenchman = ObjectToJson(oCreature); + string sConversation = JsonGetString(GffGetResRef(jHenchman, "Conversation")); + if(sConversation == "") BeginConversation("oc_ai_henchmen", oLastSpeaker); + BeginConversation(); + } + } + } +} + diff --git a/_module/nss/nw_ch_ac5.nss b/_module/nss/nw_ch_ac5.nss new file mode 100644 index 00000000..78f93214 --- /dev/null +++ b/_module/nss/nw_ch_ac5.nss @@ -0,0 +1,51 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac5 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associates (Summons, Familiars, Companions) OnPhysicalAttacked event script; + Fires for all physical attacks, claws, weapons, fists, bow, etc. + Fires for taunt skill, animal empathy skill. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oAttacker = GetLastAttacker(); + if(AI_DEBUG) ai_Debug("nw_ch_ac5", "14", GetName(oCreature) + " was attacked by " + + GetName(oAttacker) + "."); + SetLocalObject(oAttacker, AI_ATTACKED_PHYSICAL, oCreature); + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(1005)); + } + if(ai_GetIsInCombat(oCreature)) return; + // We only inform others if attacked when not busy, not disabled, & not in combat. + SetLocalObject(oCreature, AI_MY_TARGET, oAttacker); + SpeakString(AI_ATKED_BY_WEAPON, TALKVOLUME_SILENT_TALK); + // If they are using a melee weapon then make sure we are using our perception range. + // Don't go running towards them just yet, but if its a ranged weapon then react. + if(ai_GetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oAttacker))) + { + float fDistance = GetDistanceBetween(oCreature, oAttacker); + float fPerceptionDistance = GetLocalFloat(oCreature, AI_ASSOC_PERCEPTION_DISTANCE); + if(fDistance > fPerceptionDistance) return; + } + int nAction = GetCurrentAction(oCreature); + float fDistance = GetDistanceBetween(oCreature, oAttacker); + if(!ai_CanIAttack(oCreature)) + { + // We should defend ourselves if we are in Hold mode. + if(!ai_GetAIMode(oCreature, AI_MODE_STAND_GROUND)) return; + // Only defend against melee attacks. + if(fDistance > AI_RANGE_MELEE) return; + } + // The only way to get here is to not be in combat. + if(fDistance < AI_RANGE_CLOSE) + { + ai_StartAssociateCombat(oCreature); + } + else ActionMoveToObject(oAttacker, TRUE, AI_RANGE_CLOSE - 1.0); +} + + diff --git a/_module/nss/nw_ch_ac6.nss b/_module/nss/nw_ch_ac6.nss new file mode 100644 index 00000000..f51e9374 --- /dev/null +++ b/_module/nss/nw_ch_ac6.nss @@ -0,0 +1,32 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_ch_6_damaged + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnDamaged script for PC AI; + Does not fire if the creature dies from the damage. + Does not fire for plot creatures as they take no damage. + May fire before or after OnPhysicalAttacked event. + Fires when EffectDamage is applied to oCreature even if 0 damage. + Fires when a weapon damages a oCreature, but not if resisted. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + if(ai_Disabled(oCreature)) return; + // Make sure to clear wounded shout limit if we take damage. See ai_TryHealing. + DeleteLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT"); + object oDamager = GetLastDamager(oCreature); + if(AI_DEBUG) ai_Debug("nw_ch_ac6", "18", GetName(oCreature) + " has been damaged by " + GetName(oDamager)); + if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(1006)); + } + if(GetObjectType(oDamager) == OBJECT_TYPE_AREA_OF_EFFECT && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature) || ai_GetIsInCombat(oCreature)) return; + if(!ai_CanIAttack(oCreature)) return; + if(GetDistanceBetween(oCreature, oDamager) < AI_RANGE_CLOSE) ai_DoAssociateCombatRound(oCreature); + else ActionMoveToObject(oDamager, TRUE, AI_RANGE_CLOSE - 1.0); +} + diff --git a/_module/nss/nw_ch_ac8.nss b/_module/nss/nw_ch_ac8.nss new file mode 100644 index 00000000..05b7f856 --- /dev/null +++ b/_module/nss/nw_ch_ac8.nss @@ -0,0 +1,25 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_ac8 + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associates (Summons, Familiars, Companions) OnDisturbed event script. + Fires when the inventory of oCreature is changed i.e. added or removed. + Creatures can't have items added or removed from its inventory (it's not a + container), then the only way this fires for creatures if something is stolen. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + if(AI_DEBUG) ai_Debug("nw_ch_ac8", "13", GetName(OBJECT_SELF) + " is been disturbed!"); + if(GetSpawnInCondition(NW_FLAG_DISTURBED_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(1008)); + } + // We do nothing at the moment... lets not mess up our factions ok? + // This should be defined by the server admins and is commented out. + //if(ai_GetIsBusy(OBJECT_SELF, FALSE) || ai_Disabled()) return; + //object oTarget = GetLastDisturbed(); + //if (oTarget != OBJECT_INVALID) ai_DoMonsterCombatRound (); +} + + diff --git a/_module/nss/nw_ch_aca.nss b/_module/nss/nw_ch_aca.nss new file mode 100644 index 00000000..99b6d5fa --- /dev/null +++ b/_module/nss/nw_ch_aca.nss @@ -0,0 +1,46 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_aca + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate OnRested event script; + Fires when the creature attempts to rest via ActionRest or a PC rests. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_menus" +void ai_UpdateAssociateWidget(object oMaster, object oAssociate, int nUIToken) +{ + if(nUIToken) NuiDestroy(oMaster, nUIToken); + ai_CreateWidgetNUI(oMaster, oAssociate); + if(oMaster != oAssociate) + { + nUIToken = NuiFindWindow(oMaster, "pc" + AI_WIDGET_NUI); + if(nUIToken) + { + NuiDestroy(oMaster, nUIToken); + ai_CreateWidgetNUI(oMaster, oMaster); + } + } +} +void main() +{ + object oAssociate = OBJECT_SELF; + ai_ClearCreatureActions(); + ai_OnRested(oAssociate); + object oMaster = GetMaster(oAssociate); + if(ai_GetIsCharacter(oMaster) && AI_HENCHMAN_WIDGET) + { + int nLevel = ai_GetCharacterLevels(oAssociate); + float fDelay = StringToFloat(Get2DAString("restduration", "DURATION", nLevel)); + fDelay = (fDelay / 1000.0f) + 6.0f; + // Update widget for spell widget. + string sAssociateType = ai_GetAssociateType(oMaster, oAssociate); + int nUIToken = NuiFindWindow(oMaster, sAssociateType + AI_WIDGET_NUI); + if(nUIToken) DelayCommand(fDelay, ai_UpdateAssociateWidget(oMaster, oAssociate, nUIToken)); + else + { + if(!ai_GetWidgetButton(oMaster, BTN_WIDGET_OFF, oAssociate, sAssociateType)) + { + DelayCommand(fDelay, ai_UpdateAssociateWidget(oMaster, oAssociate, 0)); + } + } + } +} diff --git a/_module/nss/nw_ch_acb.nss b/_module/nss/nw_ch_acb.nss new file mode 100644 index 00000000..ec96e77f --- /dev/null +++ b/_module/nss/nw_ch_acb.nss @@ -0,0 +1,42 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: nw_ch_acb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associates (Summons, Familiars, Companions) OnSpellCastAt event script; + Fires when oCreature becomes the target of a spell via SignalEvent. + Fires when a healing kit is used on a creature. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oCaster = GetLastSpellCaster(); + SetLocalObject(oCaster, AI_ATTACKED_SPELL, oCreature); + if(ai_Disabled(oCreature)) return; + if(!GetLastSpellHarmful()) return; + // If the spell came from an ally, we don't want to hold it against them. + if(GetFactionEqual(oCaster, oCreature)) + { + ClearPersonalReputation(oCaster, oCreature); + if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT)); + } + } + // Lets see what kind of area of effect this is and select an appropriate action. + int nSpell = GetLastSpell(); + if(AI_DEBUG) ai_Debug("nw_ch_acb", "21", GetName(OBJECT_SELF) + " has been hit by a harmful spell(" + + Get2DAString("spells", "Label", nSpell) + ")!"); + if(ai_GetInAOEReaction(oCreature, oCaster, nSpell) && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature)) return; + if(ai_CheckForCombat(oCreature, FALSE)) return; + // We were attacked by an enemy out of combat, so let our allies know. + SetLocalObject(oCreature, AI_MY_TARGET, oCaster); + SpeakString(AI_ATKED_BY_SPELL, TALKVOLUME_SILENT_TALK); + if(!ai_CanIAttack(oCreature)) return; + if(GetDistanceBetween(oCreature, oCaster) < AI_RANGE_CLOSE) ai_DoAssociateCombatRound(oCreature); + else ActionMoveToObject(oCaster, TRUE, AI_RANGE_CLOSE - 1.0); +} + + diff --git a/_module/nss/nw_ch_ace.nss b/_module/nss/nw_ch_ace.nss new file mode 100644 index 00000000..688ab902 --- /dev/null +++ b/_module/nss/nw_ch_ace.nss @@ -0,0 +1,60 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: 0e_ch_e_blocked + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associates OnBlocked event script; + Can be blocked by a creature or door. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + // This actually gets either a Creature or Door that is blocking OBJECT_SELF. + object oObject = GetBlockingDoor(); + if(AI_DEBUG) ai_Debug("nw_ch_ace", "14", GetName(oCreature) + " is being blocked by " + GetName(oObject)); + int nObjectType = GetObjectType(oObject); + if(nObjectType == OBJECT_TYPE_CREATURE) + { + if(GetIsEnemy(oObject, oCreature)) + { + if(ai_CanIAttack(oCreature) && ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound(oCreature); + return; + } + if(ai_CheckForCombat(oCreature, FALSE)) return; + } + } + // Anything below blocking us is a door. + if(nObjectType != OBJECT_TYPE_DOOR) return; + if(!ai_GetAIMode(oCreature, AI_MODE_OPEN_DOORS)) return; + //if(GetLockKeyTag(oObject) != "") return; + else if(GetIsDoorActionPossible(oObject, DOOR_ACTION_OPEN) && + GetAbilityScore(oCreature, ABILITY_INTELLIGENCE) >= 5) + { + DoDoorAction(oObject, DOOR_ACTION_OPEN); + return; + } + // Anything below is ignored in combat. + if(ai_GetIsInCombat(oCreature)) return; + if(GetIsDoorActionPossible(oObject, DOOR_ACTION_BASH) && + ai_GetWeaponDamage(oCreature, 3, TRUE) > GetHardness(oObject) && + GetLockKeyTag(oObject) == "") + { + ActionWait(1.0); + ActionAttack(oObject); + // Give them 3 rounds to break through a door. + DelayCommand(18.0, ai_ClearCreatureActions(TRUE)); + return; + } + else if(GetLocked(oObject)) + { + if(AI_DEBUG) ai_Debug("nw_ch_ace", "49", GetName(oObject) + " is locked!"); + ai_AttemptToByPassLock(oCreature, oObject); + } + // Clear our action so we can move on to something else unless the door is open. + else if(!GetIsOpen(oObject)) + { + ai_ClearCreatureActions(); + } +} diff --git a/_module/nss/nw_ch_summon_9.nss b/_module/nss/nw_ch_summon_9.nss new file mode 100644 index 00000000..ca5a87c4 --- /dev/null +++ b/_module/nss/nw_ch_summon_9.nss @@ -0,0 +1,40 @@ +//:://///////////////////////////////////////////// +//:: Associate: On Spawn In +//:: nw_ch_summon_9 +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + +This must support the OC henchmen and all summoned/companion +creatures. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Nov 19, 2001 +//::////////////////////////////////////////////// +//:: Updated By: Georg Zoeller, 2003-08-20: Added variable check for spawn in animation +#include "X0_INC_HENAI" +#include "x2_inc_switches" +void main() +{ + //Sets up the special henchmen listening patterns + SetAssociateListenPatterns(); + + // Set additional henchman listening patterns + //bkSetListeningPatterns(); + // * If Incorporeal, apply changes + if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE) + { + effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL); + eConceal = ExtraordinaryEffect(eConceal); + effect eGhost = EffectCutsceneGhost(); + eGhost = ExtraordinaryEffect(eGhost); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF); + } + // Set starting location + SetAssociateStartLocation(); +} + + diff --git a/_module/nss/on_mod_enter.nss b/_module/nss/on_mod_enter.nss index f6e67b85..c1c990d5 100644 --- a/_module/nss/on_mod_enter.nss +++ b/_module/nss/on_mod_enter.nss @@ -27,4 +27,6 @@ void main() //:: Add system journal entries AddJournalQuestEntry("JRNL_XPCHART", 1, oPC, FALSE, FALSE, FALSE); AddJournalQuestEntry("JRNL_LA_BUYOFF", 1, oPC, FALSE, FALSE, FALSE); + AddJournalQuestEntry("JRNL_PRC8", 1, oPC, FALSE, FALSE, FALSE); + AddJournalQuestEntry("JRNL_FOODWTR", 1, oPC, FALSE, FALSE, FALSE); } diff --git a/_module/nss/onrest.nss b/_module/nss/onrest.nss index abf11448..cf9ef5b4 100644 --- a/_module/nss/onrest.nss +++ b/_module/nss/onrest.nss @@ -1,170 +1,184 @@ +#include "prc_inc_racial" + void main() { -object oPC = GetLastPCRested(); - -if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED) - { - int nWM = d100(1); - string sLevel = IntToString(GetHitDice(oPC)); - string sResref = "wm_" + sLevel; - object oWP = GetNearestObjectByTag("wmwp"); - location lWP = GetLocation(oWP); - if (nWM<=10) - { - object oSpawn = CreateObject(OBJECT_TYPE_CREATURE,sResref,lWP); - AssignCommand(oSpawn,ActionAttack(oPC)); - } - } -else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED||REST_EVENTTYPE_REST_CANCELLED) - { - int nHour = GetTimeHour(); - int nMinute = GetTimeMinute(); - int nSecond = GetTimeSecond(); - int nMillisecond = GetTimeMillisecond(); - // Advance the time 8 hours. - nHour += 8; - - // Set the new time - int iPW = GetLocalInt(GetModule(), "PW_MODE"); + object oPC = GetLastPCRested(); - //:: Skip if running as a Persistant World MP module - if (!iPW) + int nRace = MyPRCGetRacialType(oPC); + + if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED) { - SetTime(nHour, nMinute, nSecond, nMillisecond); + int nWM = d100(1); + string sLevel = IntToString(GetHitDice(oPC)); + string sResref = "wm_" + sLevel; + object oWP = GetNearestObjectByTag("wmwp"); + location lWP = GetLocation(oWP); + if (nWM<=10) + { + object oSpawn = CreateObject(OBJECT_TYPE_CREATURE,sResref,lWP); + AssignCommand(oSpawn,ActionAttack(oPC)); + } } + else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED||REST_EVENTTYPE_REST_CANCELLED) + { + int nHour = GetTimeHour(); + int nMinute = GetTimeMinute(); + int nSecond = GetTimeSecond(); + int nMillisecond = GetTimeMillisecond(); + // Advance the time 8 hours. + nHour += 8; - // See how hungry and thirsty PC is - int ibHungry = GetLocalInt(oPC,"ate"); - int ibThirsty = GetLocalInt(oPC,"drank"); + // Set the new time + int iPW = GetLocalInt(GetModule(), "PW_MODE"); - // Make them wake up hungrier and thirstier - SetLocalInt(oPC,"ate",ibHungry-1); - SetLocalInt(oPC,"drank",ibThirsty-1); + //:: Skip if running as a Persistant World MP module + if (!iPW) + { + SetTime(nHour, nMinute, nSecond, nMillisecond); + } + // See how hungry and thirsty PC is + int ibHungry = GetLocalInt(oPC,"ate"); + int ibThirsty = GetLocalInt(oPC,"drank"); - //get new values - int iHungry = GetLocalInt(oPC,"ate"); - int iThirsty = GetLocalInt(oPC,"drank"); - //apply hunger and thirst penalties - switch (iHungry) - { - case -1: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 2); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken hungry."); - break; - } - case -2: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 4); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken quite hungry."); - break; - } - case -3: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 5); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken really hungry."); - break; - } - case -4: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 6); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken very hungry."); - break; - } - case -5: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 7); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken painfully hungry."); - break; - } - case -6: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 8); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you awaken extremely hungry."); - break; - } - case -7: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 10); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You rest well, but you are starving to death."); - break; - } - case -8: - { - effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 12); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You will die soon if you don't eat."); - break; - } - case -9: - { - effect eEffect = EffectDeath(); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You have starved to death."); - break; - } - } - switch (iThirsty) - { - case -1: - { - effect eEffect = EffectNegativeLevel(1,FALSE); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You awaken and are quite thirsty."); - break; - } - case -2: - { - effect eEffect = EffectNegativeLevel(2,FALSE); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You awaken and are extremely thirsty."); - break; - } - case -3: - { - effect eEffect = EffectNegativeLevel(3,FALSE); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You awaken and are dreadfully thirsty."); - break; - } - case -4: - { - effect eEffect = EffectNegativeLevel(4,FALSE); - eEffect = ExtraordinaryEffect(eEffect); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You are dying of thirst, you need to find something to drink."); - break; - } - case -5: - { - effect eEffect = EffectDeath(); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); - SendMessageToPC(oPC,"You have died of thirst."); - break; - } - } + // Make them wake up hungrier and thirstier + SetLocalInt(oPC,"ate",ibHungry-1); + SetLocalInt(oPC,"drank",ibThirsty-1); + + if ( + nRace == RACIAL_TYPE_CONSTRUCT || + nRace == RACIAL_TYPE_UNDEAD || + nRace == RACIAL_TYPE_ELEMENTAL || + nRace == RACIAL_TYPE_OUTSIDER + ) + { + SetLocalInt(oPC, "ate", 99); + SetLocalInt(oPC, "drank", 99); + } + + //get new values + int iHungry = GetLocalInt(oPC,"ate"); + int iThirsty = GetLocalInt(oPC,"drank"); + //apply hunger and thirst penalties + switch (iHungry) + { + case -1: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 2); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken hungry."); + break; + } + case -2: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 4); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken quite hungry."); + break; + } + case -3: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 5); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken really hungry."); + break; + } + case -4: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 6); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken very hungry."); + break; + } + case -5: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 7); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken painfully hungry."); + break; + } + case -6: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 8); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you awaken extremely hungry."); + break; + } + case -7: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 10); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You rest well, but you are starving to death."); + break; + } + case -8: + { + effect eEffect = EffectAbilityDecrease(ABILITY_CONSTITUTION, 12); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You will die soon if you don't eat."); + break; + } + case -9: + { + effect eEffect = EffectDeath(); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You have starved to death."); + break; + } + } + switch (iThirsty) + { + case -1: + { + effect eEffect = EffectNegativeLevel(1,FALSE); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You awaken and are quite thirsty."); + break; + } + case -2: + { + effect eEffect = EffectNegativeLevel(2,FALSE); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You awaken and are extremely thirsty."); + break; + } + case -3: + { + effect eEffect = EffectNegativeLevel(3,FALSE); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You awaken and are dreadfully thirsty."); + break; + } + case -4: + { + effect eEffect = EffectNegativeLevel(4,FALSE); + eEffect = ExtraordinaryEffect(eEffect); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You are dying of thirst, you need to find something to drink."); + break; + } + case -5: + { + effect eEffect = EffectDeath(); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC); + SendMessageToPC(oPC,"You have died of thirst."); + break; + } + } - } + } } diff --git a/_module/nss/pc_savebuffs.nss b/_module/nss/pc_savebuffs.nss new file mode 100644 index 00000000..96b42d00 --- /dev/null +++ b/_module/nss/pc_savebuffs.nss @@ -0,0 +1,182 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pc_savebuffs +//////////////////////////////////////////////////////////////////////////////// + Used with pi_buffing to run the buffing plugin for + Philos Single Player Enhancements. + +Note: If a spell saves incorrectly check the spell script to see if the correct +spell is being passed through the SignalEvent correctly. +Known error in Shield of Faith spell as the below code in the shield of faith +script sends Camoflage instead! +"SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, 421, FALSE));" +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag = ""); +// sDataField should be one of the data fields for that table. +// sData is the string data to be saved. +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag = ""); +// sDataField should be one of the data fields for that table. +// jData is the json data to be saved. +void SetBuffDatabaseJson(object oPlayer, string sDataField, json jData, string sTag = ""); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag = ""); +// Returns the level if this spell has a domain spell on nLevel, or 0. +int GetHasDomainSpell(object oCaster, int nClass, int nLevel, int nSpell); + +// We do some crazy hack to get all the correct information when casting spells. +// GetLastSpellCastClass() will only give the class if this script is running +// on the actual caster, i.e. our PC. +// GetLastSpellLevel() will only give the level if this script is running on +// the actual caster, i.e. our PC. +// So for this to work we run this scrip in the event OnSpellCastAt of our +// target, then we ExecuteScript this script again with the Caster (oPC) +// as OBJECT_SELF for this script on its second pass. This allows us to get the +// information from the above functions! Neat! +void main() +{ + object oTarget = OBJECT_SELF; + // The first pass we get oCaster via GetLastSpellCaster() fails in ExecuteScript! + // The second pass we get oCaster via the variable "AI_BUFF_CASTER". + object oCaster = GetLocalObject(oTarget, "AI_BUFF_CASTER"); + if(oCaster == OBJECT_INVALID) oCaster = GetLastSpellCaster(); + // We setting up the save spells button we saved the PC to itself. + // Here we get the PC to make sure the caster of this spell is our saving PC. + object oPC = GetLocalObject(oCaster, "AI_BUFF_PC"); + // The first pass we get nspell via GetLastSpell() fails in ExecuteScript! + // The second pass we get nSpell via the variable "AI_BUFF_SPELL". + int nSpell = GetLocalInt(oTarget, "AI_BUFF_SPELL"); + if(nSpell == 0) nSpell = GetLastSpell(); + // If this is a harful spell or The caster does not equal our saving PC then + // we need to fix the targets scripts back and run the correct OnSpellCastAt script. + if(GetLastSpellHarmful() || oPC != oCaster) + { + string sScript = GetLocalString(oTarget, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + ExecuteScript(sScript, oTarget); + return; + } + // If the oTarget != oCaster then we are casting a spell on one of our + // associates. We must make a second pass to get the correct information. + // We do this by saving the Target, Caster, and Spell so we can get them + // in the second pass as Execute Script makes them impossible to get on a + // second pass. + if(oTarget != oCaster) + { + SetLocalObject(oPC, "AI_BUFF_TARGET", oTarget); + SetLocalObject(oPC, "AI_BUFF_CASTER", oCaster); + SetLocalInt(oPC, "AI_BUFF_SPELL", nSpell); + ExecuteScript("pc_savebuffs", oPC); + return; + } + // If this is the first pass and we get here then oCaster is casting a spell + // on themselves. So oTarget will be invalid and we should use oPC. + // If this is the second pass and we get here then we have saved oTarget + // to oPC and this will get them so we can save the target to the spell! + oTarget = GetLocalObject(oPC, "AI_BUFF_TARGET"); + if(oTarget == OBJECT_INVALID) oTarget = oPC; + // We need to clean up this mess! + DeleteLocalObject(oPC, "AI_BUFF_TARGET"); + DeleteLocalObject(oPC, "AI_BUFF_CASTER"); + DeleteLocalInt(oPC, "AI_BUFF_SPELL"); + // This blocks one spell from saving multiple times due to being an AOE. + if(GetLocalInt(oPC, "AI_ONLY_ONE")) return; + SetLocalInt(oPC, "AI_ONLY_ONE", TRUE); + // We delay this for just less than half a round due to haste. + DelayCommand(2.5, DeleteLocalInt(oPC, "AI_ONLY_ONE")); + // Here is the whole problem and why we must do a second pass if the target + // is not the caster. These only work if this script is run by the caster. + int nClass = GetLastSpellCastClass(); + int nLevel = GetLastSpellLevel(); + // Everything below saves the spell to the database with all our now correct info. + int nDomain = GetHasDomainSpell(oPC, nClass, nLevel, nSpell); + int nMetaMagic = GetMetaMagicFeat(); + string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(nDomain) sName += " [Domain]"; + if(nMetaMagic > 0 && StringToInt(Get2DAString("classes", "MemorizesSpells", nClass))) + { + // We must add the level of the metamagic to the spells level to get the spells correct level. + if(nMetaMagic == METAMAGIC_EMPOWER) { sName += " (Empowered)"; nLevel += 2; } + else if(nMetaMagic == METAMAGIC_EXTEND) { sName += " (Extended)"; nLevel += 1; } + else if(nMetaMagic == METAMAGIC_MAXIMIZE) { sName += " (Maximized)"; nLevel += 3; } + else if(nMetaMagic == METAMAGIC_QUICKEN) { sName += " (Quickened)"; nLevel += 4; } + else if(nMetaMagic == METAMAGIC_SILENT) { sName += " (Silent)"; nLevel += 1; } + else if(nMetaMagic == METAMAGIC_STILL) { sName += " (Still)"; nLevel += 1; } + } + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + string sList = JsonGetString(JsonArrayGet(jMenuData, 0)); + json jSpells = GetBuffDatabaseJson(oPC, "spells", sList); + json jSpell = JsonArray(); + jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nMetaMagic)); + jSpell = JsonArrayInsert(jSpell, JsonInt(nDomain)); + string sTargetName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oTarget, TRUE))); + jSpell = JsonArrayInsert(jSpell, JsonString(sTargetName)); + jSpell = JsonArrayInsert(jSpells, jSpell); + SetBuffDatabaseJson(oPC, "spells", jSpells, sList); + SendMessageToPC(oPC, sName + " has been saved for fast buffing on " + sTargetName + "."); + ExecuteScript("pi_buffing", oPC); +} +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if (SqlStep (sql)) return SqlGetString (sql, 0); + else return ""; +} +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@data", sData); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + SqlStep (sql); +} +void SetBuffDatabaseJson (object oPlayer, string sDataField, json jData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindJson (sql, "@data", jData); + SqlBindString (sql, "@name", sName); + SqlBindString (sql, "@tag", sTag); + SqlStep (sql); +} +json GetBuffDatabaseJson (object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString (sql, "@name", sName); + SqlBindString (sql, "@tag", sTag); + if (SqlStep (sql)) return SqlGetJson (sql, 0); + else return JsonArray (); +} +int GetHasDomainSpell(object oCaster, int nClass, int nLevel, int nSpell) +{ + int nIndex, nMaxIndex, nMSpell, nMmSpell, bDomain, nSubRadSpell, nSubSpell; + string sSubRadSpell; + if(StringToInt(Get2DAString("classes", "MemorizesSpells", nClass))) + { + nMaxIndex = GetMemorizedSpellCountByLevel(oCaster, nClass, nLevel); + while(nIndex < nMaxIndex) + { + nMSpell = GetMemorizedSpellId(oCaster, nClass, nLevel, nIndex); + if(nSpell == nMSpell) + { + if(GetMemorizedSpellIsDomainSpell(oCaster, nClass, nLevel, nIndex)) return nLevel; + } + nIndex ++; + } + } + return 0; +} diff --git a/_module/nss/pe_buffing.nss b/_module/nss/pe_buffing.nss new file mode 100644 index 00000000..a6c40500 --- /dev/null +++ b/_module/nss/pe_buffing.nss @@ -0,0 +1,534 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pe_buffing +//////////////////////////////////////////////////////////////////////////////// + Used with pi_buffing to run the buffing plugin for + Philos Single Player Enhancements. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" + +const int BUFF_MAX_SPELLS = 50; +const string FB_NO_MONSTER_CHECK = "FB_NO_MONSTER_CHECK"; + +// sDataField should be one of the data fields for that table. +// sData is the string data to be saved. +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag); +// sDataField should be one of the data fields for that table. +// jData is the json data to be saved. +void SetBuffDatabaseJson(object oPlayer, string sDataField, json jData, string sTag); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag); +// Casts all buff spells saved to the widget button. +void CastSavedBuffSpells(object oPC); +// Will check and make sure the spell is memorized and/or ready. +// Returns TRUE if memorized and ready, FALSE if memorized but not ready, +// and -1 if not memorized for classes that memorize. +// nSpell is the spell to find. +// nClass that cast the spell. +// nLevel the level of the spell. +// nMetamagic is if it has metamagic on it. +// nDomain is if it is a domain spell. +int GetSpellReady(object oCaster, int nSpell, int nClass, int nLevel, int nMetamagic, int nDomain); +// Creates the Buffing widget. +void PopupWidgetBuffGUIPanel(object oPC); +void main() +{ + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + string sWndId = NuiGetWindowId (oPC, nToken); + //************************************************************************** + // Watch to see if the window moves and save. + if(sElem == "window_geometry" && sEvent == "watch") + { + if(!GetLocalInt (oPC, AI_NO_NUI_SAVE)) + { + // Get the height, width, x, and y of the window. + json jGeom = NuiGetBind(oPC, nToken, "window_geometry"); + // Save on the player using the sWndId. + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + if(sWndId == "plbuffwin") + { + jMenuData = JsonArraySet(jMenuData, 1, JsonObjectGet(jGeom, "x")); + jMenuData = JsonArraySet(jMenuData, 2, JsonObjectGet(jGeom, "y")); + } + else if(sWndId == "widgetbuffwin") + { + jMenuData = JsonArraySet(jMenuData, 5, JsonObjectGet(jGeom, "x")); + jMenuData = JsonArraySet(jMenuData, 6, JsonObjectGet(jGeom, "y")); + } + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + } + return; + } + //************************************************************************** + // Spell Buffing. + if(sWndId == "plbuffwin") + { + if(sEvent == "click") + { + string sList; + if(GetStringLeft(sElem, 10) == "btn_spell_") + { + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + sList = JsonGetString(JsonArrayGet(jMenuData, 0)); + json jSpells = GetBuffDatabaseJson(oPC, "spells", sList); + int nIndex = StringToInt(GetStringRight(sElem, GetStringLength(sElem) - 10)); + int nSpell = JsonGetInt(JsonArrayGet(JsonArrayGet(jSpells, nIndex), 0)); + string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + jSpells = JsonArrayDel(jSpells, nIndex); + SetBuffDatabaseJson(oPC, "spells", jSpells, sList); + ai_SendMessages(sName + " has been removed from the list.", AI_COLOR_YELLOW, oPC); + ExecuteScript("pi_buffing", oPC); + } + else if(sElem == "btn_save") + { + string sScript; + object oCreature; + if(JsonGetInt(NuiGetBind (oPC, nToken, "btn_save"))) + { + sScript = GetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + SetLocalObject(oPC, "AI_BUFF_PC", oPC); + SetLocalString(oPC, "AI_BUFF_CAST_AT_SCRIPT", sScript); + SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "pc_savebuffs"); + // Setup your followers to allow spells to be saved on them as well. + int nAssociateType = 2; + object oAssociate = GetAssociate(nAssociateType, oPC); + while(nAssociateType < 5) + { + if(oAssociate != OBJECT_INVALID) + { + SetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT", sScript); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "pc_savebuffs"); + } + oAssociate = GetAssociate(++nAssociateType, oPC); + } + int nIndex = 1; + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(nIndex <= AI_MAX_HENCHMAN) + { + if(oAssociate != OBJECT_INVALID) + { + SetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT", sScript); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "pc_savebuffs"); + } + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + ai_SendMessages("Cast spells on yourself or an associate to save them to the widget.", AI_COLOR_YELLOW, oPC); + } + else + { + DeleteLocalObject(oPC, "AI_BUFF_PC"); + sScript = GetLocalString(oPC, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oPC, "AI_BUFF_CAST_AT_SCRIPT"); + // Cleanup your followers to allow spells to be reacted to as normal. + int nAssociateType = 2; + object oAssociate = GetAssociate(nAssociateType, oPC); + while(nAssociateType < 5) + { + if(oAssociate != OBJECT_INVALID) + { + sScript = GetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + } + oAssociate = GetAssociate(++nAssociateType, oPC); + } + int nIndex = 1; + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(nIndex <= AI_MAX_HENCHMAN) + { + if(oAssociate != OBJECT_INVALID) + { + sScript = GetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + } + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + NuiSetBind(oPC, nToken, "btn_save", JsonBool(FALSE)); + ai_SendMessages("Saving spells to the list has been turned off.", AI_COLOR_YELLOW, oPC); + } + } + else if(sElem == "btn_clear") + { + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + sList = JsonGetString(JsonArrayGet(jMenuData, 0)); + SetBuffDatabaseJson(oPC, "spells", JsonArray(), sList); + ExecuteScript("pi_buffing", oPC); + } + else if(sElem == "btn_buff") CastSavedBuffSpells(oPC); + // Runs all the List 1-4 buttons. + if(GetStringLeft(sElem, 8) == "btn_list") + { + sList = "list" + GetStringRight(sElem, 1); + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + jMenuData = JsonArraySet(jMenuData, 0, JsonString(sList)); + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + ExecuteScript("pi_buffing", oPC); + } + } + else if(sEvent == "watch") + { + if(sElem == "buff_widget_check") + { + int bBuffWidget = JsonGetInt(NuiGetBind(oPC, nToken, "buff_widget_check")); + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + jMenuData = JsonArraySet(jMenuData, 3, JsonBool(bBuffWidget)); + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + if(bBuffWidget) PopupWidgetBuffGUIPanel(oPC); + else NuiDestroy(oPC, NuiFindWindow(oPC, "widgetbuffwin")); + } + if(sElem == "lock_buff_widget_check") + { + int bBuffLockWidget = JsonGetInt(NuiGetBind(oPC, nToken, "lock_buff_widget_check")); + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + if(bBuffLockWidget) jMenuData = JsonArraySet(jMenuData, 3, JsonBool(TRUE)); + jMenuData = JsonArraySet(jMenuData, 4, JsonBool(bBuffLockWidget)); + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + NuiSetBind(oPC, nToken, "buff_widget_check", JsonBool(TRUE)); + PopupWidgetBuffGUIPanel(oPC); + } + if(sElem == "chbx_no_monster_check_check") + { + int bNoCheckMonsters = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetLocalInt(oPC, FB_NO_MONSTER_CHECK, bNoCheckMonsters); + } + } + } + //************************************************************************** + // Spell Buffing. + else if(sWndId == "widgetbuffwin") + { + if(sEvent == "click") + { + string sList; + if(sElem == "btn_one") sList = "list1"; + if(sElem == "btn_two") sList = "list2"; + if(sElem == "btn_three") sList = "list3"; + if(sElem == "btn_four") sList = "list4"; + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + jMenuData = JsonArraySet(jMenuData, 0, JsonString(sList)); + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + CastSavedBuffSpells(oPC); + } + } +} +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@data", sData); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + SqlStep (sql); +} +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if (SqlStep (sql)) return SqlGetString (sql, 0); + else return ""; +} +void SetBuffDatabaseJson (object oPlayer, string sDataField, json jData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindJson (sql, "@data", jData); + SqlBindString (sql, "@name", sName); + SqlBindString (sql, "@tag", sTag); + SqlStep (sql); +} +json GetBuffDatabaseJson (object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if(SqlStep(sql)) return SqlGetJson(sql, 0); + else return JsonArray(); +} +void CastBuffSpell (object oPC, object oTarget, int nSpell, int nClass, int nMetamagic, int nDomain, string sList, string sName) +{ + string sTargetName; + if(oPC == oTarget) sTargetName = "myself."; + else sTargetName = GetName(oTarget); + ai_SendMessages("Quick Buffing: " + sName + " on " + sTargetName, AI_COLOR_GREEN, oPC); + AssignCommand(oPC, ActionCastSpellAtObject(nSpell, oTarget, nMetamagic, FALSE, nDomain, 0, TRUE, nClass)); +} +void CastSavedBuffSpells(object oPC) +{ + // Lets make sure the save button is off! + if(GetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT) == "pc_savebuffs") + { + string sScript = GetLocalString(oPC, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oPC, "AI_BUFF_CAST_AT_SCRIPT"); + // Cleanup your followers to allow spells to be reacted to as normal. + int nAssociateType = 2; + object oAssociate = GetAssociate(nAssociateType, oPC); + while(nAssociateType < 5) + { + if(oAssociate != OBJECT_INVALID) + { + sScript = GetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + } + oAssociate = GetAssociate(++nAssociateType, oPC); + } + int nIndex = 1; + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(nIndex <= AI_MAX_HENCHMAN) + { + if(oAssociate != OBJECT_INVALID) + { + sScript = GetLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + DeleteLocalString(oAssociate, "AI_BUFF_CAST_AT_SCRIPT"); + } + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + int nMainWindow = NuiFindWindow(oPC, "plbuffwin"); + if(nMainWindow) NuiSetBind(oPC, nMainWindow, "btn_save", JsonBool(FALSE)); + ai_SendMessages("Saving spells to the list has been turned off.", AI_COLOR_YELLOW, oPC); + } + float fDistance; + if(!GetLocalInt(oPC, FB_NO_MONSTER_CHECK)) + { + // Check for monsters! We cannot let them buff if they are close to the enemy! + object oEnemy = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPC); + fDistance = GetDistanceBetween(oPC, oEnemy); + } + if(fDistance > 30.0f || fDistance == 0.0) + { + string sName; + float fDelay = 0.1f; + int nSpell, nClass, nLevel, nMetamagic, nDomain, nSpellReady, nIndex = 0; + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + string sList = JsonGetString(JsonArrayGet(jMenuData, 0)); + json jSpell, jSpells = GetBuffDatabaseJson(oPC, "spells", sList); + while(nIndex <= BUFF_MAX_SPELLS) + { + jSpell = JsonArrayGet(jSpells, nIndex); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); + nMetamagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + // We save the target's name then look them up by it. + string sTargetName = JsonGetString(JsonArrayGet(jSpell, 5)); + object oTarget; + location lLocation = GetLocation(oPC); + if(sTargetName == "" || sTargetName == ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName (oPC)))) oTarget = oPC; + else + { + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 10.0, lLocation, TRUE); + while(oTarget != OBJECT_INVALID) + { + if(sTargetName == ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oTarget)))) break; + oTarget = GetNextObjectInShape(SHAPE_SPHERE, 10.0, lLocation, TRUE); + } + } + sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + if(oTarget == OBJECT_INVALID) + { + DelayCommand(fDelay, ai_SendMessages("Cannot quick cast " + sName + " because the " + sTargetName + " is not here!", AI_COLOR_RED, oPC)); + } + else + { + if(nMetamagic > 0) + { + if(nMetamagic == METAMAGIC_EMPOWER) sName += " (Empowered)"; + else if(nMetamagic == METAMAGIC_EXTEND) sName += " (Extended)"; + else if(nMetamagic == METAMAGIC_MAXIMIZE) sName += " (Maximized)"; + else if(nMetamagic == METAMAGIC_QUICKEN) sName += " (Quickened)"; + else if(nMetamagic == METAMAGIC_SILENT) sName += " (Silent)"; + else if(nMetamagic == METAMAGIC_STILL) sName += " (Still)"; + } + nSpellReady = GetSpellReady(oPC, nSpell, nClass, nLevel, nMetamagic, nDomain); + if(nSpellReady == TRUE) + { + DelayCommand(fDelay, CastBuffSpell(oPC, oTarget, nSpell, nClass, nMetamagic, nDomain, sList, sName)); + } + else if(nSpellReady == -1) + { + DelayCommand(fDelay, ai_SendMessages("Cannot quick cast " + sName + " because it is not ready to cast!", AI_COLOR_RED, oPC)); + } + else if(nSpellReady == -2) + { + DelayCommand (fDelay, ai_SendMessages("Cannot quick cast " + sName + " because it is not memorized!", AI_COLOR_RED, oPC)); + } + else if(nSpellReady == -3) + { + DelayCommand (fDelay, ai_SendMessages("Cannot quick cast " + sName + " because there are no spell slots of that level left!", AI_COLOR_RED, oPC)); + } + else if(nSpellReady == -4) + { + DelayCommand (fDelay, ai_SendMessages("Cannot quick cast " + sName + " because that spell is not known.", AI_COLOR_RED, oPC)); + } + fDelay += 0.1f; + } + } + else break; + nIndex ++; + } + if(nIndex == 0 && !NuiFindWindow(oPC, "plbuffwin")) ExecuteScript("pi_buffing", oPC); + } + else ai_SendMessages("Enemies are too close for you to cast all your buff spells!", AI_COLOR_RED, oPC); +} +int GetSpellReady(object oCaster, int nSpell, int nClass, int nLevel, int nMetamagic, int nDomain) +{ + int nIndex, nMaxIndex, nMSpell, nMmSpell, nDSpell, nSubRadSpell, nSubSpell; + string sSubRadSpell; + if(StringToInt(Get2DAString("classes", "MemorizesSpells", nClass))) + { + int nSpellMemorized; + while(nIndex < nMaxIndex) + { + nMSpell = GetMemorizedSpellId(oCaster, nClass, nLevel, nIndex); + if(nSpell == nMSpell) + { + nMmSpell = GetMemorizedSpellMetaMagic(oCaster, nClass, nLevel, nIndex); + nDSpell = GetMemorizedSpellIsDomainSpell(oCaster, nClass, nLevel, nIndex); + //ai_Debug("pe_buffing", "308", "nMmSpell: " + IntToString(nMmSpell) + + // " nMetamagic: " + IntToString(nMetamagic) + + // " nDomain: " + IntToString(nDomain) + + // " nDSpell: " + IntToString(nDSpell)); + // Cannot save the domain status so we just use the first spell ID. + // Then return the domain statusl. + //if(nMmSpell == nMetamagic && + // ((nDomain > 0 && nDSpell == TRUE) || nDomain == 0 && nDSpell == FALSE)) + if(nMmSpell == nMetamagic) + { + nSpellMemorized = TRUE; + if(GetMemorizedSpellReady(oCaster, nClass, nLevel, nIndex)) + { + if(nDSpell == nDomain) return TRUE; + } + } + } + for(nSubRadSpell = 1; nSubRadSpell < 5; nSubRadSpell++) + { + sSubRadSpell = "SubRadSpell" + IntToString(nSubRadSpell); + if(nSpell == StringToInt(Get2DAString("spells", sSubRadSpell, nMSpell))) + nMmSpell = GetMemorizedSpellMetaMagic(oCaster, nClass, nLevel, nIndex); + nDSpell = GetMemorizedSpellIsDomainSpell(oCaster, nClass, nLevel, nIndex); + ai_Debug("pe_buffing", "421", "nMmSpell: " + IntToString(nMmSpell) + + " nMetamagic: " + IntToString(nMetamagic) + + " nDomain: " + IntToString(nDomain) + + " nDSpell: " + IntToString(nDSpell)); + if(nMmSpell == nMetamagic) + { + nSpellMemorized = TRUE; + if(GetMemorizedSpellReady(oCaster, nClass, nLevel, nIndex)) + { + if(nDSpell == nDomain) return TRUE; + } + } + } + nIndex ++; + } + if(nSpellMemorized) return -1; + return -2; + } + else + { + int nSpellKnown; + nMaxIndex = GetKnownSpellCount(oCaster, nClass, nLevel); + while(nIndex < nMaxIndex) + { + nMSpell = GetKnownSpellId(oCaster, nClass, nLevel, nIndex); + if(nSpell == nMSpell) + { + nSpellKnown = TRUE; + if(GetSpellUsesLeft(oCaster, nClass, nSpell)) return TRUE; + } + for(nSubRadSpell = 1; nSubRadSpell < 5; nSubRadSpell++) + { + sSubRadSpell = "SubRadSpell" + IntToString(nSubRadSpell); + if(nSpell == StringToInt(Get2DAString("spells", sSubRadSpell, nMSpell))) + { + nSpellKnown = TRUE; + if(GetSpellUsesLeft(oCaster, nClass, nSpell)) return TRUE; + } + } + nIndex ++; + } + if(nSpellKnown) return -3; + return -4; + } + return -2; +} +void PopupWidgetBuffGUIPanel(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // Row 1 (buttons)********************************************************** + + json jRow = CreateButtonImage(JsonArray(), "ir_level1", "btn_one", 35.0f, 35.0f, 0.0); + jRow = CreateButtonImage(jRow, "ir_level2", "btn_two", 35.0f, 35.0f, 0.0); + jRow = CreateButtonImage(jRow, "ir_level3", "btn_three", 35.0f, 35.0f, 0.0); + jRow = CreateButtonImage(jRow, "ir_level4", "btn_four", 35.0f, 35.0f, 0.0); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + int bAIBuffWidgetLock = JsonGetInt(JsonArrayGet(jMenuData, 4)); + // Get the window location to restore it from the database. + float fX = JsonGetFloat(JsonArrayGet(jMenuData, 5)); + float fY = JsonGetFloat(JsonArrayGet(jMenuData, 6)); + if(fX == 0.0f && fY == 0.0f) + { + fX = 10.0f; + fY = 10.0f; + } + float fGUI_Scale = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0; + if(bAIBuffWidgetLock) + { + fX += 4.0f; + // GUI scales are a mess, I just figured them out per scale to keep the widget from moving. + if(fGUI_Scale == 1.0) fY += 37.0; + else if(fGUI_Scale == 1.1) fY += 38.0; + else if(fGUI_Scale == 1.2) fY += 40.0; + else if(fGUI_Scale == 1.3) fY += 42.0; + else if(fGUI_Scale == 1.4) fY += 43.0; + else if(fGUI_Scale == 1.5) fY += 45.0; + else if(fGUI_Scale == 1.6) fY += 47.0; + else if(fGUI_Scale == 1.7) fY += 48.0; + else if(fGUI_Scale == 1.8) fY += 50.0; + else if(fGUI_Scale == 1.9) fY += 52.0; + else if(fGUI_Scale == 2.0) fY += 54.0; + } + // Set the layout of the window. + json jLayout = NuiCol(jCol); + int nToken; + if(bAIBuffWidgetLock) nToken = SetWindow (oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 62.0, FALSE, FALSE, FALSE, TRUE, FALSE, "pe_buffing"); + else nToken = SetWindow (oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 95.0, FALSE, FALSE, FALSE, TRUE, TRUE, "pe_buffing"); + // Set event watches for window inspector and save window location. + NuiSetBindWatch (oPC, nToken, "collapsed", TRUE); + NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE); + // Set the buttons to show events. + //NuiSetBind (oPC, nToken, "btn_one", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_one_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_two", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_two_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_three", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_three_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_four", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_four_event", JsonBool (TRUE)); +} + diff --git a/_module/nss/pe_crafting.nss b/_module/nss/pe_crafting.nss new file mode 100644 index 00000000..388c86a4 --- /dev/null +++ b/_module/nss/pe_crafting.nss @@ -0,0 +1,2153 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pe_crafting +//////////////////////////////////////////////////////////////////////////////// + Used with pi_crafting to run the crafting plugin events for + Philos Single Player Enhancements. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "nw_inc_gff" +#include "0i_main" +#include "0i_items" +// Maximum model number for all items except weapons. +const int CRAFT_MAX_MODEL_NUMBER = 999; + +struct stWeaponAppearance +{ + object oItem; + int nModel; + int nColor; + string sPart; +}; +// Maximum model number for weapons. Note this will be the 100s and 10s places. +// The color number uses the ones place. Thus 25 is actually 250. +const int CRAFT_MAX_WEAPON_MODEL_NUMBER = 99; +const string CRAFT_JSON = "CRAFT_JSON"; +const string CRAFT_ORIGINAL_ITEM = "CRAFT_ORIGINAL_ITEM"; +const string CRAFT_COOL_DOWN = "CRAFT_COOL_DOWN"; +const string CRAFT_ITEM_SELECTION = "CRAFT_ITEM_SELECTION"; +const string CRAFT_MATERIAL_SELECTION = "CRAFT_MATERIAL_SELECTION"; +const string CRAFT_MODEL_SELECTION = "CRAFT_MODEL_SELECTION"; +const string CRAFT_MODEL_SPECIAL = "CRAFT_MODEL_SPECIAL"; +const string CRAFT_ITEM_TYPE = "CRAFT_ITEM_TYPE"; +const string CRAFT_WEAPON_MOD_TOP = "CRAFT_WEAPON_MOD_TOP"; +const string CRAFT_WEAPON_MOD_MID = "CRAFT_WEAPON_MOD_MID"; +const string CRAFT_WEAPON_MOD_BOT = "CRAFT_WEAPON_MOD_BOT"; +const string CRAFT_WEAPON_COL_TOP = "CRAFT_WEAPON_COL_TOP"; +const string CRAFT_WEAPON_COL_MID = "CRAFT_WEAPON_COL_MID"; +const string CRAFT_WEAPON_COL_BOT = "CRAFT_WEAPON_COL_BOT"; +const string CRAFT_COPY_ITEM = "CRAFT_COPY_ITEM"; +const string CRAFT_COPY_ITEM_TYPE = "CRAFT_COPY_ITEM_TYPE"; +const string CRAFT_COPY_MODEL = "CRAFT_COPY_MODEL"; +const string CRAFT_COPY_COLOR = "CRAFT_COPY_COLOR"; +const string CRAFT_COPY_PART_COLOR = "CRAFT_COPY_PART_COLOR"; +const string CRAFT_ARMOR_AC = "CRAFT_ARMOR_AC"; +const string CRAFT_COLOR_PALLET = "CRAFT_COLOR_PALLET"; +const string CRAFT_LEFT_PART_COLOR = "CRAFT_LEFT_PART_COLOR"; +const string CRAFT_ALL_COLOR = "CRAFT_ALL_COLOR"; +const string CRAFT_RIGHT_PART_COLOR = "CRAFT_RIGHT_PART_COLOR"; +const string CRAFT_TARGET = "CRAFT_TARGET"; +// Tag used in lighting effects. +const string CRAFT_HIGHLIGHT = "CRAFT_HIGHLIGHT"; +const string CRAFT_ULTRALIGHT = "CRAFT_ULTRALIGHT"; +// The tags for containers used to do some crafting. +const string CRAFT_TEMPLATE = "x3_plc_basket"; +const string CRAFT_CONTAINER = "CRAFT_CONTAINER"; +// Used in the crafting GUI to copy an item to be pasted to another item later. +void CopyCraftingItem(object oPC, object oItem); +// Used in the crafting GUI to paste a copy of an item to another item. +object PasteCraftingItem(object oPC, object oTarget, object oItem); +int GetItemSelectedEquipSlot(int nItemSelected); +int GetArmorModelSelected(object oPC); +object ChangeItemsAppearance(object oPC, object oTarget, int nToken, object oItem, int nDirection, string sPart); +// Checks to see if the item can be crafted. +// bPasteCheck is a special check when an item is being pasted. +int CanCraftItem(object oPC, object oItem, int nToken, int bPasteCheck = FALSE); +object RandomizeItemsCraftAppearance(object oPlayer, object oTarget, int nToken, object oItem); +// Returns the correct item based on the crafting menu selected item. +object GetSelectedItem(object oTarget, int nItemSelected); +// Cancels the crafted item for the player and restoring the original. +void CancelCraftedItem(object oPlayer, object oTarget); +// Gets the colorId from a image of the color pallet. +// Thanks Zunath for the base code. +int GetColorPalletId(object oPC, int nToken); +// Sets the pointer based on current Item, Part, and Material selected. +void SetColorPalletPointer(object oPC, int nToken, object oItem); +// Locks/Unlocks specific buttons when an item has been changed. +void LockItemInCraftingWindow(object oPC, object oItem, object oTarget, int nToken); +// Locks/Unlocks specific buttons when an item has been cleared. +void ClearItemInCraftingWindow(object oPC, object oItem, int nToken); +// Saves the crafted item for the player removing the original. +void SaveCraftedItem(object oPC, object oTarget, int nToken); +// Remove Effect of type specified from oCreature; +// sEffectTag is the tag of the effect to remove. +// Feat, Class, Racial. +void RemoveTagedEffects(object oCreature, string sEffectTag); +// Returns TRUE/FALSE if item has temporary item property. +int CheckForTemporaryItemProperty(object oItem); +// Updates the model number text in the NUI menu. +void SetModelNumberText(object oPC, object oTarget, int nToken); +// Sets the material buttons for use. +// nMaterial 0,1 Cloth 2,3 Leather 4,5 Metal -1 None. +void SetMaterialButtons(object oPC, int nToken, int nMaterial); +// Creates the item editing menu. +void CreateItemGUIPanel(object oPC, object oTarget); +// Events for ItemGUIPanel +void CraftItemInfoEvents(object oPC, int nToken); +// Creates the save/load menu for items. +//void CreateDresserGUIPanel(object oPC, object oTarget); + +int GetColorIDChange(object oItem, int nType, int nIndex, int nChange) +{ + int nColorId = GetItemAppearance(oItem, nType, nIndex) + nChange; + if(nColorId > 175) return 0; + if(nColorId < 0) return 175; + return nColorId; +} +void main() +{ + // Get the last player to use targeting mode + object oPC = GetLastPlayerToSelectTarget(); + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + if(oPC == OBJECT_SELF && sTargetMode != "") + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + //vector vTarget = GetTargetingModeSelectedPosition(); + //location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + //object oObject = GetLocalObject(oPC, "AI_TARGET_OBJECT"); + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget))// && vTarget == Vector()) + { + return; + } + // Targeting code here. + if(sTargetMode == "SELECT_TARGET") + { + if(GetAssociateType(oTarget) == ASSOCIATE_TYPE_HENCHMAN || + ai_GetIsCharacter(oTarget)) + { + SetLocalObject(oPC, CRAFT_TARGET, oTarget); + AttachCamera(oPC, oTarget); + ExecuteScript("pi_crafting", oPC); + } + else ai_SendMessages(GetName(oTarget) + " is not the player or a henchmen! Other associates cannot use item crafting.", AI_COLOR_RED, oPC); + } + DeleteLocalString(oPC, AI_TARGET_MODE); + } + else + { + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sWndId = NuiGetWindowId (oPC, nToken); + if(sWndId == "craft_item_nui") + { + CraftItemInfoEvents(oPC, nToken); + return; + } + string sEvent = NuiGetEventType(); + // We don't use and it causes error windows to go off! Return early! + if(sEvent == "mouseup") return; + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + //SendMessageToPC(oPC, "0e_crafting, 144, sElem: " + sElem + " sEvent: " + sEvent); + //************************************************************************** + // Watch to see if the window moves and save. + if(sElem == "window_geometry" && sEvent == "watch") + { + if(!GetLocalInt (oPC, AI_NO_NUI_SAVE)) + { + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + if(JsonGetType(jCraft) == JSON_TYPE_NULL) jCraft = JsonObject(); + // Get the height, width, x, and y of the window. + json jGeometry = NuiGetBind(oPC, nToken, "window_geometry"); + jCraft = JsonObjectSet(jCraft, "CRAFT_MENU", jGeometry); + SetLocalJson(oPC, CRAFT_JSON, jCraft); + } + return; + } + //************************************************************************** + object oTarget = GetLocalObject(oPC, CRAFT_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oPC; + // Get the item we are crafting. + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetSelectedItem(oTarget, nItemSelected); + object oOriginalItem = GetLocalObject(oPC, CRAFT_ORIGINAL_ITEM); + if(oItem == OBJECT_INVALID) + { + if(sElem != "btn_cancel") + { + ai_SendMessages("The item we are adjusting is not equiped!", AI_COLOR_RED, oPC); + return; + } + } + else if(oOriginalItem != OBJECT_INVALID && GetTag(oItem) != GetTag(oOriginalItem)) + { + ai_SendMessages(GetName(oItem) + " is not the item you have been adjusting!", AI_COLOR_RED, oPC); + return; + } + // Changing the name needs to be before the cooldown. + if(sElem == "txt_item_name" && sEvent == "watch") + { + string sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_item_name")); + SetName(oItem, sName); + int nToken2 = NuiFindWindow(oPC, "craft_item_nui"); + if(nToken2) NuiSetBind(oPC, nToken2, "txt_item_name", JsonString(sName)); + return; + } + // Delay crafting so it has time to equip and unequip as well as remove. + //if(GetLocalInt(oPC, CRAFT_COOL_DOWN)) return; + //SetLocalInt(oPC, CRAFT_COOL_DOWN, TRUE); + //DelayCommand(0.25f, DeleteLocalInt(oPC, CRAFT_COOL_DOWN)); + // They have selected a color. + if(sElem == "color_pallet") + { + int nColorId, nChange; + object oNewItem; + if(sEvent == "mousedown") + { + // Get the color they selected from the color pallet cell. + nColorId = GetColorPalletId(oPC, nToken); + } + else if(sEvent == "mousescroll") + { + float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); + nChange = FloatToInt(nMouseScroll); + } + else return; + if(!CanCraftItem(oPC, oItem, nToken)) return; + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + int nBaseItemType = GetBaseItemType(oItem); + int nAllColor = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ALL_COLOR)); + if(!nAllColor && nBaseItemType == BASE_ITEM_ARMOR) + { + int nIndex; + int nModelSelected = GetArmorModelSelected(oPC); + int nLeftColor = JsonGetInt(JsonObjectGet(jCraft, CRAFT_LEFT_PART_COLOR)); + int nRightColor = JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR)); + if(nModelSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nModelSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nModelSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nModelSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + if(nChange) nColorId = GetColorIDChange(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nChange); + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nColorId, TRUE); + DestroyObject(oItem); + } + else + { + if(nRightColor) + { + // Color Right side. + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + if(nChange) nColorId = GetColorIDChange(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nChange); + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nColorId, TRUE); + DestroyObject(oItem); + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(TRUE)); + if(nLeftColor) + { + // If we are doing the left side then add one to get the left side. + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected = nModelSelected - 1; + else nModelSelected = nModelSelected + 1; + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + if(nChange) nColorId = GetColorIDChange(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nChange); + oItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nColorId, TRUE); + DestroyObject(oNewItem); + oNewItem = oItem; + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(TRUE)); + } + } + else if(nLeftColor) + { + // If we are doing the left side then add one to get the left side. + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected = nModelSelected - 1; + else nModelSelected = nModelSelected + 1; + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + if(nChange) nColorId = GetColorIDChange(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nChange); + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nColorId, TRUE); + DestroyObject(oItem); + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(TRUE)); + } + } + } + else + { + if(nChange) nColorId = GetColorIDChange(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected, nChange); + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected, nColorId, TRUE); + DestroyObject(oItem); + } + // Lock the new item so they can't change it on the character. + LockItemInCraftingWindow(oPC, oNewItem, oTarget, nToken); + // Equip new item. + if(nBaseItemType == BASE_ITEM_CLOAK) AssignCommand (oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CLOAK)); + else if(nBaseItemType == BASE_ITEM_HELMET) AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_HEAD)); + else if(nBaseItemType == BASE_ITEM_ARMOR) AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + } + else if(sEvent == "watch") + { + // The player is changing the item they are crafting. + if(sElem == "item_combo_selected") + { + int nSelected = JsonGetInt(NuiGetBind (oPC, nToken, sElem)); + oItem = GetSelectedItem(oTarget, nSelected); + if(oItem == OBJECT_INVALID) + { + ai_SendMessages("There is not an item to modify!", AI_COLOR_RED, oPC); + int nItem = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + NuiSetBind(oPC, nToken, "item_combo_selected", JsonInt(nItem)); + return; + } + jCraft = JsonObjectSet(jCraft, CRAFT_ITEM_SELECTION, JsonInt(nSelected)); + // Set button for cloak and helms. + if(nSelected == 1 || nSelected == 2) + { + int nHidden = GetHiddenWhenEquipped(oItem); + if(nHidden) jCraft = JsonObjectSet(jCraft, CRAFT_MODEL_SELECTION, JsonInt(1)); + else jCraft = JsonObjectSet(jCraft, CRAFT_MODEL_SELECTION, JsonInt(0)); + } + else jCraft = JsonObjectSet(jCraft, CRAFT_MODEL_SELECTION, JsonInt(0)); + SetLocalJson(oPC, CRAFT_JSON, jCraft); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_crafting", oPC); + } + // They have selected a part to change. + else if(sElem == "model_combo_selected") + { + int nSelected = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + jCraft = JsonObjectSet(jCraft, CRAFT_MODEL_SELECTION, JsonInt(nSelected)); + SetLocalJson(oPC, CRAFT_JSON, jCraft); + SetModelNumberText(oPC, oTarget, nToken); + int nItem = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + if(nItem == 1) // Cloak + { + if(!CanCraftItem(oPC, oItem, nToken)) return; + object oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oTarget); + if(nSelected == 1) SetHiddenWhenEquipped(oItem, TRUE); + else SetHiddenWhenEquipped(oItem, FALSE); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + else if(nItem == 2) // Headgear + { + if(!CanCraftItem(oPC, oItem, nToken)) return; + object oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oTarget); + if(nSelected == 1) SetHiddenWhenEquipped(oItem, TRUE); + else SetHiddenWhenEquipped(oItem, FALSE); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + else if(nItem == 4 && ai_GetIsShield(oItem)) + { + if(!CanCraftItem(oPC, oItem, nToken)) return; + object oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget); + if(nSelected == 1) SetHiddenWhenEquipped(oItem, TRUE); + else SetHiddenWhenEquipped(oItem, FALSE); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + if(ai_GetIsWeapon(oItem)) + { + // Clearing sets the module to 0 triggering an extra call. + if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + if(!CanCraftItem(oPC, oItem, nToken)) return; + int nVisual; + itemproperty ipProperty = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ipProperty)) + { + if(GetItemPropertyType(ipProperty) == ITEM_PROPERTY_VISUALEFFECT) + { + RemoveItemProperty(oItem, ipProperty); + } + ipProperty = GetNextItemProperty(oItem); + } + if(nSelected == 1) nVisual = ITEM_VISUAL_ACID; + else if(nSelected == 2) nVisual = ITEM_VISUAL_COLD; + else if(nSelected == 3) nVisual = ITEM_VISUAL_ELECTRICAL; + else if(nSelected == 4) nVisual = ITEM_VISUAL_EVIL; + else if(nSelected == 5) nVisual = ITEM_VISUAL_FIRE; + else if(nSelected == 6) nVisual = ITEM_VISUAL_HOLY; + else if(nSelected == 7) nVisual = ITEM_VISUAL_SONIC; + if(nVisual) + { + ipProperty = ItemPropertyVisualEffect(nVisual); + AddItemProperty(DURATION_TYPE_PERMANENT, ipProperty, oItem); + } + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + } + } + else if(sEvent == "click") + { + if(sElem == "btn_info") + { + SetLocalObject(oPC, "CRAFT_INFO_ITEM", oItem); + CreateItemGUIPanel(oPC, oItem); + } + //else if(sElem == "btn_wardrobe") CreateDresserGUIPanel(oPC, oTarget); + // Random button to change items looks randomly. + else if(sElem == "btn_randomize") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + oItem = RandomizeItemsCraftAppearance(oPC, oTarget, nToken, oItem); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + } + // Save any changes made to the selected item. + else if(sElem == "btn_save") + { + SaveCraftedItem(oPC, oTarget, nToken); + } + // Selecte target to change clothing on. + else if(sElem == "btn_select_target") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_crafting"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "SELECT_TARGET"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select either your charcter or a henchman to craft their equipment.", AI_COLOR_YELLOW, oPC); + DeleteLocalObject(oPC, CRAFT_ORIGINAL_ITEM); + DeleteLocalObject(oPC, CRAFT_TARGET); + DeleteLocalObject(oPC, "CRAFT_INFO_ITEM"); + if(GetLocalInt(oPC, CRAFT_ULTRALIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_ULTRALIGHT); + DeleteLocalInt(oPC, CRAFT_ULTRALIGHT); + } + if(GetLocalInt(oPC, CRAFT_HIGHLIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_HIGHLIGHT); + DeleteLocalInt(oPC, CRAFT_HIGHLIGHT); + } + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE , MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + // Cancel any changes made to the selected item. + else if(sElem == "btn_cancel") + { + // If the button is on cancel then clear the item. + if(JsonGetString(NuiGetBind(oPC, nToken, "btn_cancel_label")) == "Cancel") + { + CancelCraftedItem(oPC, oTarget); + ClearItemInCraftingWindow(oPC, oItem, nToken); + DelayCommand(0.5, NuiDestroy(oPC, nToken)); + DelayCommand(0.5, ExecuteScript("pi_crafting", oPC)); + } + // If the button is on Exit not Cancel then exit. + else + { + AssignCommand(oPC, RestoreCameraFacing()); + AttachCamera(oPC, oPC); + DeleteLocalObject(oPC, CRAFT_ORIGINAL_ITEM); + DeleteLocalObject(oPC, CRAFT_TARGET); + DeleteLocalObject(oPC, "CRAFT_INFO_ITEM"); + NuiDestroy(oPC, nToken); + nToken = NuiFindWindow(oPC, "craft_item_nui"); + if(nToken) NuiDestroy(oPC, nToken); + if(GetLocalInt(oPC, CRAFT_ULTRALIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_ULTRALIGHT); + DeleteLocalInt(oPC, CRAFT_ULTRALIGHT); + } + if(GetLocalInt(oPC, CRAFT_HIGHLIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_HIGHLIGHT); + DeleteLocalInt(oPC, CRAFT_HIGHLIGHT); + } + } + } + // Get the previous model of the selected item. + else if(GetStringLeft(sElem, 9) == "btn_prev_") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + oItem = ChangeItemsAppearance(oPC, oTarget, nToken, oItem, -1, GetStringRight(sElem, 1)); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + } + // Get the next model of the selected item. + else if(GetStringLeft(sElem, 9) == "btn_next_") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + oItem = ChangeItemsAppearance(oPC, oTarget, nToken, oItem, 1, GetStringRight(sElem, 1)); + LockItemInCraftingWindow(oPC, oItem, oTarget, nToken); + } + } + else if(sElem == "btn_highlight") + { + if(GetLocalInt(oPC, CRAFT_HIGHLIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_HIGHLIGHT); + DeleteLocalInt(oPC, CRAFT_HIGHLIGHT); + NuiSetBind(oPC, nToken, "btn_highlight", JsonBool(FALSE)); + } + else + { + if(GetLocalInt(oPC, CRAFT_ULTRALIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_ULTRALIGHT); + DeleteLocalInt(oPC, CRAFT_ULTRALIGHT); + } + SetLocalInt(oPC, CRAFT_HIGHLIGHT, TRUE); + effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20); + eLight = TagEffect(eLight, CRAFT_HIGHLIGHT); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oTarget); + NuiSetBind(oPC, nToken, "btn_highlight", JsonBool(TRUE)); + } + } + else if(sElem == "btn_left_part_color") + { + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(TRUE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(FALSE)); + SetColorPalletPointer(oPC, nToken, oItem); + } + else if(sElem == "btn_all_color") + { + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(TRUE)); + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(FALSE)); + SetColorPalletPointer(oPC, nToken, oItem); + } + else if(sElem == "btn_right_part_color") + { + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(TRUE)); + SetColorPalletPointer(oPC, nToken, oItem); + } + else if(sElem == "btn_right_part_reset") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + int nIndex; + int nModelSelected = GetArmorModelSelected(oPC); + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + object oNewItem; + if(nModelSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nModelSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nModelSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nModelSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, 255, TRUE); + DestroyObject(oItem); + } + else + { + nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, 255, TRUE); + DestroyObject(oItem); + } + // Lock the new item so they can't change it on the character. + LockItemInCraftingWindow(oPC, oNewItem, oTarget, nToken); + // Equip new item. + AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(FALSE)); + int nLeft = JsonGetInt(NuiGetBind(oPC, nToken, "btn_left_part_color")); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(!nLeft)); + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(!nLeft)); + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + nLeft = JsonGetInt(NuiGetBind(oPC, nToken, "btn_left_part_reset_event")); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nLeft)); + SetColorPalletPointer(oPC, nToken, oNewItem); + } + } + else if(sElem == "btn_all_reset") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + int nIndex, nColor; + json jItem = ObjectToJson(oItem, TRUE); + string sColor, sPartName; + for(nIndex = 0;nIndex < 19;nIndex++) + { + sPartName = "APart_" + IntToString(nIndex) + "_Col_"; + for(nColor = 0;nColor < 6;nColor++) + { + sColor = IntToString(nColor); + if(JsonGetType(GffGetByte(jItem, sPartName + sColor)) != JSON_TYPE_NULL) + { + jItem = GffRemoveByte(jItem, sPartName + sColor); + } + } + } + object oNewItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + DestroyObject(oItem); + // Lock the new item so they can't change it on the character. + LockItemInCraftingWindow(oPC, oNewItem, oTarget, nToken); + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(TRUE)); + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonInt(FALSE)); + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + SetColorPalletPointer(oPC, nToken, oNewItem); + } + } + else if(sElem == "btn_left_part_reset") + { + if(CanCraftItem(oPC, oItem, nToken)) + { + int nModelSelected = GetArmorModelSelected(oPC); + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected = nModelSelected - 1; + else nModelSelected = nModelSelected + 1; + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + int nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + object oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, 255, TRUE); + DestroyObject(oItem); + // Lock the new item so they can't change it on the character. + LockItemInCraftingWindow(oPC, oNewItem, oTarget, nToken); + // Equip new item. + AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + // Fix buttons. + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonInt(FALSE)); + int nRight = JsonGetInt(NuiGetBind(oPC, nToken, "btn_right_part_color")); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(!nRight)); + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonInt(!nRight)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + nRight = JsonGetInt(NuiGetBind(oPC, nToken, "btn_right_part_reset_event")); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nRight)); + SetColorPalletPointer(oPC, nToken, oNewItem); + } + } + // They have changed the material (color item) for the item. + else if(GetStringLeft(sElem, 13) == "btn_material_") + { + int nSelected = StringToInt(GetStringRight(sElem, 1)); + SetMaterialButtons(oPC, nToken, nSelected); + jCraft = JsonObjectSet(jCraft, CRAFT_MATERIAL_SELECTION, JsonInt(nSelected)); + // Change the pallet for the correct material. + string sColorPallet; + if(nSelected < 4) + { + sColorPallet = "gui_pal_tattoo"; + NuiSetBind(oPC, nToken, "armor_block_1", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "armor_block_2", JsonBool(FALSE)); + } + else + { + sColorPallet = "armor_pallet"; + if(ResManGetAliasFor(sColorPallet, RESTYPE_TGA) == "") + { + sColorPallet = "gui_pal_tattoo"; + NuiSetBind(oPC, nToken, "armor_block_1", JsonBool(TRUE)); + } + } + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString (sColorPallet)); + SetLocalString(oPC, CRAFT_COLOR_PALLET, sColorPallet); + SetColorPalletPointer(oPC, nToken, oItem); + } + SetLocalJson(oPC, CRAFT_JSON, jCraft); + } + else if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + AssignCommand(oPC, PlaySound("gui_button")); + if(sElem == "btn_highlight") + { + if(GetLocalInt(oPC, CRAFT_ULTRALIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_ULTRALIGHT); + DeleteLocalInt(oPC, CRAFT_ULTRALIGHT); + NuiSetBind(oPC, nToken, "btn_highlight", JsonBool(FALSE)); + } + else + { + if(GetLocalInt(oPC, CRAFT_HIGHLIGHT)) + { + RemoveTagedEffects(oTarget, CRAFT_HIGHLIGHT); + DeleteLocalInt(oPC, CRAFT_HIGHLIGHT); + } + SetLocalInt(oPC, CRAFT_ULTRALIGHT, TRUE); + effect eLight = EffectVisualEffect(VFX_DUR_ULTRAVISION); + eLight = TagEffect(eLight, CRAFT_ULTRALIGHT); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oTarget); + NuiSetBind(oPC, nToken, "btn_highlight", JsonBool(TRUE)); + } + } + } + } + } +} +/*void CopyCraftingItem(object oPC, object oItem) +{ + //ai_Debug("pe_crafting", "295", JsonDump(ObjectToJson(oItem), 2)); + json jItem = ObjectToJson(oItem); + + SetLocalInt(oPC, CRAFT_COPY_ITEM, TRUE); + int nSelected = GetLocalInt(oPC, CRAFT_ITEM_SELECTION); + if (ai_GetIsWeapon(oItem)) + { + // Copy the base item type; + SetLocalInt(oPC, CRAFT_COPY_ITEM_TYPE, GetBaseItemType(oItem)); + // Copy each model/color & save to variables. + int nIndex = 1; + string sIndex; + while(nIndex <= 3) + { + sIndex = IntToString(nIndex); + SetLocalInt(oPC, CRAFT_COPY_MODEL + sIndex, JsonGetInt(GffGetByte(jItem, "ModelPart" + sIndex))); + nIndex++; + } + } + else if (nSelected == 0) + { + // Copy the armors AC so we can check it. + SetLocalInt(oPC, CRAFT_ARMOR_AC, ai_GetArmorBonus(oItem)); + // Copy an per part colors if they exist. + int nPart, nColor, nPartColor; + string sPart, sColor; + while(nPart <= 18) + { + sPart = IntToString(nPart); + nColor = 0; + while(nColor <= 5) + { + sColor = IntToString(nColor); + if(GffGetFieldExists(jItem, "APart_" + sPart + "_Col_" + sColor, GFF_FIELD_TYPE_BYTE)) + { + // Shift the number up by 1 so we can save as a variable and not use 0! + nPartColor = JsonGetInt(GffGetByte(jItem, "APart_" + sPart + "_Col_" + sColor)) + 1; + SetLocalInt(oPC, CRAFT_COPY_PART_COLOR + sPart + sColor, nPartColor); + } + nColor++; + } + nPart++; + } + // Copy each model & save to variables. + SetLocalInt(oPC, "CRAFT_COPY_MODEL0", JsonGetInt(GffGetByte(jItem, "ArmorPart_Belt"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL1", JsonGetInt(GffGetByte(jItem, "ArmorPart_LBicep"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL2", JsonGetInt(GffGetByte(jItem, "ArmorPart_LFArm"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL3", JsonGetInt(GffGetByte(jItem, "ArmorPart_LFoot"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL4", JsonGetInt(GffGetByte(jItem, "ArmorPart_LHand"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL5", JsonGetInt(GffGetByte(jItem, "ArmorPart_LShin"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL6", JsonGetInt(GffGetByte(jItem, "ArmorPart_LShoul"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL7", JsonGetInt(GffGetByte(jItem, "ArmorPart_LThigh"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL8", JsonGetInt(GffGetByte(jItem, "ArmorPart_Neck"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL9", JsonGetInt(GffGetByte(jItem, "ArmorPart_Pelvis"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL10", JsonGetInt(GffGetByte(jItem, "ArmorPart_RBicep"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL11", JsonGetInt(GffGetByte(jItem, "ArmorPart_RFArm"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL12", JsonGetInt(GffGetByte(jItem, "ArmorPart_RFoot"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL13", JsonGetInt(GffGetByte(jItem, "ArmorPart_RHand"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL14", JsonGetInt(GffGetByte(jItem, "ArmorPart_RShin"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL15", JsonGetInt(GffGetByte(jItem, "ArmorPart_RShoul"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL16", JsonGetInt(GffGetByte(jItem, "ArmorPart_RThigh"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL17", JsonGetInt(GffGetByte(jItem, "ArmorPart_Robe"))); + SetLocalInt(oPC, "CRAFT_COPY_MODEL18", JsonGetInt(GffGetByte(jItem, "ArmorPart_Torso"))); + // Copy each color and save to variables. + SetLocalInt(oPC, "CRAFT_COPY_COLOR0", JsonGetInt(GffGetByte(jItem, "Cloth1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR1", JsonGetInt(GffGetByte(jItem, "Cloth2Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR2", JsonGetInt(GffGetByte(jItem, "Leather1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR3", JsonGetInt(GffGetByte(jItem, "Leather2Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR4", JsonGetInt(GffGetByte(jItem, "Metal1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR5", JsonGetInt(GffGetByte(jItem, "Metal2Color"))); + } +else + { + // Copy the base item type; + SetLocalInt(oPC, CRAFT_COPY_ITEM_TYPE, GetBaseItemType(oItem)); + // Copy the base item type; + SetLocalInt(oPC, "CRAFT_COPY_MODEL0", JsonGetInt(GffGetByte(jItem, "ModelPart1"))); + // Copy each color and save to variables. + SetLocalInt(oPC, "CRAFT_COPY_COLOR0", JsonGetInt(GffGetByte(jItem, "Cloth1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR1", JsonGetInt(GffGetByte(jItem, "Cloth2Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR2", JsonGetInt(GffGetByte(jItem, "Leather1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR3", JsonGetInt(GffGetByte(jItem, "Leather2Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR4", JsonGetInt(GffGetByte(jItem, "Metal1Color"))); + SetLocalInt(oPC, "CRAFT_COPY_COLOR5", JsonGetInt(GffGetByte(jItem, "Metal2Color"))); + } + // Send message that it has been copied. + ai_SendMessages(GetName (oItem) + " appearance has been copied!", AI_COLOR_GREEN, oPC); +} + +// Used in the crafting GUI to paste a copy of an item to another item. +object PasteCraftingItem (object oPC, object oTarget, object oItem) +{ + int nModelPartNum; + object oChestItem; + int nSelected = GetLocalInt(oPC, CRAFT_ITEM_SELECTION); + object oBuildContainer = GetObjectByTag(CRAFT_CONTAINER); + // Move the item to the building container. + oChestItem = CopyItem(oItem, oBuildContainer, TRUE); + DestroyObject(oItem); + json jItem = ObjectToJson(oChestItem, TRUE); + if (ai_GetIsWeapon(oChestItem)) + { + // Copy each model & save to variables. + int nIndex = 1; + string sIndex; + while(nIndex <= 3) + { + sIndex = IntToString(nIndex); + jItem = GffReplaceByte(jItem,"ModelPart" + sIndex, GetLocalInt(oPC, CRAFT_COPY_MODEL + sIndex)); + jItem = GffReplaceWord(jItem,"xModelPart" + sIndex, GetLocalInt(oPC, CRAFT_COPY_MODEL + sIndex)); + DeleteLocalInt(oPC, CRAFT_COPY_MODEL + sIndex); + nIndex++; + } + oItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + // Equip new item. + AssignCommand(oTarget, ActionEquipItem (oItem, INVENTORY_SLOT_RIGHTHAND)); + } + // Armor. + else if (nSelected == 0) + { + // Paste per part colors if they exist. + int nPart, nColor, nPartColor; + string sPart, sColor; + while(nPart <= 18) + { + sPart = IntToString(nPart); + nColor = 0; + while(nColor <= 5) + { + sColor = IntToString(nColor); + nPartColor = GetLocalInt(oPC, CRAFT_COPY_PART_COLOR + sPart + sColor); + if(nPartColor > 0) + { + // Shift the number down by 1 since we can not use 0 in the variable! + nPartColor = nPartColor - 1; + if(GffGetFieldExists(jItem, "APart_" + sPart + "_Col_" + sColor, GFF_FIELD_TYPE_BYTE)) + { + jItem = GffReplaceByte(jItem, "APart_" + sPart + "_Col_" + sColor, nPartColor); + } + else jItem = GffAddByte(jItem, "APart_" + sPart + "_Col_" + sColor, nPartColor); + DeleteLocalInt(oPC, "CRAFT_COPY_PART_COLOR" + sPart + sColor); + } + nColor++; + } + nPart++; + } + jItem = GffReplaceByte(jItem,"ArmorPart_Belt", GetLocalInt(oPC, "CRAFT_COPY_MODEL0")); + jItem = GffReplaceByte(jItem,"ArmorPart_LBicep", GetLocalInt(oPC, "CRAFT_COPY_MODEL1")); + jItem = GffReplaceByte(jItem,"ArmorPart_LFArm", GetLocalInt(oPC, "CRAFT_COPY_MODEL2")); + jItem = GffReplaceByte(jItem,"ArmorPart_LFoot", GetLocalInt(oPC, "CRAFT_COPY_MODEL3")); + jItem = GffReplaceByte(jItem,"ArmorPart_LHand", GetLocalInt(oPC, "CRAFT_COPY_MODEL4")); + jItem = GffReplaceByte(jItem,"ArmorPart_LShin", GetLocalInt(oPC, "CRAFT_COPY_MODEL5")); + jItem = GffReplaceByte(jItem,"ArmorPart_LShoul", GetLocalInt(oPC, "CRAFT_COPY_MODEL6")); + jItem = GffReplaceByte(jItem,"ArmorPart_LThigh", GetLocalInt(oPC, "CRAFT_COPY_MODEL7")); + jItem = GffReplaceByte(jItem,"ArmorPart_Neck", GetLocalInt(oPC, "CRAFT_COPY_MODEL8")); + jItem = GffReplaceByte(jItem,"ArmorPart_Pelvis", GetLocalInt(oPC, "CRAFT_COPY_MODEL9")); + jItem = GffReplaceByte(jItem,"ArmorPart_RBicep", GetLocalInt(oPC, "CRAFT_COPY_MODEL10")); + jItem = GffReplaceByte(jItem,"ArmorPart_RFArm", GetLocalInt(oPC, "CRAFT_COPY_MODEL11")); + jItem = GffReplaceByte(jItem,"ArmorPart_RFoot", GetLocalInt(oPC, "CRAFT_COPY_MODEL12")); + jItem = GffReplaceByte(jItem,"ArmorPart_RHand", GetLocalInt(oPC, "CRAFT_COPY_MODEL13")); + jItem = GffReplaceByte(jItem,"ArmorPart_RShin", GetLocalInt(oPC, "CRAFT_COPY_MODEL14")); + jItem = GffReplaceByte(jItem,"ArmorPart_RShoul", GetLocalInt(oPC, "CRAFT_COPY_MODEL15")); + jItem = GffReplaceByte(jItem,"ArmorPart_RThigh", GetLocalInt(oPC, "CRAFT_COPY_MODEL16")); + jItem = GffReplaceByte(jItem,"ArmorPart_Robe", GetLocalInt(oPC, "CRAFT_COPY_MODEL17")); + jItem = GffReplaceByte(jItem,"ArmorPart_Torso", GetLocalInt(oPC, "CRAFT_COPY_MODEL18")); + jItem = GffReplaceWord(jItem,"xArmorPart_Belt", GetLocalInt(oPC, "CRAFT_COPY_MODEL0")); + jItem = GffReplaceWord(jItem,"xArmorPart_LBice", GetLocalInt(oPC, "CRAFT_COPY_MODEL1")); + jItem = GffReplaceWord(jItem,"xArmorPart_LFArm", GetLocalInt(oPC, "CRAFT_COPY_MODEL2")); + jItem = GffReplaceWord(jItem,"xArmorPart_LFoot", GetLocalInt(oPC, "CRAFT_COPY_MODEL3")); + jItem = GffReplaceWord(jItem,"xArmorPart_LHand", GetLocalInt(oPC, "CRAFT_COPY_MODEL4")); + jItem = GffReplaceWord(jItem,"xArmorPart_LShin", GetLocalInt(oPC, "CRAFT_COPY_MODEL5")); + jItem = GffReplaceWord(jItem,"xArmorPart_LShou", GetLocalInt(oPC, "CRAFT_COPY_MODEL6")); + jItem = GffReplaceWord(jItem,"xArmorPart_LThig", GetLocalInt(oPC, "CRAFT_COPY_MODEL7")); + jItem = GffReplaceWord(jItem,"xArmorPart_Neck", GetLocalInt(oPC, "CRAFT_COPY_MODEL8")); + jItem = GffReplaceWord(jItem,"xArmorPart_Pelvi", GetLocalInt(oPC, "CRAFT_COPY_MODEL9")); + jItem = GffReplaceWord(jItem,"xArmorPart_RBice", GetLocalInt(oPC, "CRAFT_COPY_MODEL10")); + jItem = GffReplaceWord(jItem,"xArmorPart_RFArm", GetLocalInt(oPC, "CRAFT_COPY_MODEL11")); + jItem = GffReplaceWord(jItem,"xArmorPart_RFoot", GetLocalInt(oPC, "CRAFT_COPY_MODEL12")); + jItem = GffReplaceWord(jItem,"xArmorPart_RHand", GetLocalInt(oPC, "CRAFT_COPY_MODEL13")); + jItem = GffReplaceWord(jItem,"xArmorPart_RShin", GetLocalInt(oPC, "CRAFT_COPY_MODEL14")); + jItem = GffReplaceWord(jItem,"xArmorPart_RShou", GetLocalInt(oPC, "CRAFT_COPY_MODEL15")); + jItem = GffReplaceWord(jItem,"xArmorPart_RThig", GetLocalInt(oPC, "CRAFT_COPY_MODEL16")); + jItem = GffReplaceWord(jItem,"xArmorPart_Robe", GetLocalInt(oPC, "CRAFT_COPY_MODEL17")); + jItem = GffReplaceWord(jItem,"xArmorPart_Torso", GetLocalInt(oPC, "CRAFT_COPY_MODEL18")); + jItem = GffReplaceByte(jItem,"Cloth1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR0")); + jItem = GffReplaceByte(jItem,"Cloth2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR1")); + jItem = GffReplaceByte(jItem,"Leather1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR2")); + jItem = GffReplaceByte(jItem,"Leather2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR3")); + jItem = GffReplaceByte(jItem,"Metal1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR4")); + jItem = GffReplaceByte(jItem,"Metal2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR5")); + oItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + int nIndex; + for(nIndex = 0; nIndex <= 18; nIndex++) + { + DeleteLocalInt(oPC, CRAFT_COPY_MODEL + IntToString(nIndex)); + } + for(nIndex = 0; nIndex <= 5; nIndex++) + { + DeleteLocalInt(oPC, CRAFT_COPY_COLOR + IntToString(nIndex)); + } + // Equip new item. + AssignCommand (oTarget, ActionEquipItem (oItem, INVENTORY_SLOT_CHEST)); + } + else if(ai_GetIsShield(oChestItem)) + { + jItem = GffReplaceByte(jItem,"ModelPart1", GetLocalInt(oPC, "CRAFT_COPY_MODEL1")); + jItem = GffReplaceWord(jItem,"xModelPart1", GetLocalInt(oPC, "CRAFT_COPY_MODEL1")); + oItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + // Equip new item. + AssignCommand(oTarget, ActionEquipItem (oItem, INVENTORY_SLOT_LEFTHAND)); + } + else + { + //ai_Debug("pe_crafting", "389", JsonDump(ObjectToJson(oChestItem), 2)); + jItem = GffReplaceByte(jItem,"ModelPart1", GetLocalInt(oPC, "CRAFT_COPY_MODEL0")); + jItem = GffReplaceWord(jItem,"xModelPart1", GetLocalInt(oPC, "CRAFT_COPY_MODEL0")); + jItem = GffReplaceByte(jItem,"Cloth1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR0")); + jItem = GffReplaceByte(jItem,"Cloth2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR1")); + jItem = GffReplaceByte(jItem,"Leather1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR2")); + jItem = GffReplaceByte(jItem,"Leather2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR3")); + jItem = GffReplaceByte(jItem,"Metal1Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR4")); + jItem = GffReplaceByte(jItem,"Metal2Color", GetLocalInt(oPC, "CRAFT_COPY_COLOR5")); + oItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + DeleteLocalInt(oPC, "CRAFT_COPY_MODEL0"); + int nIndex; + for(nIndex = 0; nIndex <= 5; nIndex++) + { + DeleteLocalInt(oPC, CRAFT_COPY_COLOR + IntToString(nIndex)); + } + // Equip new item. + int nItemType = GetBaseItemType(oChestItem); + if(nItemType == BASE_ITEM_CLOAK) AssignCommand(oTarget, ActionEquipItem (oItem, INVENTORY_SLOT_CLOAK)); + else if(nItemType == BASE_ITEM_HELMET) AssignCommand(oTarget, ActionEquipItem (oItem, INVENTORY_SLOT_HEAD)); + } + // Send message that it has been copied. + AssignCommand(oPC, ai_SendMessages (GetName (oItem) + " appearance has been changed!", AI_COLOR_GREEN, oPC)); + DestroyObject(oChestItem); + return oItem; +} */ +int GetItemSelectedEquipSlot (int nItemSelected) +{ + if (nItemSelected == 0) return INVENTORY_SLOT_CHEST; + if (nItemSelected == 1) return INVENTORY_SLOT_CLOAK; + if (nItemSelected == 2) return INVENTORY_SLOT_HEAD; + if (nItemSelected == 3) return INVENTORY_SLOT_RIGHTHAND; + if (nItemSelected == 4) return INVENTORY_SLOT_LEFTHAND; + return INVENTORY_SLOT_CHEST; +} +int GetArmorModelSelected (object oPC) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nModelSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MODEL_SELECTION)); + if(nModelSelected == 0) return ITEM_APPR_ARMOR_MODEL_NECK; + if(nModelSelected == 1) return ITEM_APPR_ARMOR_MODEL_RSHOULDER; + if(nModelSelected == 2) return ITEM_APPR_ARMOR_MODEL_RBICEP; + if(nModelSelected == 3) return ITEM_APPR_ARMOR_MODEL_RFOREARM; + if(nModelSelected == 4) return ITEM_APPR_ARMOR_MODEL_RHAND; + if(nModelSelected == 5) return ITEM_APPR_ARMOR_MODEL_TORSO; + if(nModelSelected == 6) return ITEM_APPR_ARMOR_MODEL_BELT; + if(nModelSelected == 7) return ITEM_APPR_ARMOR_MODEL_PELVIS; + if(nModelSelected == 8) return ITEM_APPR_ARMOR_MODEL_RTHIGH; + if(nModelSelected == 9) return ITEM_APPR_ARMOR_MODEL_RSHIN; + if(nModelSelected == 10) return ITEM_APPR_ARMOR_MODEL_RFOOT; + return ITEM_APPR_ARMOR_MODEL_ROBE; +} +int GetMaxSimpleItemNumber(object oItem, int nBaseItemType) +{ + int nResType, nMaxNumber, nModelNumber; + string sModelNumber, sModelName = Get2DAString("baseitems", "ItemClass", nBaseItemType) + "_"; + //ai_Debug("pe_crafting", "804", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + while(nModelNumber < 999) + { + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + if(nBaseItemType == BASE_ITEM_CLOAK) nResType = RESTYPE_PLT; + else nResType = RESTYPE_MDL; + if(ResManGetAliasFor(sModelName + sModelNumber, nResType) != "") nMaxNumber++; + nModelNumber++; + //ai_Debug("pe_crafting", "841", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + } + return nMaxNumber; +} +int GetSimpleItemNumber(object oItem, int nModelNumber, int nBaseItemType) +{ + int nResType, nIndex, nCounter; + string sModelNumber, sModelName = Get2DAString("baseitems", "ItemClass", nBaseItemType) + "_"; + //ai_Debug("pe_crafting", "804", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + while(nIndex <= 999) + { + if(nIndex < 10) sModelNumber = "00" + IntToString(nIndex); + else if(nIndex < 100) sModelNumber = "0" + IntToString(nIndex); + else sModelNumber = IntToString(nIndex); + if(nBaseItemType == BASE_ITEM_CLOAK) nResType = RESTYPE_PLT; + else nResType = RESTYPE_MDL; + if(ResManGetAliasFor(sModelName + sModelNumber, nResType) != "") nCounter++; + if(nCounter == nModelNumber) return nIndex; + nIndex++; + //ai_Debug("pe_crafting", "841", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + } + return nIndex; +} +int GetMaxWeaponModuleNumber(struct stWeaponAppearance stWA) +{ + int nBaseItemType = GetBaseItemType(stWA.oItem); + stWA.nColor = 1; + stWA.nModel = 99; + stWA.sPart = "t"; + string sModelNumber; + string sModelName = Get2DAString("baseitems", "ItemClass", nBaseItemType) + "_" + stWA.sPart + "_"; + int nModelNumber = (stWA.nModel * 10) + stWA.nColor; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //SendMessageToPC(GetFirstPC(), "pe_crafting, 780, sModel: " + sModelName + sModelNumber + + // " nModel: " + IntToString(stWA.nModel) + " nColor: " + IntToString(stWA.nColor)); + while(ResManGetAliasFor(sModelName + sModelNumber, RESTYPE_MDL) == "") + { + stWA.nModel += -1; + // Create the model name. + nModelNumber = (stWA.nModel * 10) + stWA.nColor; + if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //SendMessageToPC(GetFirstPC(), "pe_crafting, 789, sModel: " + sModelName + sModelNumber + + // " nModel: " + IntToString(stWA.nModel) + " nColor: " + IntToString(stWA.nColor)); + } + return stWA.nModel; +} +struct stWeaponAppearance GetNextWeaponAppearance(struct stWeaponAppearance stWA, int nDirection) +{ + int nBaseItemType = GetBaseItemType(stWA.oItem); + string sModelNumber; + string sModelName = Get2DAString("baseitems", "ItemClass", nBaseItemType) + "_" + stWA.sPart + "_"; + // Get next/previous color/model. + stWA.nColor += nDirection; + if(stWA.nColor > 9) + { + stWA.nColor = 1; + stWA.nModel += nDirection; + if(stWA.nModel > CRAFT_MAX_WEAPON_MODEL_NUMBER) stWA.nModel = 1; + } + else if(stWA.nColor < 1) + { + stWA.nColor = 9; + stWA.nModel += nDirection; + if(stWA.nModel < 1) stWA.nModel = CRAFT_MAX_WEAPON_MODEL_NUMBER; + } + int nModelNumber = (stWA.nModel * 10) + stWA.nColor; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //SendMessageToPC(GetFirstPC(), "pe_crafting, 778, sModel: " + sModelName + sModelNumber + + // " nModel: " + IntToString(stWA.nModel) + " nColor: " + IntToString(stWA.nColor)); + while(ResManGetAliasFor(sModelName + sModelNumber, RESTYPE_MDL) == "") + { + // Get next/previous color/model. + stWA.nColor += nDirection; + if(stWA.nColor > 9) + { + stWA.nColor = 1; + stWA.nModel += nDirection; + if(stWA.nModel > CRAFT_MAX_WEAPON_MODEL_NUMBER) stWA.nModel = 1; + } + else if(stWA.nColor < 1) + { + stWA.nColor = 9; + stWA.nModel += nDirection; + if(stWA.nModel < 1) stWA.nModel = CRAFT_MAX_WEAPON_MODEL_NUMBER; + } + // Create the model name. + nModelNumber = (stWA.nModel * 10) + stWA.nColor; + if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //SendMessageToPC(GetFirstPC(), "pe_crafting, 800, sModel: " + sModelName + sModelNumber + + // " nModel: " + IntToString(stWA.nModel) + " nColor: " + IntToString(stWA.nColor)); + } + return stWA; +} +object ChangeItemsAppearance(object oPC, object oTarget, int nToken, object oItem, int nDirection, string sPart) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + // Get the item we are changing. + int nModelSelected; + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + string sModelName, sModelNumber; + object oNewItem; + // Weapons. + if(ai_GetIsWeapon(oItem)) + { + // Freeze animations - vfx 352? + if(sPart == "t") nModelSelected = 2; + else if(sPart == "m") nModelSelected = 1; + else if(sPart == "b") nModelSelected = 0; + sModelName = Get2DAString("baseitems", "ItemClass", GetBaseItemType(oItem)) + "_" + sPart + "_"; + struct stWeaponAppearance stWA; + stWA.oItem = oItem; + stWA.sPart = sPart; + stWA.nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, nModelSelected); + stWA.nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, nModelSelected); + stWA = GetNextWeaponAppearance(stWA, nDirection); + json jItem = ObjectToJson(oItem, TRUE); + int nModelNumber = stWA.nModel * 10 + stWA.nColor; + jItem = GffReplaceByte(jItem, "ModelPart" + IntToString(nModelSelected + 1), nModelNumber); + jItem = GffReplaceWord(jItem, "xModelPart" + IntToString(nModelSelected + 1), nModelNumber); + oNewItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + AssignCommand(oTarget, ClearAllActions(TRUE)); + DestroyObject(oItem); + // Item selected 3 is the right hand, 4 is the left hand. + //SendMessageToPC(oPC, "nItemSelected: " + IntToString(nItemSelected)); + if(nItemSelected == 3) + { + AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_RIGHTHAND)); + } + else AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_LEFTHAND)); + NuiSetBind(oPC, nToken, "txt_model_number_" + sPart, JsonString(IntToString(nModelNumber))); + } + // Armor. + else if(nItemSelected == 0) + { + // Create the model name. + // Get the ModelType. + int nAppearance = GetAppearanceType(oTarget); + string sModelName = Get2DAString("appearance", "MODELTYPE", nAppearance); + // Get gender. + if(GetGender(oTarget) == GENDER_MALE) sModelName += "m"; + else sModelName += "f"; + // Get race. + sModelName += Get2DAString("appearance", "RACE", nAppearance); + // Get Phenotype. + sModelName += IntToString(GetPhenoType(oTarget)) + "_"; + // Get the selected model. + nModelSelected = GetArmorModelSelected(oPC); + //ai_Debug("pe_crafting", "646", "nModelSide: " + IntToString(nModelSide)); + // If we are doing the left side (bottom menu options) then add one to + // get the left side. + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if(sPart == "b") + { + if(nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected--; + else nModelSelected++; + } + int nModelNumber = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, "txt_model_number_" + sPart))); + //int nModelNumber = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nModelSelected); + //SendMessageToPC(oPC, "pe_crafting, 826, nModelNumber: " + IntToString(nModelNumber) + + // " sPart: " + sPart + " nModelSelected: " + IntToString(nModelSelected)); + int nBaseModelNumber = nModelNumber; + nModelNumber += nDirection; + if(nModelNumber > CRAFT_MAX_MODEL_NUMBER) nModelNumber = 0; + else if(nModelNumber < 0) nModelNumber = CRAFT_MAX_MODEL_NUMBER; + string sModelNumber; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + // Check for changes to the torso (base part of the armor linked to AC). + if(nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO) + { + string sCurrentACBonus = Get2DAString("parts_chest", "ACBONUS", nBaseModelNumber); + string sACBonus = Get2DAString ("parts_chest", "ACBONUS", nModelNumber); + sModelName += Get2DAString ("capart", "MDLNAME", nModelSelected); + //SendMessageToPC(oPC, "pe_crafting, 842, sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber) + " sCurrentACBonus: " + sCurrentACBonus + + // " sACBonus: " + sACBonus + " nModelSelected: " + IntToString(nModelSelected)); + while(ResManGetAliasFor(sModelName + sModelNumber, RESTYPE_MDL) == "" || + sACBonus != sCurrentACBonus) + { + nModelNumber += nDirection; + if (nModelNumber > CRAFT_MAX_MODEL_NUMBER) nModelNumber = 0; + else if (nModelNumber < 0) nModelNumber = CRAFT_MAX_MODEL_NUMBER; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + sACBonus = Get2DAString ("parts_chest", "ACBONUS", nModelNumber); + //SendMessageToPC(oPC, "pe_crafting, 854, sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber) + " sACBonus: " + sACBonus + + // " nModelSelected: " + IntToString(nModelSelected)); + } + // Change the model. + oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nModelSelected, nModelNumber, TRUE); + DestroyObject (oItem); + AssignCommand (oTarget, ActionEquipItem (oNewItem, INVENTORY_SLOT_CHEST)); + } + // Change all other parts of armor. + else + { + sModelName += Get2DAString("capart", "MDLNAME", nModelSelected); + //SendMessageToPC(oPC, "pe_crafting, 866, sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber) + " nModelSelected: " + IntToString(nModelSelected)); + while(ResManGetAliasFor(sModelName + sModelNumber, RESTYPE_MDL) == "") + { + nModelNumber += nDirection; + if (nModelNumber > CRAFT_MAX_MODEL_NUMBER) nModelNumber = 0; + else if (nModelNumber < 0) nModelNumber = CRAFT_MAX_MODEL_NUMBER; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //SendMessageToPC(oPC, "pe_crafting, 705, sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber) + " nModelSelected: " + IntToString(nModelSelected)); + } + oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nModelSelected, nModelNumber, TRUE); + DestroyObject (oItem); + // If using the linked menu option then change the left side too. + if(sPart == "m" && (nModelSelected != ITEM_APPR_ARMOR_MODEL_NECK && + nModelSelected != ITEM_APPR_ARMOR_MODEL_BELT && + nModelSelected != ITEM_APPR_ARMOR_MODEL_PELVIS && + nModelSelected != ITEM_APPR_ARMOR_MODEL_ROBE)) + { + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected--; + else nModelSelected++; + oItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_MODEL, nModelSelected, nModelNumber, TRUE); + DestroyObject(oNewItem); + AssignCommand(oTarget, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST)); + } + else AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + } + string sModelSelected; + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nModelSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nModelSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nModelSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + NuiSetBind(oPC, nToken, "txt_model_number_" + sPart, JsonString(IntToString(nModelNumber))); + } + else + { + if(sPart == "m") + { + // Using labels for Mobile. + //NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString(IntToString(nModelNumber))); + //NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(IntToString(nModelNumber))); + //NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(IntToString(nModelNumber))); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString(IntToString(nModelNumber))); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(IntToString(nModelNumber))); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(IntToString(nModelNumber))); + } + else + { + NuiSetBind(oPC, nToken, "txt_model_number_" + sPart, JsonString(IntToString(nModelNumber))); + } + } + } + // All other items. + else + { + int nSlot, nResType, nBaseItemType = GetBaseItemType(oItem); + string sModelName = Get2DAString("baseitems", "ItemClass", nBaseItemType) + "_"; + if(nBaseItemType == BASE_ITEM_CLOAK) + { + nSlot = INVENTORY_SLOT_CLOAK; + nResType = RESTYPE_PLT; + } + else if(nBaseItemType == BASE_ITEM_HELMET) + { + nSlot = INVENTORY_SLOT_HEAD; + nResType = RESTYPE_MDL; + } + else if(nBaseItemType == BASE_ITEM_LARGESHIELD || + nBaseItemType == BASE_ITEM_SMALLSHIELD || + nBaseItemType == BASE_ITEM_TOWERSHIELD) + { + nSlot = INVENTORY_SLOT_LEFTHAND; + nResType = RESTYPE_MDL; + } + int nModelNumber = GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0); + nModelNumber += nDirection; + if (nModelNumber > CRAFT_MAX_MODEL_NUMBER) nModelNumber = 0; + else if (nModelNumber < 0) nModelNumber = CRAFT_MAX_MODEL_NUMBER; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //ai_Debug("pe_crafting", "804", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + while(ResManGetAliasFor(sModelName + sModelNumber, nResType) == "") + { + nModelNumber += nDirection; + if (nModelNumber > CRAFT_MAX_MODEL_NUMBER) nModelNumber = 0; + else if (nModelNumber < 0) nModelNumber = CRAFT_MAX_MODEL_NUMBER; + if(nModelNumber < 10) sModelNumber = "00" + IntToString(nModelNumber); + else if(nModelNumber < 100) sModelNumber = "0" + IntToString(nModelNumber); + else sModelNumber = IntToString(nModelNumber); + //ai_Debug("pe_crafting", "841", "sModelName: " + sModelName + sModelNumber + + // " nModelNumber: " + IntToString(nModelNumber)); + } + oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nModelNumber, TRUE); + DestroyObject(oItem); + AssignCommand(oTarget, ActionEquipItem (oNewItem, nSlot)); + NuiSetBind(oPC, nToken, "txt_model_number_" + sPart, JsonString(IntToString(nModelNumber))); + } + return oNewItem; +} +object RandomizeItemsCraftAppearance(object oPC, object oTarget, int nToken, object oItem) +{ + // Get the item we are changing. + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + int nBaseItemType = GetBaseItemType(oItem); + object oNewItem; + if(ai_GetIsWeapon(oItem)) + { + int nRollTop, nRollMid, nRollBottom; + int nColorTop, nColorMid, nColorBottom; + struct stWeaponAppearance stWA; + stWA.oItem = oItem; + int nMaxModuleNumber = GetMaxWeaponModuleNumber(stWA); + nRollTop = Random(nMaxModuleNumber) + 1; + // Check bows as they must randomize to the same top, middle, and bottom otherwise they look bad. + if(nBaseItemType == BASE_ITEM_LONGBOW || nBaseItemType == BASE_ITEM_SHORTBOW) + { + nRollMid = nRollTop; + nRollBottom = nRollTop; + } + // Randomize each item individualy for other weapons. + else + { + nRollMid = Random(nMaxModuleNumber) + 1; + nRollBottom = Random(nMaxModuleNumber) + 1; + } + nColorTop = Random(9) + 1; + nColorMid = Random(9) + 1; + nColorBottom = Random(9) + 1; + // Change weapons model. + stWA.sPart = "t"; + stWA.nModel = nRollTop; + stWA.nColor = nColorTop; + stWA = GetNextWeaponAppearance(stWA, -1); + json jItem = ObjectToJson(oItem, TRUE); + //ai_Debug("pe_crafting", "614", "ModelPart" + IntToString(nModelSelected + 1) + + // " nModelNumber: " + IntToString(nModelNumber)); + jItem = GffReplaceByte(jItem, "ModelPart" + IntToString(3), stWA.nModel * 10 + stWA.nColor); + jItem = GffReplaceWord(jItem, "xModelPart" + IntToString(3), stWA.nModel * 10 + stWA.nColor); + NuiSetBind(oPC, nToken, "txt_model_number_" + stWA.sPart, JsonString(IntToString(stWA.nModel * 10 + stWA.nColor))); + stWA.sPart = "m"; + stWA.nModel = nRollMid; + stWA.nColor = nColorMid; + stWA = GetNextWeaponAppearance(stWA, -1); + jItem = GffReplaceByte(jItem, "ModelPart" + IntToString(2), stWA.nModel * 10 + stWA.nColor); + jItem = GffReplaceWord(jItem, "xModelPart" + IntToString(2), stWA.nModel * 10 + stWA.nColor); + NuiSetBind(oPC, nToken, "txt_model_number_" + stWA.sPart, JsonString(IntToString(stWA.nModel * 10 + stWA.nColor))); + stWA.sPart = "b"; + stWA.nModel = nRollBottom; + stWA.nColor = nColorBottom; + stWA = GetNextWeaponAppearance(stWA, -1); + jItem = GffReplaceByte(jItem, "ModelPart" + IntToString(1), stWA.nModel * 10 + stWA.nColor); + jItem = GffReplaceWord(jItem, "xModelPart" + IntToString(1), stWA.nModel * 10 + stWA.nColor); + NuiSetBind(oPC, nToken, "txt_model_number_" + stWA.sPart, JsonString(IntToString(stWA.nModel * 10 + stWA.nColor))); + oNewItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + AssignCommand(oTarget, ClearAllActions(TRUE)); + DestroyObject(oItem); + // Item selected 3 is the right hand, 4 is the left hand. + if (nItemSelected == 3) AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_RIGHTHAND)); + else AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_LEFTHAND)); + } + // Armor. + else if(nItemSelected == 0) + { + int nRoll, nRoll2; + json jItem = ObjectToJson(oItem, TRUE); + // Randomize the models. + // Randomize Torso + //jItem = GffReplaceByte(jItem, "ArmorPart_Torso", ); + //jItem = GffReplaceWord(jItem, "xArmorPart_Torso", ); + // Randomize the colors. + nRoll = Random(175) + 1; + if(d100() < 50) nRoll2 = nRoll + Random(5) - 3; + else nRoll2 = Random(175) + 1; + jItem = GffReplaceByte(jItem, "Cloth1Color", nRoll); + jItem = GffReplaceByte(jItem, "Cloth2Color", nRoll2); + if(d100() < 50) nRoll = nRoll + Random(5) - 3; + else nRoll = Random(175) + 1; + if(d100() < 50) nRoll2 = nRoll + Random(5) - 3; + else nRoll2 = Random(175) + 1; + jItem = GffReplaceByte(jItem, "Leather1Color", nRoll); + jItem = GffReplaceByte(jItem, "Leather2Color", nRoll2); + if(d100() < 50) nRoll = nRoll + Random(5) - 3; + else nRoll = Random(175) + 1; + if(d100() < 50) nRoll2 = nRoll + Random(5) - 3; + else nRoll2 = Random(175) + 1; + jItem = GffReplaceByte(jItem, "Metal1Color", nRoll); + jItem = GffReplaceByte(jItem, "Metal2Color", nRoll2); + DestroyObject(oItem); + oNewItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + AssignCommand(oTarget, ActionEquipItem(oNewItem, INVENTORY_SLOT_CHEST)); + } + // All other items. + else + { + int nSlot; + // Get max models and inventory slot. + int nMaxModel = GetMaxSimpleItemNumber(oItem, nBaseItemType); + if(nBaseItemType == BASE_ITEM_CLOAK) nSlot = INVENTORY_SLOT_CLOAK; + else if(nBaseItemType == BASE_ITEM_HELMET) nSlot = INVENTORY_SLOT_HEAD; + else if(nBaseItemType == BASE_ITEM_LARGESHIELD || nBaseItemType == BASE_ITEM_SMALLSHIELD || + nBaseItemType == BASE_ITEM_TOWERSHIELD) nSlot = INVENTORY_SLOT_LEFTHAND; + int nRoll = Random(nMaxModel) + 1; + int nModel = GetSimpleItemNumber(oItem, nRoll, nBaseItemType); + json jItem = ObjectToJson(oItem, TRUE); + jItem = GffReplaceByte(jItem, "ModelPart1", nModel); + jItem = GffReplaceWord(jItem, "xModelPart1", nModel); + if (nBaseItemType == BASE_ITEM_CLOAK || nBaseItemType == BASE_ITEM_HELMET) + { + jItem = GffReplaceByte(jItem, "Cloth1Color", Random(175) + 1); + jItem = GffReplaceByte(jItem, "Cloth2Color", Random(175) + 1); + jItem = GffReplaceByte(jItem, "Leather1Color", Random(175) + 1); + jItem = GffReplaceByte(jItem, "Leather2Color", Random(175) + 1); + jItem = GffReplaceByte(jItem, "Metal1Color", Random(175) + 1); + jItem = GffReplaceByte(jItem, "Metal2Color", Random(175) + 1); + } + DestroyObject(oItem); + oNewItem = JsonToObject(jItem, GetLocation(oTarget), oTarget, TRUE); + AssignCommand(oTarget, ActionEquipItem(oNewItem, nSlot)); + } + return oNewItem; +} +object GetSelectedItem(object oTarget, int nItemSelected) +{ + if(nItemSelected == 0) return GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); + else if(nItemSelected == 1) return GetItemInSlot(INVENTORY_SLOT_CLOAK, oTarget); + else if(nItemSelected == 2) return GetItemInSlot(INVENTORY_SLOT_HEAD, oTarget); + else if(nItemSelected == 3) return GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + else if(nItemSelected == 4) return GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget); + return OBJECT_INVALID; +} +void CancelCraftedItem(object oPC, object oTarget) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetSelectedItem(oTarget, nItemSelected); + object oOriginalItem = GetLocalObject(oPC, CRAFT_ORIGINAL_ITEM); + if(oOriginalItem != OBJECT_INVALID) + { + DestroyObject(oItem); + int nSlot = GetItemSelectedEquipSlot(nItemSelected); + // Give item Backup to Player + oOriginalItem = CopyItem(oOriginalItem, oTarget, TRUE); + DelayCommand(0.2f, AssignCommand (oTarget, ActionEquipItem(oOriginalItem, nSlot))); + DeleteLocalObject(oPC, CRAFT_ORIGINAL_ITEM); + } +} +// Gets the colorId from a image of the color pallet. +// Thanks Zunath for the base code. +int GetColorPalletId(object oPC, int nToken) +{ + float fScale = IntToFloat(GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0f; + json jPayload = NuiGetEventPayload(); + json jMousePosition = JsonObjectGet(jPayload, "mouse_pos"); + json jX = JsonObjectGet(jMousePosition, "x"); + json jY = JsonObjectGet(jMousePosition, "y"); + float fX = StringToFloat(JsonDump (jX)); + float fY = StringToFloat(JsonDump (jY)); + float fCellSize = 20.0f * fScale; + int nCellX = FloatToInt(fX / fCellSize); + int nCellY = FloatToInt(fY / fCellSize); + if(nCellX < 0) nCellX = 0; + else if (nCellX > 16) nCellX = 16; + if(nCellY < 0) nCellY = 0; + else if(nCellY > 11) nCellY = 11; + NuiSetBind(oPC, nToken, "color_pallet_pointer", NuiRect(IntToFloat(nCellX * 20), IntToFloat(nCellY * 20), 20.0, 20.0)); + return nCellX + nCellY * 16; +} +void SetColorPalletPointer(object oPC, int nToken, object oItem) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + int nColor; + if(!JsonGetInt(NuiGetBind(oPC, nToken, "btn_all_color"))) + { + int nModelSelected = GetArmorModelSelected(oPC); + if(!JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR))) + { + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected--; + else nModelSelected++; + } + int nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex); + } + else nColor = 255; + if(nColor == 255) nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected); + float fPointX = IntToFloat((nColor - ((nColor / 16) * 16)) * 20); + float fPointY = IntToFloat((nColor / 16) * 20); + NuiSetBind(oPC, nToken, "color_pallet_pointer", NuiRect(fPointX, fPointY, 20.0, 20.0)); +} +void LockItemInCraftingWindow(object oPC, object oItem, object oTarget, int nToken) +{ + NuiSetBind(oPC, nToken, "item_combo_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_cancel_label", JsonString("Cancel")); + NuiSetBind(oPC, nToken, "btn_cancel_tooltip", JsonString(" Revert back to the original items appearance")); + NuiSetBind(oPC, nToken, "btn_save_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_select_target_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_info_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_wardrobe_event", JsonBool(FALSE)); + // Make sure the item information window is closed. + nToken = NuiFindWindow(oPC, "craft_item_nui"); + if(nToken) NuiDestroy(oPC, nToken); +} +void ClearItemInCraftingWindow(object oPC, object oItem, int nToken) +{ + NuiSetBind(oPC, nToken, "btn_save_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "item_combo_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_select_target_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_info_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_wardrobe_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cancel_label", JsonString("Exit")); + NuiSetBind(oPC, nToken, "btn_cancel_tooltip", JsonString(" Exit the crafting menu")); + if(ai_GetIsWeapon(oItem)) + { + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + NuiSetBind(oPC, nToken, "model_combo_selected", JsonInt(0)); + DelayCommand(1.0, DeleteLocalInt(oPC, AI_NO_NUI_SAVE)); + } +} +void SaveCraftedItem(object oPC, object oTarget, int nToken) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetSelectedItem(oTarget, nItemSelected); + ClearItemInCraftingWindow(oPC, oItem, nToken); + DestroyObject(GetLocalObject(oPC, CRAFT_ORIGINAL_ITEM)); + DeleteLocalObject(oPC, CRAFT_ORIGINAL_ITEM); +} +int CanCraftItem(object oPC, object oItem, int nToken, int bPasteCheck = FALSE) +{ + // Plot items cannot be changed. + if(GetPlotFlag(oItem)) + { + ai_SendMessages(GetName(oItem) + "is a plot item and its appearance cannot be changed!", AI_COLOR_RED, oPC); + return FALSE; + } + // Cannot change temorary enchanted items. + if(CheckForTemporaryItemProperty(oItem)) + { + ai_SendMessages(GetName(oItem) + " cannot be altered while it has a temporary enchantment.", AI_COLOR_RED, oPC); + return FALSE; + } + // Do special paste checks. + if (bPasteCheck) + { + int nOldItemType = GetLocalInt (oPC, CRAFT_COPY_ITEM_TYPE); + int nNewItemType = GetBaseItemType(oItem); + if(nNewItemType == BASE_ITEM_ARMOR) + { + if(GetLocalInt (oPC, CRAFT_ARMOR_AC) != ai_GetArmorBonus(oItem)) + { + ai_SendMessages("The armor you are trying to paste to is not the same type as the copy!", AI_COLOR_RED, oPC); + return FALSE; + } + } + else if(nOldItemType != nNewItemType) + { + string sOldBaseItem = GetStringByStrRef(StringToInt(Get2DAString ("baseitems", "Name", nOldItemType))); + string sNewBaseItem = GetStringByStrRef(StringToInt(Get2DAString ("baseitems", "Name", nNewItemType))); + ai_SendMessages("You copied a " + sOldBaseItem + " and are trying to paste to a " + sNewBaseItem + "!", AI_COLOR_RED, oPC); + return FALSE; + } + } + if(GetLocalObject(oPC, CRAFT_ORIGINAL_ITEM) == OBJECT_INVALID) + { + object oBuildContainer = GetObjectByTag(CRAFT_CONTAINER); + if(!GetIsObjectValid(oBuildContainer)) + { + vector vPosition = GetPositionFromLocation(GetLocation(oPC)); + vPosition.z = vPosition.z -2.0; + location lLocation = Location(GetArea(oPC), vPosition, 0.0); + oBuildContainer = CreateObject(OBJECT_TYPE_PLACEABLE, CRAFT_TEMPLATE, lLocation, FALSE, CRAFT_CONTAINER); + //SetObjectVisualTransform(oBuildContainer, OBJECT_VISUAL_TRANSFORM_TRANSLATE_Z, -5.0); + } + object oBackup = CopyItem(oItem, oBuildContainer, TRUE); + // Save the original item to the PC. + SetLocalObject(oPC, CRAFT_ORIGINAL_ITEM, oBackup); + } + return TRUE; +} +void RemoveTagedEffects(object oCreature, string sEffectTag) +{ + //Search for the effect. + //Debug ("0i_effects", "578", "RemoveTagedEffects: " + sEffectTag); + effect eEffect = GetFirstEffect(oCreature); + while (GetIsEffectValid(eEffect)) + { + //Debug ("0i_effects", "582", "Effect Tag: " + GetEffectTag (eEffect)); + if (GetEffectTag(eEffect) == sEffectTag) RemoveEffect(oCreature, eEffect); + eEffect = GetNextEffect(oCreature); + } +} +int CheckForTemporaryItemProperty (object oItem) +{ + itemproperty ipProperty; + ipProperty = GetFirstItemProperty (oItem); + while (GetIsItemPropertyValid (ipProperty)) + { + // Check to see if the item is temporary enchanted. + if (GetItemPropertyDurationType (ipProperty) == DURATION_TYPE_TEMPORARY) return TRUE; + ipProperty = GetNextItemProperty (oItem); + } + return FALSE; +} +int GetHasPartColor(object oItem, int nPart, string sSide) +{ + json jItem = ObjectToJson(oItem); + string sPartName = "APart_"; + if(sSide == "Left") + { + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nPart == ITEM_APPR_ARMOR_MODEL_RTHIGH) nPart--; + else nPart++; + } + sPartName += IntToString(nPart) + "_Col_"; + int nPartColor = JsonGetInt(GffGetByte(jItem, sPartName + "0")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "1")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "2")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "3")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "4")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "5")); + //SendMessageToPC(GetFirstPC(), "sPartName: " + sPartName + " nPartColor: " + IntToString(nPartColor)); + return nPartColor; +} +void SetModelNumberText(object oPC, object oTarget, int nToken) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nItem = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetSelectedItem(oTarget, nItem); + int nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MODEL_SELECTION)); + string sModelTop, sModelMiddle, sModelBottom; + // Model Group + if (ai_GetIsWeapon (oItem)) + { + int nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 0); + int nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 0); + int nModelNumber = (nModel * 10) + nColor; + sModelTop = IntToString(nModelNumber); + nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 1); + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 1); + nModelNumber = (nModel * 10) + nColor; + sModelMiddle = IntToString(nModelNumber); + nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 2); + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 2); + nModelNumber = (nModel * 10) + nColor; + sModelBottom = IntToString(nModelNumber); + NuiSetBind(oPC, nToken, "top_title_label", JsonString("Top")); + //NuiSetBind(oPC, nToken, "txt_model_number_t_enable", JsonBool(TRUE)); + //NuiSetBindWatch(oPC, nToken, "txt_model_number_t", TRUE); + NuiSetBind(oPC, nToken, "txt_model_name_t", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Middle")); + //NuiSetBind(oPC, nToken, "txt_model_number_m_enable", JsonBool(TRUE)); + //NuiSetBindWatch(oPC, nToken, "txt_model_number_m", TRUE); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("Bottom")); + //NuiSetBind(oPC, nToken, "txt_model_number_b_enable", JsonBool(TRUE)); + //NuiSetBindWatch(oPC, nToken, "txt_model_number_b", TRUE); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(sModelBottom)); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(TRUE)); + } + // Armor and clothing + if(nItem == 0) + { + nSelected = GetArmorModelSelected(oPC); + // These models only have one side so make sure we are not linked. + if (nSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + sModelMiddle = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + NuiSetBind(oPC, nToken, "top_title_label", JsonString("")); + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_name_t", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Model")); + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("")); + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(FALSE)); + } + else + { + sModelTop = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + if(nSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nSelected--; + else nSelected++; + sModelBottom = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + NuiSetBind(oPC, nToken, "top_title_label", JsonString("Right")); + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Right & Left")); + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("Left")); + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(sModelBottom)); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(TRUE)); + } + } + // Cloaks and Helmets. + else + { + sModelMiddle = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0)); + NuiSetBind(oPC, nToken, "top_title_label", JsonString("")); + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(FALSE)); + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Model")); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString("")); + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(FALSE)); + } + // Color Group + if(ai_GetIsWeapon(oItem) || ai_GetIsShield(oItem)) + { + // Need to disable the color widgets. + // Row 511 + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString("gui_pal_tattoo")); + NuiSetBind(oPC, nToken, "color_pallet_image_event", JsonBool(FALSE)); + // Row 512 - Label Part to Color + // Row 5l3 + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 515 + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + // Row 516 - Label Material to Color + // Row 517 + NuiSetBind(oPC, nToken, "btn_material_0", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_2", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_4", JsonBool(FALSE)); + // Row 518 + NuiSetBind(oPC, nToken, "btn_material_1", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_3", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_5", JsonBool(FALSE)); + SetMaterialButtons(oPC, nToken, -1); + } + // Armor and clothing + else if(nItem == 0) + { + // Row 511 + string sColorPallet = GetLocalString(oPC, CRAFT_COLOR_PALLET); + if(sColorPallet == "") sColorPallet = "gui_pal_tattoo"; + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString(sColorPallet)); + NuiSetBind(oPC, nToken, "color_pallet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "color_pallet_tooltip", JsonString(" Select a color or use the mouse wheel")); + NuiSetBindWatch(oPC, nToken, "txt_color_l", TRUE); + int nSelectedRight, nSelectedAll, nSelectedLeft; + int nModelSelected = GetArmorModelSelected(oPC); + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + string sColorAll = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected)); + // These models only have one side so make sure we are not linked. + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nModelSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nModelSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nModelSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + // Row 512 - Label Part to Color + // Row 5l3 + nSelectedRight = JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR)); + nSelectedAll = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ALL_COLOR)); + if(!nSelectedRight && !nSelectedAll) + { + nSelectedAll = TRUE; + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonBool(TRUE)); + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonBool(FALSE)); + } + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + nSelectedRight = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedAll = nSelectedRight; + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + } + else + { + // Row 511 + string sColorPallet = GetLocalString(oPC, CRAFT_COLOR_PALLET); + if(sColorPallet == "") sColorPallet = "gui_pal_tattoo"; + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString(sColorPallet)); + NuiSetBind(oPC, nToken, "color_pallet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "color_pallet_tooltip", JsonString(" Select a color or use the mouse wheel")); + // Row 512 - Label Part to Color + // Row 5l3 + nSelectedRight = JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR)); + nSelectedAll = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ALL_COLOR)); + nSelectedLeft = JsonGetInt(JsonObjectGet(jCraft, CRAFT_LEFT_PART_COLOR)); + if(!nSelectedRight && !nSelectedAll && !nSelectedLeft) + { + nSelectedAll = TRUE; + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonBool(TRUE)); + } + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(nSelectedLeft)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(TRUE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + nSelectedRight = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedLeft = GetHasPartColor(oItem, nModelSelected, "Left"); + nSelectedAll = nSelectedRight || nSelectedLeft; + //SendMessageToPC(oPC, "nSelectedRight: " + IntToString(nSelectedRight) + + // " nSelectedLeft: " + IntToString(nSelectedLeft)); + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(nSelectedLeft)); + // Row 516 - Label Material to Color + // Row 517 & 518 + nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + SetMaterialButtons(oPC, nToken, nSelected); + } + SetLocalJson(oPC, CRAFT_JSON, jCraft); + } + // Cloaks and Helmets. + else + { + // Row 512 - Label Part to Color + // Row 5l3 + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + //NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(FALSE)); + // Row 516 - Label Material to Color + // Row 517 & 518 + nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + SetMaterialButtons(oPC, nToken, nSelected); + } +} +void SetMaterialButtons(object oPC, int nToken, int nMaterial) +{ + int nIndex, bBool, bUseable; + string sIndex; + if(nMaterial > -1) bUseable = TRUE; + for(nIndex = 0;nIndex < 6;nIndex++) + { + if(nIndex == nMaterial) bBool = TRUE; + else bBool = FALSE; + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_material_" + sIndex + "_event", JsonBool(bUseable)); + NuiSetBind(oPC, nToken, "btn_material_" + sIndex, JsonBool(bBool)); + } +} +void CreateItemGUIPanel(object oPC, object oItem) +{ + // Row 1 (Name)************************************************************* 73 + json jRow = CreateLabel(JsonArray(), "Name:", "lbl_name_title", 50.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateTextEditBox (jRow, "name_placeholder", "txt_item_name", 60, FALSE, 325.0f, 20.0f); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Tag)************************************************************** 101 + jRow = CreateLabel(JsonArray(), "Tag:", "lbl_tag_title", 50.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateTextEditBox(jRow, "name_placeholder", "txt_item_tag", 60, FALSE, 325.0f, 20.0f); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 2 (ResRef)*********************************************************** 129 + jRow = CreateLabel(JsonArray(), "ResRef:", "lbl_resref_title", 50.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateTextEditBox(jRow, "name_placeholder", "txt_item_resref", 60, FALSE, 325.0f, 20.0f); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Base Item/Weight)************************************************* 157 + jRow = CreateLabel(JsonArray(), "Base Item: ", "lbl_baseitem_title", 75.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "", "lbl_baseitem", 145.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "Weight: ", "lbl_weight_title", 55.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "", "lbl_weight", 65.0f, 20.0f, NUI_HALIGN_LEFT); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (Gold Value)******************************************************* 185 + jRow = CreateLabel(JsonArray(), "Gold Value: ", "lbl_gold_title", 85.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "", "lbl_gold_value", 135.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "Minimum Level: ", "lbl_min_lvl_title", 110.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateLabel(jRow, "", "lbl_min_lvl", 20.0f, 20.0f, NUI_HALIGN_LEFT); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 (Plot/Stolen)****************************************************** 213 + jRow = CreateCheckBox(JsonArray(), " Plot", "chbx_plot", 110.0, 20.0f, "chbx_plot_tooltip"); + jRow = CreateCheckBox(jRow, " Stolen", "chbx_stolen", 110.0, 20.0f, "chbx_stolen_tooltip"); + jRow = CreateCheckBox(jRow, " Cursed", "chbx_cursed", 110.0, 20.0f, "chbx_cursed_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 6 (Identified/Droppable)********************************************* 269 + jRow = CreateCheckBox(JsonArray(), " Identified", "chbx_identified", 110.0, 25.0f, "chbx_identified_tooltip"); + jRow = CreateCheckBox(jRow, " Droppable", "chbx_droppable", 110.0, 25.0f, "chbx_droppable_tooltip"); + jRow = CreateButton(jRow, "Save as UTI", "btn_save_uti", 110.0, 25.0, -1.0, "btn_save_uti_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 9 (Stack/Variables/Destroy/Charges)********************************** 307 + jRow = CreateTextEditBox(JsonArray(), "name_placeholder", "txt_stack", 4, FALSE, 35.0f, 25.0f); + jRow = CreateLabel(jRow, " Stack", "lbl_stack_title", 72.0f, 20.0f, NUI_HALIGN_LEFT); + jRow = CreateTextEditBox(jRow, "name_placeholder", "txt_charges", 4, FALSE, 40.0f, 25.0f); + jRow = CreateLabel(jRow, " Charges", "lbl_charges_title", 68.0f, 25.0f, NUI_HALIGN_LEFT); + jRow = CreateButtonSelect(jRow, "Destroy", "btn_destroy", 110.0, 25.0, "btn_destroy_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 11 (Description)***************************************************** 558 + jRow = CreateTextEditBox(JsonArray(), "desc_placeholder", "txt_desc", 1000, TRUE, 375.0, 243.0, "txt_desc_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 566.0; + // Row 12 (Item Base Description)* ***************************************** 158 + int nBaseItemType = GetBaseItemType(oItem); + float fWeight; + string sBaseItemDesc; + if(nBaseItemType == BASE_ITEM_ARMOR) + { + int nArmorAC = ai_GetArmorBonus(oItem); + sBaseItemDesc = GetStringByStrRef(StringToInt(Get2DAString("armor", "BASEITEMSTATREF", nArmorAC))); + fWeight = StringToFloat(Get2DAString("armor", "WEIGHT", nArmorAC)); + } + else + { + sBaseItemDesc = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "BaseItemStatRef", nBaseItemType))); + fWeight = StringToFloat(Get2DAString("baseitems", "TenthLBS", nBaseItemType)); + } + if(sBaseItemDesc == "Bad Strref") sBaseItemDesc = ""; + if(sBaseItemDesc != "") + { + jRow = CreateTextBox(JsonArray(), "txt_base_desc", 375.0, 150.0, FALSE, NUI_SCROLLBARS_NONE, "txt_base_desc_tooltip"); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + fHeight += 158.0; + } + // Set the layout of the window. + json jLayout = NuiCol (jCol); + object oOwner = GetItemPossessor(oItem); + string sName = ai_StripColorCodes (GetName(oOwner)); + int nToken = SetWindow (oPC, jLayout, "craft_item_nui", sName + "'s item menu", + -1.0, -1.0, 400.0, fHeight, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_crafting"); + // Set the buttons to show events to 0e_window. + NuiSetBind(oPC, nToken, "txt_item_name_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_item_name", JsonString(GetName(oItem))); + NuiSetBindWatch(oPC, nToken, "txt_item_name", TRUE); + NuiSetBind(oPC, nToken, "txt_item_tag_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_item_tag", JsonString(GetTag(oItem))); + NuiSetBindWatch(oPC, nToken, "txt_item_tag", TRUE); + NuiSetBind(oPC, nToken, "txt_item_resref_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_item_resref", JsonString(GetResRef(oItem))); + NuiSetBindWatch(oPC, nToken, "txt_item_resref", TRUE); + string sValue = GetStringByStrRef(StringToInt(Get2DAString("baseitems", "Name", nBaseItemType))); + NuiSetBind(oPC, nToken, "lbl_baseitem_label", JsonString(sValue)); + sValue = FloatToString(fWeight * 0.1f, 0, 1); + NuiSetBind(oPC, nToken, "lbl_weight_label", JsonString(sValue)); + int nValue = GetGoldPieceValue(oItem); + NuiSetBind (oPC, nToken, "lbl_gold_value_label", JsonString(IntToString(nValue))); + sValue = IntToString (ai_GetMinimumEquipLevel(oItem)); + NuiSetBind(oPC, nToken, "lbl_min_lvl_label", JsonString (sValue)); + nValue = GetPlotFlag (oItem); + NuiSetBind(oPC, nToken, "chbx_plot_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_plot_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "chbx_plot_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_plot_tooltip", JsonString (" Plot items cannot be sold or destroyed.")); + nValue = GetStolenFlag(oItem); + NuiSetBind(oPC, nToken, "chbx_stolen_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_stolen_check", JsonBool(nValue)); + NuiSetBindWatch (oPC, nToken, "chbx_stolen_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_stolen_tooltip", JsonString (" Stolen items cannot be sold to some stores.")); + nValue = GetItemCursedFlag(oItem); + NuiSetBind(oPC, nToken, "chbx_cursed_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_cursed_check", JsonBool(nValue)); + NuiSetBindWatch (oPC, nToken, "chbx_cursed_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_cursed_tooltip", JsonString (" Cursed items cannot be dropped or sold.")); + nValue = GetIdentified (oItem); + NuiSetBind(oPC, nToken, "chbx_identified_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_identified_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "chbx_identified_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_identified_tooltip", JsonString (" Close inventory and open again to refresh identified state.")); + nValue = GetDroppableFlag(oItem); + NuiSetBind(oPC, nToken, "chbx_droppable_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "chbx_droppable_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "chbx_droppable_check", TRUE); + NuiSetBind(oPC, nToken, "chbx_droppable_tooltip", JsonString (" Droppable items only work on death of an NPC.")); + NuiSetBind(oPC, nToken, "btn_save_uti_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_save_uti_tooltip", JsonString (" Saves item to a UTI file. Update will be used in the game.")); + nValue = GetItemStackSize (oItem); + NuiSetBind(oPC, nToken, "txt_stack_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "txt_stack", JsonString(IntToString (nValue))); + NuiSetBindWatch (oPC, nToken, "txt_stack", TRUE); + nValue = GetItemCharges (oItem); + NuiSetBind(oPC, nToken, "txt_charges_event", JsonBool(TRUE)); + NuiSetBind (oPC, nToken, "txt_charges", JsonString(IntToString (nValue))); + NuiSetBindWatch (oPC, nToken, "txt_charges", TRUE); + NuiSetBind(oPC, nToken, "btn_destroy_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_destroy_tooltip", JsonString(" Destroys the item permanently! Must click twice to destroy the item.")); + // Description + NuiSetBind(oPC, nToken, "txt_desc_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "txt_desc", TRUE); + NuiSetBind(oPC, nToken, "txt_desc_tooltip", JsonString (" Color codes can be used!")); + NuiSetBind(oPC, nToken, "txt_desc", JsonString(GetDescription(oItem))); + // Base Item Description + NuiSetBind(oPC, nToken, "txt_base_desc_event", JsonBool(TRUE)); + //NuiSetBind(oPC, nToken, "txt_desc_tooltip", JsonString ("Color codes can be used!")); + if(sBaseItemDesc != "") NuiSetBind(oPC, nToken, "txt_base_desc", JsonString(sBaseItemDesc)); +} +void CraftItemInfoEvents(object oPC, int nToken) +{ + string sEvent = NuiGetEventType(); + // We don't use and it causes error windows to go off! Return early! + if(sEvent == "mouseup") return; + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + //SendMessageToPC(oPC, "0e_crafting, 1961, sElem: " + sElem + " sEvent: " + sEvent); + object oTarget = GetLocalObject(oPC, CRAFT_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oPC; + // Get the item we are crafting. + int nItemSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetLocalObject(oPC, "CRAFT_INFO_ITEM"); + if(sEvent == "click") + { + if(sElem == "btn_destroy") + { + if(!JsonGetInt(NuiGetBind(oPC, nToken, "btn_destroy"))) + { + if(!GetPlotFlag(oItem)) + { + DestroyObject(oItem); + ai_SendMessages(GetName(oItem) + " has been permanently destroyed!", AI_COLOR_RED, oPC); + NuiDestroy(oPC, nToken); + } + else + { + ai_SendMessages("The plot flag must be removed before you can destroy " + GetName(oItem) + "!", AI_COLOR_YELLOW, oPC); + } + } + else + { + ai_SendMessages("Click Destroy button again to destroy " + GetName(oItem) + "!", AI_COLOR_RED, oPC); + } + } + // Allows saving the item as a UTI! + else if(sElem == "btn_save_uti") + { + json jItem = ObjectToJson(oItem); + string sResRef = JsonGetString(NuiGetBind(oPC, nToken, "txt_item_resref")); + sResRef = ai_RemoveIllegalCharacters(sResRef); + if(sResRef == "") ai_SendMessages(GetName(oItem) + " has not been saved! ResRef does not have a value.", AI_COLOR_RED, oPC); + else + { + JsonToTemplate(jItem, sResRef, RESTYPE_UTI); + ai_SendMessages(GetName(oItem) + " has been saved as " + sResRef + ".uti in your Neverwinter Nights Temp directory.", AI_COLOR_GREEN, oPC); + ai_SendMessages("This temp directory will be removed when the game is left.", AI_COLOR_GREEN, oPC); + } + } + } + if(sEvent == "watch") + { + // Changing the name needs to be before the cooldown. + if(sElem == "txt_item_name") + { + string sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_item_name")); + SetName(oItem, sName); + int nToken2 = NuiFindWindow(oPC, "crafting_nui"); + if(nToken2) NuiSetBind(oPC, nToken2, "txt_item_name", JsonString(sName)); + } + else if(sElem == "txt_item_tag") + { + string sTag = JsonGetString(NuiGetBind(oPC, nToken, "txt_item_tag")); + SetTag(oItem, sTag); + } + else if(sElem == "txt_stack") + { + int nSize = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, "txt_stack"))); + int nBaseItemType = GetBaseItemType(oItem); + string sMaxSize = Get2DAString("baseitems", "Stacking", nBaseItemType); + if(nSize > StringToInt(sMaxSize)) + { + ai_SendMessages("The maximum stack for this item type is " + sMaxSize + ".", AI_COLOR_RED, oPC); + NuiSetBind(oPC, nToken, "txt_stack", JsonString(sMaxSize)); + } + if(nSize != 0) SetItemStackSize(oItem, nSize); + } + else if(sElem == "txt_charges") + { + int nCharges = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, "txt_charges"))); + if(nCharges > 250) + { + ai_SendMessages("The maximum charges for this item type is 250.", AI_COLOR_RED, oPC); + NuiSetBind(oPC, nToken, "txt_charges", JsonString("250")); + } + if(nCharges != 0) SetItemCharges(oItem, nCharges); + } + else if(sElem == "chbx_plot_check") + { + int nValue = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetPlotFlag(oItem, nValue); + } + else if(sElem == "chbx_stolen_check") + { + int nValue = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetStolenFlag(oItem, nValue); + } + else if(sElem == "chbx_cursed_check") + { + int nValue = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetItemCursedFlag(oItem, nValue); + } + else if(sElem == "chbx_identified_check") + { + int nValue = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetIdentified(oItem, nValue); + } + else if(sElem == "chbx_droppable_check") + { + int nValue = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); + SetDroppableFlag(oItem, nValue); + } + } +} +/*void CreateDresserGUIPanel(object oPC, object oTarget) +{ +} + diff --git a/_module/nss/pe_debug.nss b/_module/nss/pe_debug.nss new file mode 100644 index 00000000..5b6ad1a4 --- /dev/null +++ b/_module/nss/pe_debug.nss @@ -0,0 +1,900 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: pe_debug + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + PEPS Plugin to allow use of special Debug scripts +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +#include "0i_module" +#include "0i_menus" +//#include "prc_inc_eventhk" +// Gets a variable from oTarget, if oTarget is OBJECT_INVALID then +// it will get the variable from the Module and Area. +void debug_GetObjectVariable(object oPC, object oTarget, string sDesc = ""); +// Lists the variables from oTarget to the screen. +void debug_ListObjectVariables(object oPC, object oTarget); +// Force event script change to default for oCreature. +void ai_ForceAssociateEventScriptsToDefault(object oPC, object oCreature); +// Reverts event script change from default for oCreature. +void ai_RevertAssociateEventScriptsToDefault(object oPC, object oCreature); +void main() +{ + // Get the last player to use targeting mode + object oPC = GetLastPlayerToSelectTarget(); + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + if(oPC == OBJECT_SELF && sTargetMode != "") + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + object oObject = GetLocalObject(oPC, "AI_TARGET_OBJECT"); + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + return; + } + // Targeting code here. + if(sTargetMode == "DEBUG_CREATURE") + { + object oModule = GetModule(); + string sDebugName = GetName(oTarget); + SetLocalString(oModule, AI_RULE_DEBUG_CREATURE, sDebugName); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_DEBUG_CREATURE, JsonString(sDebugName)); + ai_SetCampaignDbJson("rules", jRules); + SetLocalObject(oPC, "AI_RULE_DEBUG_CREATURE_OBJECT", oTarget); + ExecuteScript("pi_debug", oPC); + } + else if(sTargetMode == "CLEAR_REPUTATION") + { + int nReputation = GetFactionAverageReputation(oTarget, oPC); + object oPCMember = GetFirstFactionMember(oPC, FALSE); + while(GetIsObjectValid(oPCMember)) + { + ClearPersonalReputation(oPCMember, oTarget); + oPCMember = GetNextFactionMember(oPC, FALSE); + } + ai_SendMessages("Your reputation with " + GetName(oTarget) + " has been set to neutral.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "SET_REPUTATION") + { + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 50, oTarget); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 50, oTarget); + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 50, oTarget); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 50, oTarget); + ai_SendMessages(GetName(oTarget) + " has been set to a neutral reputation.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DEBUG_INFO") + { + ai_SendMessages("Information for " + GetName(oTarget), AI_COLOR_WHITE, oPC); + ai_SendMessages("ResRef: " + GetResRef(oTarget), AI_COLOR_GREEN, oPC); + ai_SendMessages("Tag: " + GetTag(oTarget), AI_COLOR_ORANGE, oPC); + ai_SendMessages("UUID: " + GetObjectUUID(oTarget), AI_COLOR_LIGHT_MAGENTA, oPC); + ai_SendMessages("Faction Commoner: " + IntToString(GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oTarget)), AI_COLOR_GREEN, oPC); + ai_SendMessages("Faction Defender: " + IntToString(GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oTarget)), AI_COLOR_GREEN, oPC); + ai_SendMessages("Faction Merchant: " + IntToString(GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oTarget)), AI_COLOR_GREEN, oPC); + ai_SendMessages("Faction Hostile: " + IntToString(GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oTarget)), AI_COLOR_RED, oPC); + int nObjectType = GetObjectType(oTarget); + if(nObjectType == OBJECT_TYPE_CREATURE) + { + json jObject = ObjectToJson(oTarget); + string sConversation = JsonGetString(GffGetResRef(jObject, "Conversation")); + ai_SendMessages("Conversation: " + sConversation, AI_COLOR_CYAN, oPC); + SendMessageToPC(oPC, "Creature Event Scripts:"); + string sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_NOTICE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_NOTICE SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_END_COMBATROUND SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DIALOGUE SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_MELEE_ATTACKED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DAMAGED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DEATH); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DEATH SCRIPT: " + sScript); + sScript = GetLocalString(oTarget, "AI_ON_DEATH"); + if(sScript != "") + { + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DEATH SECOND SCRIPT: " + sScript); + } + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DISTURBED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_SPAWN_IN SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_RESTED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_RESTED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_SPELLCASTAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_BLOCKED_BY_DOOR SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USER_DEFINED_EVENT SCRIPT: " + sScript); + } + else if(nObjectType == OBJECT_TYPE_DOOR) + { + SendMessageToPC(oPC, "Door Event Scripts:"); + string sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_CLICKED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLICKED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_CLOSE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLOSED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_DAMAGE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DAMAGE SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_DEATH); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DEATH SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_DIALOGUE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DIALOGUE SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_DISARM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DISARM SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_FAIL_TO_OPEN); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_FAIL_TO_OPEN SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_LOCK); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_LOCK SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_MELEE_ATTACKED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_MELEE_ATTACKED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_OPEN); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_OPEN SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_SPELLCASTAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_SPELLCASTAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_TRAPTRIGGERED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_TRAPTRIGGERED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_UNLOCK); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_UNLOCK SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_DOOR_ON_USERDEFINED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USERDEFINED SCRIPT: " + sScript); + } + else if(nObjectType == OBJECT_TYPE_PLACEABLE) + { + SendMessageToPC(oPC, "Placeable Event Scripts:"); + string sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_CLOSED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLOSED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_DAMAGED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DAMAGED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_DEATH); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DEATH SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_DIALOGUE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DIALOGUE SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_DISARM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DISARM SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_INVENTORYDISTURBED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_INVENTORYDISTURBED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_LEFT_CLICK); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_LEFT_CLICK SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_LOCK); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_LOCK SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_MELEEATTACKED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_MELEEATTACKED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_OPEN); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_OPEN SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_SPELLCASTAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_SPELLCASTAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_TRAPTRIGGERED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_TRAPTRIGGERED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_UNLOCK); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_UNLOCK SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_USED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USER_DEFINED_EVENT SCRIPT: " + sScript); + } + else if(nObjectType == OBJECT_TYPE_TRIGGER) + { + SendMessageToPC(oPC, "Trigger Event Scripts:"); + string sScript = GetEventScript(oTarget, EVENT_SCRIPT_TRIGGER_ON_CLICKED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLICKED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_DISARM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_DISARM SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_TRIGGER_ON_OBJECT_ENTER); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_OBJECT_ENTER SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_TRIGGER_ON_OBJECT_EXIT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_OBJECT_EXIT SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_PLACEABLE_ON_TRAPTRIGGERED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_TRAPTRIGGERED SCRIPT: " + sScript); + sScript = GetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USER_DEFINED_EVENT SCRIPT: " + sScript); + } + else + { + // Area event scripts. + object oArea = GetArea(oPC); + SendMessageToPC(oPC, "Area Event Scripts:"); + string sScript = GetEventScript(oArea, EVENT_SCRIPT_AREA_ON_ENTER); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_ENTER SCRIPT: " + sScript); + sScript = GetEventScript(oArea, EVENT_SCRIPT_AREA_ON_EXIT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_EXIT SCRIPT: " + sScript); + sScript = GetEventScript(oArea, EVENT_SCRIPT_PLACEABLE_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oArea, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USER_DEFINED_EVENT SCRIPT: " + sScript); + // Module event scripts. + object oModule = GetModule(); + SendMessageToPC(oPC, GetModuleName() + " Module Event Scripts."); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_ACQUIRE_ITEM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_ACQUIRE_ITEM SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_ACTIVATE_ITEM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_ACTIVATE_ITEM SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_CLIENT_ENTER); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLIENT_ENTER SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_CLIENT_EXIT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_CLIENT_EXIT SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_EQUIP_ITEM SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_HEARTBEAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_HEARTBEAT SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_LOSE_ITEM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_LOSE_ITEM SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_MODULE_LOAD); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_MODULE_LOAD SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_MODULE_START); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_MODULE_START SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_NUI_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_NUI_EVENT SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_CANCEL_CUTSCENE); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_CANCEL_CUTSCENE SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_CHAT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_CHAT SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_DEATH); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_DEATH SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_DYING); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_DYING SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_GUIEVENT SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_LEVEL_UP); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_LEVEL_UP SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_REST); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_REST SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_TARGET); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_TARGET SCRIPT: " + sScript); + sScript = GetLocalString(oModule, AI_MODULE_TARGET_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + if(sScript != "") + { + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_TARGET SECOND SCRIPT: " + sScript); + } + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_TILE_ACTION); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_PLAYER_TILE_ACTION SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_RESPAWN_BUTTON_PRESSED); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_RESPAWN_BUTTON_PRESSED SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_UNEQUIP_ITEM); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_UNEQUIP_ITEM SCRIPT: " + sScript); + sScript = GetEventScript(oModule, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT); + sScript += " [" + ResManGetAliasFor(sScript, RESTYPE_NCS) + "]"; + SendMessageToPC(oPC, "ON_USER_DEFINED_EVENT SCRIPT: " + sScript); + } + /* Checks PRC virtual events. See prc_inc_eventhk + int nIndex = 1; + string sEvent = GetFirstEventScript(oTarget, EVENT_VIRTUAL_ONHEARTBEAT, FALSE); + if(sEvent != "") + { + SendMessageToPC(oPC, "HB event script " + IntToString(nIndex) + ": " + sEvent); + for(nIndex = 2; nIndex < 20; nIndex++) + { + sEvent = GetNextEventScript(oTarget, EVENT_VIRTUAL_ONHEARTBEAT, FALSE); + if(sEvent == "") break; + SendMessageToPC(oPC, "HB event script " + IntToString(nIndex) + ": " + sEvent); + } + }*/ + } + else if(sTargetMode == "SET_NPC_SCRIPTS") + { + if(GetLocalString(oTarget, "AI_ON_HEARTBEAT") == "") + { + ai_ForceAssociateEventScriptsToDefault(oPC, oTarget); + } + else ai_RevertAssociateEventScriptsToDefault(oPC, oTarget); + } + else if(sTargetMode == "CLEAR_CREATURE_EVENTS") + { + ai_SendMessages("Set event scripts for " + GetName(oTarget) + " to default.", AI_COLOR_YELLOW, oPC); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_NOTICE, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DEATH, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_RESTED, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "default"); + SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "default"); + DeleteLocalInt(oTarget, "AI_I_AM_BEING_HEALED"); + DeleteLocalString(oTarget, "AIScript"); + ai_ClearCreatureActions(); + } + else if(sTargetMode == "DEBUG_JSON_DUMP") + { + json jObject = ObjectToJson(oTarget, TRUE); + WriteTimestampedLogEntry(GetName(oTarget) + " JsonDump: " + JsonDump(jObject, 1)); + ai_SendMessages(GetName(oTarget) + " has been dumped to the log file!", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DEBUG_LIST_VAR") + { + debug_ListObjectVariables(oPC, oTarget); + } + else if(sTargetMode == "DEBUG_SET_VARIABLE") + { + string sVarName = GetLocalString(oPC, "Debug_Var_Name"); + int nVarType = GetLocalInt(oPC, "Debug_Var_Type"); + if(nVarType == 0) // Int + { + string sVarValue = GetLocalString(oPC, "Debug_Var_Value"); + int nVarValue = StringToInt(sVarValue); + SetLocalInt(oTarget, sVarName, nVarValue); + ai_SendMessages(sVarName + " [Int] has been set to " + IntToString(nVarValue) + " for " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 1) // Float + { + string sVarValue = GetLocalString(oPC, "Debug_Var_Value"); + DeleteLocalString(oPC, "Debug_Var_Name"); + float fVarValue = StringToFloat(sVarValue); + SetLocalFloat(oTarget, sVarName, fVarValue); + ai_SendMessages(sVarName + " [Float] has been set to " + FloatToString(fVarValue, 0, 2) + " for " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 2) // String + { + string sVarValue = GetLocalString(oPC, "Debug_Var_Value"); + SetLocalString(oTarget, sVarName, sVarValue); + ai_SendMessages(sVarName + " [String] has been set to " + sVarValue + " for " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 3) // Object + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalObject(oPC, "AI_TARGET_OBJECT", oTarget); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_OBJECT_VARIABLE"); + ai_SendMessages("Select an object to save to " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | + OBJECT_TYPE_ITEM | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(nVarType == 4) // Location + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalObject(oPC, "AI_TARGET_OBJECT", oTarget); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_LOCATION_VARIABLE"); + ai_SendMessages("Select a location to save to " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_TILE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + DeleteLocalString(oPC, "Debug_Var_Name"); + DeleteLocalInt(oPC, "Debug_Var_Type"); + DeleteLocalString(oPC, "Debug_Var_Value"); + } + else if(sTargetMode == "DEBUG_SET_OBJECT_VARIABLE") + { + string sVarName = GetLocalString(oPC, "Debug_Var_Name"); + SetLocalObject(oObject, sVarName, oTarget); + DeleteLocalObject(oPC, "AI_TARGET_OBJECT"); + DeleteLocalString(oPC, "Debug_Var_Name"); + ai_SendMessages(sVarName + " [Object] has been set to " + GetName(oObject) + " for " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DEBUG_SET_LOCATION_VARIABLE") + { + string sVarName = GetLocalString(oPC, "Debug_Var_Name"); + SetLocalLocation(oObject, sVarName, lLocation); + DeleteLocalObject(oPC, "AI_TARGET_OBJECT"); + DeleteLocalString(oPC, "Debug_Var_Name"); + ai_SendMessages(sVarName + " [Location] has been set to " + LocationToString(lLocation) + " for " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "DEBUG_DELETE_VARIABLE") + { + string sVarName = GetLocalString(oPC, "Debug_Var_Name"); + int nVarType = GetLocalInt(oPC, "Debug_Var_Type"); + if(nVarType == 0) DeleteLocalInt(oTarget, sVarName); + else if(nVarType == 1) DeleteLocalFloat(oTarget, sVarName); + else if(nVarType == 2) DeleteLocalString(oTarget, sVarName); + else if(nVarType == 4) DeleteLocalObject(oTarget, sVarName); + else if(nVarType == 5) DeleteLocalLocation(oTarget, sVarName); + ai_SendMessages(sVarName + " has been deleted from " + GetName(oTarget), AI_COLOR_YELLOW, oPC); + DeleteLocalString(oPC, "Debug_Var_Name"); + DeleteLocalInt(oPC, "Debug_Var_Type"); + } + else if(sTargetMode == "DEBUG_GET_VARIABLE") + { + debug_GetObjectVariable(oPC, oTarget); + } + } + // Run all non-targeting code here, usually NUI events. + else + { + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + //string sWndId = NuiGetWindowId(oPC, nToken); + //********************************************************************** + //if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + if(sEvent == "click") + { + if(sElem == "btn_npc_scripts") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "SET_NPC_SCRIPTS"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select an npc to change scripts for.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE , MOUSECURSOR_CREATE, MOUSECURSOR_NOCREATE); + } + else if(sElem == "btn_set_reputation") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "SET_REPUTATION"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select a creature to set all standard reputations to neutral.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_clear_reputation") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "CLEAR_REPUTATION"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select a creature to clear your PC's reputation with that creature's faction.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_info") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_INFO"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select an object to send it's information to the players screen.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL , MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_obj_json") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_JSON_DUMP"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select an object to dump it's json values to the log.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | + OBJECT_TYPE_ITEM | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_obj_var") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_LIST_VAR"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select an object to list it's variables to the player screen.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_debug_creature") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_CREATURE"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select a creature to start sending debug information to the log for.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_clear_events") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "CLEAR_CREATURE_EVENTS"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select a creature to set event scripts to default.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_clear_debug") + { + object oModule = GetModule(); + SetLocalString(oModule, AI_RULE_DEBUG_CREATURE, ""); + json jRules = ai_GetCampaignDbJson("rules"); + jRules = JsonObjectSet(jRules, AI_RULE_DEBUG_CREATURE, JsonString("")); + ai_SetCampaignDbJson("rules", jRules); + DeleteLocalObject(oPC, "AI_RULE_DEBUG_CREATURE_OBJECT"); + ai_SendMessages("Creature Debug mode has been cleared.", AI_COLOR_YELLOW, oPC); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_debug", oPC); + } + else if(sElem == "btn_delete_var") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + string sVarName = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")); + SetLocalString(oPC, "Debug_Var_Name", sVarName); + SetLocalString(oPC, "Debug_Var_Value", JsonGetString(NuiGetBind(oPC, nToken, "txt_var_value"))); + SetLocalInt(oPC, "Debug_Var_Type", JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected"))); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_DELETE_VARIABLE"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select Object to delete (" + sVarName + ") variable from.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_get_var") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + string sVarName = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")); + SetLocalString(oPC, "Debug_Var_Name", sVarName); + SetLocalString(oPC, "Debug_Var_Value", JsonGetString(NuiGetBind(oPC, nToken, "txt_var_value"))); + SetLocalInt(oPC, "Debug_Var_Type", JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected"))); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_GET_VARIABLE"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select Object to get (" + sVarName + ") variable from.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_set_var") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + string sVarName = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")); + SetLocalString(oPC, "Debug_Var_Name", sVarName); + SetLocalString(oPC, "Debug_Var_Value", JsonGetString(NuiGetBind(oPC, nToken, "txt_var_value"))); + SetLocalInt(oPC, "Debug_Var_Type", JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected"))); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_VARIABLE"); + NuiDestroy(oPC, nToken); + ai_SendMessages("Select Object to set (" + sVarName + ") variable to.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + } + if(sEvent == "watch") + { + if(sElem == "txt_var_name" || sElem == "txt_var_value" || + sElem == "cmb_var_type_selected") + { + if(JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")) != "") + { + NuiSetBind(oPC, nToken, "btn_get_var_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_delete_var_event", JsonBool(TRUE)); + if(JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected")) == 3 || // Objects + JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected")) == 4 || // Locations + JsonGetString(NuiGetBind(oPC, nToken, "txt_var_value")) != "") + { + NuiSetBind(oPC, nToken, "btn_set_var_event", JsonBool(TRUE)); + return; + } + } + else + { + NuiSetBind(oPC, nToken, "btn_get_var_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_delete_var_event", JsonBool(FALSE)); + } + NuiSetBind(oPC, nToken, "btn_set_var_event", JsonBool(FALSE)); + } + } + if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + if(sElem == "btn_delete_var") + { + object oModule = GetModule(); + // Set Targeting variables. + string sVarName = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")); + int nVarType = JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected")); + if(nVarType == 0) DeleteLocalInt(oModule, sVarName); + else if(nVarType == 1) DeleteLocalFloat(oModule, sVarName); + else if(nVarType == 2) DeleteLocalString(oModule, sVarName); + else if(nVarType == 4) DeleteLocalObject(oModule, sVarName); + else if(nVarType == 5) DeleteLocalLocation(oModule, sVarName); + ai_SendMessages(sVarName + " has been deleted from the Module", AI_COLOR_YELLOW, oPC); + } + else if(sElem == "btn_get_var") + { + // Set Targeting variables. + SetLocalString(oPC, "Debug_Var_Name", JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name"))); + SetLocalInt(oPC, "Debug_Var_Type", JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected"))); + debug_GetObjectVariable(oPC, GetModule(), "(Module)"); + } + else if(sElem == "btn_set_var") + { + // Set Targeting variables. + string sVarName = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_name")); + string sVarValue = JsonGetString(NuiGetBind(oPC, nToken, "txt_var_value")); + int nVarType = JsonGetInt(NuiGetBind (oPC, nToken, "cmb_var_type_selected")); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_VARIABLE"); + if(nVarType == 0) // Int + { + int nVarValue = StringToInt(sVarValue); + SetLocalInt(GetModule(), sVarName, nVarValue); + ai_SendMessages(sVarName + " [Int] has been set to " + IntToString(nVarValue) + " on the Module.", AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 1) // Float + { + float fVarValue = StringToFloat(sVarValue); + SetLocalFloat(GetModule(), sVarName, fVarValue); + ai_SendMessages(sVarName + " [Float] has been set to " + FloatToString(fVarValue, 0, 2) + " on the Module.", AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 2) // String + { + SetLocalString(GetModule(), sVarName, sVarValue); + ai_SendMessages(sVarName + " [String] has been set to " + sVarValue + " on the Module.", AI_COLOR_YELLOW, oPC); + } + else if(nVarType == 3) // Object + { + object oModule = GetModule(); + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, "Debug_Var_Name", sVarName); + SetLocalObject(oPC, "AI_TARGET_OBJECT", oModule); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_OBJECT_VARIABLE"); + ai_SendMessages("Select an object to save to " + GetName(oModule), AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | + OBJECT_TYPE_ITEM | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(nVarType == 4) // Location + { + object oModule = GetModule(); + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_debug"); + // Set Targeting variables. + SetLocalString(oPC, "Debug_Var_Name", sVarName); + SetLocalObject(oPC, "AI_TARGET_OBJECT", oModule); + SetLocalString(oPC, AI_TARGET_MODE, "DEBUG_SET_LOCATION_VARIABLE"); + ai_SendMessages("Select a location to save to " + GetName(oModule), AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_TILE, MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + } + } + } + } +} +void debug_GetObjectVariable(object oPC, object oTarget, string sDesc = "") +{ + string sVar, sVarName = GetLocalString(oPC, "Debug_Var_Name"); + int nVarType = GetLocalInt(oPC, "Debug_Var_Type"); + if(nVarType == 0) sVar = IntToString(GetLocalInt(oTarget, sVarName)); + else if(nVarType == 1) sVar = FloatToString(GetLocalFloat(oTarget, sVarName), 0, 2); + else if(nVarType == 2) sVar = GetLocalString(oTarget, sVarName); + else if(nVarType == 4) sVar = GetName(GetLocalObject(oTarget, sVarName)); + else if(nVarType == 5) sVar = LocationToString(GetLocalLocation(oTarget, sVarName)); + ai_SendMessages(sVarName + " on " + GetName(oTarget) + sDesc + " is set to " + sVar, AI_COLOR_YELLOW, oPC); +} +void debug_ListObjectVariables(object oPC, object oTarget) +{ + string sName = GetName(oTarget); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + ai_SendMessages(sName + " variables:", AI_COLOR_GREEN, oPC); + json jObject = ObjectToJson(oTarget, TRUE); + json jVarTable = GffGetList(jObject, "VarTable"); + string sVariable; + int nIndex, nVarType; + json jVar = JsonArrayGet(jVarTable, nIndex); + while(JsonGetType(jVar) != JSON_TYPE_NULL) + { + sVariable = JsonGetString(GffGetString(jVar, "Name")); + nVarType = JsonGetInt(GffGetDword(jVar, "Type")); + if(nVarType == 1) + { + sVariable += " [int] "; + sVariable += IntToString(JsonGetInt(GffGetInt(jVar, "Value"))); + } + else if(nVarType == 2) + { + sVariable += " [float] "; + sVariable += FloatToString(JsonGetFloat(GffGetFloat(jVar, "Value")), 0, 2); + } + else if(nVarType == 3) + { + sVariable += " [string] "; + sVariable += JsonGetString(GffGetString(jVar, "Value")); + } + else if(nVarType == 4) + { + sName = GetName(GetLocalObject(oTarget, sVariable)); + sVariable += " [object] " + sName; + } + else if(nVarType == 5) + { + sName = LocationToString(GetLocalLocation(oTarget, sVariable)); + sVariable += " [location] " + sName; + } + else if(nVarType == 7) + { + sVariable += " [struct] "; + sVariable += JsonDump(GffGetStruct(jVar, "Value")); + } + sVariable += JsonGetString(JsonObjectGet(jVar, "Value")); + ai_SendMessages(sVariable, AI_COLOR_YELLOW, oPC); + jVar = JsonArrayGet(jVarTable, ++nIndex); + } + if(!nIndex) ai_SendMessages("No variables to list!", AI_COLOR_YELLOW, oPC); +} +void ai_ForceAssociateEventScriptsToDefault(object oPC, object oCreature) +{ + ai_SendMessages("Changing " + GetName(oCreature) + "'s event scripts to default event scripts!", AI_COLOR_YELLOW, oPC); + ai_SendMessages("Use this tool on them again to revert this creatures event scripts back!", AI_COLOR_YELLOW, oPC); + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + if(sScript == "0e_id_events" || sScript == "0e_prc_id_events") + { + ai_SendMessages("You cannot use this on creatures in Infinite Dungeons!"); + return; + } + SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_ch_ac1"); + //********** On Perception ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); + SetLocalString(oCreature, "AI_ON_NOTICE", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_ch_ac2"); + //********** On End Combat Round ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); + SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_ch_ac3"); + //********** On Dialogue ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); + SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_ch_ac4"); + //********** On Melee Attacked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); + SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_ch_ac5"); + //********** On Damaged ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); + SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_ch_ac6"); + //********** On Disturbed ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); + SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_ch_ac8"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //********** On Rested ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); + SetLocalString(oCreature, "AI_ON_RESTED", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_ch_aca"); + //********** On Spell Cast At ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); + SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_ch_acb"); + //********** On Blocked ********** + sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); + SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_ch_acb"); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); + if(!GetCommandable(oCreature)) SetCommandable(TRUE, oCreature); +} +void ai_RevertAssociateEventScriptsToDefault(object oPC, object oCreature) +{ + ai_SendMessages("Changing " + GetName(oCreature) + "'s event scripts back to original!", AI_COLOR_YELLOW, oPC); + //********** On Heartbeat ********** + string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + if(sScript == "0e_id_events" || sScript == "0e_prc_id_events") + { + ai_SendMessages("You cannot use this on creatures in Infinite Dungeons!", AI_COLOR_RED, oPC); + return; + } + sScript = GetLocalString(oCreature, "AI_ON_HEARTBEAT"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, sScript); + //********** On Perception ********** + sScript = GetLocalString(oCreature, "AI_ON_NOTICE"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, sScript); + //********** On End Combat Round ********** + sScript = GetLocalString(oCreature, "AI_ON_END_COMBATROUND"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, sScript); + //********** On Dialogue ********** + sScript = GetLocalString(oCreature, "AI_ON_DIALOGUE"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, sScript); + //********** On Melee Attacked ********** + sScript = GetLocalString(oCreature, "AI_ON_MELEE_ATTACKED"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, sScript); + //********** On Damaged ********** + sScript = GetLocalString(oCreature, "AI_ON_DAMAGED"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, sScript); + //********** On Disturbed ********** + sScript = GetLocalString(oCreature, "AI_ON_DISTURBED"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, sScript); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); + //********** On Rested ********** + sScript = GetLocalString(oCreature, "AI_ON_RESTED"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, sScript); + //********** On Spell Cast At ********** + sScript = GetLocalString(oCreature, "AI_ON_SPELLCASTAT"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, sScript); + //********** On Blocked ********** + sScript = GetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR"); + SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, sScript); + //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); + if(!GetCommandable(oCreature)) SetCommandable(TRUE, oCreature); +} + diff --git a/_module/nss/pe_henchmen.nss b/_module/nss/pe_henchmen.nss new file mode 100644 index 00000000..4f6bf42f --- /dev/null +++ b/_module/nss/pe_henchmen.nss @@ -0,0 +1,589 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pe_henchmen +//////////////////////////////////////////////////////////////////////////////// + Used with pe_henchmen to run the npc plugin for + Philos Single Player Enhancements. +*/////////////////////////////////////////////////////////////////////////////// +#include "pinc_henchmen" +#include "x0_i0_henchman" +#include "0i_module" +// Creates the Henchman widget. +void PopupWidgetHenchmanGUIPanel(object oPC); +void ResetHenchmanWindows(object oPC, int nToken, object oHenchman) +{ + DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "henchman_nui"))); + DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC)); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.2, CreateCharacterEditGUIPanel(oPC, oHenchman)); +} +void main() +{ + //************************************************************************** + //********************** Henchmen Targeting Execution ********************** + //************************************************************************** + // Get the last player to use targeting mode + object oPC = GetLastPlayerToSelectTarget(); + if(GetLocalInt (oPC, "0_No_Win_Save")) return; + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + if(oPC == OBJECT_SELF && sTargetMode != "") + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + object oObject = GetLocalObject(oPC, "AI_TARGET_OBJECT"); + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + return; + } + // Targeting code here. + if(sTargetMode == "MAKE_NPC_HENCHMAN") + { + if(GetAssociateType(oTarget) == ASSOCIATE_TYPE_HENCHMAN) + { + ai_SendMessages(GetName(oTarget) + " is already a henchman!", AI_COLOR_RED, oPC); + return; + } + oTarget = CopyObject(oTarget, GetLocation(oPC), OBJECT_INVALID, "", TRUE); + ai_ClearCombatState(oTarget); + ChangeToStandardFaction(oTarget, STANDARD_FACTION_DEFENDER); + DeleteLocalInt(oTarget, AI_ONSPAWN_EVENT); + ai_ChangeEventScriptsForAssociate(oTarget); + AddHenchman(oPC, oTarget); + // Special check for Infinite Dungeon plot givers to be changed into henchman. + if(GetStringLeft(GetLocalString(oTarget, "sConversation"), 8) == "id1_plot") + { + DeleteLocalString(oTarget, "sConversation"); + } + // Remove this variable so they may get a unique tag associate widget. + DeleteLocalString(oTarget, AI_TAG); + ai_SendMessages(GetName(oTarget) + " has been copied and is now in your party as a henchman.", AI_COLOR_GREEN, oPC); + //ExecuteScript("pi_henchmen", oPC); + } + } + //************************************************************************** + //*********************** Henchmen Elements Execution ********************** + //************************************************************************** + else + { + // Let the inspector handle what it wants. + //HandleWindowInspectorEvent (); + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + string sWndId = NuiGetWindowId (oPC, nToken); + //SendMessageToPC(oPC, "pe_henchmen , 26 sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem + + // " nToken: " + IntToString(nToken) + " nIndex: " + IntToString(nIndex) + + // " oPC: " + GetName(oPC)); + //********************************************************************** + // Watch to see if the window moves and save. + if(sElem == "window_geometry" && sEvent == "watch") + { + if(GetLocalInt(oPC, "AI_NO_NUI_SAVE")) return; + json jGeometry = NuiGetBind(oPC, nToken, "window_geometry"); + json jData = GetHenchmanDbJson(oPC, "henchman", "0"); + if(JsonGetType(jData) == JSON_TYPE_NULL) jData = JsonObject(); + jData = JsonObjectSet(jData, sWndId, jGeometry); + SetHenchmanDbJson(oPC, "henchman", jData, "0"); + } + else if(sWndId == "henchman_nui") + { + //********************************************************************** + // Henchman menu. + if(sEvent == "click") + { + string sParty = GetHenchmanDbString(oPC, "henchname", "0"); + // Change to a different saved party #. + if(GetStringLeft(sElem, 9) == "btn_party") + { + sParty = GetStringRight(sElem, 1); + SetHenchmanDbString(oPC, "henchname", sParty, "0"); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC)); + } + // Add an NPC in the game as a henchman. + else if(sElem == "btn_npc_henchman") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_henchmen"); + // Set Targeting variables. + SetLocalString(oPC, AI_TARGET_MODE, "MAKE_NPC_HENCHMAN"); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + ai_SendMessages("Select an NPC to copy and make your henchman.", AI_COLOR_YELLOW, oPC); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL , MOUSECURSOR_CREATE, MOUSECURSOR_NOCREATE); + } + // ******************* Saved Character buttons ********************* + // Show saved party member. + else if(sElem == "btn_saved_char") + { + string sIndex = IntToString(nIndex); + SetHenchmanDbString(oPC, "henchname", sIndex, sParty); + AddSavedCharacterInfo(oPC, nToken, sParty); + } + // Have any saved henchman not in the party join. + else if(sElem == "btn_join_party") + { + SavedPartyJoin(oPC, nToken, sParty); + } + else if(sElem == "btn_saved_join") + { + SavedCharacterJoin(oPC, nToken, sParty); + } + else if(sElem == "btn_saved_remove") + { + string sIndex = GetHenchmanDbString(oPC, "henchname", sParty); + RemoveHenchmanDb(oPC, sParty + sIndex); + if(GetHenchmanDbString(oPC, "henchname", sParty + "0") == "") + { + SetHenchmanDbString(oPC, "henchname", "", sParty); + } + else SetHenchmanDbString(oPC, "henchname", "0", sParty); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC)); + } + else if(sElem == "btn_clear_party") + { + SavedPartyCleared(oPC, nToken, sParty); + } + // ******************* Current Character buttons ********************* + // Show current party member. + else if(sElem == "btn_cur_char") + { + string sIndex = IntToString(nIndex); + SetHenchmanDbString(oPC, "image", sIndex, sParty); + AddCurrentCharacterInfo(oPC, nToken, sParty); + } + // The edit button, for now we are using it to level up! + else if(sElem == "btn_cur_edit") + { + object oHenchman = GetSelectedHenchman(oPC, sParty); + SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman); + CreateCharacterEditGUIPanel(oPC, oHenchman); + } + else if(sElem == "btn_cur_remove") + { + RemoveYourHenchman(oPC, nToken, sParty); + } + else if(sElem == "btn_remove_party") + { + RemoveWholeParty(oPC, nToken, sParty); + } + else if(sElem == "btn_cur_save") + { + SaveYourHenchman(oPC, nToken, sParty); + SetHenchmanDbString(oPC, "henchname", "0", sParty); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC)); + } + else if(sElem == "btn_save_party") + { + SaveWholeParty(oPC, nToken, sParty); + } + } + /*else if(sEvent == "watch") + { + if(sElem == "henchman_widget_check") + { + int bWidget = JsonGetInt(NuiGetBind(oPC, nToken, "henchman_widget_check")); + SetLocalInt(oPC, "AI_WIDGET_HENCHMAN", bWidget); + if(bWidget) PopupWidgetHenchmanGUIPanel(oPC); + else DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "widgethenchmanwin"))); + } + if(sElem == "lock_henchman_widget_check") + { + int bBuffLockWidget = JsonGetInt(NuiGetBind(oPC, nToken, "lock_henchman_widget_check")); + SetLocalInt(oPC, "AI_WIDGET_HENCHMAN_LOCK", bBuffLockWidget); + SetLocalInt(oPC, "AI_WIDGET_HENCHMAN", TRUE); + NuiSetBind(oPC, nToken, "henchman_widget_check", JsonBool(TRUE)); + PopupWidgetHenchmanGUIPanel(oPC); + } + } + //************************************************************************** + // Spell Buffing. + else if (sWndId == "widget_henchman") + { + if (sEvent == "click") + { + string sParty; + if (sElem == "btn_one") sParty = "1"; + if (sElem == "btn_two") sParty = "2"; + if (sElem == "btn_three") sParty = "3"; + if (sElem == "btn_four") sParty = "4"; + SetHenchmanDbString (oPC, "henchname", sParty, "0"); + PopupWidgetHenchmanGUIPanel(oPC); + } + } */ + } + else if(sWndId == "henchman_edit_nui") + { + int nChange = 0; + int nID; + string sResRef, sID, sPlot; + object oHenchman = GetLocalObject(oPC, HENCHMAN_TO_EDIT); + if(sEvent == "watch") + { + if(sElem == "char_name") + { + string sName = JsonGetString(NuiGetBind(oPC, nToken, "char_name")); + SetName(oHenchman, sName); + } + if(sElem == "port_name") + { + if(GetLocalInt(oPC, "AI_PORTRAIT_ID_SET")) + { + DeleteLocalInt(oPC, "AI_PORTRAIT_ID_SET"); + //nID = JsonGetInt(NuiGetUserData(oPC, nToken)); + //SetPortraitId(oHenchman, nID); + } + else NuiSetUserData(oPC, nToken, JsonInt(-1)); + sResRef = JsonGetString (NuiGetBind(oPC, nToken, "port_name")); + if(ResManGetAliasFor(sResRef + "l", RESTYPE_TGA) == "" && + ResManGetAliasFor(sResRef + "l", RESTYPE_DDS) == "") + { + if(GetGender(oHenchman)) sResRef = "po_hu_f_99_"; + else sResRef = "po_hu_m_99_"; + } + NuiSetBind (oPC, nToken, "port_resref_image", JsonString (sResRef + "l")); + } + else if(sElem == "cmb_class_selected") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_class_selected")); + int nClass = GetClassBySelection2DA(nSelection); + SetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition), nClass); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, CreateCharacterEditGUIPanel(oPC, oHenchman)); + } + else if(sElem == "cmb_package_selected") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + string sClass = IntToString(GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition))); + int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_package_selected")); + int nPackage = GetPackageBySelection2DA(sClass, nSelection); + SetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition), nPackage); + } + else if(sElem == "cmb_soundset_selected") + { + int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_soundset_selected")); + int nSoundSet = GetSoundSetBySelection2DA(oHenchman, nSelection); + SetSoundset(oHenchman, nSoundSet); + string sResRef = GetStringLowerCase(Get2DAString("soundset", "RESREF", nSoundSet)); + if(GetStringLeft(sResRef, 4) == "vs_f") + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 11, ":1:2:3:22:34:35:41:42:44:45:46:")); + } + else if(GetStringLeft(sResRef, 4) == "vs_n") + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 10, ":1:2:3:34:35:36:40:42:44:45:")); + } + else + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 7, ":1:2:3:11:12:13:33:")); + } + } + } + if(sEvent == "click") + { + if (sElem == "btn_desc_save") + { + string sDescription = JsonGetString(NuiGetBind(oPC, nToken, "desc_value")); + SetDescription(oHenchman, sDescription); + return; + } + else if(sElem == "btn_level_up") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + int nClass = GetClassByPosition(nPosition, oHenchman); + if(nClass == CLASS_TYPE_INVALID) + { + nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition)); + int nIndex = 1; + while(nIndex < 5) + { + if(nClass == GetClassByPosition(nIndex, oHenchman)) + { + ai_SendMessages(GetName(oHenchman) + " already has this class in a different slot! You can only level up this class in its original slot.", AI_COLOR_RED, oPC); + return; + } + nIndex++; + } + } + int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition)); + if(nPackage == 0) nPackage = GetPackageBySelection2DA(IntToString(nClass), 0); + else if(nPackage == -1) + { + ai_SendMessages("There is not a valid package for this class!", AI_COLOR_RED, oPC); + return; + } + string sLevel = IntToString(GetLevelByClass(nClass, oHenchman) + 1); + json jHenchman = ObjectToJson(oHenchman, TRUE); + //WriteTimestampedLogEntry("pe_henchmen, 318, jHenchman: " + JsonDump(jHenchman, 4)); + // Check to see if this character has a LvlStatList that is required to level. + json jLvlStatList = JsonObjectGet(jHenchman, "LvlStatList"); + //WriteTimestampedLogEntry("pe_henchmen, 321, jLvlStatList: " + JsonDump(jLvlStatList, 4)); + if(JsonGetType(jLvlStatList) == JSON_TYPE_NULL) + { + RemoveHenchman(oPC, oHenchman); + // Make sure to get a clean faction version of the henchman here. + jHenchman = ObjectToJson(oHenchman, TRUE); + jHenchman = CreateLevelStatList(jHenchman, oHenchman, oPC); + location lLocation = GetLocation(oHenchman); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oHenchman); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oHenchman); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + AssignCommand(oHenchman, SetIsDestroyable(TRUE, FALSE, FALSE)); + DestroyObject(oHenchman); + oHenchman = ai_AddHenchman(oPC, jHenchman, lLocation, nFamiliar, nCompanion); + SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman); + // We need to move party button list index to the last one since + // the henchman will move to the last henchman slot. + int nIndex = 1; + object oHench = GetHenchman(oPC, nIndex); + while(oHench != OBJECT_INVALID) + { + oHench = GetHenchman(oPC, ++nIndex); + //SendMessageToPC(oPC, "oHench: " + GetName(oHench) + " nIndex: " + IntToString(nIndex)); + } + string sParty = GetHenchmanDbString(oPC, "henchname", "0"); + SetHenchmanDbString(oPC, "image", IntToString(nIndex - 1), sParty); + } + int nLeveled = LevelUpHenchman(oHenchman, nClass, TRUE, nPackage); + //SendMessageToPC(oPC, "pe_henchmen, 282, nClass: " + IntToString(nClass) + + // " nPackage: " + IntToString(nPackage) + " nPosition: " + IntToString(nPosition) + + // " nLeveled: " + IntToString(nLeveled)); + string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + if(!nLeveled) + { + //WriteTimestampedLogEntry("pe_henchmen, 306, jLvlStatList: " + JsonDump(jLvlStatList, 1)); + ai_SendMessages(GetName(oHenchman) + " could not level " + sClass + " to level " + sLevel + "!", AI_COLOR_RED, oPC); + } + else + { + ai_SendMessages(GetName(oHenchman) + " has leveled " + sClass + " to " + sLevel + " level!", AI_COLOR_GREEN, oPC); + ResetHenchmanWindows(oPC, nToken, oHenchman); + } + return; + } + else if(sElem == "btn_reset") + { + oHenchman = ResetCharacter(oPC, oHenchman); + SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman); + ai_SendMessages(GetName(oHenchman) + " has been reset to level 1!", AI_COLOR_GREEN, oPC); + // We need to move party button list index to the last one since + // the henchman will move to the last henchman slot. + int nIndex = 1; + object oHench = GetHenchman(oPC, nIndex); + while(oHench != OBJECT_INVALID) + { + oHench = GetHenchman(oPC, ++nIndex); + } + string sParty = GetHenchmanDbString(oPC, "henchname", "0"); + SetHenchmanDbString(oPC, "image", IntToString(nIndex - 1), sParty); + ResetHenchmanWindows(oPC, nToken, oHenchman); + } + else if(sElem == "btn_portrait_next") + { + nID = JsonGetInt(NuiGetUserData(oPC, nToken)) + 1; + nChange = 1; + } + else if(sElem == "btn_portrait_prev") + { + nID = JsonGetInt(NuiGetUserData(oPC, nToken)) - 1; + nChange = -1; + } + else if(sElem == "btn_portrait_ok") + { + nID = JsonGetInt(NuiGetUserData(oPC, nToken)); + if(nID != -1) SetPortraitId(oHenchman, nID); + else + { + sResRef = JsonGetString (NuiGetBind (oPC, nToken, "port_name")); + if(ResManGetAliasFor(sResRef + "l", RESTYPE_TGA) == "" && + ResManGetAliasFor(sResRef + "l", RESTYPE_DDS) == "") + { + if(GetGender(oHenchman)) sResRef = "po_hu_f_99_"; + else sResRef = "po_hu_m_99_"; + SetPortraitResRef(oHenchman, sResRef); + } + } + int nHenchToken = NuiFindWindow(oPC, "henchman_nui"); + if(nHenchToken) + { + string sImage = GetPortraitResRef(oHenchman); + NuiSetBind(oPC, nHenchToken, "img_cur_portrait_image", JsonString(sImage + "l")); + } + } + if (nChange != 0) + { + int nPRace, nPGender; + int nMax2DARow = Get2DARowCount("portraits") - 1; + if(nID > 5000) nID = 1; + if(nID < 0) nID = 5000; + int nGender = GetGender(oHenchman); + int nRace = GetRacialType(oHenchman); + string sPRace = Get2DAString("portraits", "Race", nID); + if(sPRace != "") nPRace = StringToInt(sPRace); + else nPRace = -1; + string sResRef, sPGender = Get2DAString("portraits", "Sex", nID); + if(sPGender != "") nPGender = StringToInt(sPGender); + else nPGender = -1; + //WriteTimestampedLogEntry("pe_henchmen, 367, nGender: " + IntToString(nGender) + + // " nPGender: " + IntToString(nPGender) + + // " nRace: " + IntToString(nRace) + " nPRace: " + IntToString(nPRace) + + // " nID: " + IntToString(nID)); + while((nRace != nPRace && + (nRace != RACIAL_TYPE_HALFELF || + (nPRace != RACIAL_TYPE_ELF || nPRace != RACIAL_TYPE_HUMAN))) || + nGender != nPGender && nPGender != 4) + { + nID += nChange; + //WriteTimestampedLogEntry("pe_henchmen, 382, nCounter: " + IntToString(nCounter) + + // " nMax2DARow: " + IntToString(nMax2DARow)); + if (nID > 5000) nID = 1; + if (nID < 1) nID = 5000; + sPRace = Get2DAString("portraits", "Race", nID); + if(sPRace != "") nPRace = StringToInt(sPRace); + else nPRace = -1; + sPGender = Get2DAString("portraits", "Sex", nID); + if(sPGender != "") nPGender = StringToInt(sPGender); + else nPGender = -1; + //WriteTimestampedLogEntry("pe_henchmen, 385, nGender: " + IntToString(nGender) + + // " nPGender: " + IntToString(nPGender) + " sPGender: " + sPGender + + // " nRace: " + IntToString(nRace) + " nPRace: " + IntToString(nPRace) + + // " sPRace: " + sPRace + " nID: " + IntToString(nID)); + sResRef = "po_" + Get2DAString("portraits", "BaseResRef", nID) + "l"; + if(ResManGetAliasFor(sResRef, RESTYPE_TGA) == "" && + ResManGetAliasFor(sResRef, RESTYPE_DDS) == "") nPRace = 99; + } + sResRef = "po_" + Get2DAString("portraits", "BaseResRef", nID); + NuiSetUserData(oPC, nToken, JsonInt (nID)); + // This is passed to the portrait name txt that actually sets + // the portrait information and tells it we picked an ID. + SetLocalInt(oPC, "AI_PORTRAIT_ID_SET", TRUE); + NuiSetBind(oPC, nToken, "port_name", JsonString (sResRef)); + } + } + if(sEvent == "mousedown") + { + int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); + if (sElem == "opt_classes" && nMouseButton == NUI_MOUSE_BUTTON_LEFT) + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")); + SetLocalInt(oHenchman, "CLASS_OPTION_POSITION", nPosition); + DelayCommand(0.0, NuiDestroy(oPC, nToken)); + DelayCommand(0.1, CreateCharacterEditGUIPanel(oPC, oHenchman)); + return; + } + if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) + { + if(sElem == "cmb_class") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + int nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition)); + string sName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + string sDescription = GetStringByStrRef(StringToInt(Get2DAString("classes", "Description", nClass))); + string sIcon = Get2DAString("classes", "Icon", nClass); + CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription); + } + else if(sElem == "cmb_package") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + int nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition)); + int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition)); + string sName = GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nPackage))); + string sDescription = GetStringByStrRef(StringToInt(Get2DAString("packages", "Description", nPackage))); + string sIcon = Get2DAString("classes", "Icon", nClass); + CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription); + } + else if(sElem == "cmb_soundset") + { + int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_soundset_selected")); + int nSoundSet = GetSoundSetBySelection2DA(oHenchman, nSelection); + string sResRef = GetStringLowerCase(Get2DAString("soundset", "RESREF", nSoundSet)); + if(GetStringLeft(sResRef, 4) == "vs_f") + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 11, ":1:2:3:22:34:35:41:42:44:45:46:")); + } + else if(GetStringLeft(sResRef, 4) == "vs_n") + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 10, ":1:2:3:34:35:36:40:42:44:45:")); + } + else + { + DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 7, ":1:2:3:11:12:13:33:")); + } + } + else if(sElem == "opt_classes") + { + int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1; + int nClass = GetClassByPosition(nPosition, oHenchman); + if(nClass != CLASS_TYPE_INVALID) + { + string sName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + string sDescription = GetStringByStrRef(StringToInt(Get2DAString("classes", "Description", nClass))); + int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition)); + string sPackageName = GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nPackage))); + sDescription += "\n\nPACKAGE: \n" + sPackageName + "\n"; + sDescription += GetStringByStrRef(StringToInt(Get2DAString("packages", "Description", nPackage))); + string sIcon = Get2DAString("classes", "Icon", nClass); + CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription); + } + } + } + } + } + else if(sWndId == "char_description_nui") + { + if(sEvent == "click" && sElem == "btn_ok") DelayCommand(0.0, NuiDestroy(oPC, nToken)); + } + } +} +void PopupWidgetHenchmanGUIPanel(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt (oPC, "AI_NO_NUI_SAVE", TRUE); + DelayCommand (0.5f, DeleteLocalInt (oPC, "AI_NO_NUI_SAVE")); + // Row 1 (buttons)********************************************************** + json jRow = CreateButtonImage(JsonArray(), "ir_level1", "btn_one", 30.0f, 30.0f); + jRow = CreateButtonImage(jRow, "ir_level2", "btn_two", 30.0f, 30.0f); + jRow = CreateButtonImage(jRow, "ir_level3", "btn_three", 30.0f, 30.0f); + jRow = CreateButtonImage(jRow, "ir_level4", "btn_four", 30.0f, 30.0f); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + int bAINPCWidgetLock = GetLocalInt(oPC, "AI_WIDGET_HENCHMAN_LOCK"); + // Get the window location to restore it from the database. + float fX = GetLocalFloat(oPC, "widget_henchman_X"); + float fY = GetLocalFloat(oPC, "widget_henchman_Y"); + if(fX == 0.0f && fY == 0.0f) + { + fX = 10.0f; + fY = 10.0f; + } + if(bAINPCWidgetLock) + { + fX = fX + 4.0f; + fY = fY + 45.0f; + } + // Set the layout of the window. + json jLayout = NuiCol (jCol); + int nToken; + if(bAINPCWidgetLock) nToken = SetWindow (oPC, jLayout, "widget_henchman", "Henchman Widget", fX, fY, 160.0, 62.0, FALSE, FALSE, FALSE, TRUE, FALSE, "pe_npc"); + else nToken = SetWindow (oPC, jLayout, "widget_henchman", "Henchman Widget", fX, fY, 160.0, 95.0, FALSE, FALSE, FALSE, TRUE, TRUE, "pe_npc"); + // Set event watches for window inspector and save window location. + NuiSetBindWatch (oPC, nToken, "collapsed", TRUE); + NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE); + // Set the buttons to show events. + //NuiSetBind (oPC, nToken, "btn_one", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_one_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_two", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_two_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_three", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_three_event", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_four", JsonBool (TRUE)); + NuiSetBind (oPC, nToken, "btn_four_event", JsonBool (TRUE)); +} diff --git a/_module/nss/pe_mod_set.nss b/_module/nss/pe_mod_set.nss new file mode 100644 index 00000000..9c251b98 --- /dev/null +++ b/_module/nss/pe_mod_set.nss @@ -0,0 +1,119 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: pe_mod_settings + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + PEPS Plugin to set module and area settings. +/*////////////////////////////////////////////////////////////////////////////// +const string AI_MODULE_HEARTBEAT_SCRIPT = "AI_MODULE_HEARTBEAT_SCRIPT"; + +#include "0i_main" +void main() +{ + // Get the last player to use targeting mode + object oPC = GetLastPlayerToSelectTarget(); + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + if(oPC == OBJECT_SELF && sTargetMode != "") + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + object oAssociate = GetLocalObject(oPC, AI_TARGET_ASSOCIATE); + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + return; + } + // Targeting code here. + if(sTargetMode == "TEST_LEVEL_TARGET") + { + int nLevel = ai_GetCharacterLevels(oTarget); + int nXPNeeded = StringToInt(Get2DAString("exptable", "XP", nLevel)); + int nXPToGive = nXPNeeded - GetXP(oTarget); + GiveXPToCreature(oTarget, nXPToGive); + ai_SendMessages(GetName(oTarget) + " has gained " + IntToString(nXPToGive) + " experience to gain 1 level.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "TEST_GOLD_TARGET") + { + GiveGoldToCreature(oTarget, 10000); + ai_SendMessages(GetName(oTarget) + " has gained 10,000 gold.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "TEST_REST_TARGET") + { + ForceRest(oTarget); + ai_SendMessages(GetName(oTarget) + " has rested.", AI_COLOR_GREEN, oPC); + } + else if(sTargetMode == "TEST_HEAL_TARGET") + { + int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + if(nHeal > 0) + { + effect eHeal = EffectHeal(nHeal); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + ai_SendMessages(GetName(oTarget) + " has been healed.", AI_COLOR_GREEN, oPC); + } + } + else if(sTargetMode == "TEST_ID_TARGET") SetIdentified(oTarget, !GetIdentified(oTarget)); + else if(sTargetMode == "TEST_CLEAR_TARGET") + { + ClearAllActions(TRUE, oTarget); + } + else if(sTargetMode == "TEST_KILL_TARGET") + { + effect eDmg = EffectDamage(10000); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); + ai_SendMessages(GetName(oTarget) + " has been killed.", AI_COLOR_RED, oPC); + } + else if(sTargetMode == "TEST_REMOVE_TARGET") + { + SetIsDestroyable(TRUE, FALSE, FALSE, oTarget); + DestroyObject(oTarget); + ai_SendMessages(GetName(oTarget) + " has been removed!", AI_COLOR_RED, oPC); + } + } + // Run all non-targeting code here, usually NUI events. + else + { + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + //string sWndId = NuiGetWindowId(oPC, nToken); + //********************************************************************** + //if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + if(sEvent == "click") + { + if(sElem == "btn_combat_music_off") + { + object oArea = GetFirstArea(); + while(GetIsObjectValid(oArea)) + { + MusicBattleChange(oArea, 0); + oArea = GetNextArea(); + } + ai_SendMessages(GetModuleName() + " has had the combat music removed. Save your game or you may loose this change!", AI_COLOR_GREEN, oPC); + } + if(sElem == "btn_night_to_day") + { + object oModule = GetModule(); + string sScript = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_HEARTBEAT); + if(sScript == "pc_mod_set") + { + sScript = GetLocalString(oPC, AI_MODULE_HEARTBEAT_SCRIPT); + SetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_HEARTBEAT, sScript); + DeleteLocalString(oPC, AI_MODULE_HEARTBEAT_SCRIPT); + SendMessageToPC(oPC, "Module has been set to use normal time passage!"); + } + else + { + SetLocalString(oPC, AI_MODULE_HEARTBEAT_SCRIPT, sScript); + SetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_HEARTBEAT, "pc_mod_set"); + SendMessageToPC(oPC, "Module has been set to pass through nighttime to make it morning!"); + } + } + } + } +} + + diff --git a/_module/nss/pe_test.nss b/_module/nss/pe_test.nss new file mode 100644 index 00000000..7fd799c8 --- /dev/null +++ b/_module/nss/pe_test.nss @@ -0,0 +1,227 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script Name: pe_test + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + PEPS Plugin to help test errors. + Gives gold, Heals, etc. +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_main" +void main() +{ + // Get the last player to use targeting mode + object oPC = GetLastPlayerToSelectTarget(); + string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE); + if(oPC == OBJECT_SELF && sTargetMode != "") + { + // Get the targeting mode data + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC)); + object oAssociate = GetLocalObject(oPC, AI_TARGET_ASSOCIATE); + // If the user manually exited targeting mode without selecting a target, return + if(!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + return; + } + // Targeting code here. + if(sTargetMode == "TEST_LEVEL_TARGET") + { + int nLevel = ai_GetCharacterLevels(oTarget); + int nXPNeeded = StringToInt(Get2DAString("exptable", "XP", nLevel)); + int nXPToGive = nXPNeeded - GetXP(oTarget); + GiveXPToCreature(oTarget, nXPToGive); + ai_SendMessages(GetName(oTarget) + " has gained " + IntToString(nXPToGive) + " experience to gain 1 level.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "TEST_GOLD_TARGET") + { + GiveGoldToCreature(oTarget, 10000); + ai_SendMessages(GetName(oTarget) + " has gained 10,000 gold.", AI_COLOR_YELLOW, oPC); + } + else if(sTargetMode == "TEST_REST_TARGET") + { + ForceRest(oTarget); + ai_SendMessages(GetName(oTarget) + " has rested.", AI_COLOR_GREEN, oPC); + } + else if(sTargetMode == "TEST_HEAL_TARGET") + { + int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); + if(nHeal > 0) + { + effect eHeal = EffectHeal(nHeal); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + ai_SendMessages(GetName(oTarget) + " has been healed.", AI_COLOR_GREEN, oPC); + } + } + else if(sTargetMode == "TEST_ID_TARGET") SetIdentified(oTarget, !GetIdentified(oTarget)); + else if(sTargetMode == "TEST_CLEAR_TARGET") + { + ClearAllActions(TRUE, oTarget); + } + else if(sTargetMode == "TEST_KILL_TARGET") + { + effect eDmg = EffectDamage(10000); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget); + ai_SendMessages(GetName(oTarget) + " has been killed.", AI_COLOR_RED, oPC); + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_KILL_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_KILL, MOUSECURSOR_NOKILL); + } + else if(sTargetMode == "TEST_REMOVE_TARGET") + { + SetIsDestroyable(TRUE, FALSE, FALSE, oTarget); + DestroyObject(oTarget); + ai_SendMessages(GetName(oTarget) + " has been removed!", AI_COLOR_RED, oPC); + } + else if(sTargetMode == "TEST_JUMP") + { + JumpToLocation(lLocation); + int nIndex; + object oAssociate; + for(nIndex = 2; nIndex < 6; nIndex++) + { + oAssociate = GetAssociate(nIndex, oPC); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, JumpToLocation(lLocation)); + } + for(nIndex = 1; nIndex < AI_MAX_HENCHMAN; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oAssociate != OBJECT_INVALID) AssignCommand(oAssociate, JumpToLocation(lLocation)); + } + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_JUMP"); + EnterTargetingMode(oPC, OBJECT_TYPE_TILE, MOUSECURSOR_TRANSITION, MOUSECURSOR_NOWALK); + } + else if(sTargetMode == "TEST_KILL_AREA") + { + effect eDmg = EffectDamage(10000); + object oKill = GetFirstObjectInShape(SHAPE_SPHERE, 6.67, lLocation, FALSE); + while(oKill != OBJECT_INVALID) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oKill); + oKill = GetNextObjectInShape(SHAPE_SPHERE, 6.67, lLocation, FALSE); + } + } + } + // Run all non-targeting code here, usually NUI events. + else + { + object oPC = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElem = NuiGetEventElement(); + int nIndex = NuiGetEventArrayIndex(); + //string sWndId = NuiGetWindowId(oPC, nToken); + //********************************************************************** + //if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; + if(sEvent == "click") + { + if(sElem == "btn_level") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_LEVEL_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE , MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_gold") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_GOLD_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE , MOUSECURSOR_CREATE, MOUSECURSOR_NOCREATE); + } + else if(sElem == "btn_rest") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_REST_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE , MOUSECURSOR_EXAMINE, MOUSECURSOR_NOEXAMINE); + } + else if(sElem == "btn_heal") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_HEAL_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_HEAL, MOUSECURSOR_NOHEAL); + } + else if(sElem == "btn_id_item") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_ID_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_ITEM, MOUSECURSOR_HEAL, MOUSECURSOR_NOHEAL); + } + else if(sElem == "btn_clear") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_CLEAR_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_MAGIC, MOUSECURSOR_NOMAGIC); + } + else if(sElem == "btn_kill") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_KILL_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE, MOUSECURSOR_KILL, MOUSECURSOR_NOKILL); + } + else if(sElem == "btn_remove") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_REMOVE_TARGET"); + EnterTargetingMode(oPC, OBJECT_TYPE_CREATURE | + OBJECT_TYPE_DOOR | OBJECT_TYPE_ITEM | + OBJECT_TYPE_PLACEABLE, MOUSECURSOR_KILL, MOUSECURSOR_NOKILL); + } + else if(sElem == "btn_jump") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_JUMP"); + EnterTargetingMode(oPC, OBJECT_TYPE_TILE, MOUSECURSOR_TRANSITION, MOUSECURSOR_NOWALK); + } + else if(sElem == "btn_kill_area") + { + // Set this variable on the player so PEPS can run the targeting script for this plugin. + SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_test"); + // Set Targeting variables. + SetLocalObject(oPC, AI_TARGET_ASSOCIATE, OBJECT_SELF); + SetLocalString(oPC, AI_TARGET_MODE, "TEST_KILL_AREA"); + SetEnterTargetingModeData(oPC, SPELL_TARGETING_SHAPE_SPHERE, 6.67, 0.0, 3); + EnterTargetingMode(oPC, OBJECT_TYPE_ALL, MOUSECURSOR_KILL, MOUSECURSOR_NOKILL); + } + } + else if(sEvent == "watch") + { + if(sElem == "txt_debug_creature") + { + } + } + } +} + + diff --git a/_module/nss/pi_buffing.nss b/_module/nss/pi_buffing.nss new file mode 100644 index 00000000..6ce454ea --- /dev/null +++ b/_module/nss/pi_buffing.nss @@ -0,0 +1,338 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pi_buffing +//////////////////////////////////////////////////////////////////////////////// + Executable plug in script for Philos Module Extentions. + + Database structure: + Name(string) Tag(String) Spells(Json) + Tag: Widget - 0 = x position, 1 = y position, 2 = On/Off, 3 = Locked + Tag: List (string) set to the list number selected 1,2,3, or 4. + Tag: List# is the list of spells for List number 1,2,3, or 4. + + UI to save a players buff spells to be cast after resting. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +const int BUFF_MAX_SPELLS = 50; +const string FB_NO_MONSTER_CHECK = "FB_NO_MONSTER_CHECK"; + +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +// Creates the table and initializes if it needs to. +void CheckBuffDataAndInitialize(object oPlayer, string sTag); +// sDataField should be one of the data fields for that table. +// sData is the string data to be saved. +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag); +// sDataField should be one of the data fields for that table. +// jData is the json data to be saved. +void SetBuffDatabaseJson(object oPlayer, string sDataField, json jData, string sTag); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag); +// Creates the widget for buffing. +void PopupWidgetBuffGUIPanel(object oPC); + +void main() +{ + object oPC = OBJECT_SELF; + // Check to make sure the database is setup before we do anything. + CheckBuffDataAndInitialize(oPC, "menudata"); + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + if(JsonGetType(JsonArrayGet(jMenuData, 0)) == JSON_TYPE_NULL) + { + jMenuData = JsonArrayInsert(JsonArray(), JsonString("list1")); // 0 Spell List # + jMenuData = JsonArrayInsert(jMenuData, JsonFloat(0.0)); // 1 Main menu X pos. + jMenuData = JsonArrayInsert(jMenuData, JsonFloat(GetGUIHeightMiddle(oPC, 257.0))); // 2 Main menu Y pos. + jMenuData = JsonArrayInsert(jMenuData, JsonBool(FALSE)); // 3 Widget on/off + jMenuData = JsonArrayInsert(jMenuData, JsonBool(FALSE)); // 4 Widget Locked + jMenuData = JsonArrayInsert(jMenuData, JsonFloat(10.0)); // 5 Widget X pos. + jMenuData = JsonArrayInsert(jMenuData, JsonFloat(10.0)); // 6 Widget Y pos. + SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata"); + } + if(StartingUp(oPC)) return; + // Row 1 (Buttons) ********************************************************* 83 + json jRow = CreateButtonSelect(JsonArray(), "Save", "btn_save", 60.0f, 30.0f, "btn_save_tooltip"); + CreateButton(jRow, "Clear", "btn_clear", 60.0f, 30.0f, -1.0, "btn_clear_tooltip"); + CreateButton(jRow, "Buff", "btn_buff", 60.0f, 30.0f, -1.0, "btn_buff_tooltip"); + CreateButtonSelect(jRow, "List 1", "btn_list1", 60.0f, 30.0f); + CreateButtonSelect(jRow, "List 2", "btn_list2", 60.0f, 30.0f); + CreateButtonSelect(jRow, "List 3", "btn_list3", 60.0f, 30.0f); + CreateButtonSelect(jRow, "List 4", "btn_list4", 60.0f, 30.0f); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Buttons) ********************************************************* 121 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateCheckBox(jRow, "Buff Widget", "buff_widget", 110.0, 30.0f, "buff_widget_tooltip"); + jRow = CreateCheckBox(jRow, "Lock Widget", "lock_buff_widget", 110.0, 30.0f, "lock_buff_widget_tooltip"); + if(!AI_SERVER) + { + jRow = CreateCheckBox(jRow, "Don't Check for Monsters", "chbx_no_monster_check", 200.0, 30.0f, "chbx_no_monster_check_tooltip"); + } + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (List of Spells) ************************************************** 164 + // Create the button template for the List. + jRow = JsonArray(); + string sList = JsonGetString(JsonArrayGet(jMenuData, 0)); + int nCntr, nIndex; + string sCntr, sIndex; + json jSpell; + CheckBuffDataAndInitialize(oPC, sList); + json jSpells = GetBuffDatabaseJson(oPC, "spells", sList); + while(nCntr <= BUFF_MAX_SPELLS) + { + jSpell = JsonArrayGet(jSpells, nCntr); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + sIndex = IntToString(nIndex++); + jRow = CreateButtonImage(jRow, "", "btn_spell_" + sIndex, 35.0, 35.0, 0.0, "btn_spell_" + sIndex + "_tooltip"); + } + nCntr++; + } + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Get the window location to restore it from the database. + float fWidth = IntToFloat(nIndex) * 39; + if(fWidth < 470.0) fWidth = 470.0; + float fX = JsonGetFloat(JsonArrayGet(jMenuData, 1)); + float fY = JsonGetFloat(JsonArrayGet(jMenuData, 2)); + if(fX == 0.0f && fY == 0.0f) + { + fX = 0.0f; + fY = GetGUIHeightMiddle(oPC, 257.0); + } + // Set the layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPC, jLayout, "plbuffwin", "Fast Buffing Spells", + fX, fY, fWidth, 164.0, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_buffing"); + // Set the elements to show events. + int nSelected = GetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT) == "pc_savebuffs"; + NuiSetBind(oPC, nToken, "btn_save", JsonBool(nSelected)); + NuiSetBind(oPC, nToken, "btn_save_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_save_tooltip", JsonString(" Saves any spells cast on you or your associates.")); + NuiSetBind(oPC, nToken, "btn_clear", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_tooltip", JsonString(" Clears the current list of all saved spells.")); + NuiSetBind(oPC, nToken, "btn_buff", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_buff_tooltip", JsonString(" Casts the current list of saved spells.")); + if(sList == "list1") NuiSetBind (oPC, nToken, "btn_list1", JsonBool (TRUE)); + else NuiSetBind(oPC, nToken, "btn_list1", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_list1_event", JsonBool(TRUE)); + if(sList == "list2") NuiSetBind (oPC, nToken, "btn_list2", JsonBool (TRUE)); + else NuiSetBind(oPC, nToken, "btn_list2", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_list2_event", JsonBool(TRUE)); + if(sList == "list3") NuiSetBind (oPC, nToken, "btn_list3", JsonBool (TRUE)); + else NuiSetBind(oPC, nToken, "btn_list3", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_list3_event", JsonBool(TRUE)); + if(sList == "list4") NuiSetBind (oPC, nToken, "btn_list4", JsonBool (TRUE)); + else NuiSetBind (oPC, nToken, "btn_list4", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_list4_event", JsonBool(TRUE)); + int nValue = JsonGetInt(JsonArrayGet(jMenuData, 3)); + NuiSetBind(oPC, nToken, "buff_widget_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "buff_widget_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "buff_widget_check", TRUE); + string sText = " Creates a set of 4 buttons on the screen for quick buffing."; + NuiSetBind(oPC, nToken, "buff_widget_tooltip", JsonString(sText)); + nValue = JsonGetInt(JsonArrayGet(jMenuData, 4)); + NuiSetBind(oPC, nToken, "lock_buff_widget_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "lock_buff_widget_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "lock_buff_widget_check", TRUE); + sText = " Locks the buffing widget in place reducing its size."; + NuiSetBind(oPC, nToken, "lock_buff_widget_tooltip", JsonString(sText)); + if(!AI_SERVER) + { + NuiSetBind(oPC, nToken, "chbx_no_monster_check_event", JsonBool(TRUE)); + nValue = GetLocalInt(oPC, FB_NO_MONSTER_CHECK); + NuiSetBind(oPC, nToken, "chbx_no_monster_check_check", JsonBool(nValue)); + NuiSetBindWatch(oPC, nToken, "chbx_no_monster_check_check", TRUE); + sText = " Turns on/off checks for nearby monsters."; + NuiSetBind(oPC, nToken, "chbx_no_monster_check_tooltip", JsonString(sText)); + } + // Create buttons with spells listed. + int nSpell, nClass, nLevel, nMetamagic, nDomain; + string sName, sTargetName, sResRef; + nCntr = 0; + nIndex = 0; + while(nCntr <= BUFF_MAX_SPELLS) + { + jSpell = JsonArrayGet(jSpells, nCntr); + if(JsonGetType(jSpell) != JSON_TYPE_NULL) + { + nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); + nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); + nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); + nMetamagic = JsonGetInt(JsonArrayGet(jSpell, 3)); + nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); + sTargetName = JsonGetString(JsonArrayGet(jSpell, 5)); + sResRef = Get2DAString("spells", "IconResRef", nSpell); + sName = " " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); + sName += " (" + GetStringByStrRef(StringToInt(Get2DAString("classes", "Short", nClass))); + sName += " / " + IntToString (nLevel); + if(nMetamagic > 0) + { + if(nMetamagic == METAMAGIC_EMPOWER) sName += " / Empowered"; + else if(nMetamagic == METAMAGIC_EXTEND) sName += " / Extended"; + else if(nMetamagic == METAMAGIC_MAXIMIZE) sName += " / Maximized"; + else if(nMetamagic == METAMAGIC_QUICKEN) sName += " / Quickened"; + else if(nMetamagic == METAMAGIC_SILENT) sName += " / Silent"; + else if(nMetamagic == METAMAGIC_STILL) sName += " / Still"; + } + if(nDomain > 0) sName += " / Domain"; + sName += ") " + sTargetName; + sIndex = IntToString(nIndex++); + NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_image", JsonString(sResRef)); + NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_tooltip", JsonString(sName)); + } + nCntr++; + } + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_buffing")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Quick Buff")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("dm_appear")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata"); + int bWidgetOn = JsonGetInt(JsonArrayGet(jMenuData, 3)); + if(bWidgetOn) + { + PopupWidgetBuffGUIPanel(oPC); + ai_SendMessages("Buffing widget has been created.", AI_COLOR_YELLOW, oPC); + } + return TRUE; +} +void CreateBuffDataTable(object oPlayer) +{ + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "CREATE TABLE IF NOT EXISTS BUFF_TABLE (" + + "name TEXT, " + + "tag TEXT, " + + "spells TEXT, " + + "PRIMARY KEY(name, tag));"); + SqlStep(sql); +} +void CheckBuffDataAndInitialize(object oPlayer, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' AND name=@tableName;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString (sql, "@tableName", "BUFF_TABLE"); + if(!SqlStep (sql)) CreateBuffDataTable(oPlayer); + sQuery = "SELECT name FROM BUFF_TABLE Where name = @name AND tag = @tag;"; + sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if(!SqlStep(sql)) + { + sQuery = "INSERT INTO BUFF_TABLE(name, tag, spells) " + + "VALUES (@name, @tag, @spells);"; + sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + SqlBindJson(sql, "@spells", JsonArray()); + SqlStep(sql); + } +} +void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@data", sData); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + SqlStep(sql); +} +string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if(SqlStep(sql)) return SqlGetString(sql, 0); + else return ""; +} +void SetBuffDatabaseJson (object oPlayer, string sDataField, json jData, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindJson(sql, "@data", jData); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + SqlStep(sql); +} +json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag) +{ + string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE))); + string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;"; + sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery); + SqlBindString(sql, "@name", sName); + SqlBindString(sql, "@tag", sTag); + if(SqlStep(sql)) return SqlGetJson(sql, 0); + else return JsonArray(); +} +void PopupWidgetBuffGUIPanel(object oPC) +{ + // Set window to not save until it has been created. + SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // Row 1 (buttons)********************************************************** + json jRow = JsonArray(); + CreateButtonImage(jRow, "ir_level1", "btn_one", 35.0f, 35.0f, 0.0); + CreateButtonImage(jRow, "ir_level2", "btn_two", 35.0f, 35.0f, 0.0); + CreateButtonImage(jRow, "ir_level3", "btn_three", 35.0f, 35.0f, 0.0); + CreateButtonImage(jRow, "ir_level4", "btn_four", 35.0f, 35.0f, 0.0); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + json jWidget = GetBuffDatabaseJson(oPC, "spells", "menudata"); + int bAIBuffWidgetLock = JsonGetInt(JsonArrayGet(jWidget, 4)); + // Get the window location to restore it from the database. + float fX = JsonGetFloat(JsonArrayGet(jWidget, 5)); + float fY = JsonGetFloat(JsonArrayGet(jWidget, 6)); + if(fX == 0.0f && fY == 0.0f) + { + fX = 10.0f; + fY = 10.0f; + } + if(bAIBuffWidgetLock) + { + fX = fX + 4.0f; + fY = fY + 45.0f; + } + // Set the layout of the window. + json jLayout = NuiCol (jCol); + int nToken; + if(bAIBuffWidgetLock) nToken = SetWindow(oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 62.0, FALSE, FALSE, FALSE, TRUE, FALSE, "pe_buffing"); + else nToken = SetWindow(oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 95.0, FALSE, FALSE, FALSE, TRUE, TRUE, "pe_buffing"); + // Set event watches for window inspector and save window location. + //NuiSetBindWatch(oPC, nToken, "collapsed", TRUE); + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + // Set the buttons to show events. + //NuiSetBind (oPC, nToken, "btn_one", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_one_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_two", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_two_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_three", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_three_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_four", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_four_event", JsonBool(TRUE)); +} + diff --git a/_module/nss/pi_crafting.nss b/_module/nss/pi_crafting.nss new file mode 100644 index 00000000..3fa9775d --- /dev/null +++ b/_module/nss/pi_crafting.nss @@ -0,0 +1,717 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pi_crafting +//////////////////////////////////////////////////////////////////////////////// + Executable plug in script for Philos Module Extentions + + Crafting UI for players items. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "0i_items" +#include "nw_inc_gff" +const string CRAFT_JSON = "CRAFT_JSON"; +const string CRAFT_COOL_DOWN = "CRAFT_COOL_DOWN"; +const string CRAFT_ITEM_SELECTION = "CRAFT_ITEM_SELECTION"; +const string CRAFT_MATERIAL_SELECTION = "CRAFT_MATERIAL_SELECTION"; +const string CRAFT_MODEL_SELECTION = "CRAFT_MODEL_SELECTION"; +const string CRAFT_COLOR_PALLET = "CRAFT_COLOR_PALLET"; +const string CRAFT_LEFT_PART_COLOR = "CRAFT_LEFT_PART_COLOR"; +const string CRAFT_ALL_COLOR = "CRAFT_ALL_COLOR"; +const string CRAFT_RIGHT_PART_COLOR = "CRAFT_RIGHT_PART_COLOR"; +const string CRAFT_TARGET = "CRAFT_TARGET"; +// Tag used in lighting effects. +const string CRAFT_HIGHLIGHT = "CRAFT_HIGHLIGHT"; +const string CRAFT_ULTRALIGHT = "CRAFT_ULTRALIGHT"; + +json CreateItemCombo(object oPC, json jRow, string sComboBind); +json CreateModelCombo(object oPC, object oTarget, json jRow, string sComboBind); +json CreateMaterialCombo(object oPC, json jRow, string sComboBind); +// Sets the material buttons for use. +// nMaterial 0,1 Cloth 2,3 Leather 4,5 Metal -1 None. +void SetMaterialButtons(object oPC, int nToken, int nMaterial); +// Returns the correct item based on the crafting menu selected item. +object GetSelectedItem(object oTarget, int nItemSelected); +int GetArmorModelSelected(object oPC); +// Returns True if oItem, nPart has a per part color for sSide. +int GetHasPartColor(object oItem, int nPart, string sSide); +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +void main() +{ + object oPC = OBJECT_SELF; + object oTarget = GetLocalObject(oPC, CRAFT_TARGET); + if(oTarget == OBJECT_INVALID) oTarget = oPC; + if(StartingUp(oPC)) return; + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + // Row 1 (Object Name)****************************************************** 508 / 83 + json jRow = CreateTextEditBox(JsonArray(), "plc_hold_bind", "txt_item_name", 50, FALSE, 486.0f, 30.0f); // 419 + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Object Name)****************************************************** 508 / 121 + jRow = JsonArray(); + if(!AI_SERVER) jRow = CreateButton(jRow, "Information", "btn_info", 160.0f, 30.0f, -1.0, "btn_info_tooltip"); + else + { + if(GetIsDM(oTarget)) + { + jRow = CreateButton(jRow, "Information", "btn_info", 160.0f, 30.0f, -1.0, "btn_info_tooltip"); + } + else jRow = JsonArrayInsert(jRow, NuiSpacer()); + } + jRow = CreateButton(jRow, "Wardrobe", "btn_wardrobe", 158.0f, 30.0f, -1.0, "btn_wardrobe_tooltip"); + jRow = CreateButtonSelect(jRow, "Add Light", "btn_highlight", 160.0f, 30.0f, "btn_highlight_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Object Name)****************************************************** 508 / 159 + jRow = CreateButton(JsonArray(), "Save", "btn_save", 160.0f, 30.0f, -1.0, "btn_save_tooltip"); + jRow = CreateButton(jRow, "Select Target", "btn_select_target", 158.0f, 30.0f); + jRow = CreateButton(jRow, "", "btn_cancel", 160.0f, 30.0f, -1.0, "btn_cancel_tooltip"); + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (labels)*********************************************************** 508 / 177 + jRow = CreateLabel(JsonArray(), "Model", "module_title", 143.0f, 10.0f); + jRow = CreateLabel(jRow, "Color", "color_title", 339.0f, 10.0f); + jRow = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 (groups) + // Row 51 (title)*********************************************************** 508 / 195 / 18 + json jGroupRow = CreateLabel(JsonArray(), "Item", "item__cmb_title", 128.0f, 10.0f); + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + // Row 52 (combo)*********************************************************** 508 / 233 / 56 + jGroupRow = CreateItemCombo(oPC, JsonArray(), "item_combo"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 53 (title)*********************************************************** 508 / 251 / 74 + jGroupRow = CreateLabel(JsonArray(), "Model", "model_cmb_title",128.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 54 (combo)*********************************************************** 508 / 289 / 112 + jGroupRow = CreateModelCombo(oPC, oTarget, JsonArray(), "model_combo"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 55 (title)*********************************************************** 508 / 307 / 120 + jGroupRow = CreateLabel(JsonArray(), "", "top_title",128.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 56 (top)************************************************************* 508 / 355 / 168 + jGroupRow = CreateButtonImage(JsonArray(), "nui_shld_left", "btn_prev_t", 40.0f, 40.0f); + // Removed TextEditBox for mobile + jGroupRow = CreateTextEditBox(jGroupRow, "place_holder", "txt_model_number_t", 3, FALSE, 40.0, 40.0); + //CreateLabel(jGroupRow, "", "txt_model_number_t", 40.0, 40.0); + jGroupRow = CreateButtonImage(jGroupRow, "nui_shld_right", "btn_next_t", 40.0f, 40.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 57 (title)*********************************************************** 508 / 373 / 186 + jGroupRow = CreateLabel(JsonArray(), "", "middle_title",128.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 58 (middle)********************************************************** 508 / 421 /234 + jGroupRow = CreateButtonImage(JsonArray(), "nui_shld_left", "btn_prev_m", 40.0f, 40.0f); + // Removed TextEditBox for mobile + jGroupRow = CreateTextEditBox(jGroupRow, "place_holder", "txt_model_number_m", 3, FALSE, 40.0, 40.0); + //CreateLabel(jGroupRow, "", "txt_model_number_m", 40.0, 40.0); + jGroupRow = CreateButtonImage(jGroupRow, "nui_shld_right", "btn_next_m", 40.0f, 40.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 59 (title)*********************************************************** 508 / 439 / 252 + jGroupRow = CreateLabel(JsonArray(), "", "bottom_title",128.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 510 (bottom)********************************************************* 508 / 487 /300 + jGroupRow = CreateButtonImage(JsonArray(), "nui_shld_left", "btn_prev_b", 40.0f, 40.0f); + // Removed TextEditBox for mobile + jGroupRow = CreateTextEditBox(jGroupRow, "place_holder", "txt_model_number_b", 3, FALSE, 40.0, 40.0); + //CreateLabel(jGroupRow, "", "txt_model_number_b", 40.0, 40.0); + jGroupRow = CreateButtonImage(jGroupRow, "nui_shld_right", "btn_next_b", 40.0f, 40.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 511 (blank spacer) + jGroupRow = CreateLabel(JsonArray(), "", "blank_space",128.0f, 20.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 512 (light)********************************************************** 508 / 487 /300 + jGroupRow = CreateButtonSelect(JsonArray(), "Randomize", "btn_randomize", 128.0f, 30.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupCol = JsonArrayInsert(jGroupCol, NuiSpacer()); + jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiWidth(NuiGroup(NuiCol(jGroupCol)), 143.0), 442.0)); + // Make the Color Group. + // Row 550 (groups)********************************************************* 508 / 361 / 184 + json jImage = NuiEnabled(NuiId(NuiImage(NuiBind("color_pallet_image"), JsonInt(0), JsonInt(0), JsonInt(1)), "color_pallet"), NuiBind("color_pallet_event")); + jImage = NuiWidth(jImage, 320.0); // 256 + 64 + jImage = NuiHeight(jImage, 220.0); // 176 + 44 + jImage = NuiTooltip(jImage, NuiBind("color_pallet_tooltip")); + json jIndicator = JsonArrayInsert(JsonArray(), NuiDrawListRect(JsonBool(TRUE), NuiColor(255,255,255), JsonBool(FALSE), JsonFloat(2.0), NuiBind("color_pallet_pointer"))); + jImage = NuiDrawList(jImage, JsonBool(FALSE), jIndicator); + jGroupRow = JsonArrayInsert(JsonArray(), jImage); + jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + // Row 551 (groups)********************************************************* 508 / 379 /202 + jGroupRow = CreateLabel(JsonArray(), "Part To Color", "lbl_color_parts", 320.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 552 (groups)********************************************************* 508 / 417 /240 + jGroupRow = CreateButtonSelect(JsonArray(), "Right", "btn_right_part_color", 98.0, 30.0, "btn_right_part_color_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "All", "btn_all_color", 98.0, 30.0, "btn_all_color_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "Left", "btn_left_part_color", 98.0, 30.0, "btn_left_part_color_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 553 (groups)********************************************************* 508 / 435 / 258 + jGroupRow = CreateLabel(JsonArray(), "Part Color To Reset", "lbl_reset_parts", 320.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 554 (groups)********************************************************* 508 / 473 /296 + jGroupRow = CreateButton(JsonArray(), "Right", "btn_right_part_reset", 98.0, 30.0, -1.0, "btn_right_part_reset_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButton(jGroupRow, "All", "btn_all_reset", 50.0, 30.0, -1.0, "btn_all_reset_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButton(jGroupRow, "Left", "btn_left_part_reset", 98.0, 30.0, -1.0, "btn_left_part_reset_tooltip"); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 555 (groups)********************************************************* 508 / 491 / 314 + jGroupRow = CreateLabel(JsonArray(), "Material to Color", "lbl_material_color", 320.0f, 10.0f); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 556 (groups)********************************************************* 508 / 529 /352 + jGroupRow = CreateButtonSelect(JsonArray(), "Cloth 1", "btn_material_0", 98.0, 30.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "Leather 1", "btn_material_2", 98.0, 30.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "Metal 1", "btn_material_4", 98.0, 30.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Row 557 (groups)********************************************************* 508 / 567 / 390 + jGroupRow = CreateButtonSelect(JsonArray(), "Cloth 2", "btn_material_1", 98.0, 30.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "Leather 2", "btn_material_3", 98.0, 30.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButtonSelect(jGroupRow, "Metal 2", "btn_material_5", 98.0, 30.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupCol = JsonArrayInsert(jGroupCol, NuiSpacer()); + jRow = JsonArrayInsert(jRow, NuiHeight(NuiWidth(NuiGroup(NuiCol(jGroupCol)), 339.0), 442.0)); // 275 398 + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + json jLayout = NuiCol(jCol); + // Get the window location to restore it from the database. + json jGeometry = JsonObjectGet(jCraft, "CRAFT_MENU"); + float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); + float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); + string sPCWindow; + int nToken = SetWindow(oPC, jLayout, "crafting_nui", "Crafting", + fX, fY, 508.0, 700.0, FALSE, FALSE, FALSE, FALSE, TRUE, "pe_crafting"); // 444 645 + // Set all binds, events, and watches. + NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE); + int nItem = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + object oItem = GetSelectedItem(oTarget, nItem); + // Row 1 + NuiSetBind(oPC, nToken, "txt_item_name", JsonString(GetName(oItem))); + NuiSetBind(oPC, nToken, "txt_item_name_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "txt_item_name", TRUE); + // Row 2 + NuiSetBind(oPC, nToken, "btn_info_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_info_tooltip", JsonString(" Look at and change item information")); + NuiSetBind(oPC, nToken, "btn_wardrobe_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_wardrobe_tooltip", JsonString(" Use your wardrobe to save/load item appearances")); + int nLight = GetLocalInt(oPC, CRAFT_HIGHLIGHT) + GetLocalInt(oPC, CRAFT_ULTRALIGHT); + NuiSetBind(oPC, nToken, "btn_highlight", JsonBool(nLight)); + NuiSetBind(oPC, nToken, "btn_highlight_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_highlight_tooltip", JsonString(" Left click for White light, Right click for Ultravision")); + // Row 3 + NuiSetBind(oPC, nToken, "btn_save_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_save_tooltip", JsonString(" Save current changes")); + NuiSetBind(oPC, nToken, "btn_select_target_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cancel_label", JsonString("Exit")); + NuiSetBind(oPC, nToken, "btn_cancel_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cancel_tooltip", JsonString(" Exit the crafting menu")); + // Row 4 Labels. + // Row 5 Groups. + // Row 51 title. + // Row 52 + NuiSetBind(oPC, nToken, "item_combo_selected", JsonInt(nItem)); + NuiSetBind(oPC, nToken, "item_combo_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "item_combo_selected", TRUE); + // Row 53 title. + // Row 54 + int nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MODEL_SELECTION)); + if(nItem == 1 || nItem == 2 || nItem == 4) + { + if(GetHiddenWhenEquipped(oItem)) nSelected = 1; + else nSelected = 0; + } + NuiSetBind(oPC, nToken, "model_combo_selected", JsonInt (nSelected)); + NuiSetBind(oPC, nToken, "model_combo_event", JsonBool (TRUE)); + NuiSetBindWatch(oPC, nToken, "model_combo_selected", TRUE); + // Row 55, 56, 57 titles + // Row 58 top, 59 middle, 510 bottom + string sModelTop, sModelMiddle, sModelBottom; + // Model Group + if(ai_GetIsWeapon(oItem)) + { + int nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 0); + int nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 0); + int nModelNumber = (nModel * 10) + nColor; + sModelTop = IntToString(nModelNumber); + nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 1); + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 1); + nModelNumber = (nModel * 10) + nColor; + sModelMiddle = IntToString(nModelNumber); + nModel = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, 2); + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, 2); + nModelNumber = (nModel * 10) + nColor; + sModelBottom = IntToString(nModelNumber); + // Row 55 + NuiSetBind(oPC, nToken, "top_title_label", JsonString("Top")); + // Row 56 + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(TRUE)); + // Row 57 + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Middle")); + // Row 58 + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + // Row 59 + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("Bottom")); + // Row 510 + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(sModelBottom)); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(TRUE)); + // Row 511 + NuiSetBind(oPC, nToken, "btn_randomize_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_randomize_tooltip", JsonString(" Randomize the selected weapon")); + } + // Armor and clothing + else if(nItem == 0) + { + nSelected = GetArmorModelSelected(oPC); + // These models only have one side so make sure we are not linked. + if (nSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + sModelMiddle = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + // Row 55 + NuiSetBind(oPC, nToken, "top_title_label", JsonString("")); + // Row 56 + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_name_t", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(FALSE)); + // Row 57 + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Model")); + // Row 58 + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + // Row 59 + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("")); + // Row 510 + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(FALSE)); + } + else + { + sModelTop = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + if(nSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nSelected--; + else nSelected++; + sModelBottom = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, nSelected)); + // Row 55 + NuiSetBind(oPC, nToken, "top_title_label", JsonString("Right")); + // Row 56 + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(TRUE)); + // Row 57 + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Right & Left")); + // Row 58 + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelTop)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + // Row 59 + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("Left")); + // Row 510 + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString(sModelBottom)); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(TRUE)); + } + // Row 511 + NuiSetBind(oPC, nToken, "btn_randomize_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_randomize_tooltip", JsonString(" Randomize the selected armor")); + } + // Shields, Cloaks, and Helmets. + else + { + sModelMiddle = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0)); + // Row 55 + NuiSetBind(oPC, nToken, "top_title_label", JsonString("")); + // Row 56 + //NuiSetBind(oPC, nToken, "txt_model_number_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_t", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_t_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_t_event", JsonBool(FALSE)); + // Row 57 + NuiSetBind(oPC, nToken, "middle_title_label", JsonString("Model")); + // Row 58 + //NuiSetBind(oPC, nToken, "txt_model_number_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "txt_model_number_m", JsonString(sModelMiddle)); + NuiSetBind(oPC, nToken, "btn_prev_m_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_next_m_event", JsonBool(TRUE)); + // Row 59 + NuiSetBind(oPC, nToken, "bottom_title_label", JsonString("")); + // Row 510 + //NuiSetBind(oPC, nToken, "txt_model_number_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "txt_model_number_b", JsonString("")); + NuiSetBind(oPC, nToken, "btn_prev_b_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_next_b_event", JsonBool(FALSE)); + // Row 511 + NuiSetBind(oPC, nToken, "btn_randomize_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_randomize_tooltip", JsonString(" Randomize the selected item")); + } + // Color Group + if(ai_GetIsWeapon(oItem) || ai_GetIsShield(oItem)) + { + // Need to disable the color widgets. + // Row 511 + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString("gui_pal_tattoo")); + NuiSetBind(oPC, nToken, "color_pallet_image_event", JsonBool(FALSE)); + // Row 512 - Label Part to Color + // Row 5l3 + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 515 + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + // Row 516 - Label Material to Color + // Row 517 + NuiSetBind(oPC, nToken, "btn_material_0", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_2", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_4", JsonBool(FALSE)); + // Row 518 + NuiSetBind(oPC, nToken, "btn_material_1", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_3", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_material_5", JsonBool(FALSE)); + SetMaterialButtons(oPC, nToken, -1); + } + // Armor and clothing + else if(nItem == 0) + { + // Row 511 + string sColorPallet = GetLocalString(oPC, CRAFT_COLOR_PALLET); + if(sColorPallet == "") sColorPallet = "gui_pal_tattoo"; + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + int nModelSelected = GetArmorModelSelected(oPC); + // Row 511 + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString(sColorPallet)); + NuiSetBind(oPC, nToken, "color_pallet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "color_pallet_tooltip", JsonString(" Select a color or use the mouse wheel")); + int nSelectedRight, nSelectedAll, nSelectedLeft; + string sColorAll = IntToString(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected)); + // These models only have one side so make sure we are not linked. + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_NECK || + nModelSelected == ITEM_APPR_ARMOR_MODEL_TORSO || + nModelSelected == ITEM_APPR_ARMOR_MODEL_BELT || + nModelSelected == ITEM_APPR_ARMOR_MODEL_PELVIS || + nModelSelected == ITEM_APPR_ARMOR_MODEL_ROBE) + { + // Row 512 - Label Part to Color + // Row 5l3 + int nPartColor = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedRight = JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR)); + if(!nSelectedRight && nPartColor) + { + nSelectedRight = TRUE; + nSelectedLeft = FALSE; + } + nSelectedAll = !nSelectedRight; + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonBool(nSelectedAll)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + nSelectedRight = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedAll = nSelectedRight; + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + } + else + { + // Row 512 - Label Part to Color + // Row 5l3 + int nPartColor = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedRight = JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR)); + if(!nSelectedRight && nPartColor) + { + nSelectedRight = TRUE; + nSelectedLeft = FALSE; + } + else + { + nPartColor = GetHasPartColor(oItem, nModelSelected, "Left"); + nSelectedLeft = JsonGetInt(JsonObjectGet(jCraft, CRAFT_LEFT_PART_COLOR)); + if(!nSelectedLeft && nPartColor) + { + nSelectedLeft = TRUE; + nSelectedRight = FALSE; + } + } + nSelectedAll = !nSelectedRight && !nSelectedLeft; + jCraft = JsonObjectSet(jCraft, CRAFT_LEFT_PART_COLOR, JsonBool(nSelectedLeft)); + jCraft = JsonObjectSet(jCraft, CRAFT_ALL_COLOR, JsonBool(nSelectedAll)); + jCraft = JsonObjectSet(jCraft, CRAFT_RIGHT_PART_COLOR, JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(nSelectedLeft)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(TRUE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + nSelectedRight = GetHasPartColor(oItem, nModelSelected, "Right"); + nSelectedLeft = GetHasPartColor(oItem, nModelSelected, "Left"); + nSelectedAll = nSelectedRight || nSelectedLeft; + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(nSelectedRight)); + NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(nSelectedAll)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(nSelectedLeft)); + } + int nColor; + if(!JsonGetInt(NuiGetBind(oPC, nToken, "btn_all_color"))) + { + int nModelSelected = GetArmorModelSelected(oPC); + if(!JsonGetInt(JsonObjectGet(jCraft, CRAFT_RIGHT_PART_COLOR))) + { + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nModelSelected == ITEM_APPR_ARMOR_MODEL_RTHIGH) nModelSelected--; + else nModelSelected++; + } + int nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (nModelSelected * ITEM_APPR_ARMOR_NUM_COLORS) + nMaterialSelected; + nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex); + } + else nColor = 255; + if(nColor == 255) nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected); + float fPointX = IntToFloat((nColor - ((nColor / 16) * 16)) * 20); + float fPointY = IntToFloat((nColor / 16) * 20); + NuiSetBind(oPC, nToken, "color_pallet_pointer", NuiRect(fPointX, fPointY, 20.0, 20.0)); + // Row 516 - Label Material to Color + // Row 517 & 518 + NuiSetBind(oPC, nToken, "btn_right_part_color_tooltip", JsonString(" Select the right part to be uniquely colored")); + NuiSetBind(oPC, nToken, "btn_all_color_tooltip", JsonString(" Select all parts to be colored")); + NuiSetBind(oPC, nToken, "btn_left_part_color_tooltip", JsonString(" Select the left part to be uniquely colored")); + NuiSetBind(oPC, nToken, "btn_right_part_reset_tooltip", JsonString(" Clears the right part's unique color")); + NuiSetBind(oPC, nToken, "btn_all_reset_tooltip", JsonString(" Clears all parts unique colors")); + NuiSetBind(oPC, nToken, "btn_left_part_reset_tooltip", JsonString(" Clears the left part's unique color")); + nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + SetMaterialButtons(oPC, nToken, nSelected); + SetLocalJson(oPC, CRAFT_JSON, jCraft); + } + // Cloaks and Helmets. + else + { + // Row 511 + string sColorPallet = GetLocalString(oPC, CRAFT_COLOR_PALLET); + if(sColorPallet == "") sColorPallet = "gui_pal_tattoo"; + int nMaterialSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + int nModelSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MODEL_SELECTION)); + int nColor = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nMaterialSelected); + float fPointX = IntToFloat((nColor - ((nColor / 16) * 16)) * 20); + float fPointY = IntToFloat((nColor / 16) * 20); + NuiSetBind(oPC, nToken, "color_pallet_pointer", NuiRect(fPointX, fPointY, 20.0, 20.0)); + NuiSetBind(oPC, nToken, "color_pallet_image", JsonString(sColorPallet)); + NuiSetBind(oPC, nToken, "color_pallet_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "color_pallet_tooltip", JsonString(" Select a color or use the mouse wheel")); + // Row 512 - Label Part to Color + // Row 5l3 + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_right_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_all_color_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_all_color", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_left_part_color_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_color", JsonBool(FALSE)); + // Row 514 - Label Part Color to Reset + // Row 5l5 + NuiSetBind(oPC, nToken, "btn_right_part_reset_event", JsonBool(FALSE)); + //NuiSetBind(oPC, nToken, "btn_all_reset_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_left_part_reset_event", JsonBool(FALSE)); + // Row 516 - Label Material to Color + // Row 517 & 518 + nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MATERIAL_SELECTION)); + SetMaterialButtons(oPC, nToken, nSelected); + } + // Lets make sure we clean up any cool down variables. + //DeleteLocalInt(oPC, CRAFT_COOL_DOWN); +} +json CreateItemCombo(object oPC, json jRow, string sComboBind) +{ + int nCnt; + // Create the list. + json jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Armor", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Cloak", 1)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Headgear", 2)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Right hand", 3)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Left hand", 4)); + return CreateCombo(jRow, jCombo, sComboBind, 128.0, 40.0); +} +json CreateModelCombo(object oPC, object oTarget, json jRow, string sComboBind) +{ + float fFacing = GetFacing(oTarget); + json jCombo, jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_ITEM_SELECTION)); + // Create the list. + // Armor. + if(nSelected == 0) + { + fFacing += 180.0f; + if (fFacing > 359.0) fFacing -=359.0; + AssignCommand(oPC, SetCameraFacing(fFacing, 4.5f, 75.0, CAMERA_TRANSITION_TYPE_VERY_FAST)); + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Neck", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Shoulder", 1)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Bicep", 2)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Forearm", 3)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Hand", 4)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Torso", 5)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Belt", 6)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Pelvis", 7)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Thigh", 8)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Shin", 9)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Foot", 10)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Robe", 11)); + } + // Cloak. + else if(nSelected == 1) + { + if(fFacing > 359.0) fFacing -=359.0; + AssignCommand (oPC, SetCameraFacing(fFacing, 4.5f, 75.0, CAMERA_TRANSITION_TYPE_VERY_FAST)); + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Cloak", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Invisible", 1)); + } + // Headgear. + else if (nSelected == 2) + { + fFacing += 180.0f; + if(fFacing > 359.0) fFacing -=359.0; + AssignCommand(oPC, SetCameraFacing(fFacing, 2.5f, 75.0, CAMERA_TRANSITION_TYPE_VERY_FAST)); + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Headgear", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Invisible", 1)); + } + // Weapon. + else if (nSelected == 3) + { + // If they are changing a bow then face the opposite side. + object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); + int nBaseItemType = GetBaseItemType(oItem); + if(nBaseItemType == BASE_ITEM_LONGBOW || nBaseItemType == BASE_ITEM_SHORTBOW) fFacing -= 90.00; + // This will make the camera face a melee weapon. + else fFacing += 90.0; + if(fFacing > 359.0) fFacing -=359.0; + AssignCommand(oPC, SetCameraFacing(fFacing, 3.5f, 75.0, CAMERA_TRANSITION_TYPE_VERY_FAST)); + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Weapon", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Acidic", 1)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Frost", 2)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Electric", 3)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Unholy", 4)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Flaming", 5)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Holy", 6)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Sonic", 7)); +} + // Weapon/Shield. + else if(nSelected == 4) + { + fFacing += 270.0f; + if(fFacing > 359.0) fFacing -=359.0; + AssignCommand(oPC, SetCameraFacing(fFacing, 3.5f, 75.0, CAMERA_TRANSITION_TYPE_VERY_FAST)); + object oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); + if(ai_GetIsShield(oItem)) + { + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Shield", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Invisible", 1)); + } + else + { + jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("Weapon", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Acidic", 1)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Frost", 2)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Electric", 3)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Unholy", 4)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Flaming", 5)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Holy", 6)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("Sonic", 7)); + } + } + return CreateCombo(jRow, jCombo, sComboBind, 128.0, 40.0); +} +void SetMaterialButtons(object oPC, int nToken, int nMaterial) +{ + int nIndex, bBool, bUseable; + string sIndex; + if(nMaterial > -1) bUseable = TRUE; + for(nIndex = 0;nIndex < 6;nIndex++) + { + if(nIndex == nMaterial) bBool = TRUE; + else bBool = FALSE; + sIndex = IntToString(nIndex); + NuiSetBind(oPC, nToken, "btn_material_" + sIndex + "_event", JsonBool(bUseable)); + NuiSetBind(oPC, nToken, "btn_material_" + sIndex, JsonBool(bBool)); + } +} +object GetSelectedItem(object oTarget, int nItemSelected) +{ + if(nItemSelected == 0) return GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); + else if(nItemSelected == 1) return GetItemInSlot(INVENTORY_SLOT_CLOAK, oTarget); + else if(nItemSelected == 2) return GetItemInSlot(INVENTORY_SLOT_HEAD, oTarget); + else if(nItemSelected == 3) return GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); + else if(nItemSelected == 4) return GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget); + return OBJECT_INVALID; +} +int GetArmorModelSelected(object oPC) +{ + json jCraft = GetLocalJson(oPC, CRAFT_JSON); + int nModelSelected = JsonGetInt(JsonObjectGet(jCraft, CRAFT_MODEL_SELECTION)); + if(nModelSelected == 0) return ITEM_APPR_ARMOR_MODEL_NECK; + if(nModelSelected == 1) return ITEM_APPR_ARMOR_MODEL_RSHOULDER; + if(nModelSelected == 2) return ITEM_APPR_ARMOR_MODEL_RBICEP; + if(nModelSelected == 3) return ITEM_APPR_ARMOR_MODEL_RFOREARM; + if(nModelSelected == 4) return ITEM_APPR_ARMOR_MODEL_RHAND; + if(nModelSelected == 5) return ITEM_APPR_ARMOR_MODEL_TORSO; + if(nModelSelected == 6) return ITEM_APPR_ARMOR_MODEL_BELT; + if(nModelSelected == 7) return ITEM_APPR_ARMOR_MODEL_PELVIS; + if(nModelSelected == 8) return ITEM_APPR_ARMOR_MODEL_RTHIGH; + if(nModelSelected == 9) return ITEM_APPR_ARMOR_MODEL_RSHIN; + if(nModelSelected == 10) return ITEM_APPR_ARMOR_MODEL_RFOOT; + return ITEM_APPR_ARMOR_MODEL_ROBE; +} +int GetHasPartColor(object oItem, int nPart, string sSide) +{ + json jItem = ObjectToJson(oItem); + string sPartName = "APart_"; + if(sSide == "Left") + { + // Note: Right Thigh and Left Thigh are backwards so this fixes that! + if (nPart == ITEM_APPR_ARMOR_MODEL_RTHIGH) nPart--; + else nPart++; + } + sPartName += IntToString(nPart) + "_Col_"; + int nPartColor = JsonGetInt(GffGetByte(jItem, sPartName + "0")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "1")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "2")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "3")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "4")); + nPartColor += JsonGetInt(GffGetByte(jItem, sPartName + "5")); + return nPartColor; +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_crafting")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Item Crafting")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("isk_x2cweap")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + return TRUE; +} + diff --git a/_module/nss/pi_debug.nss b/_module/nss/pi_debug.nss new file mode 100644 index 00000000..6555882a --- /dev/null +++ b/_module/nss/pi_debug.nss @@ -0,0 +1,200 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: pi_debug + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Plugin for debugging. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "0i_player_target" +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +void main() +{ + object oPC = OBJECT_SELF; + if(StartingUp(oPC)) return; + // Set window to not save until it has been created. + //SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + //DelayCommand (0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + string sText = " [Single player]"; + if(AI_SERVER) sText = " [Server]"; + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 500 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, PHILOS_VERSION + sText, "lbl_version", 470.0f, 20.0f, NUI_HALIGN_CENTER); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 129 + sText = "Module: " + GetModuleName() + " [" + GetTag(GetModule()) + "]"; + jRow = CreateLabel(JsonArray(), sText, "lbl_module_name", 470.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 500 / 101 + sText = "Monster AI (nw_c2_default1): " + ResManGetAliasFor("nw_c2_default1", RESTYPE_NCS); + jRow = CreateLabel(JsonArray(), sText, "monster_1_ai", 470.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 ******************************************************************* 500 / 157 + sText = "Monster AI (j_ai_onheartbeat): " + ResManGetAliasFor("j_ai_onheartbeat", RESTYPE_NCS); + jRow = CreateLabel(JsonArray(), sText, "monster_2_ai", 470.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 5 ******************************************************************* 500 / 213 + sText = "Associate AI (nw_ch_ac1): " + ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS); + jRow = CreateLabel(JsonArray(), sText, "henchman_ai", 470.0f, 20.0f, NUI_HALIGN_CENTER); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 6 ******************************************************************* 500 / 241 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Set NPC's scripts", "btn_npc_scripts", 150.0f, 20.0f, -1.0, "btn_npc_scripts_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Set Reputations", "btn_set_reputation", 150.0f, 20.0f, -1.0, "btn_set_reputation_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear Party Rep.", "btn_clear_reputation", 150.0f, 20.0f, -1.0, "btn_clear_reputation_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 7 ******************************************************************* 500 / 269 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Display Target Info", "btn_info", 150.0f, 20.0f, -1.0, "btn_info_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Dump Object to Json", "btn_obj_json", 150.0f, 20.0f, -1.0, "btn_obj_json_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "List Object Variables", "btn_obj_var", 150.0f, 20.0f, -1.0, "btn_obj_var_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 8 ******************************************************************* 500 / 297 jRow = JsonArray(); + jRow = CreateButton(JsonArray(), "Delete Variable", "btn_delete_var", 115.0f, 25.0f, -1.0, "btn_delete_var_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Set Variable", "btn_set_var", 115.0f, 25.0f, -1.0, "btn_set_var_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Get Variable", "btn_get_var", 115.0f, 25.0f, -1.0, "btn_get_var_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + json jCombo = JsonArrayInsert(JsonArray(), NuiComboEntry("int", 0)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("float", 1)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("string", 2)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("object", 3)); + jCombo = JsonArrayInsert(jCombo, NuiComboEntry("location", 4)); + jRow = CreateCombo(jRow, jCombo, "cmb_var_type", 115.0, 25.0); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 9 ******************************************************************* 500 / 329 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "Name:", "lbl_name", 40.0f, 20.0f); + jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_var_name", 40, FALSE, 425.0f, 20.0f, "txt_var_name_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 10 ******************************************************************* 500 / 357 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateLabel(jRow, "Value:", "lbl_value", 40.0f, 20.0f); + jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_var_value", 40, FALSE, 425.0f, 20.0f, "txt_var_value_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 11 ******************************************************************* 500 / 385 + // Make the debug creature group. + // Group Row 1 ******************************************************************* 500 / 385 + json jGroupRow = CreateButton(JsonArray(), "Debug Creature", "btn_debug_creature", 120.0f, 20.0f, -1.0, "btn_debug_creature_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButton(jGroupRow, "Clear Event Scripts", "btn_clear_events", 150.0f, 20.0f, -1.0, "btn_clear_events_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupRow = CreateButton(jGroupRow, "Clear Debug", "btn_clear_debug", 120.0f, 20.0f, -1.0, "btn_clear_debug_tooltip"); + // Add group row to the group column. + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + float fHeight = 431.0; + // Group Row 2 ******************************************************************* 500 / --- + object oDebugCreature = GetLocalObject(oPC, "AI_RULE_DEBUG_CREATURE_OBJECT"); + if(GetIsObjectValid(oDebugCreature)) + { + string sScript = GetEventScript(oDebugCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); + if(sScript == "nw_c2_default1") sText = GetName(oDebugCreature) + " is using monster AI scripts (" + sScript + ")."; + else if(sScript == "nw_ch_ac1") sText = GetName(oDebugCreature) + " is using associate AI scripts (" + sScript + ")."; + else if(sScript == "xx_pc_1_hb") sText = GetName(oDebugCreature) + " is using player AI scripts (" + sScript + ")."; + else if(sScript == "0e_id_events") sText = GetName(oDebugCreature) + " is using Infinite Dungeons AI scripts (" + sScript + ")."; + else if(sScript == "0e_prc_id_events") sText = GetName(oDebugCreature) + " is using PRC Infinite Dungeons AI scripts (" + sScript + ")."; + else sText = GetName(oDebugCreature) + " is using unknown AI scripts (" + sScript + ")."; + jGroupRow = CreateLabel(JsonArray(), sText, "debug_info", 455.0f, 20.0f, NUI_HALIGN_CENTER); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight = fHeight + 28; + } + // Group Row 3 ******************************************************************* 500 / --- + sText = GetLocalString(GetModule(), AI_RULE_DEBUG_CREATURE); + if(sText != "") sText = sText + " is sending AI debug to the log file."; + else sText = "Nothing is sending AI debug to the log file."; + jGroupRow = CreateLabel(JsonArray(), sText, "debug_log", 455.0f, 20.0f, NUI_HALIGN_CENTER); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + fHeight = fHeight + 28; + // Add group to the row. + jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, "pi_debug_nui", sName + " PEPS Debug Menu", + -1.0, -1.0, 500.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_debug"); + // Set all binds, events, and watches. + // Row 1 - Version label. + // Row 2 Module Name. + // Row 3 - 5 Script locations. + // Row 6 + NuiSetBind(oPC, nToken, "btn_npc_scripts_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_npc_scripts_tooltip", JsonString(" Forces NPC to use Philos AI scripts!")); + NuiSetBind(oPC, nToken, "btn_set_reputation_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_set_reputation_tooltip", JsonString(" Sets a creatures faction to neutral for all standard factions.")); + NuiSetBind(oPC, nToken, "btn_clear_reputation_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_reputation_tooltip", JsonString(" Clears the party's reputation with creature's faction.")); + // Row 7 + NuiSetBind(oPC, nToken, "btn_info_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_info_tooltip", JsonString(" Displays a target object's information to the log screen.")); + NuiSetBind(oPC, nToken, "btn_obj_json_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_obj_json_tooltip", JsonString(" Sends a Json Dump to the log file for the targeted object.")); + NuiSetBind(oPC, nToken, "btn_obj_var_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_obj_var_tooltip", JsonString(" Sends a list of variables for the targeted object.")); + // Row 8 + NuiSetBind(oPC, nToken, "btn_delete_var_tooltip", JsonString(" Delete the variable for the targeted object or Right click for the Module.")); + NuiSetBind(oPC, nToken, "btn_set_var_tooltip", JsonString(" Set the variable for the targeted object or Right click for the Module.")); + NuiSetBind(oPC, nToken, "btn_get_var_tooltip", JsonString(" Get the variable for the targeted object or Right click for the Module.")); + NuiSetBind(oPC, nToken, "cmb_var_type_event", JsonBool(TRUE)); + NuiSetBindWatch(oPC, nToken, "cmb_var_type_selected", TRUE); + // Row 9 + NuiSetBind(oPC, nToken, "txt_var_name_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "txt_var_name", TRUE); + NuiSetBind(oPC, nToken, "txt_var_name_tooltip", JsonString(" Name of the variable we are setting.")); + // Row 10 + NuiSetBind(oPC, nToken, "txt_var_value_event", JsonBool(TRUE)); + NuiSetBindWatch (oPC, nToken, "txt_var_value", TRUE); + NuiSetBind(oPC, nToken, "txt_var_value_tooltip", JsonString(" The value to set on the variable, Objects/Locations will need to be selected.")); + // Row 11 + NuiSetBind(oPC, nToken, "btn_debug_creature_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_debug_creature_tooltip", JsonString(" Sets target creature to send AI debug to the log file.")); + NuiSetBind(oPC, nToken, "btn_clear_events_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_events_tooltip", JsonString(" Sets a creature's event scripts to default.")); + NuiSetBind(oPC, nToken, "btn_clear_debug_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_debug_tooltip", JsonString(" Clears a creature from sending AI debug to the log file.")); +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_debug")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Debug Menu")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("dm_tagsearch")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + return TRUE; +} + diff --git a/_module/nss/pi_forcerest.nss b/_module/nss/pi_forcerest.nss new file mode 100644 index 00000000..dfabb342 --- /dev/null +++ b/_module/nss/pi_forcerest.nss @@ -0,0 +1,70 @@ +#include "0i_menus" +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +void ai_UpdateAssociateWidget(object oMaster, object oAssociate, int nUIToken) +{ + if(nUIToken) NuiDestroy(oMaster, nUIToken); + ai_CreateWidgetNUI(oMaster, oAssociate); + if(oMaster != oAssociate) + { + nUIToken = NuiFindWindow(oMaster, "pc" + AI_WIDGET_NUI); + if(nUIToken) + { + NuiDestroy(oMaster, nUIToken); + ai_CreateWidgetNUI(oMaster, oMaster); + } + } +} +void main() +{ + object oPC = OBJECT_SELF; + if(StartingUp(oPC)) return; + ForceRest(oPC); + DeleteLocalInt(oPC, "HF_REST_LAST_TIME"); + int nIndex; + int nMaxHenchman = GetMaxHenchmen(); + object oAssociate; + for(nIndex = 1;nIndex <= nMaxHenchman; nIndex++) + { + oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + ForceRest(oAssociate); + DeleteLocalInt(oAssociate, "HF_REST_LAST_TIME"); + if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) + { + DelayCommand(1.0, ai_HenchmanCastDefensiveSpells(oAssociate, oPC)); + } + if(AI_HENCHMAN_WIDGET) + { + // Update widget for spell widget. + string sAssociateType = ai_GetAssociateType(oPC, oAssociate); + int nUIToken = NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI); + if(nUIToken) DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate, nUIToken)); + else + { + if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType)) + { + DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate, 0)); + } + } + } + } +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_forcerest")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Force Rest")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("ir_rest")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + return TRUE; +} + diff --git a/_module/nss/pi_henchmen.nss b/_module/nss/pi_henchmen.nss new file mode 100644 index 00000000..51190399 --- /dev/null +++ b/_module/nss/pi_henchmen.nss @@ -0,0 +1,209 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pi_henchmen +//////////////////////////////////////////////////////////////////////////////// + Executable plug in script for Philos Module Extentions. + + UI to save a players as Henchmen. +*/////////////////////////////////////////////////////////////////////////////// +#include "pinc_henchmen" +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +// Inserts base classes to an array for a combo box. +json JArrayInsertBaseClasses(); +void main() +{ + object oPC = OBJECT_SELF; + if(StartingUp(oPC)) return; + // Set window to not save until it has been created. + SetLocalInt (oPC, "AI_NO_NUI_SAVE", TRUE); + DelayCommand (0.5f, DeleteLocalInt (oPC, "AI_NO_NUI_SAVE")); + // Row 1 (Buttons) ********************************************************* 775 / 73 + json jRow = CreateButtonSelect(JsonArray(), "Party 1", "btn_party1", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 2", "btn_party2", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 3", "btn_party3", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 4", "btn_party4", 90.0f, 20.0f); + jRow = CreateButtonSelect(jRow, "Party 5", "btn_party5", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 6", "btn_party6", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 7", "btn_party7", 90.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Party 8", "btn_party8", 90.0f, 20.0f); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 (Options)********************************************************** 775 / 101 + jRow = CreateButton(JsonArray(), "Clear Party", "btn_clear_party", 120.0f, 20.0f, -1.0, "btn_clear_party_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Party Join", "btn_join_party", 120.0f, 20.0f, -1.0, "btn_join_party_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButtonSelect(jRow, "Create NPC Henchman", "btn_npc_henchman", 200.0f, 20.0f, "btn_npc_henchman_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Save Party", "btn_save_party", 120.0f, 20.0f, -1.0, "btn_save_party_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Remove Party", "btn_remove_party", 120.0f, 20.0f, -1.0, "btn_remove_party_tooltip"); + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 (Names and List titles) ******************************************* 775 / 124 + jRow = CreateLabel(JsonArray(), "", "lbl_save_char", 150.0, 15.0, 0, 0); + jRow = CreateLabel(jRow, "", "lbl_save_list", 200.0, 15.0, 0, 0); + jRow = CreateLabel(jRow, "In game party", "lbl_game_list", 200.0, 15.0, 0, 0); + jRow = CreateLabel(jRow, "", "lbl_game_char", 150.0, 15.0, 0, 0); + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 4 (List Characters) ************************************************* 775 / 488 (364) + // Saved Characters for Party # + // ***** Adding character saved group next to the button list ************** + json jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateImage(jGroupRow, "", "img_saved_portrait", NUI_ASPECT_EXACTSCALED, NUI_HALIGN_CENTER, NUI_VALIGN_TOP, 128.0, 200.0, 0.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_saved_stats", 150.0, 15.0, 0, 0, 0.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_saved_classes", 150.0, 15.0, 0, 0, 0.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateButton(JsonArray(), "", "btn_saved_join", 75.0, 20.0); + jGroupRow = CreateButton(jGroupRow, "Remove", "btn_saved_remove", 75.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + //jGroupRow = JsonArray(); + //CreateButton(jGroupRow, "Edit", "btn_saved_edit", 150.0, 20.0); + //jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); + // Create the button template for the List. + json jButton = NuiId(NuiButton(NuiBind ("btns_saved_char")), "btn_saved_char"); + json jList = JsonArrayInsert(JsonArray (), NuiListTemplateCell(jButton, 170.0, TRUE)); + // Create the list with the template. + jRow = CreateList(jRow, jList, "btns_saved_char", 25.0, 200.0, 325.0); + // Current Characters. + // Create the button template for the List. + jButton = NuiId(NuiButton(NuiBind ("btns_cur_char")), "btn_cur_char"); + jList = JsonArrayInsert(JsonArray (), NuiListTemplateCell(jButton, 170.0, TRUE)); + // Create the list with the template. + jRow = CreateList(jRow, jList, "btns_cur_char", 25.0, 200.0, 325.0); + // ***** Adding character current group next to the button list ************ + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateImage(jGroupRow, "", "img_cur_portrait", NUI_ASPECT_EXACTSCALED, NUI_HALIGN_CENTER, NUI_VALIGN_TOP, 128.0, 200.0, 0.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_cur_stats", 150.0, 15.0, 0, 0, 0.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateLabel(JsonArray(), "", "lbl_cur_classes", 150.0, 15.0, 0, 0, 0.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateButton(JsonArray(), "", "btn_cur_save", 75.0, 20.0); + jGroupRow = CreateButton(jGroupRow, "Remove", "btn_cur_remove", 75.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jGroupRow = CreateButton(JsonArray(), "Edit", "btn_cur_edit", 150.0, 20.0); + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jRow = JsonArrayInsert(jRow, NuiGroup(NuiCol(jGroupCol))); + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Set the layout of the window. + json jLayout = NuiCol(jCol); + // Get the window location to restore it from the database. + CheckHenchmanDataAndInitialize(oPC, "0"); + json jData = GetHenchmanDbJson(oPC, "henchman", "0"); + json jGeometry = JsonObjectGet(jData, "henchman_nui"); + float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); + float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); + if(fX == 0.0 && fY == 0.0) + { + fX = -1.0; + fY = -1.0; + } + string sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow (oPC, jLayout, "henchman_nui", sName + " party", + fX, fY, 775.0, 488.0, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_henchmen"); + // Lets set MaxHenchman here. + if(GetMaxHenchmen() < 6) SetMaxHenchmen(6); + // Setup watch for saving location. + NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE); + // Set the elements to show events. + NuiSetBind(oPC, nToken, "btn_save_pc_event", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_current_party_event", JsonBool (TRUE)); + string sParty = GetHenchmanDbString(oPC, "henchname", "0"); + if(sParty == "") + { + SetHenchmanDbString(oPC, "henchname", "1", "0"); + sParty = "1"; + } + // Set the party # buttons. + int nIndex; + string sIndex; + for(nIndex = 1; nIndex < 9; nIndex++) + { + sIndex = IntToString(nIndex); + if(sParty == sIndex) NuiSetBind(oPC, nToken, "btn_party" + sIndex, JsonBool(TRUE)); + else NuiSetBind(oPC, nToken, "btn_party" + sIndex, JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_party" + sIndex + "_event", JsonBool (TRUE)); + } + NuiSetBind(oPC, nToken, "btn_npc_henchman_event", JsonBool(TRUE)); + string sText = " Select a creature to copy and have them join you."; + NuiSetBind(oPC, nToken, "btn_npc_henchman_tooltip", JsonString(sText)); + // ********** Saved Henchman in party # ********* + nIndex = 0; + int nSlot, nMaxHenchman = AI_MAX_HENCHMAN + 1; + json jButtons = JsonArray(); + string sFirstHenchman, sButtonText; + json jNPCs, jNPC; + // Add saved party members from sParty to the button list. + while(nIndex < nMaxHenchman) + { + sIndex = IntToString(nIndex); + sButtonText = GetHenchmanDbString(oPC, "henchname", sParty + sIndex); + if(sButtonText != "") + { + jButtons = JsonArrayInsert(jButtons, JsonString(sButtonText)); + SetHenchmanDbString(oPC, "slot", sParty + IntToString(nSlot++), sParty + sIndex); + } + nIndex++; + } + // Add the buttons to the list. + NuiSetBind(oPC, nToken, "btns_saved_char", jButtons); + // Set up button lables for henchman. + NuiSetBind(oPC, nToken, "lbl_save_list_label", JsonString("Party Save " + sParty)); + AddSavedCharacterInfo(oPC, nToken, sParty); + // ********** Current Party ********* + NuiSetBind(oPC, nToken, "btn_current_party", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_party", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "lbl_save_char", JsonBool(TRUE)); + // Set up button labels for henchman. + NuiSetBind(oPC, nToken, "btn_join_save_label", JsonString("Save")); + nIndex = 0; + jButtons = JsonArray(); + object oPartyMember, oCharacter = OBJECT_INVALID; + // Add current party members to the button list. + while(nIndex < AI_MAX_HENCHMAN) + { + if(nIndex == 0) oPartyMember = oPC; + else oPartyMember = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oPartyMember != OBJECT_INVALID) jButtons = JsonArrayInsert(jButtons, JsonString(GetName(oPartyMember))); + else break; + nIndex++; + } + // Add the buttons to the list. + NuiSetBind(oPC, nToken, "btns_cur_char", jButtons); + AddCurrentCharacterInfo(oPC, nToken, sParty); +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_henchmen")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Henchmen Menu")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("dm_creator")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + return TRUE; +} + diff --git a/_module/nss/pi_test.nss b/_module/nss/pi_test.nss new file mode 100644 index 00000000..818da8c1 --- /dev/null +++ b/_module/nss/pi_test.nss @@ -0,0 +1,103 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: pi_test + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Plugin for debugging. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "0i_player_target" +// Does startup check if the game has just been loaded. +int StartingUp(object oPC); +void main() +{ + object oPC = OBJECT_SELF; + if(StartingUp(oPC)) return; + string sText; + // Set window to not save until it has been created. + //SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); + //DelayCommand (0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); + // ************************************************************************* Width / Height + // Row 1 ******************************************************************* 636 / 73 + json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Level Up Creature", "btn_level", 150.0f, 20.0f, -1.0, "btn_level_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Gold for Creature", "btn_gold", 150.0f, 20.0f, -1.0, "btn_gold_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Force Rest Creature", "btn_rest", 150.0f, 20.0f, -1.0, "btn_rest_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "ID/UnID Item", "btn_id_item", 150.0f, 20.0f, -1.0, "btn_id_item_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 636 / 101 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Heal Creature", "btn_heal", 150.0f, 20.0f, -1.0, "btn_heal_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Clear Creature Actions", "btn_clear", 150.0f, 20.0f, -1.0, "btn_clear_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Kill Creature", "btn_kill", 150.0f, 20.0f, -1.0, "btn_kill_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Remove Object", "btn_remove", 150.0f, 20.0f, -1.0, "btn_remove_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Row 3 ******************************************************************* 636 / 101 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "Jump To", "btn_jump", 150.0f, 20.0f, -1.0, "btn_jump_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + jRow = CreateButton(jRow, "Kill In Area", "btn_kill_area", 150.0f, 20.0f, -1.0, "btn_kill_area_tooltip"); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + float fHeight = 129.0; + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + string sName = GetName(oPC); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow(oPC, jLayout, "pi_test_nui", sName + " PEPS Testing Menu", + -1.0, -1.0, 636.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_test"); + // Set all binds, events, and watches. + // Row 1 + NuiSetBind(oPC, nToken, "btn_level_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_tooltip", JsonString(" Give level to target creature.")); + NuiSetBind(oPC, nToken, "btn_gold_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_gold_tooltip", JsonString(" Give Gold to target creature.")); + NuiSetBind(oPC, nToken, "btn_rest_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_rest_tooltip", JsonString(" Force rest target creature.")); + NuiSetBind(oPC, nToken, "btn_id_item_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_id_item_tooltip", JsonString(" Identify or UnIdentify the target item.")); + // Row 2 + NuiSetBind(oPC, nToken, "btn_heal_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_heal_tooltip", JsonString(" Heal target creature to max hitpoints.")); + NuiSetBind(oPC, nToken, "btn_clear_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_clear_tooltip", JsonString(" Clears a creature's actions including combat.")); + NuiSetBind(oPC, nToken, "btn_kill_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_kill_tooltip", JsonString(" Kill target creature doing 10,000 magic damage.")); + NuiSetBind(oPC, nToken, "btn_remove_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_remove_tooltip", JsonString(" Remove selected object or the nearest object to ground selection.")); + // Row 3 + NuiSetBind(oPC, nToken, "btn_jump_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_jump_tooltip", JsonString(" Jump to target location.")); + NuiSetBind(oPC, nToken, "btn_kill_area_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_kill_area_tooltip", JsonString(" Kills all creatures in target area.")); +} +int StartingUp(object oPC) +{ + if(GetLocalInt(oPC, AI_ADD_PLUGIN)) + { + json jPlugin = JsonArray(); + jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_test")); + jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE)); + jPlugin = JsonArrayInsert(jPlugin, JsonString("Testing Menu")); + jPlugin = JsonArrayInsert(jPlugin, JsonString("ir_charsheet")); + json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS); + jPlugins = JsonArrayInsert(jPlugins, jPlugin); + SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin); + SetLocalInt(oPC, AI_PLUGIN_SET, TRUE); + return TRUE; + } + if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE; + return TRUE; +} + diff --git a/_module/nss/pinc_henchmen.nss b/_module/nss/pinc_henchmen.nss new file mode 100644 index 00000000..a67141a3 --- /dev/null +++ b/_module/nss/pinc_henchmen.nss @@ -0,0 +1,1531 @@ +/*////////////////////////////////////////////////////////////////////////////// +// Script Name: pinc_henchmen +//////////////////////////////////////////////////////////////////////////////// + Include file for Henchmen plug in scripts for Philos Module Extentions. + +Database Info: +Slot 0 - henchname = the save slot 1 - 8. +Slots 1 - 8 define the selections: + henchname = Saved character selected. + image = Current character selected. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_nui" +#include "nw_inc_gff" + +const string HENCHMAN_DATABASE = "philos_henchman_db"; +const string HENCHMAN_TABLE = "HENCHMAN_TABLE"; +const string HENCHMAN_TO_EDIT = "HENCHMAN_TO_EDIT"; + +// Creates the table and initializes if it needs to. +void CheckHenchmanDataAndInitialize(object oPC, string sSlot); +// Removes a henchan from the current slot. +void RemoveHenchmanDb(object oPC, string sSlot); +// sDataField should be one of the data fields for that table. +// sData is the string data to be saved. +void SetHenchmanDbString(object oPC, string sDataField, string sData, string sSlot); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +string GetHenchmanDbString(object oPC, string sDataField, string sSlot); +// sDataField should be one of the data fields for that table. +// jData is the json data to be saved. +void SetHenchmanDbJson(object oPC, string sDataField, json jData, string sSlot); +// sDataField should be one of the data fields for the table. +// Returns a string of the data stored. +json GetHenchmanDbJson(object oPC, string sDataField, string sSlot); +// sSlot is the slot to define this object in the database for this Slot## (# Party button and #1-6). +// oHenchman is the PC/Henchman to be saved. +void SetHenchmanDbObject(object oPC, object oHenchman, string sSlot); +// sSlot is the slot to define this object in the database for this Slot## (# Party button and #1-6). +// lLocationToSpawn will spawn the object at that location. +object GetHenchmanDbObject(object oPC, location lLocationToSpawn, string sSlot); +// Returns TRUE if the henchman with sName can join. +int GetJoinButtonActive(object oPC, string sName); +// Returns a two letter alignment string. +string GetAlignText(object oHenchman); +// Populates the Saved character group. +void AddSavedCharacterInfo(object oPC, int nToken, string sParty); +// Populates the Current character group. +void AddCurrentCharacterInfo(object oPC, int nToken, string sParty); +// Removes a henchman from your party. +void RemoveYourHenchman(object oPC, int nToken, string sParty); +// Removes all henchman from the party. +void RemoveWholeParty(object oPC, int nToken, string sParty); +// Saves a henchman in your party to the saved party #. +void SaveYourHenchman(object oPC, int nToken, string sParty); +// Saves the whole party to the saved party #. +void SaveWholeParty(object oPC, int nToken, string sParty); +// Saves the players current party to party #. +void SavedPartyJoin(object oPC, int nToken, string sParty); +// Saves a character in the players party to party #. +void SavedCharacterJoin(object oPC, int nToken, string sParty); +// Clears the players saved party #. +void SavedPartyCleared(object oPC, int nToken, string sParty); +// Sets oHenchmans scripts to the current AI. +void SetHenchmanScripts(object oHenchman); +// If a henchman does not have a LvlStatList this will create one for them. +// nLevels allows the creation of x levels for LvlStatList using the 1st class. +// 0 on nLevels makes the function build it based on current levels. +json CreateLevelStatList(json jHenchman, object oHenchman, object oPC, int nLevels = 0); +// Resets the character to level one in the first class. +object ResetCharacter(object oPC, object oHenchman); +// Creates a menu to edit a characters information. +void CreateCharacterEditGUIPanel(object oPC, object oAssociate); +// Creates a character description menu. +void CreateCharacterDescriptionNUI(object oPC, string sName, string sIcon, string sDescription); + +void CreateHenchmanDataTable () +{ + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, + "CREATE TABLE IF NOT EXISTS " + HENCHMAN_TABLE + " (" + + "name TEXT, " + + "slot TEXT, " + + "henchname TEXT, " + + "image TEXT, " + + "stats TEXT, " + + "classes TEXT, " + + "henchman TEXT, " + + "PRIMARY KEY(slot));"); + SqlStep (sql); +} +void CheckHenchmanDataAndInitialize(object oPC, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' AND name=@tableName;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@tableName", HENCHMAN_TABLE); + if(!SqlStep (sql)) CreateHenchmanDataTable(); + sQuery = "SELECT slot FROM " + HENCHMAN_TABLE + " Where name = @name AND slot = @slot;"; + sql = SqlPrepareQueryCampaign("philos_henchman_db", sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + if(!SqlStep(sql)) + { + sQuery = "INSERT INTO " + HENCHMAN_TABLE + "(name, slot, henchname, image, stats, classes " + + ", henchman) VALUES (@name, @slot, @henchname, @image, @stats, @classes, @henchman);"; + sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + SqlBindString(sql, "@henchname", ""); + SqlBindString(sql, "@image", ""); + SqlBindString(sql, "@stats", ""); + SqlBindString(sql, "@classes", ""); + SqlBindJson(sql, "@henchman", JsonObject()); + SqlStep(sql); + } +} +void RemoveHenchmanDb(object oPC, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "DELETE FROM " + HENCHMAN_TABLE + " WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + SqlStep(sql); +} +void SetHenchmanDbString(object oPC, string sDataField, string sData, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "UPDATE " + HENCHMAN_TABLE + " SET " + sDataField + " = @data WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@data", sData); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + SqlStep(sql); +} +string GetHenchmanDbString(object oPC, string sDataField, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "SELECT " + sDataField + " FROM " + HENCHMAN_TABLE + " WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + if(SqlStep (sql)) return SqlGetString(sql, 0); + else return ""; +} +void SetHenchmanDbJson(object oPC, string sDataField, json jData, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "UPDATE " + HENCHMAN_TABLE + " SET " + sDataField + + " = @data WHERE name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindJson (sql, "@data", jData); + SqlBindString(sql, "@name", sPCName); + SqlBindString (sql, "@slot", sSlot); + SqlStep (sql); +} +json GetHenchmanDbJson(object oPC, string sDataField, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "SELECT " + sDataField + " FROM " + HENCHMAN_TABLE + " WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString (sql, "@slot", sSlot); + if (SqlStep (sql)) return SqlGetJson (sql, 0); + else return JsonArray (); +} +void SetHenchmanDbObject(object oPC, object oHenchman, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "UPDATE " + HENCHMAN_TABLE + " SET henchman = @henchman WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindObject(sql, "@henchman", oHenchman); + SqlBindString(sql, "@name", sPCName); + SqlBindString(sql, "@slot", sSlot); + SqlStep(sql); +} +object GetHenchmanDbObject(object oPC, location lLocationToSpawn, string sSlot) +{ + string sPCName = ai_RemoveIllegalCharacters(GetPCPlayerName(oPC)); + string sQuery = "SELECT henchman FROM " + HENCHMAN_TABLE + " WHERE " + + "name = @name AND slot = @slot;"; + sqlquery sql = SqlPrepareQueryCampaign(HENCHMAN_DATABASE, sQuery); + SqlBindString(sql, "@name", sPCName); + SqlBindString (sql, "@slot", sSlot); + if (SqlStep (sql)) + { + json jHenchman = SqlGetJson(sql, 0); + string sTag = JsonGetString(GffGetString(jHenchman, "Tag")); + if(sTag == "") jHenchman = GffReplaceString(jHenchman, "Tag", "Hench_" + IntToString(Random(100))); + return JsonToObject(jHenchman, lLocationToSpawn, OBJECT_INVALID, TRUE); + } + return OBJECT_INVALID; +} +int GetJoinButtonActive(object oPC, string sName) +{ + if(sName == GetName(oPC)) return FALSE; + // Look for a free henchman slot, and if this henchman is already joined! + int nIndex = 1; + object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(oHenchman != OBJECT_INVALID) + { + if(GetName(oHenchman) == sName) return FALSE; + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + return TRUE; +} +string GetAlignText(object oHenchman) +{ + string sAlign1, sAlign2; + switch (GetAlignmentLawChaos(oHenchman)) + { + case ALIGNMENT_LAWFUL : sAlign1 = "L"; break; + case ALIGNMENT_NEUTRAL : sAlign1 = "N"; break; + case ALIGNMENT_CHAOTIC : sAlign1 = "C"; break; + } + switch (GetAlignmentGoodEvil(oHenchman)) + { + case ALIGNMENT_GOOD : sAlign2 = "G"; break; + case ALIGNMENT_NEUTRAL : sAlign2 = "N"; break; + case ALIGNMENT_EVIL : sAlign2 = "E"; break; + } + string sAlign = sAlign1 + sAlign2; + if (sAlign == "NN") sAlign = "TN"; + return sAlign; +} +void AddSavedCharacterInfo(object oPC, int nToken, string sParty) +{ + string sHenchman = GetHenchmanDbString(oPC, "henchname", sParty); + // Add Henchman information. + if(sHenchman != "") + { + NuiSetBind (oPC, nToken, "btn_clear_party_event", JsonBool (TRUE)); + string sText = " Clears all characters from party " + sParty + "'s list!"; + NuiSetBind(oPC, nToken, "btn_clear_party_tooltip", JsonString(sText)); + NuiSetBind(oPC, nToken, "btn_join_party", JsonBool (TRUE)); + NuiSetBind(oPC, nToken, "btn_join_party_event", JsonBool (TRUE)); + sText = " Saved characters from party " + sParty + " enter the game and join you."; + NuiSetBind(oPC, nToken, "btn_join_party_tooltip", JsonString(sText)); + // Setup the henchman window. + string sName = GetHenchmanDbString(oPC, "henchname", sParty + sHenchman); + string sImage = GetHenchmanDbString(oPC, "image", sParty + sHenchman); + string sStats = GetHenchmanDbString(oPC, "stats", sParty + sHenchman); + string sClasses = GetHenchmanDbString(oPC, "classes", sParty + sHenchman); + NuiSetBind(oPC, nToken, "lbl_save_char_label", JsonString(sName)); + NuiSetBind(oPC, nToken, "img_saved_portrait_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "img_saved_portrait_image", JsonString(sImage + "l")); + NuiSetBind(oPC, nToken, "lbl_saved_stats_label", JsonString(sStats)); + NuiSetBind(oPC, nToken, "lbl_saved_classes_label", JsonString(sClasses)); + NuiSetBind(oPC, nToken, "btn_saved_join_label", JsonString("Join")); + NuiSetBind(oPC, nToken, "btn_saved_join_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_saved_remove_event", JsonBool(TRUE)); + //NuiSetBind(oPC, nToken, "btn_saved_edit_event", JsonBool(TRUE)); + } + else + { + NuiSetBind(oPC, nToken, "lbl_save_char_label", JsonString("Empty Party")); + NuiSetBind (oPC, nToken, "btn_clear_party_event", JsonBool (FALSE)); + NuiSetBind (oPC, nToken, "btn_join_party", JsonBool (FALSE)); + NuiSetBind (oPC, nToken, "btn_join_party_event", JsonBool (FALSE)); + // Setup the henchman window. + NuiSetBind(oPC, nToken, "img_saved_portrait_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "img_saved_portrait_image", JsonString("po_hu_m_99_l")); + NuiSetBind(oPC, nToken, "lbl_saved_stats_label", JsonString("")); + NuiSetBind(oPC, nToken, "lbl_saved_classes_label", JsonString("")); + NuiSetBind(oPC, nToken, "btn_saved_join_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_saved_join_label", JsonString("Join")); + NuiSetBind(oPC, nToken, "btn_saved_remove_event", JsonBool(FALSE)); + NuiSetBind(oPC, nToken, "btn_saved_edit_event", JsonBool(FALSE)); + } +} +void AddCurrentCharacterInfo(object oPC, int nToken, string sParty) +{ + string sHenchman = GetHenchmanDbString(oPC, "image", sParty); + if(sHenchman == "") + { + CheckHenchmanDataAndInitialize(oPC, sParty); + SetHenchmanDbString(oPC, "image", "0", sParty); + } + int nHenchman = StringToInt(sHenchman); + int nIndex = 0; + object oCharacter; + while(nIndex < AI_MAX_HENCHMAN) + { + if(nIndex == 0) oCharacter = oPC; + else oCharacter = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oCharacter == OBJECT_INVALID) + { + nIndex = 0; + oCharacter = oPC; + break; + } + else if(nHenchman == nIndex) break; + nIndex++; + } + // Adjust the party buttons. + int bParty = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, 1) != OBJECT_INVALID; + //NuiSetBind(oPC, nToken, "btn_save_party", JsonBool (bParty)); + NuiSetBind(oPC, nToken, "btn_save_party_event", JsonBool (bParty)); + //NuiSetBind(oPC, nToken, "btn_remove_party", JsonBool (bParty)); + NuiSetBind(oPC, nToken, "btn_remove_party_event", JsonBool (bParty)); + if(bParty) + { + string sText = " Saves all henchman from your current party to party " + sParty + "."; + NuiSetBind(oPC, nToken, "btn_save_party_tooltip", JsonString(sText)); + sText = " Removes all henchman from your current party!"; + NuiSetBind(oPC, nToken, "btn_remove_party_tooltip", JsonString(sText)); + } + // Setup the henchman window. + string sName = GetName(oCharacter); + string sImage = GetPortraitResRef(oCharacter); + string sStats = GetAlignText(oCharacter) + " "; + if(GetGender(oCharacter) == GENDER_MALE) sStats += "Male "; + else sStats += "Female "; + int nPosition = 1; + sStats += GetStringByStrRef (StringToInt (Get2DAString ("racialtypes", "Name", GetRacialType (oCharacter)))); + string sClasses = GetStringByStrRef (StringToInt (Get2DAString ("classes", "Short", GetClassByPosition (nPosition, oCharacter)))); + sClasses += " " + IntToString (GetLevelByPosition (nPosition, oCharacter)); + int nClass = GetClassByPosition(++nPosition, oCharacter); + while(nClass != CLASS_TYPE_INVALID) + { + sClasses += ", " + GetStringByStrRef (StringToInt (Get2DAString ("classes", "Short", nClass))); + sClasses += " " + IntToString (GetLevelByPosition (nPosition, oCharacter)); + nClass = GetClassByPosition(++nPosition, oCharacter); + } + NuiSetBind(oPC, nToken, "lbl_game_char_label", JsonString(sName)); + NuiSetBind(oPC, nToken, "img_cur_portrait_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "img_cur_portrait_image", JsonString(sImage + "l")); + NuiSetBind(oPC, nToken, "lbl_cur_stats_label", JsonString(sStats)); + NuiSetBind(oPC, nToken, "lbl_cur_classes_label", JsonString(sClasses)); + NuiSetBind(oPC, nToken, "btn_cur_save_label", JsonString("Save")); + NuiSetBind(oPC, nToken, "btn_cur_save_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cur_edit_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_cur_remove_event", JsonBool(TRUE)); +} +object GetSelectedHenchman(object oPC, string sParty) +{ + string sHenchman = GetHenchmanDbString(oPC, "image", sParty); + if(sHenchman == "") + { + CheckHenchmanDataAndInitialize(oPC, sParty); + SetHenchmanDbString(oPC, "image", "0", sParty); + } + int nHenchman = StringToInt(sHenchman); + int nIndex = 0; + object oCharacter; + while(nIndex < AI_MAX_HENCHMAN) + { + if(nIndex == 0) oCharacter = oPC; + else oCharacter = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oCharacter == OBJECT_INVALID) + { + nIndex = 0; + oCharacter = oPC; + break; + } + else if(nHenchman == nIndex) break; + nIndex++; + } + return oCharacter; +} +void RemoveYourHenchman(object oPC, int nToken, string sParty) +{ + object oHenchman = GetSelectedHenchman(oPC, sParty); + if(oHenchman == oPC) ai_SendMessages("You cannot remove the player from the party!", AI_COLOR_RED, oPC); + else + { + RemoveHenchman(oPC, oHenchman); + AssignCommand(oHenchman, SetIsDestroyable(TRUE, FALSE, FALSE)); + NuiDestroy(oPC, NuiFindWindow(oPC, ai_GetAssociateType(oPC, oHenchman) + AI_WIDGET_NUI)); + DestroyObject(oHenchman); + } + ai_SendMessages(GetName(oHenchman) + " has been removed from the party!", AI_COLOR_GREEN, oPC); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +void RemoveWholeParty(object oPC, int nToken, string sParty) +{ + int nIndex = AI_MAX_HENCHMAN; + object oHenchman; + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(nIndex > 0) + { + if(oHenchman != OBJECT_INVALID) + { + ai_SendMessages(GetName(oHenchman) + " has been remove from your Party.", AI_COLOR_YELLOW, oPC); + RemoveHenchman(oPC, oHenchman); + AssignCommand(oHenchman, SetIsDestroyable(TRUE, FALSE, FALSE)); + NuiDestroy(oPC, NuiFindWindow(oPC, ai_GetAssociateType(oPC, oHenchman) + AI_WIDGET_NUI)); + DestroyObject(oHenchman); + } + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, --nIndex); + } + ai_SendMessages("All of your henchman have been remove from the Party.", AI_COLOR_YELLOW, oPC); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +void SaveYourHenchman(object oPC, int nToken, string sParty) +{ + int bPC, nIndex, nClass, nPosition, nMaxHenchman = AI_MAX_HENCHMAN + 1; + string sName, sIndex, sSlot, sStats, sClasses; + object oHenchman = GetSelectedHenchman(oPC, sParty); + if(oHenchman == oPC) + { + bPC = TRUE; + oHenchman = CopyObject(oPC, GetLocation(oPC), OBJECT_INVALID, "hench_" + IntToString(Random(100)), TRUE); + SetHenchmanScripts(oHenchman); + } + string sHenchmanName = GetName(oHenchman); + while(nIndex < nMaxHenchman) + { + sIndex = IntToString(nIndex); + sName = GetHenchmanDbString(oPC, "henchname", sParty + sIndex); + if(sName == sHenchmanName || sName == "") + { + sSlot = sParty + sIndex; + if(!bPC) RemoveHenchman(oPC, oHenchman); + // Special check for Infinite Dungeon plot givers to be changed into henchman. + if(GetStringLeft(GetLocalString(oHenchman, "sConversation"), 8) == "id1_plot") + { + DeleteLocalString(oHenchman, "sConversation"); + } + ChangeToStandardFaction(oHenchman, STANDARD_FACTION_DEFENDER); + json jHenchman = ObjectToJson(oHenchman, TRUE); + if(!bPC) AddHenchman(oPC, oHenchman); + else DestroyObject(oHenchman); + //string sPatch = "[{\"op\":\"replace\",\"path\":\"/FactionID/value\",\"value\":1}]"; + //json jPatch = JsonParse(sPatch); + //jHenchman = JsonPatch(jHenchman, jPatch); + CheckHenchmanDataAndInitialize(oPC, sSlot); + SetHenchmanDbString(oPC, "image", GetPortraitResRef(oHenchman), sSlot); + SetHenchmanDbString(oPC, "henchname", sHenchmanName, sSlot); + sStats = GetAlignText(oHenchman) + " "; + if(GetGender(oHenchman) == GENDER_MALE) sStats += "Male "; + else sStats += "Female "; + nPosition = 1; + sStats += GetStringByStrRef (StringToInt (Get2DAString ("racialtypes", "Name", GetRacialType (oHenchman)))); + sClasses = GetStringByStrRef (StringToInt (Get2DAString ("classes", "Short", GetClassByPosition (nPosition, oHenchman)))); + sClasses += " " + IntToString (GetLevelByPosition (nPosition, oHenchman)); + nClass = GetClassByPosition(++nPosition, oHenchman); + while(nClass != CLASS_TYPE_INVALID) + { + sClasses += ", " + GetStringByStrRef (StringToInt (Get2DAString ("classes", "Short", GetClassByPosition (nPosition, oHenchman)))); + sClasses += " " + IntToString (GetLevelByPosition (nPosition, oHenchman)); + nClass = GetClassByPosition(++nPosition, oHenchman); + } + SetHenchmanDbString(oPC, "stats", sStats, sSlot); + SetHenchmanDbString(oPC, "classes", sClasses, sSlot); + SetHenchmanDbJson(oPC, "henchman", jHenchman, sSlot); + if(sName == "") ai_SendMessages(sHenchmanName + " has been saved to the party.", AI_COLOR_GREEN, oPC); + else ai_SendMessages(sHenchmanName + " has replaced a copy of themselves in the party.", AI_COLOR_GREEN, oPC); + break; + } + nIndex++; + } +if(nIndex == nMaxHenchman) ai_SendMessages("This party is full!", AI_COLOR_RED, oPC); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +void SaveWholeParty(object oPC, int nToken, string sParty) +{ + int nIndex = AI_MAX_HENCHMAN; + object oHenchman; + while(nIndex > 0) + { + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + if(oHenchman != OBJECT_INVALID) + { + SetHenchmanDbString(oPC, "image", IntToString(nIndex), sParty); + SaveYourHenchman(oPC, nToken, sParty); + } + nIndex--; + } + ai_SendMessages("All of your henchman have been saved to Party " + sParty + ".", AI_COLOR_YELLOW, oPC); + SetHenchmanDbString(oPC, "henchname", "0", sParty); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +void SavedPartyJoin(object oPC, int nToken, string sParty) +{ + int bFound, nIndex, nDBHenchman = 0; + json jHenchman; + object oHenchman, oLoadedHenchman; + string sDBHenchman = IntToString(nDBHenchman); + string sName = GetHenchmanDbString(oPC, "henchname", sParty + sDBHenchman); + while(sName != "") + { + bFound = FALSE; + nIndex = 1; + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(oHenchman != OBJECT_INVALID) + { + if(sName == GetName(oPC) || GetName(oHenchman) == sName) + { + bFound = TRUE; + break; + } + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + if(!bFound) + { + ai_SendMessages(sName + " has joined your party.", AI_COLOR_GREEN, oPC); + jHenchman = GetHenchmanDbJson(oPC, "henchman", sParty + sDBHenchman); + oLoadedHenchman = JsonToObject(jHenchman, GetLocation(oPC), OBJECT_INVALID, TRUE); + AddHenchman(oPC, oLoadedHenchman); + } + else ai_SendMessages(sName + " is already in your party!", AI_COLOR_RED, oPC); + sDBHenchman = IntToString(++nDBHenchman); + sName = GetHenchmanDbString(oPC, "henchname", sParty + sDBHenchman); + } + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +void SavedCharacterJoin(object oPC, int nToken, string sParty) +{ + int nIndex, bFound; + object oHenchman, oLoadedHenchman; + string sHenchman = GetHenchmanDbString(oPC, "henchname", sParty); + string sName = GetHenchmanDbString(oPC, "henchname", sParty + sHenchman); + nIndex = 1; + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); + while(oHenchman != OBJECT_INVALID) + { + if(sName == GetName(oPC) || GetName(oHenchman) == sName) + { + bFound = TRUE; + break; + } + oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, ++nIndex); + } + if(!bFound) + { + ai_SendMessages(sName + " has joined your party!", AI_COLOR_GREEN, oPC); + oLoadedHenchman = GetHenchmanDbObject(oPC, GetLocation(oPC), sParty + sHenchman); + AddHenchman(oPC, oLoadedHenchman); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); + } + else ai_SendMessages(sName + " is already in your party!", AI_COLOR_RED, oPC); +} +void SavedPartyCleared(object oPC, int nToken, string sParty) +{ + int nIndex, nMaxHenchman = AI_MAX_HENCHMAN + 1; + object oHenchman, oLoadedHenchman; + string sIndex = IntToString(nIndex); + string sName = GetHenchmanDbString(oPC, "henchname", sParty + sIndex); + while(nIndex < nMaxHenchman) + { + if(sName != "") + { + RemoveHenchmanDb(oPC, sParty + sIndex); + ai_SendMessages(sName + " has been cleared from the saved party " + sParty + ".", AI_COLOR_YELLOW, oPC); + } + sIndex = IntToString(++nIndex); + sName = GetHenchmanDbString(oPC, "henchname", sParty + sIndex); + } + SetHenchmanDbString(oPC, "henchname", "", sParty); + NuiDestroy(oPC, nToken); + ExecuteScript("pi_henchmen", oPC); +} +json CreateOptionsAlignment(object oHenchman, int nAlignType) +{ + json jAlignNameList = JsonArray(); + if(nAlignType == 0) + { + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Lawful")); + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Neutral")); + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Chaotic")); + } + else + { + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Good")); + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Neutral")); + jAlignNameList = JsonArrayInsert(jAlignNameList, JsonString("Evil")); + } + return jAlignNameList; +} +json CreateOptionsClasses(object oHenchman) +{ + int nIndex = 1, nClass; + string sClassName; + json jClassNameList = JsonArray(); + while(nIndex < 5) + { + nClass = GetClassByPosition(nIndex, oHenchman); + if(nClass == CLASS_TYPE_INVALID) sClassName = "Empty"; + else + { + sClassName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); + sClassName += " " + IntToString(GetLevelByClass(nClass, oHenchman)); + } + jClassNameList = JsonArrayInsert(jClassNameList, JsonString(sClassName)); + nIndex++; + } + return jClassNameList; +} +json jArrayInsertClasses() +{ + int nIndex, nClass, nMaxClass = Get2DARowCount("classes"); + string sClassName; + json jClassNameCombo = JsonArray(); + while(nIndex < nMaxClass) + { + if(Get2DAString("classes", "PlayerClass", nIndex) == "1") + { + sClassName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nIndex))); + jClassNameCombo = JsonArrayInsert(jClassNameCombo, NuiComboEntry(sClassName, nClass)); + nClass++; + } + nIndex++; + } + return jClassNameCombo; +} +int GetSelectionByClass2DA(int nClass) +{ + int nIndex, nSelection, nMaxClass = Get2DARowCount("classes"); + while(nIndex < nMaxClass) + { + if(Get2DAString("classes", "PlayerClass", nIndex) == "1") + { + if(nClass == nIndex) return nSelection; + nSelection++; + } + nIndex++; + } + return -1; +} +int GetClassBySelection2DA(int nSelection) +{ + int nIndex, nClass, nMaxClass = Get2DARowCount("classes"); + while(nClass < nMaxClass) + { + if(Get2DAString("classes", "PlayerClass", nClass) == "1") + { + if(nSelection == nIndex) return nClass; + nIndex++; + } + nClass++; + } + return -1; +} +json ArrayInsertPackages(string sClass) +{ + int nIndex, nPackage, nMaxPackage = Get2DARowCount("packages"); + string sPackageName; + json jPackageNameCombo = JsonArray(); + while(nIndex < nMaxPackage) + { + if(Get2DAString("packages", "ClassID", nIndex) == sClass) + { + sPackageName = Get2DAString("packages", "Label", nIndex); + //GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nIndex))); + if(sPackageName != "Bad Strref" && sPackageName != "") + { + jPackageNameCombo = JsonArrayInsert(jPackageNameCombo, NuiComboEntry(sPackageName, nPackage)); + nPackage++; + } + } + nIndex++; + } + return jPackageNameCombo; +} +int GetSelectionByPackage2DA(string sClass, int nPackage) +{ + int nIndex, nSelection, nMaxPackage = Get2DARowCount("packages"); + string sPackageName; + while(nIndex < nMaxPackage) + { + if(Get2DAString("packages", "ClassID", nIndex) == sClass) + { + sPackageName = GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nIndex))); + if(sPackageName != "Bad Strref" && sPackageName != "") + { + if(nPackage == nIndex) return nSelection; + nSelection++; + } + } + nIndex++; + } + return -1; +} +int GetPackageBySelection2DA(string sClass, int nSelection) +{ + int nIndex, nPackage, nMaxPackage = Get2DARowCount("packages"); + while(nPackage < nMaxPackage) + { + if(Get2DAString("packages", "ClassID", nPackage) == sClass) + { + if(nSelection == nIndex) return nPackage; + nIndex++; + } + nPackage++; + } + return -1; +} +json ArrayInsertSoundSets(object oHenchman) +{ + int nIndex, nSoundSet, nSoundSetType, nMaxSets = Get2DARowCount("soundset"); + string sGender = IntToString(GetGender(oHenchman)); + string sSoundSetName, sResRef; + json jSoundSetNameCombo = JsonArray(); + while(nIndex < nMaxSets) + { + if(Get2DAString("soundset", "GENDER", nIndex) == sGender) + { + nSoundSetType = StringToInt(Get2DAString("soundset", "TYPE", nIndex)); + if(nSoundSetType < 5) + { + sSoundSetName = GetStringByStrRef(StringToInt(Get2DAString("soundset", "STRREF", nIndex))); + sResRef = GetStringLowerCase(Get2DAString("soundset", "RESREF", nIndex)); + if(GetStringLeft(sResRef, 4) == "vs_f") sSoundSetName += " (Full)"; + else if(GetStringLeft(sResRef, 4) == "vs_n") sSoundSetName += " (Part)"; + jSoundSetNameCombo = JsonArrayInsert(jSoundSetNameCombo, NuiComboEntry(sSoundSetName, nSoundSet)); + nSoundSet++; + } + } + nIndex++; + } + return jSoundSetNameCombo; +} +int GetSelectionBySoundSet2DA(object oHenchman, int nSoundSet) +{ + int nIndex, nSelection, nSoundSetType, nMaxSoundSet = Get2DARowCount("soundset"); + string sGender = IntToString(GetGender(oHenchman)); + while(nIndex < nMaxSoundSet) + { + if(Get2DAString("soundset", "GENDER", nIndex) == sGender) + { + nSoundSetType = StringToInt(Get2DAString("soundset", "TYPE", nIndex)); + if(nSoundSetType < 5) + { + if(nSoundSet == nIndex) return nSelection; + nSelection++; + } + } + nIndex++; + } + return -1; +} +int GetSoundSetBySelection2DA(object oHenchman, int nSelection) +{ + int nIndex, nSoundSet, nSoundSetType, nMaxSoundSet = Get2DARowCount("soundset"); + string sGender = IntToString(GetGender(oHenchman)); + while(nSoundSet < nMaxSoundSet) + { + if(Get2DAString("soundset", "GENDER", nSoundSet) == sGender) + { + nSoundSetType = StringToInt(Get2DAString("soundset", "TYPE", nSoundSet)); + if(nSoundSetType < 5) + { + if(nSelection == nIndex) return nSoundSet; + nIndex++; + } + } + nSoundSet++; + } + return -1; +} +void SetHenchmanScripts(object oHenchman) +{ + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_ch_ac1"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_ch_ac2"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_ch_ac3"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_ch_ac4"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_ch_ac5"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_ch_ac6"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_DEATH, "nw_ch_ac7"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_ch_ac8"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, "nw_ch_ac9"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_ch_aca"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_ch_acb"); + SetEventScript(oHenchman, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_ch_ace"); +} +object ai_AddHenchman(object oPC, json jHenchman, location lLocation, int nFamiliar, int nCompanion) +{ + jHenchman = GffReplaceResRef(jHenchman, "ScriptSpawn", ""); + object oHenchman = JsonToObject(jHenchman, lLocation, OBJECT_INVALID, TRUE); + AddHenchman(oPC, oHenchman); + DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); + string sAssociateType = ai_GetAssociateType(oPC, oHenchman); + NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI)); + if(nFamiliar) SummonFamiliar(oHenchman); + if(nCompanion) SummonAnimalCompanion(oHenchman); + return oHenchman; +} +json CreateLevelStatList(json jHenchman, object oHenchman, object oPC, int nLevels = 0) +{ + int nClass = GetClassByPosition(1, oHenchman); + int nHitDie = StringToInt(Get2DAString("classes", "HitDie", nClass)); + SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); + json jSkill = JsonObject(); + jSkill = GffAddByte(jSkill, "Rank", 0); + jSkill = JsonObjectSet(jSkill, "__struct_id", JsonInt(0)); + json jSkillArray = JsonArray(); + int nNumOfSkills; + for(nNumOfSkills = Get2DARowCount("skills"); nNumOfSkills > 0; nNumOfSkills--) + { + jSkillArray = JsonArrayInsert(jSkillArray, jSkill); + } + json jLevel = JsonObject(); + jLevel = GffAddByte(jLevel, "EpicLevel", 0); + jLevel = GffAddList(jLevel, "FeatList", JsonArray()); + jLevel = GffAddByte(jLevel, "LvlStatClass", nClass); + jLevel = GffAddByte(jLevel, "LvlStatHitDie", nHitDie); + jLevel = GffAddList(jLevel, "SkillList", jSkillArray); + jLevel = GffAddWord(jLevel, "SkillPoints", 0); + jLevel = JsonObjectSet(jLevel, "__struct_id", JsonInt(0)); + json jLevelArray = JsonArray(); + if(nLevels == 0) nLevels = GetLevelByPosition(1, oHenchman); + for(nLevels; nLevels > 0; nLevels--) + { + jLevelArray = JsonArrayInsert(jLevelArray, jLevel); + } + WriteTimestampedLogEntry("pinc_henchmen, 813, Adding LvlStatList to " + GetName(oHenchman)); + return GffAddList(jHenchman, "LvlStatList", jLevelArray); +} +int CanSelectFeat(json jCreature, object oCreature, int nFeat, int nPosition = 1) +{ + // Check if all classes can use. + int n2DAStat = StringToInt(Get2DAString("feat", "ALLCLASSESCANUSE", nFeat)); + if(n2DAStat == 0) + { + int bPass, nClassFeat, nRow, nClass = GetClassByPosition(nPosition, oCreature); + string sClsFeat2DAName = Get2DAString("classes", "FeatsTable", nClass); + int nMaxRow = Get2DARowCount(sClsFeat2DAName); + while(nRow < nMaxRow) + { + nClassFeat = StringToInt(Get2DAString(sClsFeat2DAName, "FeatIndex", nRow)); + if(nClassFeat == nFeat) + { + bPass = TRUE; + break; + } + nRow++; + } + if(!bPass) return FALSE; + } + n2DAStat = StringToInt(Get2DAString("feat", "MINATTACKBONUS", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "BaseAttackBonus")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINSTR", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Str")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINDEX", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Dex")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINCON", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Con")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MININT", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Int")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINWIS", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Wis")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINCHA", nFeat)); + if(JsonGetInt(GffGetByte(jCreature, "Cha")) < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "MINSPELLLVL", nFeat)); + int nSpellLevel = 0, nClass = GetClassByPosition(nPosition, oCreature); + string s2DAName = Get2DAString("classes", "SpellGainTable", nClass); + int nLevel = GetLevelByPosition(nPosition, oCreature); + if(s2DAName != "") + { + nSpellLevel = StringToInt(Get2DAString(s2DAName, "NumSpellLevels", nLevel - 1)) - 1; + } + if(nSpellLevel < n2DAStat) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "PREREQFEAT1", nFeat)); + if(n2DAStat > 0) + { + // ************************************** Add code to search jCreature's feats! + if(!GetHasFeat(n2DAStat, oCreature)) return FALSE; + n2DAStat = StringToInt(Get2DAString("feat", "PREREQFEAT2", nFeat)); + if(!GetHasFeat(n2DAStat, oCreature)) return FALSE; + } + int nIndex; + while(nIndex < 5) + { + n2DAStat = StringToInt(Get2DAString("feat", "OrReqFeat" + IntToString(nIndex), nFeat)); + if(nIndex == 0 && n2DAStat == 0) break; + if(GetHasFeat(n2DAStat, oCreature)) break; + nIndex++; + if(nIndex == 5) return FALSE; + } + string s2DAStat = Get2DAString("feat", "REQSKILL", nFeat); + if(s2DAStat != "") + { + n2DAStat = StringToInt(s2DAStat); + int bCanUse; + if(Get2DAString("skills", "AllClassesCanUse", n2DAStat) == "1") bCanUse = TRUE; + else + { + string sClsSkill2DA = Get2DAString("classes", "SkillsTable", nClass); + int bPass, nClassSkill, nRow, nMaxRow = Get2DARowCount(sClsSkill2DA); + while(nRow < nMaxRow) + { + nClassSkill = StringToInt(Get2DAString(sClsSkill2DA, "SkillIndex", nRow)); + if(nClassSkill == n2DAStat) + { + bCanUse = TRUE; + break; + } + nRow++; + } + } + if(bCanUse) + { + int nSkillReq = StringToInt(Get2DAString("feat", "ReqSkillMinRanks", n2DAStat)); + // ************************** Add code to check jCreatures skills. + if(GetSkillRank(n2DAStat, oCreature, TRUE) < nSkillReq) return FALSE; + } + else return FALSE; + } + s2DAStat = Get2DAString("feat", "REQSKILL2", nFeat); + if(s2DAStat != "") + { + n2DAStat = StringToInt(s2DAStat); + int bCanUse; + if(Get2DAString("skills", "AllClassesCanUse", n2DAStat) == "1") bCanUse = TRUE; + else + { + string sClsSkill2DA = Get2DAString("classes", "SkillsTable", nClass); + int bPass, nClassSkill, nRow, nMaxRow = Get2DARowCount(sClsSkill2DA); + while(nRow < nMaxRow) + { + nClassSkill = StringToInt(Get2DAString(sClsSkill2DA, "SkillIndex", nRow)); + if(nClassSkill == n2DAStat) + { + bCanUse = TRUE; + break; + } + nRow++; + } + } + if(bCanUse) + { + int nSkillReq = StringToInt(Get2DAString("feat", "ReqSkillMinRanks2", n2DAStat)); + if(GetSkillRank(n2DAStat, oCreature, TRUE) < nSkillReq) return FALSE; + } + else return FALSE; + } + n2DAStat = StringToInt(Get2DAString("feat", "MinLevel", nFeat)); + if(n2DAStat > 0) + { + int bPass, nClassPosition, nPositionClass, nPositionLevel; + int nClassRequired = StringToInt(Get2DAString("feat", "MinLevelClass", nFeat)); + while(nClassPosition < AI_MAX_CLASSES_PER_CHARACTER) + { + // ***************************** Rework to check jCreature class list instead. + nPositionClass = GetClassByPosition(nClassPosition, oCreature); + if(nPositionClass == nClassRequired) + { + nPositionLevel = GetLevelByPosition(nClassPosition, oCreature); + if(nPositionLevel < n2DAStat) return FALSE; + else bPass = TRUE; + } + nClassPosition++; + } + if(!bPass) return FALSE; + } + n2DAStat = StringToInt(Get2DAString("feat", "MinFortSave", nFeat)); + if(JsonGetInt(GffGetChar(jCreature, "FortSaveThrow")) < n2DAStat) return FALSE; + s2DAStat = Get2DAString("feat", "PreReqEpic", nFeat); + if(s2DAStat == "1") return FALSE; + return TRUE; +} +json ResetFeats(json jHenchman, object oHenchman) +{ + int nLevel = 0; + // We remake the Feat list if the character doesn't have a level list! + json jFeatList = JsonArray(); + json jFeat; + int nRace = GetRacialType(oHenchman); + string sRace2DAName = Get2DAString("racialtypes", "FeatsTable", nRace); + // Give racial feats. + int nRaceRow, nRaceFeat; + int nRaceMaxRow = Get2DARowCount(sRace2DAName); + while(nRaceRow < nRaceMaxRow) + { + nRaceFeat = StringToInt(Get2DAString(sRace2DAName, "FeatIndex", nRaceRow)); + jFeat = JsonObject(); + jFeat = GffAddWord(jFeat, "Feat", nRaceFeat); + jFeat = JsonObjectSet(jFeat, "__struct_id", JsonInt(1)); + jFeatList = JsonArrayInsert(jFeatList, jFeat); + WriteTimestampedLogEntry("pinc_henchmen, 973, Adding racial feat: " + + Get2DAString("feat", "LABEL", nRaceFeat)); + nRaceRow++; + } + // Give class feats. + int nClass = GetClassByPosition(1, oHenchman); + string sGranted, sList; + string sClsFeat2DAName = Get2DAString("classes", "FeatsTable", nClass); + int nClassRow, nClassFeat, nClassMaxRow = Get2DARowCount(sClsFeat2DAName); + while(nClassRow < nClassMaxRow) + { + sGranted = Get2DAString(sClsFeat2DAName, "GrantedOnLevel", nClassRow); + if(sGranted == "1") + { + sList = Get2DAString(sClsFeat2DAName, "List", nClassRow); + if(sList == "3") + { + nClassFeat = StringToInt(Get2DAString(sClsFeat2DAName, "FeatIndex", nClassRow)); + jFeat = JsonObject(); + jFeat = GffAddWord(jFeat, "Feat", nClassFeat); + jFeat = JsonObjectSet(jFeat, "__struct_id", JsonInt(1)); + jFeatList = JsonArrayInsert(jFeatList, jFeat); + WriteTimestampedLogEntry("pinc_henchmen, 995, Adding class feat: " + + Get2DAString("feat", "LABEL", nClassFeat)); + } + } + nClassRow++; + } + // Give any bonus feats from package. + int nPackageFeat, nPackageRow; + string sBonusFeat2DAName = Get2DAString("classes", "BonusFeatsTable", nClass); + int nNumOfFeats = StringToInt(Get2DAString(sBonusFeat2DAName, "Bonus", nLevel)); + string sPackage2DAName = Get2DAString("packages", "FeatPref2DA", nClass); + int nPackageMaxRow = Get2DARowCount(sPackage2DAName); + // Give bonus feats based on the package. + nPackageRow = 0; + if(nNumOfFeats > 0) + { + while(nPackageRow < nPackageMaxRow) + { + nPackageFeat = StringToInt(Get2DAString(sPackage2DAName, "FeatIndex", nPackageRow)); + nClassRow = 0; + while(nClassRow < nClassMaxRow) + { + nClassFeat = StringToInt(Get2DAString(sClsFeat2DAName, "FeatIndex", nClassRow)); + if(nClassFeat == nPackageFeat) + { + sList = Get2DAString(sClsFeat2DAName, "List", nClassRow); + if((sList == "1" || sList == "2") && CanSelectFeat(jHenchman, oHenchman, nClassFeat)) + { + jFeat = JsonObject(); + jFeat = GffAddWord(jFeat, "Feat", nClassFeat); + jFeat = JsonObjectSet(jFeat, "__struct_id", JsonInt(1)); + jFeatList = JsonArrayInsert(jFeatList, jFeat); + WriteTimestampedLogEntry("pinc_henchmen, 1028, Adding class bonus feat: " + + Get2DAString("feat", "LABEL", nPackageFeat)); + nNumOfFeats--; + } + } + nClassRow++; + } + if(nNumOfFeats < 1) break; + nPackageRow++; + } + } + // Give picked feats from package. + nNumOfFeats = 1; + if(GetHasFeat(FEAT_QUICK_TO_MASTER, oHenchman)) nNumOfFeats++; + nPackageRow = 0; + while(nPackageRow < nPackageMaxRow) + { + nClassRow = 0; + nPackageFeat = StringToInt(Get2DAString(sPackage2DAName, "FeatIndex", nPackageRow)); + if(CanSelectFeat(jHenchman, oHenchman, nPackageFeat)) + { + jFeat = JsonObject(); + jFeat = GffAddWord(jFeat, "Feat", nPackageFeat); + jFeat = JsonObjectSet(jFeat, "__struct_id", JsonInt(1)); + jFeatList = JsonArrayInsert(jFeatList, jFeat); + WriteTimestampedLogEntry("pinc_henchmen, 1053, Adding character bonus feat: " + + Get2DAString("feat", "LABEL", nPackageFeat)); + nNumOfFeats--; + } + if(nNumOfFeats < 1) break; + nPackageRow++; + } + jHenchman = GffReplaceList(jHenchman, "FeatList", jFeatList); + return jHenchman; +} +json ResetSkills(json jHenchman, object oHenchman) +{ + // We remake the Skill List if the character doesn't have a level list! + int nClass = GetClassByPosition(1, oHenchman); + int nSkillPoints, nIntMod = GetAbilityModifier(ABILITY_INTELLIGENCE, oHenchman); + if(nIntMod > 0) nSkillPoints = nIntMod * 4; + if(GetRacialType(oHenchman) == RACIAL_TYPE_HUMAN) nSkillPoints += 4; + nSkillPoints += StringToInt(Get2DAString("classes", "SkillPointBase", nClass)) * 4; + int nMaxRanks = 5; + json jSkillList = JsonArray(); + json jSkill; + // Setup the Skill List. + int nIndex, nSkillMaxRow = Get2DARowCount("skills"); + for(nIndex = 0; nIndex < nSkillMaxRow; nIndex++) + { + jSkill = JsonObject(); + jSkill = GffAddByte(jSkill, "Rank", 0); + jSkill = JsonObjectSet(jSkill, "__struct_id", JsonInt(0)); + jSkillList = JsonArrayInsert(jSkillList, jSkill); + } + // Give skill points based on the package. + int nPackageSkill, nPackageRow, nCurrentRanks, bCrossClass, nClassRow, nNewRanks; + string sPackage2DAName = Get2DAString("packages", "SkillPref2DA", nClass); + int nPackageMaxRow = Get2DARowCount(sPackage2DAName); + string sClass2DAName = Get2DAString("classes", "SkillsTable", nClass); + int nClassMaxRow = Get2DARowCount(sClass2DAName); + nPackageRow = 0; + while(nPackageRow < nPackageMaxRow && nSkillPoints > 0) + { + nPackageSkill = StringToInt(Get2DAString(sPackage2DAName, "SkillIndex", nPackageRow)); + jSkill = JsonArrayGet(jSkillList, nPackageSkill); + nCurrentRanks = JsonGetInt(GffGetByte(jSkill, "Rank")); + nClassRow = 0; + while(nClassRow < nClassMaxRow) + { + if(nPackageSkill == StringToInt(Get2DAString(sClass2DAName, "SkillIndex", nClassRow))) + { + bCrossClass = Get2DAString(sClass2DAName, "ClassSkill", nClassRow) == "0"; + break; + } + nClassRow++; + } + if(bCrossClass) nNewRanks = (nMaxRanks / 2) - nCurrentRanks; + else nNewRanks = nMaxRanks - nCurrentRanks; + if(nNewRanks > nSkillPoints) nNewRanks = nSkillPoints; + if(nNewRanks > 0) + { + jSkill = GffReplaceByte(jSkill, "Rank", nCurrentRanks + nNewRanks); + jSkillList = JsonArraySet(jSkillList, nPackageSkill, jSkill); + WriteTimestampedLogEntry("pinc_henchmen, 1110, Adding " + IntToString(nNewRanks) + + " ranks to " + Get2DAString("skills", "Label", nPackageSkill)); + nSkillPoints -= nNewRanks; + } + nPackageRow++; + } + jHenchman = GffReplaceList(jHenchman, "SkillList", jSkillList); + return jHenchman; +} +json ResetSpellsKnown(json jClass, object oHenchman) +{ + int nClass = GetClassByPosition(1, oHenchman); + if(Get2DAString("classes", "SpellCaster", nClass) == "0") return jClass; + int nLevel = 0; + // We remake the Known spell list if the character doesn't have a level list! + json jKnownList, jMemorizedList; + json jSpell, jSpellsPerDayList; + int bMemorizesSpells = StringToInt(Get2DAString("classes", "MemorizesSpells", nClass)); + int bSpellBookRestricted = StringToInt(Get2DAString("classes", "SpellBookRestricted", nClass)); + string sSpellKnown2DAName = Get2DAString("classes", "SpellKnownTable", nClass); + string sSpellGained2DAName = Get2DAString("classes", "SpellGainTable", nClass); + string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); + string sSpellPackage2DAName = Get2DAString("packages", "SpellPref2DA", nClass); + int nPackageSpell, nPackageRow; + int nPackageMaxRow = Get2DARowCount(sSpellPackage2DAName); + int nKnownSpellIndex, nSpellsKnown, nAbility, nSpellLevel = 0; + string sKnownListName, sSpellLevel, sPackageSpellLevel, sAbility; + // Cycle through all spell levels and reset. + while(nSpellLevel < 10) + { + sSpellLevel = IntToString(nSpellLevel); + WriteTimestampedLogEntry("pinc_henchmen, 1143, Checking Spell Level: " + sSpellLevel); + // Recreate the 0th and 1st level based on the package. + if(nSpellLevel < 2 && bSpellBookRestricted) + { + // Spellbook restricted that don't have a SpellsKnown2DAName + // get to keep all 0th level spells so we skip them. Example:Wizard + if(nSpellLevel != 0 || sSpellKnown2DAName != "") + { + // Classes that are spell book restricted but don't have a SpellKnownTable + // get 3 spells + Ability Modifier worth of spells like a wizard. + if(sSpellKnown2DAName == "") + { + sAbility = Get2DAString("classes", "SpellCastingAbil", nClass); + if(sAbility == "INT") nAbility = ABILITY_INTELLIGENCE; + else if(sAbility == "WIS") nAbility = ABILITY_WISDOM; + else if(sAbility == "CHA") nAbility = ABILITY_CHARISMA; + nSpellsKnown = 3 + GetAbilityModifier(nAbility, oHenchman); + } + else + { + nSpellsKnown = StringToInt(Get2DAString(sSpellKnown2DAName, "SpellLevel" + sSpellLevel, nLevel)); + } + WriteTimestampedLogEntry("pinc_henchmen, 1165, nSpellsKnown: " + IntToString(nSpellsKnown)); + jKnownList = JsonArray(); + nPackageRow = 0; + while(nPackageRow < nPackageMaxRow && nSpellsKnown > 0) + { + nPackageSpell = StringToInt(Get2DAString(sSpellPackage2DAName, "SpellIndex", nPackageRow)); + sPackageSpellLevel = Get2DAString("spells", sSpellTableColumn, nPackageSpell); + if(sPackageSpellLevel == sSpellLevel) + { + jSpell = JsonObject(); + jSpell = GffAddWord(jSpell, "Spell", nPackageSpell); + jSpell = JsonObjectSet(jSpell, "__struct_id", JsonInt(3)); + jKnownList = JsonArrayInsert(jKnownList, jSpell); + WriteTimestampedLogEntry("pinc_henchmen, 1178, Adding known spell: " + + Get2DAString("spells", "LABEL", nPackageSpell)); + nSpellsKnown--; + } + nPackageRow++; + } + if(JsonGetLength(jKnownList) == 0) + { + jClass = GffRemoveList(jClass, "KnownList" + sSpellLevel); + WriteTimestampedLogEntry("pinc_henchmen, 1187, Removing KnownList" + sSpellLevel); + } + else if(JsonGetType(GffGetList(jClass, "KnownList" + sSpellLevel)) != JSON_TYPE_NULL) + { + jClass = GffReplaceList(jClass, "KnownList" + sSpellLevel, jKnownList); + } + else jClass = GffAddList(jClass, "KnownList" + sSpellLevel, jKnownList); + } + } + // Remove all other known spell levels and memorized levels. + else + { + jKnownList = GffGetList(jClass, "KnownList" + sSpellLevel); + if(JsonGetType(jKnownList) != JSON_TYPE_NULL) + { + jClass = GffRemoveList(jClass, "KnownList" + sSpellLevel); + WriteTimestampedLogEntry("pinc_henchmen, 1203, Removing KnownList" + sSpellLevel); + } + } + if(bMemorizesSpells) + { + jMemorizedList = GffGetList(jClass, "MemorizedList" + sSpellLevel); + if(JsonGetType(jMemorizedList) != JSON_TYPE_NULL) + { + jClass = GffRemoveList(jClass, "MemorizedList" + sSpellLevel); + WriteTimestampedLogEntry("pinc_henchmen, 1210, Removing MemorizedList" + sSpellLevel); + } + } + else + { + jSpellsPerDayList = GffGetList(jClass, "SpellsPerDayList"); + nSpellsKnown = StringToInt(Get2DAString(sSpellGained2DAName, "SpellLevel"+ sSpellLevel, nLevel)); + jSpell = JsonArrayGet(jSpellsPerDayList, nSpellLevel); + jSpell = GffReplaceByte(jSpell, "NumSpellsLeft", nSpellsKnown); + jSpellsPerDayList = JsonArraySet(jSpellsPerDayList, nSpellLevel, jSpell); + jClass = GffReplaceList(jClass, "SpellsPerDayList", jSpellsPerDayList); + WriteTimestampedLogEntry("pinc_henchmen, 1223, Setting SpellsPerDay to " + + IntToString(nSpellsKnown)); + } + nSpellLevel++; + } + return jClass; +} +object ResetCharacter(object oPC, object oHenchman) +{ + SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); + RemoveHenchman(oPC, oHenchman); + json jHenchman = ObjectToJson(oHenchman, TRUE); + json jClassList = GffGetList(jHenchman, "ClassList"); + json jClass = JsonArrayGet(jClassList, 0); + // Set the Class list to the first class only and put at level 1. + int nClass = JsonGetInt(JsonObjectGet(jClass, "Class")); + jClass = GffReplaceShort(jClass, "ClassLevel", 1); + // Delete extra classes. + int nClassIndex = JsonGetLength(jClassList) - 1; + while(nClassIndex > 0) + { + jClassList = JsonArrayDel(jClassList, nClassIndex--); + } + int nHitPoints = StringToInt(Get2DAString("classes", "HitDie", nClass)); + int nMod = JsonGetInt(GffGetByte(jHenchman, "Con")); + if(nMod > 9) nHitPoints += (nMod - 10) / 2; + else nHitPoints += (nMod - 11) / 2; + jHenchman = GffReplaceShort(jHenchman, "CurrentHitPoints", nHitPoints); + jHenchman = GffReplaceShort(jHenchman, "HitPoints", nHitPoints); + jHenchman = GffReplaceShort(jHenchman, "MaxHitPoints", nHitPoints); + jHenchman = GffReplaceDword(jHenchman, "Experience", 0); + jHenchman = GffReplaceFloat(jHenchman, "ChallengeRating", 1.0); + string s2DA = Get2DAString("classes", "AttackBonusTable", nClass); + int nAtk = StringToInt(Get2DAString(s2DA, "BAB", 0)); + jHenchman = GffReplaceByte(jHenchman, "BaseAttackBonus", nAtk); + s2DA = Get2DAString("classes", "SavingThrowTable", nClass); + int nSave = StringToInt(Get2DAString(s2DA, "FortSave", 0)); + jHenchman = GffReplaceChar(jHenchman, "FortSaveThrow", nSave); + nSave = StringToInt(Get2DAString(s2DA, "RefSave", 0)); + jHenchman = GffReplaceChar(jHenchman, "RefSaveThrow", nSave); + nSave = StringToInt(Get2DAString(s2DA, "WillSave", 0)); + jHenchman = GffReplaceChar(jHenchman, "WillSaveThrow", nSave); + json jLvlStatList = GffGetList(jHenchman, "LvlStatList"); + if(JsonGetType(jLvlStatList) != JSON_TYPE_NULL) + { + WriteTimestampedLogEntry("pinc_henchmen 1275, jLvlStatList: " + JsonDump(jLvlStatList, 4)); + int nLevel = 1, nLevelTrack = 1; + int nAbilityStatIncrease, nAbility; + string sAbility; + json jAbility; + json jLevel = JsonArrayGet(jLvlStatList, nLevel); + while(JsonGetType(jLevel) != JSON_TYPE_NULL) + { + WriteTimestampedLogEntry("inc_henchmen, 1297, Checking level " + IntToString(nLevelTrack)); + // Remove all Ability score increases for each level from ability scores. + jAbility = GffGetByte(jLevel, "LvlStatAbility"); + if(JsonGetType(jAbility) != JSON_TYPE_NULL) + { + nAbilityStatIncrease = JsonGetInt(jAbility); + if(nAbilityStatIncrease == ABILITY_STRENGTH) sAbility = "Str"; + if(nAbilityStatIncrease == ABILITY_DEXTERITY) sAbility = "Dex"; + if(nAbilityStatIncrease == ABILITY_CONSTITUTION) sAbility = "Con"; + if(nAbilityStatIncrease == ABILITY_INTELLIGENCE) sAbility = "Int"; + if(nAbilityStatIncrease == ABILITY_WISDOM) sAbility = "Wis"; + if(nAbilityStatIncrease == ABILITY_CHARISMA) sAbility = "Cha"; + nAbility = JsonGetInt(GffGetByte(jHenchman, sAbility)) - 1; + jHenchman = GffReplaceByte(jHenchman, sAbility, nAbility); + WriteTimestampedLogEntry("pinc_henchmen, 1314, Removing " + sAbility + " level bonus ability score point."); + } + jLvlStatList = JsonArrayDel(jLvlStatList, nLevel); + // Note: nLevel is not incremented since we are removing the previous level. + // there for when we get the same level again its the next level! + jLevel = JsonArrayGet(jLvlStatList, nLevel); + //SendMessageToPC(oPC, "jLvlStatList: " + JsonDump(jLvlStatList, 4)); + nLevelTrack++; + } + jHenchman = GffRemoveList(jHenchman, "LvlStatList"); + } + jHenchman = CreateLevelStatList(jHenchman, oHenchman, oPC, 1); + jHenchman = ResetSkills(jHenchman, oHenchman); + jHenchman = ResetFeats(jHenchman, oHenchman); + jClass = ResetSpellsKnown(jClass, oHenchman); + jClassList = JsonArraySet(jClassList, 0, jClass); + jHenchman = GffReplaceList(jHenchman, "ClassList", jClassList); + //WriteTimestampedLogEntry("pinc_henchmen 1397, jHenchman: " + JsonDump(jHenchman, 4)); + location lLocation = GetLocation(oHenchman); + int nFamiliar, nCompanion; + object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oHenchman); + if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; + oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oHenchman); + if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; + AssignCommand(oHenchman, SetIsDestroyable(TRUE, FALSE, FALSE)); + DestroyObject(oHenchman); + oHenchman = ai_AddHenchman(oPC, jHenchman, lLocation, nFamiliar, nCompanion); + return oHenchman; +} +// ********* New Henchman windows ********** +void CreateCharacterEditGUIPanel(object oPC, object oHenchman) +{ + // Set window to not save until it has been created. + SetLocalInt(oPC, "0_No_Win_Save", TRUE); + DelayCommand(0.5f, DeleteLocalInt (oPC, "0_No_Win_Save")); + // Group 1 (Portrait)******************************************************* 151 / 73 + // Group 1 Row 1 *********************************************************** 350 / 91 + json jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateTextEditBox (jGroupRow, "name_placeholder", "char_name", 15, FALSE, 140.0, 20.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add the group row to the group column. + json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + // Group 1 Row 1 *********************************************************** 350 / 91 + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateTextEditBox (jGroupRow, "port_placeholder", "port_name", 15, FALSE, 140.0, 20.0, "port_tooltip"); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add the group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 1 Row 2 *********************************************************** 350 / 259 + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateImage(jGroupRow, "", "port_resref", NUI_ASPECT_EXACTSCALED, NUI_HALIGN_CENTER, NUI_VALIGN_TOP, 140.0f, 160.0f); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add the group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 1 Row 3 *********************************************************** 350 / 292 + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateButton (jGroupRow, "<", "btn_portrait_prev", 42.0f, 25.0f); + jGroupRow = CreateButton (jGroupRow, "Set", "btn_portrait_ok", 44.0f, 25.0f); + jGroupRow = CreateButton (jGroupRow, ">", "btn_portrait_next", 42.0f, 25.0f); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 1 Row 4 *********************************************************** 350 / 91 + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateLabel(jGroupRow, "Sound Set", "lbl_sound_set", 140.0, 10.0f, NUI_HALIGN_CENTER, NUI_VALIGN_BOTTOM); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add the group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 1 Row 5 *********************************************************** 350 / 325 + jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jGroupRow = CreateCombo(jGroupRow, ArrayInsertSoundSets(oHenchman), "cmb_soundset", 140.0, 25.0); + jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + json jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); + // Group 2 (Stats)********************************************************** 151 / 73 + // Group 2 Row 1 *********************************************************** 350 / 91 + jGroupRow = CreateLabel(JsonArray(), "", "lbl_stats", 150.0, 15.0, 0, NUI_VALIGN_BOTTOM, 0.0); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); + + // Group 2 Row 2 *********************************************************** 350 / 243 + //json jAlign = CreateOptionsAlignment(oHenchman, 0); + //jGroupRow = CreateOptions(JsonArray(), "opt_lawchaos", NUI_DIRECTION_HORIZONTAL, jAlign, 60.0, 35.0); + // Add group row to the group column. + //jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 3 *********************************************************** 350 / 243 + //jAlign = CreateOptionsAlignment(oHenchman, 1); + //jGroupRow = CreateOptions(JsonArray(), "opt_goodevil", NUI_DIRECTION_HORIZONTAL, jAlign, 60.0, 35.0); + //jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer()); + // Add group row to the group column. + //jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 2 *********************************************************** 350 / 243 + json jClasses = CreateOptionsClasses(oHenchman); + jGroupRow = CreateOptions(JsonArray(), "opt_classes", NUI_DIRECTION_VERTICAL, jClasses, 150.0, 144.0); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 3 *********************************************************** 350 / 276 + jGroupRow = CreateButton(JsonArray(), "Level Up", "btn_level_up", 150.0f, 25.0f, -1.0, "btn_level_up_tooltip"); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 4 *********************************************************** 350 / 309 + jGroupRow = CreateButton (JsonArray(), "Reset Character", "btn_reset", 150.0f, 25.0f, -1.0, "btn_reset_tooltip"); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 5 *********************************************************** 350 / 342 + jGroupRow = CreateCombo(JsonArray(), jArrayInsertClasses(), "cmb_class", 150.0, 25.0); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + // Group 2 Row 6 *********************************************************** 350 / 375 + int nClassOption = GetLocalInt(oHenchman, "CLASS_OPTION_POSITION"); + int nClass = GetClassByPosition(nClassOption + 1, oHenchman); + int bNoClass = FALSE; + if(nClass == CLASS_TYPE_INVALID) + { + nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nClassOption + 1)); + bNoClass = TRUE; + } + string sClass = IntToString(nClass); + jGroupRow = CreateCombo(JsonArray(), ArrayInsertPackages(sClass), "cmb_package", 150.0, 25.0); + // Add group row to the group column. + jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); + jRow = JsonArrayInsert(jRow, NuiGroup(NuiCol(jGroupCol))); + // Add the row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 5 (text edit box)**************************************************** 350 / 518 + jRow = CreateTextEditBox(JsonArray(), "desc_placeholder", "desc_value", 1000, TRUE, 350.0, 150.0, "desc_tooltip"); + // Add the row to the column. + jCol = JsonArrayInsert(jCol, NuiRow (jRow)); + // Row 6 (button)*********************************************************** 350/ 546 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton (jRow, "Save Description", "btn_desc_save", 150.0f, 20.0f); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow (jRow)); + // Set the Layout of the window. + json jLayout = NuiCol (jCol); + // Get the window location to restore it from the database. + CheckHenchmanDataAndInitialize(oPC, "0"); + json jData = GetHenchmanDbJson(oPC, "henchman", "0"); + json jGeometry = JsonObjectGet(jData, "henchman_edit_nui"); + float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); + float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); + if(fX == 0.0 && fY == 0.0) + { + fX = -1.0; + fY = -1.0; + } + string sName = GetName(oHenchman); + if(GetStringRight(sName, 1) == "s") sName = sName + "'"; + else sName = sName + "'s"; + int nToken = SetWindow (oPC, jLayout, "henchman_edit_nui", sName + " Character editor", + fX, fY, 380.0, 588.0, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_henchmen"); + // Set all binds, events, and watches. + int nID = GetPortraitId (oPC); + NuiSetUserData(oPC, nToken, JsonInt(nID)); + string sResRef = GetPortraitResRef(oHenchman); + NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); + NuiSetBind(oPC, nToken, "char_name", JsonString(GetName(oHenchman))); + NuiSetBindWatch(oPC, nToken, "char_name", TRUE); + NuiSetBind(oPC, nToken, "char_name_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "port_name", JsonString(sResRef)); + NuiSetBindWatch(oPC, nToken, "port_name", TRUE); + NuiSetBind(oPC, nToken, "port_name_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "port_resref_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "port_resref_image", JsonString(sResRef + "l")); + NuiSetBind(oPC, nToken, "port_tooltip", JsonString (" You may also type the portrait file name.")); + // Set buttons active. + NuiSetBind(oPC, nToken, "btn_portrait_prev_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_portrait_next_event", JsonBool(TRUE)); + int nSelection = GetSelectionBySoundSet2DA(oHenchman, GetSoundset(oHenchman)); + NuiSetBind(oPC, nToken, "cmb_soundset_selected", JsonInt(nSelection)); + NuiSetBindWatch(oPC, nToken, "cmb_soundset_selected", TRUE); + NuiSetBind(oPC, nToken, "cmb_soundset_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_desc_save_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_portrait_ok_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "desc_tooltip", JsonString(" You can use color codes!")); + string sDescription = GetDescription(oHenchman); + NuiSetBind(oPC, nToken, "desc_value_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "desc_value", JsonString (sDescription)); + // Setup the henchman window. + string sStats = GetAlignText(oHenchman) + " "; + if(GetGender(oHenchman) == GENDER_MALE) sStats += "Male "; + else sStats += "Female "; + sStats += GetStringByStrRef (StringToInt (Get2DAString ("racialtypes", "Name", GetRacialType (oHenchman)))); + NuiSetBind(oPC, nToken, "lbl_stats_label", JsonString(sStats)); + json jHenchman = ObjectToJson(oHenchman); + NuiSetBind(oPC, nToken, "opt_classes_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "opt_classes_value", JsonInt(nClassOption)); + NuiSetBind(oPC, nToken, "btn_level_up_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_level_up_tooltip", JsonString(" Levels the character up by one level in selected class.")); + if(ai_GetIsCharacter(oHenchman)) NuiSetBind(oPC, nToken, "btn_reset_event", JsonBool(FALSE)); + else NuiSetBind(oPC, nToken, "btn_reset_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "btn_reset_tooltip", JsonString(" Resets the character to level 1.")); + nSelection = GetSelectionByClass2DA(nClass); + NuiSetBind(oPC, nToken, "cmb_class_selected", JsonInt(nSelection)); + NuiSetBindWatch(oPC, nToken, "cmb_class_selected", bNoClass); + NuiSetBind(oPC, nToken, "cmb_class_event", JsonBool(bNoClass)); + int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nClassOption + 1)); + if(nPackage == 0) + { + nPackage = GetPackageBySelection2DA(sClass, 0); + SetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nClassOption + 1), nPackage); + } + NuiSetBind(oPC, nToken, "cmb_package_selected", JsonInt(GetSelectionByPackage2DA(sClass, nPackage))); + NuiSetBindWatch(oPC, nToken, "cmb_package_selected", bNoClass); + NuiSetBind(oPC, nToken, "cmb_package_event", JsonBool(bNoClass)); +} +void CreateCharacterDescriptionNUI(object oPC, string sName, string sIcon, string sDescription) +{ + // Row 1 ******************************************************************* 500 / 469 + json jRow = CreateImage(JsonArray(), "", "char_icon", NUI_ASPECT_FIT, NUI_HALIGN_CENTER, NUI_VALIGN_MIDDLE, 40.0, 40.0); + jRow = CreateTextBox(jRow, "char_text", 380.0, 400.0); + // Add row to the column. + json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); + // Row 2 ******************************************************************* 500 / 522 + jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); + jRow = CreateButton(jRow, "OK", "btn_ok", 150.0f, 45.0f); + // Add row to the column. + jCol = JsonArrayInsert(jCol, NuiRow(jRow)); + // Set the Layout of the window. + json jLayout = NuiCol(jCol); + int nToken = SetWindow(oPC, jLayout, "char_description_nui", sName, + -1.0, -1.0, 460.0f, 537.0 + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_henchmen"); + json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPC))); + NuiSetUserData(oPC, nToken, jData); + // Row 1 + NuiSetBind(oPC, nToken, "char_icon_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "char_icon_image", JsonString(sIcon)); + NuiSetBind(oPC, nToken, "char_text_event", JsonBool(TRUE)); + NuiSetBind(oPC, nToken, "char_text", JsonString(sDescription)); + // Row 2 + NuiSetBind(oPC, nToken, "btn_ok_event", JsonBool(TRUE)); +} + diff --git a/_module/nss/spawn_towners.nss b/_module/nss/spawn_towners.nss index 3e0fd9fb..da739356 100644 --- a/_module/nss/spawn_towners.nss +++ b/_module/nss/spawn_towners.nss @@ -28,33 +28,46 @@ const int EVENT_USER_DEFINED_POSTSPAWN = 1511; #include "x0_i0_anims" #include "x2_inc_switches" +#include "ms_name_inc" +#include "mmd_inc_random" + void main() { - // User defined OnSpawn event requested? - int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS"); + object oNPC = OBJECT_SELF; + + // User defined OnSpawn event requested? + int nSpecEvent = GetLocalInt(oNPC,"X2_USERDEFINED_ONSPAWN_EVENTS"); // Pre Spawn Event requested if (nSpecEvent == 1 || nSpecEvent == 3 ) { - SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN )); + SignalEvent(oNPC,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN )); } + ms_Nomenclature(oNPC); + + DelayCommand(0.0f, rnd_skin(oNPC)); + DelayCommand(0.0f, rnd_head(oNPC)); + DelayCommand(0.0f, rnd_pheno(oNPC)); + DelayCommand(0.0f, rnd_tattoo(oNPC)); + DelayCommand(0.0f, rnd_height(oNPC)); + /* Fix for the new golems to reduce their number of attacks */ - int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS); + int nNumber = GetLocalInt(oNPC,CREATURE_VAR_NUMBER_OF_ATTACKS); if (nNumber >0 ) { SetBaseAttackBonus(nNumber); } // Execute default OnSpawn script. - ExecuteScript("nw_c2_default9", OBJECT_SELF); + ExecuteScript("nw_c2_default9", oNPC); //Post Spawn event requeste if (nSpecEvent == 2 || nSpecEvent == 3) { - SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN)); + SignalEvent(oNPC,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN)); } SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS); } diff --git a/_module/nss/x2_def_spawn.nss b/_module/nss/x2_def_spawn.nss new file mode 100644 index 00000000..f562dc24 --- /dev/null +++ b/_module/nss/x2_def_spawn.nss @@ -0,0 +1,101 @@ +//:://///////////////////////////////////////////// +//:: Name x2_def_spawn +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Default On Spawn script + + + 2003-07-28: Georg Zoeller: + + If you set a ninteger on the creature named + "X2_USERDEFINED_ONSPAWN_EVENTS" + The creature will fire a pre and a post-spawn + event on itself, depending on the value of that + variable + 1 - Fire Userdefined Event 1510 (pre spawn) + 2 - Fire Userdefined Event 1511 (post spawn) + 3 - Fire both events + + 2007-12-31: Deva Winblood + Modified to look for X3_HORSE_OWNER_TAG and if + it is defined look for an NPC with that tag + nearby or in the module (checks near first). + It will make that NPC this horse's master. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Keith Warner, Georg Zoeller +//:: Created On: June 11/03 +//::////////////////////////////////////////////// + +const int EVENT_USER_DEFINED_PRESPAWN = 1510; +const int EVENT_USER_DEFINED_POSTSPAWN = 1511; + +#include "ms_name_inc" +#include "x2_inc_switches" +#include "mmd_inc_random" + +void main() +{ + string sTag; + object oNPC; + // User defined OnSpawn event requested? + int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS"); + + + // Pre Spawn Event requested + if (nSpecEvent == 1 || nSpecEvent == 3 ) + { + SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN )); + } + + ms_Nomenclature(OBJECT_SELF); + + DelayCommand(0.0f, rnd_skin(oNPC)); + DelayCommand(0.0f, rnd_head(oNPC)); + DelayCommand(0.0f, rnd_pheno(oNPC)); + DelayCommand(0.0f, rnd_tattoo(oNPC)); + DelayCommand(0.0f, rnd_height(oNPC)); + + sTag=GetLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG"); + if (GetStringLength(sTag)>0) + { // look for master + oNPC=GetNearestObjectByTag(sTag); + if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE) + { // master found + AddHenchman(oNPC); + } // master found + else + { // look in module + oNPC=GetObjectByTag(sTag); + if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE) + { // master found + AddHenchman(oNPC); + } // master found + else + { // master does not exist - remove X3_HORSE_OWNER_TAG + DeleteLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG"); + } // master does not exist - remove X3_HORSE_OWNER_TAG + } // look in module + } // look for master + + /* Fix for the new golems to reduce their number of attacks */ + + int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS); + if (nNumber >0 ) + { + SetBaseAttackBonus(nNumber); + } + + // Execute default OnSpawn script. + ExecuteScript("nw_c2_default9", OBJECT_SELF); + + + //Post Spawn event requeste + if (nSpecEvent == 2 || nSpecEvent == 3) + { + SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN)); + } + +} diff --git a/_module/nss/xx_pc_1_hb.nss b/_module/nss/xx_pc_1_hb.nss new file mode 100644 index 00000000..7dac8764 --- /dev/null +++ b/_module/nss/xx_pc_1_hb.nss @@ -0,0 +1,79 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_1_hb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnHeart beat script for PC AI; + This will usually fire every 6 seconds (1 game round). +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_menus" +void ai_ActionFollow(object oCreature, object oTarget) +{ + if(GetLocalInt(OBJECT_SELF, AI_CURRENT_ACTION_MODE) == AI_LAST_ACTION_MOVE) + { + float fDistance = GetDistanceBetween(oCreature, oTarget); + float fFollowDistance = ai_GetFollowDistance(oCreature); + if(fDistance > fFollowDistance && !ai_GetIsInCombat(oCreature)) + { + if(fDistance > fFollowDistance * 5.0) AssignCommand(oCreature, JumpToObject(oTarget)); + else + { + ClearAllActions(); + ActionMoveToObject(oTarget, TRUE, fFollowDistance); + } + } + DelayCommand(1.0, ai_ActionFollow(oCreature, oTarget)); + } +} +void main() +{ + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("xx_pc_1_hb", "12", GetName(oCreature) + " heartbeat."); + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound(oCreature); + return; + } + if(ai_CheckForCombat(oCreature, FALSE)) return; + if(IsInConversation(oCreature)) return; + if(ai_TryHealing(oCreature, oCreature)) return; + if(ai_CheckNearbyObjects(oCreature)) return; + if(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH)) + { + if(AI_DEBUG) ai_Debug("xx_ch_1_hb", "47", "Going into stealth mode!"); + int nStealth = GetSkillRank(SKILL_HIDE, oCreature); + nStealth += GetSkillRank(SKILL_MOVE_SILENTLY, oCreature); + if(nStealth / 2 >= ai_GetCharacterLevels(oCreature)) + { + SetActionMode(oCreature, ACTION_MODE_STEALTH, TRUE); + SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + } + } + else + { + SetActionMode(oCreature, ACTION_MODE_STEALTH, FALSE); + if(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH)) + { + if(AI_DEBUG) ai_Debug("xx_ch_1_hb", "61", "Going into search mode!"); + SetActionMode(oCreature, ACTION_MODE_DETECT, TRUE); + } + else SetActionMode(oCreature, ACTION_MODE_DETECT, FALSE); + } + // Finally we check to make sure we are following. + if(GetCurrentAction(oCreature) != ACTION_FOLLOW) + { + // Follow associate. + object oAssociate = GetLocalObject(oCreature, AI_FOLLOW_TARGET); + if(oAssociate == OBJECT_INVALID || GetMaster(oAssociate) != oCreature) return; + if(GetDistanceBetween(oCreature, oAssociate) > ai_GetFollowDistance(oCreature)) + { + ai_ClearCreatureActions(); + if(AI_DEBUG) ai_Debug("XX_pc_1_hb", "75", "Follow master: " + + " Stealth: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_STEALTH)) + + " Search: " + IntToString(ai_GetAIMode(oCreature, AI_MODE_AGGRESSIVE_SEARCH))); + SetLocalInt(oCreature, AI_CURRENT_ACTION_MODE, AI_LAST_ACTION_MOVE); + ai_ActionFollow(oCreature, oAssociate); + //ActionMoveToObject(oAssociate, TRUE, ai_GetFollowDistance(oCreature)); + } + } +} diff --git a/_module/nss/xx_pc_2_percept.nss b/_module/nss/xx_pc_2_percept.nss new file mode 100644 index 00000000..9731f702 --- /dev/null +++ b/_module/nss/xx_pc_2_percept.nss @@ -0,0 +1,107 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_2_percept + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnPerception script for PC AI; + There are 4 types of perception - Heard, Inaudible, Seen, Vanished. + Only one type will ever be true in an event trigger. + The order of trigger is Heard/Seen and Inaudible/Vanished. + There are two states of percepion Heard and Seen. + These states can be set at the same time thus a heard event can see the creature. + Fires when ever one of these states changes from TRUE to FALSE or FALSE to TRUE. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oLastPerceived = GetLastPerceived(); + if(AI_DEBUG) + { + if(GetLastPerceptionHeard ()) + { + ai_Debug("xx_pc_2_percept", "22", GetName(oCreature) + " heard " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + + " Seen: " + IntToString(GetObjectSeen(oLastPerceived, oCreature)) + "."); + } + if(GetLastPerceptionSeen ()) + { + ai_Debug("xx_pc_2_percept", "29", GetName(oCreature) + " sees " + + GetName(GetLastPerceived()) + " Distance: " + + FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + "."); + } + if(GetLastPerceptionVanished ()) + { + ai_Debug("xx_pc_2_percept", "35", GetName(oCreature) + " lost sight of " + + GetName(GetLastPerceived()) + "."); + } + } + // We do nothing on Inaudibles so drop out early! + if(GetLastPerceptionInaudible()) + { + ai_Debug("xx_pc_2_percept", "42", GetName(oCreature) + " lost sound of " + + GetName(GetLastPerceived()) + "."); + return; + } + if(AI_DEBUG) ai_Debug("xx_pc_2_percept", "46", "Dead? " + IntToString(GetIsDead(oLastPerceived)) + + " Enemy? " + IntToString(GetIsEnemy(oLastPerceived, oCreature))); + if(ai_Disabled(oCreature)) return; + if(GetIsDead(oLastPerceived) || !GetIsEnemy(oLastPerceived, oCreature)) return; + // All code below assumes the perceived creature is an enemy and is alive! + // **************************** ENEMY HEARD ******************************** + if(GetLastPerceptionHeard()) + { + // Since Heard is run before Seen, but the values are set at the same + // time we can skip heard checks on heard & seen creatures! + if(GetObjectSeen(oLastPerceived, oCreature)) + { + // If the creature we are perceiving was our invisible creature then + // remove that they are invisible. + if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE)) + { + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); + } + ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY); + } + else ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_HEARD_AN_ENEMY); + return; + } + // **************************** ENEMY SEEN ********************************* + if(GetLastPerceptionSeen()) + { + // If the creature we are perceiving was our invisible creature then + // remove that they are invisible. + if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE)) + { + DeleteLocalObject(oCreature, AI_IS_INVISIBLE); + } + ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY); + return; + } + // **************************** ENEMY VANISHED ***************************** + if(GetLastPerceptionVanished()) + { + // Lets keep a mental note of the invisible creature. + SetLocalObject(oCreature, AI_IS_INVISIBLE, oLastPerceived); + if(AI_DEBUG) ai_Debug("xx_pc_2_percept", "86", " We saw " + GetName(oLastPerceived) + " disappear!"); + if(ai_GetIsBusy(oCreature)) return; + // If in combat check to see if our target disappeared. + // If they have and we are not in melee with them then reevaluate combat + // since we lost our target. + if(ai_GetIsInCombat(oCreature)) + { + if(AI_DEBUG) ai_Debug("xx_pc_2_percept", "93", "Is this our target? " + + IntToString(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived)); + if(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived) + { + ai_DoAssociateCombatRound(oCreature); + } + return; + } + // If they are not invisible then that means they left our perception + // range and we need follow them. + ActionMoveToObject(oLastPerceived, TRUE, AI_RANGE_CLOSE); + } + // **************************** ENEMY INAUDIBLE***************************** + // Not used. +} diff --git a/_module/nss/xx_pc_3_endround.nss b/_module/nss/xx_pc_3_endround.nss new file mode 100644 index 00000000..51126e6d --- /dev/null +++ b/_module/nss/xx_pc_3_endround.nss @@ -0,0 +1,60 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_3_endround + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnCombatRoundEnd event script for PC AI; + Fires at the end of each combat round (6 seconds). + This will fire as long as oCreature is in combat (GetIsInCombat()). + This event starts counting once a combat action is started. + Every time a spell is cast it will queue another end combat round so haste with + two spells cast will fire this twice in one round. + It will also fire at the end of a hostile effect that stops actions i.e Stunned, Knockdown etc. + Action modes are also cleared prior to this event executing! + GetAttemptedAttackTarget() & GetAttemptedSpellTarget() also get cleared prior to this event. + This event can be canceled with ClearAllActions(TRUE) and SurrenderToEnemies. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + if(AI_DEBUG) ai_Debug("xx_pc_3_endround", "20", GetName(oCreature) + " ends combat round."); + if(ai_Disabled(oCreature)) return; + // Action modes get cleared prior to each OnCombatRoundEnd! + // We do this to keep the action mode going. + int nActionMode = GetLocalInt(oCreature, AI_CURRENT_ACTION_MODE); + if(nActionMode > 0) + { + SetActionMode(oCreature, nActionMode, TRUE); + // We don't want to use up all of the Dwarven Defenders uses! + if(nActionMode == 12) IncrementRemainingFeatUses(oCreature, FEAT_DWARVEN_DEFENDER_DEFENSIVE_STANCE); + } + int nAction = GetCurrentAction(oCreature); + if(AI_DEBUG) ai_Debug("xx_pc_3_endround", "32", "nAction: " + IntToString(nAction)); + switch(nAction) + { + // These actions are uninteruptable. + case ACTION_MOVETOPOINT : + case ACTION_CASTSPELL : + case ACTION_ITEMCASTSPELL : + case ACTION_COUNTERSPELL : return; + // Might be doing a special action that is not a defined action. + case ACTION_INVALID : + { + int nCombatWait = GetLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + if(AI_DEBUG) ai_Debug("xx_pc_3_endround", "47", "nCombatWait: " + IntToString(nCombatWait)); + if(nCombatWait) + { + if(ai_IsInCombatRound(oCreature, nCombatWait)) return; + DeleteLocalInt(oCreature, AI_COMBAT_WAIT_IN_SECONDS); + } + break; + } + // We always want to interupt an attack action at the end of a round (6 seconds). + case ACTION_ATTACKOBJECT : + { + if(ai_IsInCombatRound(oCreature, AI_COMBAT_ROUND_IN_SECONDS)) return; + } + } + if(ai_GetIsInCombat(oCreature)) ai_DoAssociateCombatRound (oCreature); +} + diff --git a/_module/nss/xx_pc_4_convers.nss b/_module/nss/xx_pc_4_convers.nss new file mode 100644 index 00000000..413aef15 --- /dev/null +++ b/_module/nss/xx_pc_4_convers.nss @@ -0,0 +1,30 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_4_convers + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnDialoge event script for PC AI; + Fires when oCreature has been clicked on for conversation. + Fires when oCreature hears a shout from another creature. + If SetListening is FALSE then oCreature will not "hear" anything. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + int nMatch = GetListenPatternNumber(); + object oLastSpeaker = GetLastSpeaker(); + if(AI_DEBUG) ai_Debug("xx_pc_4_convers", "17", GetName(oCreature) + " listens " + + IntToString(nMatch) + " to " + GetName(oLastSpeaker) + "." + + " Searching: " + IntToString(GetLocalInt(oCreature, AI_AM_I_SEARCHING))); + // If we are disabled then we can't listen or talk, Busy is checked in ai_SelectAssociateCommand(). + // Some modules disable the player then talk to them! So it should be ok + // to keep this remarked out. + // Some commands override being busy so we check in ai_SelectAssociateCommand. + if(nMatch != -1) + { + if(!GetFactionEqual(oLastSpeaker, oCreature)) return; + if(!ai_Disabled(oCreature)) ai_SelectAssociateCommand(oCreature, oLastSpeaker, nMatch); + } + else BeginConversation("", oLastSpeaker); +} + diff --git a/_module/nss/xx_pc_5_phyatked.nss b/_module/nss/xx_pc_5_phyatked.nss new file mode 100644 index 00000000..1c6ba790 --- /dev/null +++ b/_module/nss/xx_pc_5_phyatked.nss @@ -0,0 +1,29 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_5_phyatked + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnPhysicalAttacked event script for PC AI; + Fires for all physical attacks, claws, weapons, fists, bow, etc. + Fires for taunt skill, animal empathy skill. +/*////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oAttacker = GetLastAttacker(); + if(AI_DEBUG) ai_Debug("xx_pc_5_phyatked", "14", GetName(oCreature) + " was attacked by " + + GetName(oAttacker) + "."); + SetLocalObject(oAttacker, AI_ATTACKED_PHYSICAL, oCreature); + if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature)) return; + if(ai_GetIsInCombat(oCreature)) return; + // We only inform others if attacked when not busy, not disabled, & not in combat. + SetLocalObject(oCreature, AI_MY_TARGET, oAttacker); + SpeakString(AI_ATKED_BY_WEAPON, TALKVOLUME_SILENT_TALK); + // The only way to get here is to not be in combat thus we have not + // perceived them so lets look for them. + if(!ai_CanIAttack(oCreature)) return; + if(GetDistanceBetween(oCreature, oAttacker) < AI_RANGE_CLOSE) ai_DoAssociateCombatRound(oCreature); + else ActionMoveToObject(oAttacker, TRUE, AI_RANGE_CLOSE - 1.0); +} + + diff --git a/_module/nss/xx_pc_6_damaged.nss b/_module/nss/xx_pc_6_damaged.nss new file mode 100644 index 00000000..c3d6aaa3 --- /dev/null +++ b/_module/nss/xx_pc_6_damaged.nss @@ -0,0 +1,27 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_6_damaged + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Associate (Summons, Familiars, Companions) OnDamaged script; + Does not fire if the creature dies from the damage. + Does not fire for plot creatures as they take no damage. + May fire before or after OnPhysicalAttacked event. + Fires when EffectDamage is applied to oCreature even if 0 damage. + Fires when a weapon damages a oCreature, but not if resisted. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + if(ai_Disabled(oCreature)) return; + // Make sure to clear wounded shout limit if we take damage. See ai_TryHealing. + DeleteLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT"); + object oDamager = GetLastDamager(oCreature); + if(AI_DEBUG) ai_Debug("xx_pc_6_damaged", "18", GetName(oCreature) + " has been damaged by " + GetName(oDamager)); + if(GetObjectType(oDamager) == OBJECT_TYPE_AREA_OF_EFFECT && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature) || ai_GetIsInCombat(oCreature)) return; + if(GetDistanceBetween(oCreature, oDamager) < AI_RANGE_CLOSE) ai_DoAssociateCombatRound(oCreature); + else ActionMoveToObject(oDamager, TRUE, AI_RANGE_CLOSE - 1.0); +} + diff --git a/_module/nss/xx_pc_8_disturb.nss b/_module/nss/xx_pc_8_disturb.nss new file mode 100644 index 00000000..6440c038 --- /dev/null +++ b/_module/nss/xx_pc_8_disturb.nss @@ -0,0 +1,21 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_8_disturb + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnDisturbed event script for PC AI. + Fires when the inventory of oCreature is changed i.e. added or removed. + Creatures can't have items added or removed from its inventory (it's not a + container), then the only way this fires for creatures if something is stolen. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + if(AI_DEBUG) ai_Debug("xx_pc_8_disturb", "14", GetName(OBJECT_SELF) + " is been disturbed!"); + // We do nothing at the moment... lets not mess up our factions ok? + // This should be defined by the server admins and is commented out. + //if(ai_GetIsBusy(OBJECT_SELF, FALSE) || ai_Disabled()) return; + //object oTarget = GetLastDisturbed(); + //if (oTarget != OBJECT_INVALID) ai_DoMonsterCombatRound (); +} + + diff --git a/_module/nss/xx_pc_b_castat.nss b/_module/nss/xx_pc_b_castat.nss new file mode 100644 index 00000000..5d4b85f5 --- /dev/null +++ b/_module/nss/xx_pc_b_castat.nss @@ -0,0 +1,35 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_b_castat + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnSpellCastAt event script for PC AI; + Fires when oCreature becomes the target of a spell via SignalEvent. + Fires when a healing kit is used on a creature. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + object oCaster = GetLastSpellCaster(); + SetLocalObject(oCaster, AI_ATTACKED_SPELL, oCreature); + if(ai_Disabled(oCreature)) return; + if(!GetLastSpellHarmful()) return; + // If the spell came from an ally, we don't want to hold it against them. + if(GetFactionEqual(oCaster, oCreature)) ClearPersonalReputation(oCaster, oCreature); + // Lets see what kind of area of effect this is and select an appropriate action. + int nSpell = GetLastSpell(); + if(AI_DEBUG) ai_Debug("xx_pc_b_castat", "21", GetName(OBJECT_SELF) + " has been hit by a harmful spell(" + + Get2DAString("spells", "Label", nSpell) + ")!"); + if(ai_GetInAOEReaction(oCreature, oCaster, nSpell) && + ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return; + if(ai_GetIsBusy(oCreature)) return; + if(ai_CheckForCombat(oCreature, FALSE)) return; + // We were attacked by an enemy out of combat, so let our allies know. + SetLocalObject(oCreature, AI_MY_TARGET, oCaster); + SpeakString(AI_ATKED_BY_SPELL, TALKVOLUME_SILENT_TALK); + if(!ai_CanIAttack(oCreature)) return; + if(GetDistanceBetween(oCreature, oCaster) < AI_RANGE_CLOSE) ai_DoAssociateCombatRound(oCreature); + else ActionMoveToObject(oCaster, TRUE, AI_RANGE_CLOSE - 1.0); +} + + diff --git a/_module/nss/xx_pc_e_blocked.nss b/_module/nss/xx_pc_e_blocked.nss new file mode 100644 index 00000000..604513e8 --- /dev/null +++ b/_module/nss/xx_pc_e_blocked.nss @@ -0,0 +1,68 @@ +/*////////////////////////////////////////////////////////////////////////////// + Script: xx_pc_e_blocked + Programmer: Philos +//////////////////////////////////////////////////////////////////////////////// + Player OnBlocked event script for PC AI; + Can be blocked by a creature or door. +*/////////////////////////////////////////////////////////////////////////////// +#include "0i_associates" +void main() +{ + object oCreature = OBJECT_SELF; + // This actually gets either a Creature or Door that is blocking OBJECT_SELF. + object oObject = GetBlockingDoor(); + if(AI_DEBUG) ai_Debug("xx_pc_e_blocked", "14", GetName(oCreature) + " is being blocked by " + GetName(oObject)); + int nObjectType = GetObjectType(oObject); + if(nObjectType == OBJECT_TYPE_CREATURE) + { + if(GetIsEnemy(oObject, oCreature)) + { + if(ai_CanIAttack(oCreature) && ai_GetIsInCombat(oCreature)) + { + ai_DoAssociateCombatRound(oCreature); + return; + } + if(ai_CheckForCombat(oCreature, FALSE)) return; + } + } + // Anything below blocking us is a door. + if(nObjectType != OBJECT_TYPE_DOOR) return; + //if(GetLockKeyTag(oObject) != "") return; + else if(GetIsDoorActionPossible(oObject, DOOR_ACTION_OPEN) && + GetAbilityScore(oCreature, ABILITY_INTELLIGENCE) >= 5) + { + DoDoorAction(oObject, DOOR_ACTION_OPEN); + return; + } + // Anything below is ignored in combat. + if(ai_GetIsInCombat(oCreature)) return; + // If we are in combat we should ignore doors that do not easily open. + if(GetIsDoorActionPossible(oObject, DOOR_ACTION_BASH) && + ai_GetWeaponDamage(oCreature, 3, TRUE) > GetHardness(oObject) && + GetLockKeyTag(oObject) == "") + { + ActionWait(1.0); + ActionAttack(oObject); + // Give them 3 rounds to break through a door. + DelayCommand(18.0, ai_ClearCreatureActions(TRUE)); + return; + } + else if(GetLocked(oObject)) + { + if(AI_DEBUG) ai_Debug("0e_ch_e_blocked", "49", GetName(oObject) + " is locked!"); + string sID = ObjectToString(oCreature); + if(!GetLocalInt(oObject, "AI_STATED_LOCKED_" + sID) && + !ai_GetAIMode(oCreature, AI_MODE_DO_NOT_SPEAK)) SpeakString("That " + GetName(oObject) + " is locked!"); + SetLocalInt(oObject, "AI_STATED_LOCKED_" + sID, TRUE); + if(ai_GetAIMode(oCreature, AI_MODE_PICK_LOCKS) || + ai_GetAIMode(oCreature, AI_MODE_BASH_LOCKS)) + { + ai_AttemptToByPassLock(oCreature, oObject); + } + } + // Clear our action so we can move on to something else unless the door is open. + else if(!GetIsOpen(oObject)) + { + ai_ClearCreatureActions(); + } +}